El microcontrolador se bloquea mientras se apaga

3

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?

    
pregunta Ashutosh

1 respuesta

6

Cuando mantiene presionado el botón y las microcontrolador controlan la línea ON/OFF baja, 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 pin SENSE de la micro, hasta su bus de energía - esto es una cosa muy mala. También hay otra ruta a través de su diodo externo y el pin ON/OFF .

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 bajo 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 tendrá que aumentar su diseño de otras formas.

La solución más directa probablemente sería colocar el micro en el lado "siempre encendido" del interruptor, y simplemente ponerlo en un modo "inactivo" de bajo consumo 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 apagas los transistores hasta que después de se suelte el botón, por lo que el problema descrito anteriormente es solo un problema. si el botón rebota al soltarse, pero si lo hace, el sistema se volverá a encender de inmediato o quedará bloqueado en una condición de medio encendido.

¿Es un botón de acción instantánea, o algo "masticado"?

    
respondido por el Dave Tweed

Lea otras preguntas en las etiquetas