ATmega328A UART: alles funktioniert, aber nicht wie erwartet

Ich versuche, UART über den ATmega328A zum Laufen zu bringen. Ich möchte ein Zeichen eingeben und dieses Zeichen ausdrucken lassen. Wenn mein Code jedoch ausgeführt wird, passiert Folgendes:

  1. Ich gebe ein Zeichen ein, dieses Zeichen wird ausgedruckt.
  2. Ich gebe ein zweites Zeichen ein, und das Zeichen wird ausgedruckt, aber dann wird das erste Zeichen kontinuierlich ausgedruckt, für immer.

Zum Beispiel die Ausgabe von der Konsole.

<user input a 5><5 is printed><system waits for input><user enter a 3><three is printed><system prints 5 repeatedly(for ever)>

Geben Sie hier die Bildbeschreibung ein

Der Code:

 #include <avr/io.h>
 #include <util/delay.h>
 #include <stdlib.h>
                                                      // include LCD library
  #define F_CPU 8000000UL       
 #define BAUD 9600                                                       // define baud
 #define BAUDRATE ((F_CPU)/(BAUD*16UL)-1)        // set baudrate value for UBRR


                                 // set the CPU clock


 // function to initialize UART
 void uart_init (void)
 {
     UBRR0H=(BAUDRATE>>8);
     UBRR0L=BAUDRATE;                                                 //set baud rate
     UCSR0B|=(1<<TXEN0)|(1<<RXEN0);                     //enable receiver and transmitter
     UCSR0C|=(1<<UCSZ00)|(1<<UCSZ01);// 8bit data format
 }

 // function to send data - NOT REQUIRED FOR THIS PROGRAM IMPLEMENTATION
 void uart_transmit (unsigned char data)
 {
     while (!( UCSR0A & (1<<UDRE0)));                  // wait while register is free
     UDR0 = data;                                                     // load data in the register
 }

 // function to receive data
 unsigned char uart_recieve (void)
 {
     while(!(UCSR0A) & (1<<RXC0));                     // wait while data is being received
     return UDR0;                                                     // return 8-bit data
 }

 // main function: entry point of program
 int main (void)
 {
     unsigned char a;
     char buffer[10];

     uart_init();                                                    // initialize UART

     while(1)
     {

         uart_transmit( uart_recieve());                               

         _delay_ms(100);                                         
     }

     return 0;
 }

Antworten (1)

Sie haben fehlende Klammern in while(!(UCSR0A) & (1<<RXC0));der Bedingung. Korrigieren Sie es als

while(!(UCSR0A & (1<<RXC0)));

oder

while(!(UCSR0A & _BV(RXC0)));

Makros wiederverwenden bzw

while(!bitRead(UCSR0A, RXC0));

wenn Sie die Arduino.h- Bibliothek verwenden .