Estoy teniendo algunos problemas serios al intentar que el monitor serial produzca los caracteres correctos. He revisado muchas publicaciones con problemas similares, pero nada parece resolverlo.
Soy un novato absoluto cuando se trata de esto, estamos trabajando con sistemas integrados para un curso universitario y el profesor no es de mucha ayuda.
Simplemente estoy tratando de imprimir el carácter "a" en el monitor de serie, pero todo lo que obtengo son estos caracteres extraños que se pueden ver en la imagen.
Adjunté el código y la imagen, con la esperanza de que alguien más conocedor del área pueda ubicarme en la dirección correcta.
Información básica:
Programación a través de un Arduino nano
programador: arduino
velocidad de transmisión: 56700
chip: atmega328p
#define F_CPU 1000000UL
#include <stdio.h>
#include <avr/io.h>
#include <util/delay.h>
#include "usart.h"
int main(void) {
uart_init(); // open the communication to the microcontroller
io_redirect(); // redirect input and output to the communication
while(1) {
_delay_ms(1000);
printf("a");
}
return 0;
}
Los archivos usart.c y usart.h son proporcionados por la universidad. Puedo compilar y flashear en el chip sin problemas, solo obteniendo caracteres extraños como salida.
Cadavalordelavelocidadenbaudiospordebajode57600medaestarespuestadeavrdude.
Hay una excepción cuando intento usar 9600, obtengo la respuesta:
avrdude: stk500_getsync() attempts 1 of 10: not in sync: resp=0xff
avrdude: stk500_getsync() attempts 2 of 10: not in sync: resp=0xff
avrdude: stk500_getsync() attempts 3 of 10: not in sync: resp=0xff
...
Como soy totalmente nuevo en esto, no tengo idea de lo que significa, y Google no ayudó mucho. La única velocidad en baudios que puedo destellar al chip es 57600.
Aquí puede ver la función uart_init:
void uart_init(void) {
UBRR0H = UBRRH_VALUE;
UBRR0L = UBRRL_VALUE;
#if USE_2X
UCSR0A |= _BV(U2X0);
#else
UCSR0A &= ~(_BV(U2X0));
#endif
UCSR0C = _BV(UCSZ01) | _BV(UCSZ00); /* 8-bit data */
UCSR0B = _BV(RXEN0) | _BV(TXEN0); /* Enable RX and TX */
}