Estoy usando un ATmega64A para mi proyecto con ESP8266 y RFM75. Pero el ATmega64 se cuelga al encenderse y tengo que hacer un reinicio bajo para que mi código funcione. Estoy usando un cristal externo de 8 MHz.
He conectado todos los pines VCC y GND correctamente con condensadores de 0,1 µF en cada PIN VCC. El pin RESET se eleva con resistencias de 10 kΩ y se conectan condensadores de 10 µF entre RESET y GND (también probé condensadores de 0,1 µF).
Necesito algún tipo de ayuda para salir de este problema. Todos los comentarios o sugerencias serán apreciados.
EDIT 1: Mi esquema adjunto aquí.
He medido el nivel de voltaje en el PIN DE REINICIO en la condición de encendido.
EDICIÓN 2 : solo el código de parpadeo LED funciona bien en el mismo hardware, lo he comprobado muchas veces al encender/apagar el suministro. Creo que Code tiene algunos problemas. Estoy tratando de averiguarlo.
EDICIÓN 2: he mostrado un código de parpadeo de LED simple en el inicio antes de iniciar la inicialización de ESP8266 o RFM. También tengo una opción de depuración en mi código. ATmega64 UART1 se utiliza como terminal de depuración. He intentado hacer parpadear el LED antes de la inicialización de depuración. ¡El parpadeo de LED funciona de maravilla! Tengo una función en la terminal de depuración para imprimir un banner al inicio. Imprime la fecha y la hora de las causas de compilación y reinicio y una versión del código. cuando comenté la función, mi código comenzó a funcionar bien. Lo he probado muchas veces en diferentes placas por lo que desaparece el tema a partir de entonces. aquí la función que he quitado.
static void PrintBanner(void)
{
unsigned char status = MCUCSR;
unsigned char moreThanOne = 0;
printf_P(PSTR(CMD_LINE_MSG_WELCOME));
printf_P(PSTR("Firmware: v%S [Compiled on "__DATE__" "__TIME__"]\r\nBoot cause: "), PSTR(APP_VERSION));
if(status & (1 << PORF))
{
printf_P(PSTR("Power On"));
MCUCSR &= ~(1 << PORF);
moreThanOne = 1;
}
if(status & (1 << EXTRF))
{
if(moreThanOne)
printf_P(PSTR(", "));
printf_P(PSTR("External"));
MCUCSR &= ~(1 << EXTRF);
moreThanOne = 1;
}
if(status & (1 << BORF))
{
if(moreThanOne)
printf_P(PSTR(", "));
printf_P(PSTR("Brown-out"));
MCUCSR &= ~(1 << BORF);
moreThanOne = 1;
}
if(status & (1 << WDRF))
{
if(moreThanOne)
printf_P(PSTR(", "));
printf_P(PSTR("Watchdog"));
MCUCSR &= ~(1 << WDRF);
moreThanOne = 1;
}
if(status & (1 << JTRF))
{
if(moreThanOne)
printf_P(PSTR(", "));
printf_P(PSTR("JTAG"));
MCUCSR &= ~(1 << JTRF);
moreThanOne = 1;
}
printf_P(PSTR(" Reset.\r\n"));
}
¿Cuál sería la causa del problema RESET del ATmega64 con este código? ¿Se debe a la obtención de datos de la memoria del programa para imprimir a través de UART? Todavía estoy tratando de ir a la causa raíz de este problema. Si alguien tiene alguna idea sobre esto, por favor arroje algo de luz sobre esto. Gracias.
Algunos consejos:
Los AVR tienen fusibles de retardo de inicio de reloj (SUT1/SUT0 para ATmega64): verifique si el problema ocurre en diferentes configuraciones de retardo de inicio.
Utilice la detección de caídas de voltaje (también una configuración de fusible).
Intente agregar un ciclo de espera ocupada al principio.
Juan Evans
Sam Gibson
jack creasey
Sam Gibson
Taher Kawantwala
Taher Kawantwala
Taher Kawantwala
jack creasey
Taher Kawantwala
Sam Gibson
Anónimo
Taher Kawantwala
Anónimo
chris stratton
dibosco