¿Cómo hacer un circuito de memoria permanente de 1 bit?

Me gustaría hacer un circuito simple para almacenar o guardar 1 bit de datos. El circuito debería poder recordar el estado de un LED (encendido o apagado) incluso si el suministro está desconectado del circuito. Necesito que funcione como un disco duro, memoria flash o tarjeta de memoria SD de celulares.

Hice un circuito como se muestra en la imagen, la salida es un LED en serie con una resistencia de 470 ohmios. Utilizo dos botones de casquillo para cargar o descargar el condensador para que el LED de salida esté encendido o apagado.

Después de desconectar el suministro o apagar la electricidad, el circuito pudo recordar el estado del LED durante unos minutos.

Después de 2 o 3 minutos, el capacitor se descargó por completo y el circuito perdió sus datos.

ingrese la descripción de la imagen aquí¿Cómo puedo evitar que el capacitor se descargue? o ¿cómo puedo reducir la velocidad de descarga para que el circuito pierda sus datos después de una semana o más?

En este circuito, uso 555 como inversor (no puerta), pero puedo usar cualquier otro IC. Mi objetivo es hacer una memoria permanente simple.

¿Qué tan reacio eres a usar una celda tipo moneda? No hay forma de duplicar una celda EEPROM/flash/FRAM a nivel macro.
@IgnacioVazquez-Abrams Podrías usar un relé de enganche ...
@IgnacioVazquez-Abrams No quiero duplicar nada, quiero saber como funciona y hacer una simple celda de memoria. o algo que hace el mismo trabajo de una celda de memoria. solo para aprender electronica
Una celda de memoria es fácil. Una celda de memoria no volátil no lo es.
@MichaelGeorge: No, el objetivo de un relé de enganche es que usa un imán permanente para preservar su estado sin la aplicación de energía externa. Solo necesitas un pulso de electricidad para cambiar su estado.
Puede conseguir que un condensador mantenga su carga durante una semana con un diseño y una construcción cuidadosos: m.electronicdesign.com/analog/…
En cuanto a la descarga de condensadores: pueden retener el voltaje durante MUCHO tiempo, si se desconectan correctamente. robotroom.com/Capacitor-Self-Discharge-1.html
Una de las primeras computadoras electrónicas, la Atanasoff-Berry Computer , usaba capacitores en la primera DRAM. Estaban montados en un par de tambores que giraban para conectarlos secuencialmente a conjuntos de contactos para escritura, lectura y actualización (una vez por segundo).

Respuestas (11)

La memoria electrónica no volátil original se basa en núcleos de ferrita. Si bien es relativamente fácil magnetizar un núcleo de este tipo en una dirección u otra para almacenar un uno o un cero, se necesita un circuito bastante sofisticado para leerlo de manera confiable.

Los chips no volátiles modernos se basan en el almacenamiento de carga, pero para que esto funcione, debe poder crear un capacitor que tenga esencialmente cero fugas y una forma de leer esa carga. Esto solo se puede hacer en el contexto de la microelectrónica, donde el capacitor es una pequeña pieza de metal (la "puerta flotante") que está completamente recubierta de vidrio (dióxido de silicio) y se lee por medio de su influencia en un transistor cercano. .

Otra opción es la RAM ferroeléctrica (FRAM), que utiliza un material dieléctrico especial que tiene dos estados de polarización estables y distintos. Nuevamente, esto solo funciona en microelectrónica.

Por lo tanto, debe elegir algún otro fenómeno físico para almacenar su información. Una opción obvia es el relé de enganche, que almacena información en la posición física de su armadura, que se mantiene en cualquiera de las dos posiciones estables mediante un imán permanente o un resorte. La posición se puede cambiar aplicando un pulso de corriente relativamente corto, y la lectura se logra conectando contactos eléctricos a la armadura.

Dado que solo tiene un núcleo, ¿no podría leerlo con un sensor de efecto Hall o algo así?
@immibis: No fácilmente. El campo magnético está casi completamente contenido dentro del propio núcleo, con muy poca fuga externa.

Haga un circuito que active un interruptor mecánico, por ejemplo. caja inútil. El circuito necesitaría ser encendido para cambiar/leer el estado pero lo mantendría en el medio.

La electrónica pura no hará una celda de memoria permanente, pero la carga en un capacitor puede acercarse a ella (necesitará una actualización regular). La memoria EEPROM/Flash amplía este requisito a decenas de años, por lo que a efectos prácticos se denomina permanente. Pero esto no es algo que puedas hacer con componentes ordinarios.

La memoria permanente real utiliza algún tipo de fenómeno físico biestable. La magnetización de los núcleos de ferrita mencionada por Dave se usó ampliamente (¿alguna vez has oído hablar de un 'volcado de núcleo'?). El relé biestable (o de enganche) mencionado por helloworld922 es más fácil de usar.

