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.
Gracias de antemano por cualquier tipo de ayuda
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_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 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
}
F_CPU
16 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í.
brahans
Andrés