UART con PC: Recibiendo caracteres absurdos en PC

1

Estoy trabajando en un proyecto con 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 un tipo de informática, por lo que necesito un poco de ayuda.

Supongo que podría estar escribiendo los bits de fusible incorrectos o algo más. Por favor, especifique los bits de 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 indican a continuación

Gracias de antemano por cualquier tipo de ayuda

    
pregunta Debesh Mohanty

1 respuesta

4

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 establecer UBRR_VALUE en 103 y vea si su comunicación mejora.

Una forma adecuada sería definir F_CPU y BAUD , y dejar que las macros de setbaud.h haz 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
}
    
respondido por el Dmitry Grigoryev

Lea otras preguntas en las etiquetas