Mantener el estado del pin GPIO durante el reinicio

Tengo un ESP-12 soldado en esta placa adaptadora . Estoy usando el firmware basado en NodeMCU Lua para codificar la lógica.

Lo he programado node.restartpara que se ejecute periódicamente. 1 de los pines GPIO se usa para controlar un componente externo usando el estado ALTO o BAJO. Puedo restaurar el estado de GPIO (ALTO/BAJO) después, node.restartpero durante el reinicio, el estado de GPIO no está definido. Quiero mantener ese estado, especialmente si el estado era ALTO.

Un enfoque que tengo en mente es tener otro microcontrolador como ATTinyX que está conectado a ESP-12 a través de UART. ESP-12 puede dar una cadena/caracter a ATTinyX para mantener el estado (el pin GPIO de ESP-12 y el pin ATTinyX están conectados al componente externo a través de una puerta OR) y luego reiniciar. Una vez que se completa el reinicio de ESP-12, puede decirle a ATTinyX que no mantenga el estado porque ESP-12 puede mantenerlo ahora después del reinicio.

Esto agrega un poco de costo y componentes, ¿hay alguna forma diferente de lograr lo mismo? Estoy más en el lado del software, tengo menos conocimientos de electrónica. Cualquier ayuda es apreciada. Tal vez sea similar a la memoria de 1 bit que se configura / restablece con ESP-12, ¿puedo usar un flip flop en este caso?

¡Sí! Cualquier memoria de 1 bit activada por Edge sería lo suficientemente buena
@Swanand gracias. 74HC74 funcionaría? ¿Puede proporcionar algún número DIP IC que pueda usar?
@ ritesht93 Un SOT23-6 PIC10F200 sería más barato y más pequeño que un 74hc74 (y se puede obtener en su lugar en DIP8 si lo prefiere). Pero un pin de E / S generalmente se reinicia en un estado de alta impedancia, por lo que un pull-up resistivo podría ser suficiente ¿Puede proporcionar su esquema actual?
Puede agregar una alimentación de enganche para controlar su componente externo. circuitdigest.com/electronic-circuits/…

Respuestas (5)

esquemático

simular este circuito : esquema creado con CircuitLab

Figura 1. Condensador de retención de estado.

Conecte un GPIO de repuesto como se muestra. Al reiniciar, lea el estado del capacitor y configure la salida de manera apropiada. Esto le dará una memoria a corto plazo de 1 bit.

//Pseudo code to go early in boot sequence.
pinPullup(pin) = false;        //Turn off the pull-up.
pinMode(pin) = input;          //Set the pin to input mode, if required.
pdState = pinRead(pin);        //Read the input to get the power-down state.
pinMode(pin) = output;         //Configure as output.
pinWrite(pin) = pdState;       //Restore the power-down state.

Es posible que desee cambiar el orden de las dos últimas líneas (según el micro) para evitar un parpadeo momentáneo.

Tenga en cuenta que en esta configuración, el pin no se puede usar para nada más.

Eche un vistazo a los expansores I2C como MCP23008. Básicamente, la misma configuración que su ATtiny menos otro firmware. Simplemente mantendrá cualquier estado que desee, independientemente de los reinicios de ESP.

Intente usar un capacitor que proporcione el voltaje requerido para la duración del reinicio. El siguiente enlace puede ayudarlo a encontrar el valor de capacitor apropiado.

http://www.electronics-tutorials.ws/rc/rc_2.html

editar:

esquemático

simular este circuito : esquema creado con CircuitLab

Para ser más específicos, asumo que el tiempo requerido para reiniciar es menos de dos segundos, por lo que ahora la constante de tiempo de la red RC debe ser casi el doble del tiempo de reinicio. Elegir una constante de tiempo de 4,7 segundos.

Constante de tiempo T = R * C

es decir, 4.7 s = 4.7K OHMIOS * 1000uf

La razón por la que deberíamos tener la constante de tiempo para que sea el doble del tiempo requerido es que, cuando un capacitor comienza a descargarse, a la mitad de la constante de tiempo, el voltaje del capacitor sería aproximadamente el 60 % del voltaje mientras está completamente cargado, que es de 3 voltios a 2,35 segundo, dado que el tiempo de reinicio es menor que eso, se mantendrá un nivel alto.

ingrese la descripción de la imagen aquí

En lugar de vincular algo que es muy básico, podría explicar que todo lo que necesita hacer es conectar una resistencia a un capacitor. Subí tu respuesta con el pulgar, pero alguien más la bajó a 0. (Probablemente porque vinculaste)
Gracias por el consejo. Me aseguraré de dar todas las explicaciones yo mismo y no proporcionar un enlace.
Copie la información relevante y conserve el enlace también.
Solo me preguntaba, @karthikJay, ¿cuál es la ruta de descarga (o carga) durante el reinicio? Mientras respondía, asumí que el reinicio no apagará el chip, por lo que no habrá descargas a través de los diodos de protección de entrada y, dado que las salidas deben tener tres estados, tampoco habrá ningún menú desplegable. El condensador debe mantener su carga durante mucho tiempo.
@Transistor Me olvidé de los diodos de protección, ¿qué sucede si el estado reciente fue BAJO y el estado anterior fue alto? Supongo que el capacitor tendrá un nivel ALTO debido al diodo, ¿es correcto?
(1) No. Los diodos solo conducirán si la entrada va por encima de Vcc o por debajo de GND. El OP está reiniciando su micro sin un ciclo de energía para que la energía permanezca en el chip. C estará un poco por debajo de Vcc o un poco por encima de GND. Las salidas deben pasar a tres estados (desconectadas) al restablecerse y permanecer así hasta que el programa las vuelva a convertir en salidas. Vea mi pseudocódigo para una explicación de esa parte. (2) Solo hay un estado del que preocuparse: el pin estaba alto o bajo en el punto de reinicio.

Si se conoce el estado del pin antes del apagado, puede usar pull up o pull down para mantener ese estado mientras el my se está iniciando. Los capacitores grandes también pueden ayudar.

El problema es que los pines generalmente están predeterminados en funciones de salida o no GPIO, por lo que observa sus estados en el reinicio.

Intente usar un pestillo simple, pero es posible que necesite tres pines GPIO. Mientras se ejecuta, si la salida en el GPIO que está utilizando es ALTA, proporcione un pulso alto-bajo en SET, y si está en LOW, haga lo mismo en RESET. Durante el encendido, verifique el estado de Q, si es ALTO, mantenga el pin GPIO requerido como ALTO, de lo contrario, hágalo BAJO

ingrese la descripción de la imagen aquí

Lo siento, yo otra vez. ¿Qué sucede cuando tanto SET como RESET flotan (debido al estado triple) en el microrestablecimiento? Podrías salirte con la tuya por un par de segundos. ¿Un pequeño condensador en cada línea? ¡El recuento de componentes y pines está aumentando!