Problema con Atmega88 y usart en winavr

Saludos! No se cuantos por aqui usaran atmel, pero estoy iniciandome con estos micros y he probado a hacer/adaptar un codigo para la usart. Os pongo aqui el codigo a ver si me podeis ayudar a hacerlo funcionar, gracias de antemano

Código:
#include <stdlib.h> 
#include <avr/io.h>

#define F_CPU 4000000
#define USART_BAUDRATE 9600
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)

int main (void)
{	//Variables
	char ReceivedByte;
	// Turn on the transmission and reception circuitry:
	UCSR0B |= (1 << RXEN0) | (1 << TXEN0);
	// Use 8-bit character sizes:
	//UCSR0C |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1);
	UCSR0C |= (1 << UCSZ00) | (1 << UCSZ01);
	// Load lower 8-bits of the baud rate value into the low byte
	// of the UBRR register:
	UBRR0L = BAUD_PRESCALE;
	// Load upper 8-bits of the baud rate value into the high byte
	// of the UBRR register:
	UBRR0H = (BAUD_PRESCALE >> 8);
	for (;;) // Loop forever
		{
		// Do nothing until data have been recieved and is ready
		// to be read from the UDR register:
		while ((UCSR0A & (1 << RXC0)) == 0) {};
		// Fetch the recieved byte value into the variable
		// called "ByteReceived":
		ReceivedByte = UDR0;
		// Do nothing until UDR is ready for more data to be
		// written to it:
		while ((UCSR0A & (1 << UDRE0)) == 0) {};
		// Echo back the received byte back to the computer:
		UDR0 = ReceivedByte;
		}
}
 
A primera vista, parece bien el codigo. Estas usando un cristal de 4 MHZ ? Te aseguraste de seleccionar los fusibles adecuados? (oscilador externo, etc).

De cualquier forma, aqui hay un voltimetro para pc y atmega8. Usa tambien comunicacion serial, quiza te pueda ayudar en algo. (el codigo c de atemega8 es similar al de atmega88, el nombre de los registros es un poco diferente, pero no muy diferente).

http://hackec.blogspot.com/

Salu2
 
Si el circuito creo que esta bien, de todas formas, hoy volvere a intentarlo.

El cristal lo tengo configurado como fullswing que va de 0.4-20mhz, sino intentare con otras configuraciones. De todas formas, antes de este le cargue otro ejemplo con un led e iba bien con esa configuracion de cristal.
 
El atmega tiene un oscilador rc interno. Si no configuras los fuses para usar el oscilador externo, termina usando el oscilador interno por defecto. Eso explicaria que funcione el led, y no funcione la comunicacion serial.

En el avrstudio, la configuracion de fuses debe ser la siguiente:

Ext. Crystal/Resonator High Freq.; Start-up time: 16K CK + 64 ms



Salu2
 
Muchas gracias por tu ayuda macraig, era un problema con los fuses lo habia configurado de 0.9 a 3.0 mhz, en lugar de 3.0 a 8.0 Mhz; debi equivocarme al seleccionar, asi que supongo que con la configuracion full swing debe funcionar, ya lo probare.
 
Que tal muchach@s, estoy programando una rutina similar para comunicarme por serial, pero lo único que veo en el pc es basura, he probado todas las combinaciones posibles de baudrate, parity, etc... me inclino por pensar que no he configurado bien la velocidad UBRR, aprovechando que tienen esta discusión, quisiera preguntar sobre cual es la velocidad del atmega168 por defecto, ya que en algunos lados veo que es de 8mhz (datasheet), pero en otros que es de 1mhz, esto porq la verdad no quisiera cambiar los fuse bytes para utilizar cristal externo ya que una vez los programo mis micros no se pueden volver a grabar (no se por que, ...estoy usando uisp). Gracias
 
Atrás
Arriba