USART entre Atmega16 y Beaglebone negro

0

Estoy trabajando en un proyecto que me obliga a enviar datos desde el microcontrolador AVR atmega16 a un Beaglebone Black.

Había escrito un código para la atmega USART pero cuando estaba conectado, el Beaglebone Black no recibió ningún dato. Así que intenté usar un arduino uno para ver qué está mal. La interfaz USART entre el arduino y el beaglebone black funcionó perfectamente, pero mientras estaba conectada a la atmega, seguía ocurriendo el mismo problema. Luego intenté hacer USART entre el atmega y el arduino, y el arduino no recibió ningún dato. Las velocidades en baudios son iguales en todos los dispositivos e incluso los he conectado a una base común.

Estoy usando PySerial en el beaglebone black para recibir los datos. Estoy publicando la biblioteca de USART que estoy usando para la atmega.

¿Alguien puede ayudarme y decirme adónde voy mal?

#define USART_BAUDRATE 9600 //Baud rate value
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)

void usart_init()
{
UCSRB |= (1 << RXEN) | (1 << TXEN); //Turn on the transmission and reception circuitry
UCSRC |= (1 << URSEL) | (1<<USBS) | (1 << UCSZ0) | (1 << UCSZ1);
// Use 8-bit character sizes

UBRRL = BAUD_PRESCALE;
// Load lower 8-bits of the baud rate value into the low byte of the UBRR register
UBRRH = (BAUD_PRESCALE >> 8); // Load upper 8-bits of the baud rate value..
// into the high byte of the UBRR register
}

unsigned int usart_getch()
{
while ((UCSRA & (1 << RXC)) == 0);
// Do nothing until data has been received and is ready to be read from UDR
return(UDR); // return the byte
}

void usart_putch(unsigned char send)
{
while ((UCSRA & (1 << UDRE)) == 0); // Do nothing until UDR is ready..
// for more data to be written to it
UDR = send; // Send the byte
}
    
pregunta Rohan Narlanka

1 respuesta

1

Sería muy bueno saber acerca de F_CPU usado ...

  1. Atmega no puede ejecutarse correctamente usart a 9600bps con un reloj de 1MHz con la configuración predeterminada.
  2. (1<<USBS) es el receptor configurado en 2 bits de parada?
  3. El reloj real se puede configurar en fusibles, no definiendo F_CPU (solo haga 1s ledblink para verificar si 1s es exactamente 1s).
  4. El oscilador interno puede desviarse con el voltaje / temperatura y causar un error en baudios inaceptable (> 2%).

enlace

    
respondido por el jnk0le

Lea otras preguntas en las etiquetas