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:
- Ingreso un carácter, ese carácter se imprime.
- 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;
}