Cuando observa cómo se hizo esto en las primeras computadoras, debe darse cuenta de que existe un equilibrio entre la complejidad de la celda única y la complejidad del circuito de conducción. Un núcleo de ferrita es muy simple, pero el circuito de conducción y especialmente el de lectura es muy complejo. Para un relé biestable es lo contrario: el relé es bastante complejo por bit, pero el circuito de control es muy simple.

¿Cual es tu propósito?

  • Si desea hacer una celda solo por diversión, use un relé biestable.

  • Si desea demostrar cómo se hace en la práctica (DRAM/Flash) sin que sea práctico, utilice una carga almacenada en un condensador y actualícela periódicamente.

  • Si quiere hacer algo práctico, use un pequeño microcontrolador que tenga una EEPROM incorporada (o que pueda autoprogramar su FLASH).

un fusible Puede ser molesto reemplazarlo con frecuencia, por lo que podría actualizar a un interruptor.

Esto es un poco delgado para una respuesta en EE.SE. Por favor elabora.
Entonces... sale un 1 por defecto (pasará la corriente), para establecerlo en cero, envía una gota de corriente a través del fusible para quemarlo, ahora la corriente no pasará, para establecerlo en 1 nuevamente, reemplaza ¿el fusible?
Me gusta el pensamiento innovador aquí. Cuando presiona el botón para apagar el LED, dispara el interruptor. Cuando presiona el botón para encender el LED, reinicia el interruptor. Es solo una versión extraña del relé de enganche. Probablemente no sea la mejor opción, pero aun así disfruto de la creatividad.
Simplemente me refería a cómo funcionaban los primeros dispositivos ROM. Eran una serie de fusibles. Sople los fusibles donde quiere ceros. No pensé que requeriría una visión más profunda. Muy de la vieja escuela.

Una solución simple sería un microcontrolador como el PIC12F635 que está disponible en un DIP de 8 pines o más pequeño, y tiene un reloj incorporado y un circuito de restablecimiento de caída de tensión (este último es importante para mantener la integridad de la EEPROM no volátil). almacenamiento).

El código requerido no es mucho, un buen proyecto inicial.

Las únicas partes externas requeridas serían un capacitor de derivación y una resistencia limitadora de corriente para el LED.

La solución más simple es probablemente un relé de señal de enclavamiento de 2 bobinas.

Solución práctica:

Un relé de enganche como lo menciona @DaveTweed es el más simple.

Si desea una solución de estado sólido, puede usar un IC de memoria de interfaz paralela como este . Puede vincular las líneas de dirección a una dirección fija y usar solo una de las líneas de datos. Necesitará algo de lógica de pegamento adicional.

Solución interesante:

Si está buscando un proyecto para demostrar la memoria, entonces podría usar un solenoide con un núcleo histérico. Sature el núcleo en una dirección para almacenar un 1, satúrelo en la otra dirección para almacenar un 0. Eso se ocupa de las escrituras.

Luego móntelo justo encima de un sensor como este sensor de pasillo . Luego, puede observar la polaridad del campo remanente con el sensor Hall (solo un comparador analógico) para determinar el estado.

De la respuesta de fusible/interruptor dada por William Price surgió la solución más obvia:

Un interruptor.

Toma una lámpara. Conéctalo. Enciéndelo. Desenchúfelo. Muévelo a Hawai. Conéctalo.
Se vuelve a encender.

Apágalo. Desenchúfelo. Llévalo a casa. Conéctelo.
Permanece apagado.

Si desea que una computadora active/desactive el LED, no es tan útil. Sin embargo, si usa un interruptor de palanca de botón y un solenoide activado electrónicamente, podría hacer el trabajo. Presione el botón para encender el LED, activa el solenoide, el LED se enciende. Presione de nuevo, el LED se apaga. Desenchúfelo, y el botón todavía está activado o desactivado mecánicamente.

Si desea conservar la funcionalidad explícita "esto si definitivamente está encendido, eso definitivamente está apagado" (en lugar de un interruptor), puede hacer que el botón superior active un solenoide que presiona la parte superior de un interruptor basculante. Luego, el botón inferior activa un segundo solenoide que presiona la parte inferior del interruptor basculante.

No digo que esta sea remotamente la mejor manera de hacerlo, pero es funcional.

