UART con PC: Recibiendo personajes absurdos en PC

Estoy trabajando en un proyecto utilizando el microcontrolador Atmega16 de la familia AVR. Estoy usando UART para mi proyecto. Necesito enviar datos a mi PC a una velocidad de transmisión de 9600 a través de un convertidor USB-TTL y ver los datos usando 'masilla'.

Estoy obteniendo datos absurdos en masilla. No soy un tipo de electrónica sino de informática, así que necesito un poco de ayuda.

Supongo que podría estar escribiendo los bits de fusibles equivocados o algo más. Por favor, especifique los bits del fusible si es posible

El programa para el microcontrolador está debajo

#include<avr/io.h>
#include<util/delay.h>

#define UBRR_VALUE 51

//function to initialize UART
void uart_init(void)
{
    UBRRH=(UBRR_VALUE>>8);//shift the register right by 8 bits
    UBRRL=UBRR_VALUE;//set baud rate
    UCSRB|=(1<<TXEN)|(1<<RXEN);//enable receiver and transmitter
    UCSRC|=(1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);//8 bit data format
}

//function to transmit data
void uart_transmit(unsigned char data)
{
    while(!(UCSRA & (1<<UDRE)));
    UDR=data;
}

void transmit_string(char *str_data)
{
    while(*str_data)
    {
        uart_transmit(*str_data);
        str_data++;
    }
}

int main(void)
{
    uart_init();
    while(1)
    {
        //transmit_string("hello");
        uart_transmit('h');
    }
    return 0;
}

Las especificaciones de los bits de fusible se dan a continuación.

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Gracias de antemano por cualquier tipo de ayuda

¿Cuál es su frecuencia de reloj y cómo calculó su divisor de velocidad en baudios?
Los caracteres incomprensibles normalmente son el resultado de una configuración incorrecta de la velocidad en baudios. No ha proporcionado suficientes detalles para verificar esa configuración.

Respuestas (1)

Su divisor de velocidad en baudios parece seleccionar una velocidad en baudios de 19200 en lugar de 9600:

baud = (clock speed) / ( 16 * (UBRR + 1) )

Intente configurarlo UBRR_VALUEen 103 y vea si su comunicación mejora.

Una forma adecuada sería definir F_CPUy BAUD, y dejar que las macros de setbaud.h hagan el cálculo:

#include <avr/io.h>

#define F_CPU 16000000

static void
uart_9600(void)
{
#define BAUD 9600
#include <util/setbaud.h>
    UBRRH = UBRRH_VALUE;
    UBRRL = UBRRL_VALUE;
#if USE_2X
    UCSRA |= (1 << U2X);
#else
    UCSRA &= ~(1 << U2X);
#endif
}
Hola... vi la placa del microcontrolador... había un oscilador de cristal de 12 MHz... así que calculé el valor de ubrr usando F_CPU como 12000000 y obtuve el valor de ubrr como 77 para una tasa de baudios de 9600... La comunicación funciona perfectamente ahora... gracias
@DebeshMohanty Me alegro de haber podido ayudar. Puede "aceptar" mi respuesta si lo desea: eso les diría a los otros usuarios que la información en la respuesta es relevante para ellos si tienen un problema similar.
Por cierto, asumí F_CPU16 MHz al mirar el cuadro de diálogo de configuración en sus capturas de pantalla. Quizás también debería actualizar su configuración con la frecuencia de reloj real allí.