2017-01-21 20 views
0

PIC24FJ256GB606デバイスの割り込み駆動型UARTの作業中です。私のコードは、UART受信割り込みが誤って最初にトリガされるのを除いて、うまく動作します。 メインルーチンである。 [コード]PIC24FJ初回実行時の誤割り込みトリガー

int main(){ 

System_init(); 
uart_init(); 

// UART2_PPS 
    RPINR19bits.U2RXR= 21; 
    RPOR13bits.RP26R = 5; 

    TRISGbits.TRISG6 = 1; 
    TRISGbits.TRISG7 = 0; 

     uart_puts("\n**********************************************"); 
     uart_puts("\nMy project "); 
     uart_puts("\n x"); 
     uart_puts("\n x"); 
     uart_puts("\n"__DATE__); 
     uart_puts("\n**********************************************"); 
return -1; 
} 
} 

[/コード]

ISRである:

[code]void __attribute__ ((interrupt, no_auto_psv)) _U2RXInterrupt(void) 
{ 

     IFS1bits.U2RXIF = 0; 
     uart_puts("False Trigger"); 
     __delay_ms(1000); 
}[/code] 

初期化である:

[![\[code\]int uart_init() 
{ 
    int status = -1; 
     size_t i; 


    // STSEL 1; IREN disabled; PDSEL 8N; UARTEN enabled; RTSMD disabled; USIDL disabled; WAKE disabled; ABAUD disabled; LPBACK disabled; BRGH enabled; URXINV disabled; UEN TX_RX; 
    U2MODE = 0x8008; 
    // OERR NO_ERROR_cleared; URXISEL RX_ONE_CHAR; UTXBRK COMPLETED; UTXEN disabled; ADDEN disabled; UTXISEL0 TX_ONE_CHAR; UTXINV disabled; 
    U2STA = 0x0000; 
    // U2TXREG 0; 
    U2TXREG = 0x0000; 
    // BaudRate = 9600; Frequency = 4000000 Hz; U2BRG 103; 
    U2BRG = 0x0067; 
    // ADMADDR 0; ADMMASK 0; 
    U2ADMD = 0x0000; 

      rb_attr_t attr = {sizeof(_rbmem\[0\]), ARRAY_SIZE(_rbmem), _rbmem}; 
      if (ring_buffer_init(&_rbd, &attr) == 0) { 
      U2MODEbits.UARTEN = 1; // And turn the peripheral on 
      U2STAbits.UTXEN = 1; //UART2 Transmit Enable 
      IFS1bits.U2RXIF = 0; //_U2RXIF = 0; 
      IEC1bits.U2RXIE = 1; //_U2RXIE = 1; 
       status = 0; 
      } 

    return status; 
}\[/code\]][1]][1] 

画像が取り付けを参照してくださいと以下を考慮して、 1)マイクロコントローラこの時点では何も受け取らないと予想されます。私は同じコードを実行しようとすると、同じ結果が得られた。 2)受信割り込みIEC1bits.U2RXIE = 0を無効にすると、このコードは正常に機能します。

UART

+0

私はPIC24の詳細については不明ですが、後半のピンの初期化シーケンスは少し怪しそうです。遅いRxDルーティング設定がペリフェラル入力に低い初期状態をもたらし、グリッチがスタートビットとして解釈されると、私は驚くことはありません。それを動かしてみてください。 – doynax

答えて

0

こんにちはDoynax応答していただきありがとうございます。初期化コードはMCCによって生成され、バグだった! 別のフォーラムで回答を受けました:

こんにちは、 UARTの初期化コードは、MCCによって生成されたようです。 これにもかかわらず、他のセットアップ操作の前にモジュールを有効にするという点で、プログラミングの習慣が悪いことが実証されています。

このデバイスのデータシートで推奨されているもの、 と私が見ている他のすべてのデバイスとは逆の結果になります。 データシートのセクション19.2 8ビットデータモードでの送信とセクション19.3 8ビットまたは9ビットデータでの受信 モード: 1. UARTx: を設定します。a)データ、パリティ、およびストップビットに適切な値を書き込みます。 b)適切なボーレート値をUxBRGレジスタに書き込みます。 c)送受信割り込みイネーブルビットとプライオリティビットを設定します。 2. UARTxを有効にします。 2. URXENビット(UxSTA < 12>)を設定して、UARTxをイネーブルにします。

また、生成されたコードでは、TXREG = 0000への書き込みがあります。 これは、レジスタをクリアするだけでなく、トランスミッタFIFOレジスタの最初のバイトの送信をキューに入れることもできます。

よろしく、 Mysil

初期化シーケンスを変更するには、問題を解決しました!