Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
Hola, estoy haciendo pruebas con un ATmega644 y comunicación serie. Tengo un programita que envía "HOLA" por el puerto serie y lo único que recibo son caracteres raros (sólo cuadraditos).
Utilizo AVR Studio 4 para compilar y cargar el programa en el micro.
¿Alguien tiene alguna idea de lo que puede estar pasando?
Gracias!
Os dejo el programita:
/**************************************************
UART_Test
************************************************/
#define F_CPU 16000000UL
#include <avr>
#include <util>
void USART_Init();
void USART_Transmit( unsigned char );
unsigned char USART_Receive( void );
int main(void)
{
USART_Init();
for(;;)
{
USART_Transmit('H');
USART_Transmit('O');
USART_Transmit('L');
USART_Transmit('A');
USART_Transmit('n');
USART_Transmit('r');
_delay_ms(25);
_delay_ms(25);
}
}
/***********************************************
Functions from UART_Test
***************************************************/
void USART_Init(){
/*
19200 baudios
cristal de 16 MHz
UBRR = 16^7/(16*9600) - 1
UBRR = 16000000/(16*19200)-1
UBRR = 16000000/307200-1
UBRR = 52.083-1
UBRR = 51.083
*/
//registro UBRRL
UBRR0H = 0;
UBRR0L = 51;
/* Enable receiver and transmitter */
UCSR0B = (1<<RXEN0)|(1<<TXEN0);
/* Set frame format: 8data, 2stop bit */
UCSR0C = (1<<USBS0)|(3<<UCSZ00);
}
void USART_Transmit( unsigned char data ){
/* Wait for empty transmit buffer */
while ( !( UCSR0A & (1<<UDRE0)) );
/* Put data into buffer, sends the data */
UDR0 = data;
}
unsigned char USART_Receive( void ){
/* Wait for data to be received */
while ( !(UCSR0A & (1<<RXC0)) );
/* Get and return received data from buffer */
return UDR0;
}
Eso suele ser que no tengas configurado igual el puerto serie de tu ordenador y el del ATMega. Mira bits de parada, paridad, no usar control flujo, y que las velocidades de transmisión recepción sean exactas y las mismas.
Eso suele ser que no tengas configurado igual el puerto serie de tu ordenador y el del ATMega. Mira bits de parada, paridad, no usar control flujo, y que las velocidades de transmisión recepción sean exactas y las mismas.El puerto del ordenador al que se conecta tiene la siguiente configuración:
Bits por segundo: 9600
Bits de datos: 8
Paridad: Ninguno
Bits de parada: 1
Control de flujo: Ninguno
He configurado el registro UBRRL para el Atmega:
/*
9600 baudios
cristal de 16 MHz
UBRR = 16^7/(16*9600) - 1
UBRR = 16000000/(16*9600)-1
UBRR = 16000000/153600-1
UBRR = 104.16-1
UBRR = 103.16
*/
//registro UBRRL
UBRR0H = 0;
UBRR0L = 103;
De esta manera he conseguido que escriba bien los datos en la consola pero tengo que configurarla 1200 baudios.
No sé porqué es así y tampoco sé como configurar la paridad, los bits de parada, el control de flujo y las velocidades de transmisión y recepción para el Atmega. ¿Se configura en el Makefile?
Agradecería que me aclaraséis esas dudas.
Gracias!!
Arriba has puesto el ATMega con 2 bits de parada (o eso pone). Generalmente la configuración del puerto serie no suele ser más que modificar 2-3 registros, nada de cálculos ni cosas extrañas... de hecho en TODOS los datasheet de los microcontroladores vienen ejemplos completos de cómo hacerlo. Sino tienes el datasheet, es buen momento para bajarlo 😉
Arriba has puesto el ATMega con 2 bits de parada (o eso pone). Generalmente la configuración del puerto serie no suele ser más que modificar 2-3 registros, nada de cálculos ni cosas extrañas... de hecho en TODOS los datasheet de los microcontroladores vienen ejemplos completos de cómo hacerlo. Sino tienes el datasheet, es buen momento para bajarlo :wink:No sé a qué te refieres (no soy usuario avanzado). Todo el código C está sacado del datasheet del ATmega644 y creo que los calculos extraños a los que te refieres son la ecuacón para calcular el valor de UBRR en función de la fracuencia de reloj y los baudios como dice el datasheet (frec_osc/(16*baudios) - 1).
¿alguien me puede echar un cable para poder entenderlo?