Tengo un AVR (ATMega644) conectado a una Raspberry PI a través de una conexión en serie. El AVR se alimenta con 5 V y la línea AVR = > RPI Tx utiliza un divisor de voltaje de 1k8 / 3k3 para obtener un nivel de 3v3.
Si la espera de 10 ms (XXX en el código) no está presente (de acuerdo con la hoja de datos, no tengo que esperar en absoluto) Recibo este disparate (python repr () de los datos recibidos):
'\x00\xaa\x8a\x8a\xea\n'
'\xe9\xf5%\xc5E\xd5\xa4\xfcBYE WORLD\r\n'
Cuando hay un retraso de 10 ms, recibo esto:
'\x00HELLO WORLD\r\n'
'BYE WORLD\r\n'
Esto está bastante bien. Sin embargo, me gustaría saber por qué hay un
antes del primer byte de datos real ( %code% ). ¡Nunca envío uno seguro! 'H'
Sin embargo, mi pregunta principal es por qué es necesaria la demora entre la inicialización y el envío de datos.
Notas: Mi valor F_CPU es correcto y también lo son los fusibles. También intenté usar una velocidad inferior (4800) y un chip diferente.
Este es el código que estoy usando:
#include <avr/interrupt.h>
#include <util/delay.h>
#include <util/setbaud.h>
inline void uart_putc(char c)
{
loop_until_bit_is_set(UCSR0A, UDRE0);
UDR0 = c;
}
inline void uart_puts(const char *s)
{
while (*s) {
uart_putc(*s++);
}
}
int main()
{
// we don't need/use any interrupts
cli();
// -DF_CPU=18432000L -DBAUD=19200 used when compiling
UBRR0H = UBRRH_VALUE;
UBRR0L = UBRRL_VALUE;
// 8 data bits
UCSR0C |= (1 << UCSZ00) | (1 << UCSZ01);
// enable transmitter
UCSR0B |= (1 << TXEN0);
_delay_ms(10); // XXX
uart_puts("HELLO WORLD\r\n");
_delay_ms(250);
uart_puts("BYE WORLD\r\n");
// do nothing
while (1)
;
return 0;
}