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;
}
...o lo mejor (lo que yo haría), conectar en la entrada (ver datasheet) una señal cuadrada de la frecuencia que puedas, con una resistencia en serie de digamos 100R a 1K. De esta manera, el ISP 'revivirá'.
Gracias beamspot! Me van quedando las cosas más claras pero cuando dices "conectar a la entrada" a qué entrada te refieres exactamente (es para buscar en el datasheet).
Gracias!
Pin Xtal1, o sea el 8 en TQFP (o lo que sea SMD), 13 en el DIP 40. Según el datasheet es la entrada del circuito de reloj y del inversor interno.ç
No te olvides de poner una resistencia en serie, por si las moscas. Ah, y postea el resultado, que siempre es bueno para todos el saber que soluciones a los problemas más comunes hay.
Suerte.
Pin Xtal1, o sea el 8 en TQFP (o lo que sea SMD), 13 en el DIP 40. Según el datasheet es la entrada del circuito de reloj y del inversor interno.ç
No te olvides de poner una resistencia en serie, por si las moscas. Ah, y postea el resultado, que siempre es bueno para todos el saber que soluciones a los problemas más comunes hay.
Suerte.
Nada, no he conseguido resucitar el micro.
Le he puesto un oscilador RC como el de la imagen:
He utilizado un condensador cerámico de 22pf y una resistencia de 1k. También he probado con una resistencia de 10k porque el rango que recomendaban en el sitio del gráfico anterior era de 5k a 100k. El caso en que sigo sin poder cambiar la configuración de fuses que puse.
Os adelanto también que el problema de origen de este hilo lo he resuelto con otro ATmega644 que tenía. Os pongo la configuración de fuses que me funcionan para ATmega 644 en el AVRstudo (activar los checkbox siguientes):
* Brown-out detection disabled; [BODLEVEL=111]
* Watchdog timer always on; [WDTON=0]
* Boot Flash section size=4096 words Boot start address=$7000; ...
* Boot Reset vector Enabled (default address=$0000); [BOOTRST=0]
* Ext. Crystal Osc.; Frequency 8.0- Mhz; Start-up time 16k CK + 0ms; [CKSEL=1111 SUT=01]
Con esta configuración he probrado a 9600 baud y 19200 baud entre otros y recibo los datos sin problema.
P.D. Aún tengo pendiente cómo resucitar el otro micro.
Saludos!
Lo que yo te propongo no es exactamente lo que tienes puesto en el dibujo. Más bien, lo que propongo es que uses un generador de funciones, o una salida de timer del 644P que ya te funciona, para meter una señal cuadrada en la entrada de reloj. Es decir, aplicar un reloj externo.
Recuerda que necesitas saber la frecuencia del mismo para que la frecuencia de trabajo del ISP sea de 1/4 o menor de la misma, o en caso contrario, vuelves a tener problemas.
Lo que yo te propongo no es exactamente lo que tienes puesto en el dibujo. Más bien, lo que propongo es que uses un generador de funciones, o una salida de timer del 644P que ya te funciona, para meter una señal cuadrada en la entrada de reloj. Es decir, aplicar un reloj externo.
Recuerda que necesitas saber la frecuencia del mismo para que la frecuencia de trabajo del ISP sea de 1/4 o menor de la misma, o en caso contrario, vuelves a tener problemas.
Ok, cuesta entender todas las explicaciones. No soy usuario avanzado y tras cada explicación o comentario tengo que tirar de google para descifrarlo (Es como un profesor de universidad explicando a niños de primaria).
He cogido el otro atmega644 y le he metido un programita que es una señal PWM para inyectarla a la entrada de reloj del otro atmega. Lo he hecho directamente con el sofware de arduino que tengo hackeado para que tire con el atmega644 (este es el link). el problema que tengo es que no sé la frecuencia a la que tiene que ir. Tras tantos fracasos probé una cosa que aún no entiendo pero ha funcionado y he conseguido reconfigurar los fuses. Como simple prueba conecté el pin xtal1 del micro que tenía funcionando con el xtal1 del que no y... ?????? va y resucita. ¿sabes la explicación a esto?
muchas gracias por tu ayuda beamspot.