En mi aplicación, he interconectado el chip wifi ESP8266 con el microcontrolador ATTiny828. Hemos desarrollado nuestro módulo personalizado con estos dos chips en él. El problema al que nos enfrentamos es que el microcontrolador se bloquea a veces cuando se apaga el módulo. El botón es de tipo momentáneo "push to On" y la función de encendido / apagado se implementa con el siguiente circuito: cuandosepresionaelinterruptor,eltransistornpnseenciende,loqueasuvezhacequePMOSconduzcalacorrienteyenciendetodalaunidad.Tanprontocomoelmicrocontroladorseponeenmarcha,poneelpinON/OFFenestadoHIGHpermanentemente(paramantenerlaunidadencendidadespuésdequesehayasoltadoelinterruptor).Elpin"SENSE" del microcontrolador detecta el estado del interruptor (las interrupciones de cambio de pin están activas en este pin). Entonces, si se presiona el interruptor por más de un lapso de tiempo preprogramado, entonces el microcontrolador hará que el pin cero de ENCENDIDO / APAGADO apague el módulo.
nos hemos ocupado de hacer rebotes 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 utilizan para medir el tiempo transcurrido. se tarda aprox. 32 ms para que se produzca un desbordamiento.
Aparte de esto, las interrupciones de UART también están activas en las que solo toma los datos y los asigna a una variable global.
El problema es este: Al presionar el botón de ENCENDIDO / APAGADO durante más de 2 segundos y luego soltarlo, se debe apagar la unidad, lo que hace la mayor parte del tiempo. Pero en 1 de cada 15 casos, el microcontrolador se cuelga mientras se apaga. No responde a la presión de los botones y los LED dejan de parpadear. O a veces deja de responder cuando el LED VERDE sigue parpadeando.
¿Alguien puede adivinar cuál puede ser el problema?