Todo lo que ha hecho es describir cómo construir un relé biestable, que fue una de las primeras soluciones propuestas.
La segunda parte, sí, es solo una descripción de un relé biestable tosco, tal vez útil si está interesado en construir su propio relé. La primera parte, sin embargo, no lo es. No creo que coincida con la intención de la pregunta (supongo que está interesado en aprender electrónica en lugar de construir el diseño más simple posible), pero un solo interruptor de palanca es un diseño más simple y fácil que los bits electrónicos y cumple con los requisitos dados en las dos primeras frases.
Puede que tenga razón, pero nunca estaremos seguros ya que el OP nunca volvió a discutirlo, aunque "aceptó" mi respuesta. Interpreté la intención general de la pregunta para referirse a la memoria reescribible electrónicamente, basada en "El circuito debería poder recordar el estado de un LED" . Esto descartaría la memoria de solo lectura (interruptores, puentes, diodos, etc.) y la memoria de escritura única (fusibles).
Mi opinión es que el estado del LED está directamente relacionado con el último botón que se presionó. Desde un punto de vista lógico, capturar el estado de los botones es idéntico a capturar el estado del LED.

La solución más simple de un componente sería un relé biestable. Y solo necesitarás una resistencia para leer el estado.

Podría usar un microcontrolador que tenga una EEPROM incorporada. El PIC16F84A de 8 bits tiene 64 bytes de EEPROM, lo que es bueno para normalmente 10 000 000 y un mínimo de 1 000 000 escrituras en cada byte (esto se conoce como resistencia de bytes). El PIC elegido en otra respuesta, PIC12F635 tiene una EEPROM de 128 bytes y una resistencia de bytes de 100 000 escrituras. El PIC24F16KA102 , un procesador de 16 bits, tiene 512 bytes de EEPROM y también una resistencia de bytes de 100 000 escrituras.

El OP no indica con qué frecuencia parpadeará el LED. Para los propósitos de esta discusión, supongamos que es cuatro veces por minuto.

En un año parpadeará

4 60 24 365 = 2 , 102 , 400   t i metro mi s .

Dado que la EEPROM necesita capturar los últimos eventos de encendido y apagado, se escribirá el doble de ese número, o alrededor de 4,2 millones de veces . En cinco años, esto es 21 millones de veces.

Claramente, esto excederá las especificaciones de cualquier EEPROM que ahora incorporé a un microcontrolador.

Pero hay una solución simple para esto. En lugar de usar el mismo byte una y otra vez para realizar un seguimiento del estado de encendido o apagado, se puede usar una serie de bytes que llenan todo el chip.

Necesita dos bytes para cada elemento de la matriz. Entonces, una EEPROM de 64 bytes, como la del PIC16F84A, podría contener 32 elementos. Cada vez que escribe en la EEPROM, escribe un 0 en el byte de estado (lo que significa que este elemento tiene datos) y un 0 en el byte de datos (el LED se apagó por última vez) o 0xFF (el LED se encendió por última vez). La próxima vez que acceda a la EEPROM, indexe los elementos hasta que encuentre uno con un byte de estado 0xFF y luego use ese elemento. Si no queda ninguno, reinicialice la EEPROM y comience de nuevo (para los PIC de gama baja, esto significa escribir 0xFF en cada uno de los bytes de estado; para el PIC24, hay un comando para borrar toda la EEPROM). Si necesita conocer el último estado del LED, indexe la matriz como antes, pero ahora retroceda un elemento y lea el byte de datos.

ingrese la descripción de la imagen aquí

Básicamente, esto divide el número de accesos a un solo byte por un factor de 16 para el PIC16F84A (16 y no 32 porque cada uno de los bytes de estado se escribe dos veces). Por lo tanto, podría manejar 16 millones de escrituras en total, suficiente para casi cuatro años de datos. Y el PIC12F635 con su EEPROM más grande pero una resistencia de bytes más pequeña de 100K, podría manejar 3,2 millones de escrituras en total, suficiente para nueve meses.

El PIC24F16KA102, con su EEPROM de 512 bytes y función de borrado masivo, podría manejar 25,6 millones de escrituras, suficiente para más de cinco años.

Si la tasa de parpadeo fue solo cuatro veces por hora en lugar de cuatro veces por minuto , esto significa un total de 70,080 escrituras por año. ¡Incluso el PIC12F635, con su resistencia de 100 000 escrituras por byte, duraría 45 años!

