2017-12-23 20 views
0

私はexplorer16/32 evbでデータを送信しようとしています 私はUART1とUART2を割り込みの有無にかかわらず試してみましたが、常に同じ問題が発生しました 1つのバイトを送信するために、私はシフトを持つ2つの4ビットにそれを分割する必要があるように見えPIC24H Uartは4ビットしか正しく送信しません - 分割する必要があります

コード:

#define FCY 16000000 
#define BAUDRATE 9600 
#define BRGVAL ((FCY/BAUDRATE)/16)-1 
U2MODE = 0; 
U2STA = 0; 
U2MODEbits.STSEL = 0; // 1-Stop bit 
U2MODEbits.PDSEL = 0 ; // No Parity 8 bit data 
U2MODEbits.ABAUD = 0; // Auto-Baud Disabled 
U2MODEbits.BRGH = 1; // High Speed Mode 
U2MODEbits.URXINV = 0;  
U2STAbits.UTXINV = 0;  
U2BRG = BRGVAL;   // Baud Rate Setting for 9600 

U2MODEbits.UARTEN = 1; //Enable UART module 
U2STAbits.UTXEN = 1; //Enable UART TX 


unsigned char putU2(unsigned char c) 
{  

    while (U2STAbits.TRMT == 0) 
    { 

    }  
    while (CTS);     
    while (U2STAbits.UTXBF);  
    U2TXREG = c & 0xF; 
    U2TXREG = (c >> 4) & 0xF; 
    return c; 
} 

私は4ビットにsplitedデータは、私が上のデータが正しい見ることができることをsedningていた場合PC(c#シリアルポートアプリケーション) しかし、U2TXREGへの2回の書き込みに分割してはなりません。

FCYが16000000であることを100%保証しているわけではありませんが、これは妥当な結果をもたらす唯一の値です。

問題が発生する可能性があります
お時間をありがとうございます。

答えて

0

PIC24Hの場合、BRGVALの正しい値を得るためにUART高速モード(BRGH = 1)では、16でなく4で除算する必要があります.3行目の式を変更してください。クロックレートについて。設定ビットを変更しなかった場合、16 MHzではなく8 MHzになります。

+0

ありがとうございました。クロックを4000000に変更し、16から4に変更しました(8または16が悪い結果になりました)。次にputU2 0x7A);私は0xFAを得る。 putU2(0x3A);私は0x7Aを取得し、常にMSBの1ビットが追加されることを意味します。 – user1820451

関連する問題