AVR: la comunicación en serie proporciona caracteres extraños

0

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 */

}
    
pregunta Michael Nissen

1 respuesta

1

¿Estás seguro de esta línea aquí?

#define  F_CPU 1000000UL 

Por lo que sé, arduino nano tiene un oscilador externo incorporado de 16Mhz y si no ha cambiado la configuración predeterminada de los fusibles, funcionará con 16Mhz.

También intente hacerlo funcionar en valores de baudios más bajos, como 9600. Y revise su uart.h, asegúrese de que tenga el valor UBBR correcto.

    
respondido por el Mustafa Ali Mutlu

Lea otras preguntas en las etiquetas