Puede abstenerse de escribir en EEPROM hasta después de una pérdida de energía. Los condensadores deben almacenar suficiente carga para mantener el uC funcionando el tiempo suficiente para escribir el estado actual. Esto podría aumentar en gran medida la longevidad de su EEPROM.
Además, ¿por qué no usar varios bits por byte? El primer byte almacena 7 bits de datos de conteo y 1 bit de datos de LED. La primera vez que escribe, establece el byte en 0000001L, luego en 0000010L, etc. Cuando llega a 1111111L, restablece el siguiente byte en ceros. Después de llegar al último byte, restablece el primer byte a cero. Luego, su próxima ubicación de lectura es el primer byte cuyos 7 bits principales son 0 < 7 bits <= 127, y la siguiente ubicación de escritura es el primer byte con 7 bits < 127. Ahora casi ha duplicado sus accesos porque (casi ) cada escritura es a un solo byte en lugar de dos.
@MichaelS También pensé en eso. Primero, no puede pasar de 11111110 a 11111101 porque no puede escribir 1 (invertí su condición inicial). En su lugar, escribiría 0, uno a la vez en el byte. Pero en realidad no sirve de nada en términos de limitar la cantidad de escrituras por byte: termina teniendo que escribir en cada byte ocho veces en lugar de una.
No he usado los dispositivos PIC exactos en cuestión, pero entiendo que borre todos los datos y luego cambie los bits que no deberían estar predeterminados de inmediato. Entonces, si "borrado" significa todos los 1, entonces borraría todo y cambiaría los bits 1-6 y posiblemente L. Luego, borraría todo y cambiaría los bits 1-5, 7, posiblemente L. Hacia el final de la cuenta , solo cambiaría algunos bits (1110110L -> 1110111L solo cambia los bits 4 y L). Debido a que hay un 50 % de probabilidad por borrado y un 50 % por escritura de que un bit dado se borre, es un promedio del 100 % u 8 bits por ciclo de borrado/escritura.
Con su método, todo el byte de estado se borra algún tiempo antes de su uso, luego se establece en cero en uso, o 16 bits por ciclo de borrado/escritura. Al mismo tiempo, todo su byte de datos tiene un 50 % de posibilidades de borrado, un 50 % de posibilidades de escritura o un promedio de 8 bits por ciclo de borrado/escritura. El total es entonces 24 bits por ciclo. Incluso si asumimos que cada ciclo de borrado/escritura es equivalente por byte, todavía son dos bytes cambiando en lugar de uno. (No se puede editar el comentario anterior, quise decir 50/50 por un bit determinado para cambiar , no borrar, en la última oración).
@MichaelS Erasing, que restablece todos los bytes en 0xff, ocurre solo después de que se hayan usado todos los bytes. Entonces, en una EEPROM de 256 bytes, el borrado ocurriría una vez cada 256 conteos. No necesita borrar antes de cada escritura en este esquema. Hay dos tipos de límites de "desgaste" en una EEPROM; uno a nivel de byte (llamado "resistencia") y el otro a nivel global debido a borrados. El último es típicamente 10 veces el primero.
Ambos PIC que vinculó se borran a nivel de byte cada vez que escribe. Consulte la página 13 (su enlace) y 93 (PIC12F635). No veo nada sobre un borrado global. De cualquier manera, sigue siendo un borrado, una escritura por escritura. No estoy seguro de por qué un borrado global sería menos exigente que un borrado local.
@MichaelS: gracias por las correcciones con respecto al borrado global. Basé mis cálculos en la resistencia de bytes de todos modos, así que no importa. Sin embargo, actualizaré mi respuesta para indicar que algunas EEPROM no requieren una operación de borrado por separado. (La familia PIC24F, por ejemplo, tiene una función de borrado masivo).

Esta puede ser una sugerencia muy ingenua ... pero ¿qué tal construir un pestillo de transistor de baja potencia impulsado por una batería de botón ? Luego use la salida de eso para alimentar un amplificador operacional que es impulsado por la fuente de alimentación . Así descargas la pila de botón del esfuerzo de alimentar la salida útil; no puedes usar eso de todos modos mientras el suministro está apagado, ¿verdad?

EDITAR: Además, de acuerdo con el comentario a continuación, es recomendable hacerlo de modo que el pestillo esté aislado del amplificador operacional si el suministro desaparece. Cualquier tipo de relé, o circuito equivalente, alimentado por el suministro debería poder hacer el trabajo allí.

Teniendo en cuenta que un simple reloj de pulsera puede funcionar con una pila de botón durante años, encender un pestillo simple debería darle una vida útil por pila de una década. Incluso puede poner dos baterías en paralelo para poder intercambiarlas, una a la vez, sin perder la información.

Hay muy pocos amplificadores operacionales disponibles que permitan un voltaje en la entrada más alto que el voltaje de suministro, lo que sería el caso durante el apagado.
Si ese es el caso, ¿no hay una manera de cerrar la entrada al amplificador operacional si el suministro desaparece, esencialmente aislando el pestillo? Cualquier tipo de relé, o circuito equivalente, funcionaría allí, ¿no es así?

Se puede programar un CPLD pequeño para controlar el protocolo necesario para escribir un conjunto simple de valores en un bus I2C.

NXP fabrica una gama de memorias muy pequeñas, destinadas a reemplazar los interruptores DIP, por ejemplo, PCA8550 / PCA9561.

Combine los dos y tendrá un interruptor de estado sólido muy pequeño que recuerda su estado.