ATmega64 debe reiniciarse después del encendido

2

Estoy usando un ATmega64A para mi proyecto con ESP8266 y RFM75. Pero el ATmega64 se cuelga en el encendido y tengo que hacer un reinicio bajo para que mi código funcione. Estoy usando un cristal externo de 8 MHz.

He conectado correctamente todos los pines VCC y GND con capacitores de 0.1 µF en cada PIN de VCC. El pin RESET se tira alto con resistencias de 10 kΩ y los condensadores de 10 µF están conectados entre RESET y GND (también he probado 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í.

HemedidoelniveldevoltajeenRESETPINenlacondicióndeencendido.

EDIT2:SoloelcódigodeparpadeodelLEDfuncionabienenelmismohardware,lohecomprobadotantasvecesalencender/apagarlaalimentación.Locódigotienealgunosproblemas.Estoytratandodeaveriguarlo.

EDIT2:HeencendidoelcódigodeparpadeodelLEDsimpleenelinicioantesdeiniciarESP8266oRFMInitialization.Tambiéntengounaopcióndedepuraciónenmicódigo.ATmega64UART1seutilizacomoterminaldedepuración.HeintentadoparpadearLEDantesdelainicializacióndedepuración.Ledparpadeantefuncionacomoelencanto!Tengounafunciónenelterminaldedepuraciónparaimprimirelbannerenelinicio.Imprimelafechayhoradelascausasdecompilaciónyreinicioyunaversióndelcódigo.Cuandohecomentadolafunción,micódigocomenzóafuncionarbien.Heprobadomuchasvecesendiferentestablerosporelproblemadesaparecidodesdeentonces.Aquílafunciónqueheeliminado.

staticvoidPrintBanner(void){unsignedcharstatus=MCUCSR;unsignedcharmoreThanOne=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 de RESTABLECIMIENTO del ATmega64 con este código? ¿Se debe a la obtención de datos de la memoria del programa para imprimir sobre UART? Todavía estoy tratando de ir a la causa raíz de este problema. Si alguien tiene alguna idea sobre esto amablemente arroje algo de luz sobre esto. Gracias.

    
pregunta Taher Kawantwala

1 respuesta

1

Algunos consejos:

  1. Los AVR tienen fusibles de retardo de inicio del reloj (SUT1 / SUT0 para ATmega64): compruebe si el problema ocurre con diferentes configuraciones del retardo de inicio.

  2. Use la detección de caída de tensión (también una configuración de fusible).

  3. Intente agregar un ciclo de espera ocupado al principio.

respondido por el filo

Lea otras preguntas en las etiquetas