2016-06-17 15 views
3

PIC18F25K80이 내장 된 보드 용 라이브러리를 몇 개 프로그래밍하고 있습니다. 지금은 UART 라이브러리를 프로그래밍하려고하는데 모든 것을 시도했지만 char 문자열을 보낼 때 제대로 작동하지 않습니다.PIC18F25K80 USART를 통해 보내는 문자열이 작동하지 않습니다.

나는 XC8 컴파일러를 사용하고 있는데 나는 도서관에 다음 코드가 있습니다. (난 당신이 코드에서 그와 관련된 어떤 것도 볼 수 없습니다 그 이유는, 아직 중단을 프로그램하지 않은

void UARTsend(char data){ 
    UARTbusy(); 
    TXREG1 = data; 
} 

void UARTsendTEXT(unsigned char *text){ 

    while(*text != '\0'){ 
     UARTsend(*(text++)); 
    } 
} 

char UARTbusy(){ 
return TXSTA1bits.TRMT; 
} 

그리고 주 파일이 코드 :

int main() { 

    UARTconfig(_BR_19200, _RxINT_OFF, _TxINT_OFF, _8BIT); 

    unsigned char data[20] = "ABCDEFGHIJ"; 

    while(1){ 

     if(UARTrxREAD() == 'a'){ 
      UARTsendTEXT(data); 
     } 
    } 

    return 0; 
} 

내가 칠 때, 'A', 문자열이 대신 문자열을 보는 전송되어야, 내가 처음이자 마지막 편지를 받고, 때로는 첫 번째 글자

솔직히 말해서 코드에 대한 근본적인 문제라고 생각합니다. 그러나 생각할 수있는 모든 것을 시도했지만 아무 것도 효과가 없었습니다. 그래서 여기 누군가가 저를 도울 수 있습니다.

편집 :

void UARTconfig(unsigned int BaudRate, unsigned int RxINT, unsigned int   TxINT, unsigned int BIT){ 

int br_data; 

//Clock configuration at 16MHz 
OSCCONbits.IRCF = 0b111; 

//9-bit transmit enable bit. 
if(BIT == 1) { 
    RCSTA1bits.RX9 = 1; //Reception 9-bit. 
    TXSTA1bits.TX9 = 1; //Transmission 9-bit. 
} 
else { 
    RCSTA1bits.RX9 = 0; //Reception 8-bit. 
    TXSTA1bits.TX9 = 0; //Transmission 8-bit. 
} 


//Enable serial port. 
RCSTA1bits.SPEN = 1;      

//Enable continuous reception. 
RCSTA1bits.CREN = 1; 

//Setting asynchronous mode. 
TXSTA1bits.SYNC = 0; 

//Enable transmission 
TXSTA1bits.TXEN = 1;       

//Setting Rx/Tx pins as output. 
TRISC7 = 0;         
TRISC6 = 0;  

//Baud rate configuration 
BAUDCON1bits.BRG16 = 1;      //16bit Baud Rate generator 
TXSTA1bits.BRGH = 0;       //Low speed BR. 

switch(BaudRate){ 
    case 0: 
     br_data=415; 
     break; 
    case 1: 
     br_data=103; 
     break; 
    case 2: 
     br_data=51; 
     break; 
    case 3: 
     br_data=16; 
     break; 
    case 4: 
     br_data=8;   
} 
SPBRGH1:SPBRG1 = br_data; 

} 
+0

들여 쓰기를 수정하고 C 태그를 추가하는 편집을 제출했습니다.이 질문은 질문의 가시성을 높이는 데 매우 중요하다고 생각합니다. 불행하게도 5 개의 태그 만 허용되므로 태그 하나를 희생해야했습니다. 나는 "usart"를 선택했다. 다른 것을 원한다면 내 변경 사항을 취소 할 수 있습니다. –

+0

'UARTbusy(); '가 필요합니다. –

+0

죄송합니다. UARTbusy()를 잊어 버렸습니다; char UARTbusy() { return TXSTA1bits.TRMT; } –

답변

1

기능 UARTbusy 상태 대기해야한다, 또는 발신자가 있어야한다 : 단지의 경우 당신은 그것을 확인해야합니다. 그러나 전송 레지스터 상태는 한번 읽혀 무시됩니다.

전송 된 데이터에는 일반적으로 2 단계 버퍼가 있습니다. 인터페이스 레지스터에 기록 된 값은 시프트 레지스터가 비게 될 때까지 유지되고, 그때까지 디바이스는 'busy'상태를 유지합니다.

첫 번째 데이터를 쓸 때 즉시 시프트 레지스터로 전송되므로 두 번째 데이터를 즉시 쓰는 것은 무해합니다. 그러나 출력 레지스터의 내용이 메시지의 마지막 문자를 포함 할 때까지 계속해서 내용을 덮어 씁니다. 그런 다음 시프트 레지스터가 비게되면 메시지의 마지막 문자가 전송됩니다.

시프트 레지스터는 전송 속도가 비교적 느리게 비트를 이동시키는 것을 기억하십시오. 이것이 상태 비트를 검사해야하는 이유입니다.