2017-12-23 2 views
0

나는 explorer16/32 evb와 함께 작업 중이며 데이터를 UART로 보내려고합니다 인터럽트 유무에 관계없이 UART1, UART2를 시도했으며 항상 같은 문제가 발생했습니다 1 바이트를 전송하기 위해 난 시프트 개의 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# serial port application) 그러나 U2TXREG에 두 번 쓰면 안됩니다.

저는 FCY가 16000000이라는 것을 100 % 확신하지는 못하지만 이것은 합리적인 결과를주는 유일한 값입니다.

무엇이 문제 일 수 있습니까?
시간 내 주셔서 감사합니다.

답변

0

PIC24H의 경우 BRGVAL의 올바른 값을 얻으려면 UART 고속 모드 (BRGH = 1)에서 16이 아닌 4로 나누어야합니다. 3 행의 수식을 변경하십시오. 또한 100 % 확신 할 수 있습니다 클럭 속도에 관하여; 구성 비트를 변경하지 않으면 16이 아닌 8 MHz가됩니다.

+0

감사합니다. 시계를 4000000으로 변경하고 16에서 4로 변경합니다 (8 또는 16에서 나쁜 결과가 나타남). 이제 putU2를 보냅니다. 0x7A); 나는 0xFA를 얻는다. putU2 (0x3A); 나는 0x7A를 얻는다, 항상 MSB에 1 비트가 추가된다는 것을 의미한다. – user1820451

관련 문제