Problem bei der Kommunikation von uart mit pic

Ich versuche, ein UART-Programm in Bild zu machen. Ich möchte Zeichen anzeigen, die vom Controller an den PC gesendet werden. Aber ich bin nicht in der Lage, dies zu tun. Folgendes ist mein Code

#include<pic.h>

__CONFIG(0x3f72);

#define FOSC       10000     //10Mhz==>10000Khz
#define BAUD_RATE   9.6     //9600 Baudrate
#define BAUD_VAL   ((char)(FOSC/ (16 * BAUD_RATE )) – 1)     

void main()
{
 unsigned char ReceiveChar;  
 TRISC=0xc0;   //RC7,RC6 set to usart mode(INPUT)
 TXSTA=0x24;   //Transmit Enable
 SPBRG=BAUD_VAL; //9600 baud at 10Mhz
 RCSTA=0x90;   //Usart Enable, Continus receive enable
 TXREG='0';

 while(1)
 {
   if (RCIF==1) //char received? Send 'A' back to Terminal
       {
     ReceiveChar=RCREG;

     if(TXIF==1)
     TXREG=ReceiveChar;
   }  
  }
}  
#define BAUD_VALhat einen potenziellen Fehler: Sie sollten niemals charTyp für Arithmetik verwenden, da es eine implementierungsdefinierte Vorzeichenbedeutung hat.

Antworten (1)

Nun, Ihr Code sieht in Ordnung aus, aber wissen Sie, dass der Mikrochip eine PIC18-Peripheriebibliothek bereitstellt , sodass Sie Funktionen direkt verwenden können, anstatt Werte in Register zu schreiben.

Im Folgenden finden Sie den Beispielcode, den Sie verwenden können:

#include <plib.h>
#pragma config FNOSC = PRIPLL       
#pragma config POSCMOD = HS         
#pragma config FPLLMUL = MUL_18     
#pragma config FPLLIDIV = DIV_2     
#pragma config FPBDIV = DIV_1       
#pragma config FPLLODIV = DIV_1     
#pragma config FWDTEN = OFF         
#define SYSTEM_FREQUENCY        {define you system frequency here}
#define BAUDRATE                115200
int main()
{
 int pbFreq;
 pbFreq=SYSTEMConfigPerformance(SYSTEM_FREQUENCY);
OpenUART( UART_EN | UART_NO_PAR_8BIT | UART_1STOPBIT, UART_RX_ENABLE | UART_TX_ENABLE, (pbFreq/16/BAUDRATE)-1);
 while(1)
 {
   putsUART("Hello World.!");
 }
}
Danke für die Bibliothek
PIC-Bibliotheken verwenden 32-Bit-Arithmetik? Ich glaube nicht, dass ... hier muss ein Fehler vorliegen. Und Sie sollten 32-Bit-Zahlen von vornherein vermeiden. Denken Sie daran, dass dies die mit Abstand langsamste CPU der Welt ist, die noch produziert wird. Die Methode des OP zur Berechnung der Baudrate ist besser, da dies vom Vorprozessor durchgeführt wird. Wenn Sie nicht aus irgendeinem Grund eine variable Systemuhr benötigen, warum etwas zur Laufzeit berechnen?
Begründung: Auf einer 8-Bit-MCU intsind es 16 Bits, und daher 115200ist das Literal vom Typ lang. Deshalb pbFreq/16/BAUDRATEergibt der Ausdruck keinen Sinn.
@Lundin ja du hast recht.! 16bit tut mir leid. Dies ist nur ein Democode, den OP durch die von 8-Bit-MCU verwendeten Funktionen ersetzen kann. Dies funktionierte hervorragend für 32-Bit-MCU.!
@CZAbhinav Aus diesem Grund sollten Sie intin eingebetteten Systemen nicht verwenden, sondern uint16_t oder uint32_t. Es zwingt Sie, Überläufe zu berücksichtigen.