El microcontrolador se cuelga mientras se apaga

En mi aplicación, he interconectado el chip wifi ESP8266 con el microcontrolador ATTiny828. Hemos desarrollado nuestro módulo personalizado con estos dos chips. El problema al que nos enfrentamos es que el microcontrolador se cuelga a veces al apagar el módulo. El botón es el interruptor de tipo momentáneo "pulsar para encender" y la funcionalidad de encendido/apagado se implementa con el siguiente circuito:circuito de encendido/apagadocuando se presiona el interruptor, el transistor npn se enciende, lo que a su vez hace que PMOS conduzca corriente y encienda toda la unidad. Tan pronto como se inicia el microcontrolador, pone el pin ON/OFF en estado ALTO permanentemente (para mantener la unidad encendida después de soltar el interruptor). El pin "SENSE" del microcontrolador detecta el estado del interruptor (las interrupciones de cambio de pin están activas en este pin). Entonces, si el interruptor se presiona durante más de un período de tiempo preprogramado, el microcontrolador pondrá el pin de ENCENDIDO/APAGADO en cero, lo que apagará el módulo.

nos hemos ocupado de eliminar el rebote en el software agregando un retraso de 100 ms. aquí está nuestro código

// PW pin is same as "SENSE" pin
ISR(PCINT0_vect) {
    static uint8_t tmr_pw_start = 0; 
    static uint8_t PW_prev = 1, GP2_prev = 1;

    uint8_t const PW = READ(PW);
    uint8_t const GP2 = READ(GPIO2);

    if (PW != PW_prev) {
        if (PW) {               // Start measuring button press time
            tmr_pw_start = 1;
            ovf0 = 0;
        } else if(tmr_pw_start){ 
            if (ovf0 > 60) {                            
                WRITE(On_off_pin, LOW);     // POWER OFF
                _delay_ms(100); 
            }            
            tmr_pw_start = 0;
        }
    }

    if (GP2 != GP2_prev) {
        TOGGLE(BLUE_LED);
    }
    PW_prev = PW;
    GP2_prev = GP2;
}

ISR(TIMER0_OVF_vect, ISR_NOBLOCK) {
    ovf0++;
    if(!(ovf0 % 16))    TOGGLE(GREEN_LED);
}

Mantenemos el temporizador 0 siempre en funcionamiento y su número de desbordamientos se utiliza para medir el tiempo transcurrido. se tarda aprox. 32 ms para que ocurra un desbordamiento.

Aparte de esto, las interrupciones UART también están activas en las que solo toma los datos y los asigna a una variable global.

El problema es el siguiente: al presionar el botón de encendido/apagado durante más de 2 segundos y luego soltarlo, la unidad debe apagarse, lo que hace la mayor parte del tiempo. Pero en 1 de cada 15 casos, el microcontrolador se cuelga mientras lo apaga. No responde al presionar el botón y los LED dejan de parpadear. O a veces deja de responder y el LED VERDE sigue parpadeando.

¿Alguien puede adivinar cuál puede ser el problema?

no tengo idea, pero cambie 100ms a 10ms y vea si 1/15 cambia la probabilidad... la mayoría de los cambios momentáneos son <1ms a menos que sea realmente inestable
Puedo adivinar porque he visto este problema antes con otros procesadores. El problema que está experimentando puede deberse a varios problemas. Lo más común es la forma en que el voltaje al procesador decae después de desconectar el regulador. Debe ser un corte nítido, o el procesador se "comportará mal" en el camino hacia abajo y establecerá la señal de ENCENDIDO/APAGADO nuevamente en ENCENDIDO. Hay una serie de otros problemas que no podría comenzar a adivinar sin ver su esquema completo. Comience por revisar los reguladores de voltaje "snap-on-snap-off" (si todavía los fabrica National Semi o sus herederos).
¿Cuál es el voltaje de ATTiny828 y ESP8266? Post-regulador, quiero decir. ¿Es eso 3.3V? Además, se lee como si estuviera enfocado en ATTiny y no en ESP8266. ¿Ha intentado simplemente sacar el ESP8266 del circuito y ver la funcionalidad ATTiny sin que esté presente?
¿Por qué poner el ATtiny detrás del interruptor de encendido? En el modo de apagado, normalmente necesita 100 nA.
¿Cuál es el tipo de ovf0? ¿Existe la posibilidad de que se desborde si presiona el botón durante demasiado tiempo? Si es así, eso haría que el micro no se detuviera en el lanzamiento, ya que la condición (ovf0> 60) sería incorrecta.

Respuestas (1)

Cuando mantiene presionado el botón y el micro reduce la ON/OFFlínea, hay una ruta de baja impedancia directamente desde la batería, a través de los diodos de protección de E/S en el SENSEpin del micro, hasta su bus de alimentación; esto es algo muy malo. . También hay otro camino a través de su diodo externo y el ON/OFFpin.

Como mínimo, debe tener una resistencia en serie con cada una de las líneas de E/S para limitar la corriente que puede fluir en esta condición. Pero es posible que el micro aún pueda seguir funcionando con esta baja cantidad de corriente, por lo que también deberá mejorar su diseño de otras maneras.

La solución más directa probablemente sería poner el micro en el lado "siempre encendido" del interruptor, y simplemente ponerlo en un modo de "reposo" de baja potencia cuando se supone que el sistema está apagado. Esto realmente simplificaría el circuito externo requerido.


EDITAR: en realidad, después de pensarlo un poco más, me di cuenta de que no apaga los transistores hasta que se suelta el botón, por lo que el problema descrito anteriormente es solo un problema si el botón rebota al soltarlo, pero si lo hace, el sistema se volverá a encender de inmediato o se colgará a medias.

¿Es un botón de acción rápida o algo "más blando"?

Hacia allí me dirigía. ¡Bien!