ATmega328A UART: todo funciona, pero no como se esperaba

2

Estoy tratando de hacer que UART funcione a través del ATmega328A. Quiero ingresar un carácter y hacer que se imprima ese carácter. Sin embargo, cuando se ejecuta mi código, esto es lo que sucede:

  1. Ingreso un carácter, ese carácter se imprime.
  2. Ingreso un segundo carácter, y el carácter se imprime, pero luego el El primer carácter se imprime continuamente, para siempre.

Por ejemplo, la salida de la consola.

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

El código:

 #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;
 }
    
pregunta dgamma3

1 respuesta

5

Le faltan paréntesis en la condición while(!(UCSR0A) & (1<<RXC0)); . Corregirlo como

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

o

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

para reutilizar macros o

while(!bitRead(UCSR0A, RXC0));

si usas la biblioteca Arduino.h .

    
respondido por el TMa

Lea otras preguntas en las etiquetas