Comment faire un circuit de mémoire permanente 1 bit?

13

Je voudrais faire un circuit simple pour stocker ou enregistrer 1 bit de données. Le circuit doit pouvoir se souvenir de l'état d'une LED (allumée ou éteinte) même si l'alimentation est déconnectée du circuit. J'en ai besoin pour fonctionner comme un disque dur, une mémoire flash ou une carte mémoire SD de téléphones portables.

J'ai fait un circuit comme indiqué sur l'image, la sortie est une LED en série avec une résistance de 470 ohms. J'utilise deux boutons de bush pour charger ou décharger le condensateur afin que la LED de sortie soit allumée ou éteinte.

Après avoir coupé l'alimentation ou coupé l'électricité, le circuit a pu se souvenir de l'état de la LED pendant quelques minutes.

Après 2 ou 3 minutes, le condensateur s'est complètement déchargé et le circuit a perdu ses données.

entrez la description de l'image ici Comment puis-je empêcher le condensateur de se décharger? ou comment puis-je ralentir la vitesse de décharge pour que le circuit perde ses données après une semaine ou plus?

Dans ce circuit, j'utilise 555 comme onduleur (pas de porte) mais je peux utiliser n'importe quel autre CI, mon objectif est simplement de créer une simple mémoire permanente.

Michael George
la source
1
Dans quelle mesure êtes-vous opposé à l'utilisation d'une pile bouton? Il n'y a aucun moyen de dupliquer une cellule EEPROM / flash / FRAM au niveau macro.
Ignacio Vazquez-Abrams
8
@ IgnacioVazquez-Abrams Vous pouvez utiliser un relais à verrouillage ...
helloworld922
2
@MichaelGeorge: Non, tout l'intérêt d'un relais à verrouillage est qu'il utilise un aimant permanent pour préserver son état sans l'application d'une alimentation externe. Vous avez juste besoin d'une impulsion électrique pour changer son état.
Dave Tweed
6
Vous pouvez obtenir un condensateur pour maintenir sa charge pendant une semaine avec une conception et une construction minutieuses
pjc50
3
Concernant la décharge des condensateurs: ils peuvent conserver la tension pendant une LONGUE durée, s'ils sont correctement déconnectés. robotroom.com/Capacitor-Self-Discharge-1.html
FarO

Réponses:

29

La mémoire électronique non volatile d' origine est basée sur des noyaux de ferrite. Bien qu'il soit relativement facile de magnétiser un tel noyau dans une direction ou dans l'autre pour stocker un ou un zéro, il faut des circuits assez sophistiqués pour le relire de manière fiable.

Les puces non volatiles modernes reposent sur le stockage des charges, mais pour que cela fonctionne, vous devez être en mesure de créer un condensateur qui n'a pratiquement aucune fuite et un moyen de lire cette charge. Cela ne peut se faire que dans le contexte de la microélectronique, où le condensateur est un minuscule morceau de métal (la "grille flottante") qui est complètement enveloppé dans du verre (dioxyde de silicium) et qui est lu au moyen de son influence sur un transistor à proximité. .

Un autre choix est la RAM ferrorélectrique (FRAM), qui utilise un matériau diélectrique spécial qui a deux états de polarisation stables et distincts. Encore une fois, cela ne fonctionne que dans la microélectronique.

Par conséquent, vous devez choisir un autre phénomène physique pour stocker votre information. Un choix évident est le relais de verrouillage, qui stocke les informations dans la position physique de son armature, qui est maintenue dans l'une des deux positions stables par un aimant permanent ou un ressort. La position peut être modifiée en appliquant une impulsion de courant relativement courte, et la lecture est réalisée en fixant des contacts électriques à l'armature.

Dave Tweed
la source
Puisque vous n'avez qu'un seul noyau, ne pourriez-vous pas le lire avec un capteur à effet Hall ou quelque chose?
user253751
1
@immibis: Pas facilement. Le champ magnétique est presque entièrement contenu dans le noyau lui-même, avec très peu de fuites externes.
Dave Tweed
8

Faire un circuit qui actionne un interrupteur mécanique, par exemple. boîte inutile. Le circuit devrait être alimenté pour changer / lire l'état mais il le garderait entre les deux.

JamesRyan
la source
6

Une solution simple serait un microcontrôleur tel qu'un PIC12F635 qui est disponible dans un DIP à 8 broches ou plus petit, et a une horloge intégrée et un circuit de réinitialisation de brunissement (ce dernier est important pour maintenir l'intégrité de l'EEPROM non volatile espace de rangement).

Le code requis n'est pas beaucoup, un bon projet de démarrage.

Les seules pièces externes requises seraient un condensateur de dérivation et une résistance de limitation de courant pour la LED.

La solution la plus simple est probablement un relais de signal à verrouillage à 2 bobines.

Spehro Pefhany
la source
6

L'électronique pure ne fera pas une cellule de mémoire permanente, mais la charge dans un condensateur peut s'en approcher (aura besoin d'un rafraîchissement régulier). La mémoire EEPROM / Flash étend cette exigence à 10 ans, donc pour des raisons pratiques, elle est appelée permanente. Mais ce n'est pas quelque chose que vous atteignez avec des composants ordinaires.

La vraie mémoire permanente utilise une sorte de phénomène physique bi-stable. L'aimantation des noyaux de ferrite mentionnée par Dave a été largement utilisée (vous avez déjà entendu parler d'un «core dump»?). Le relais bi-stable (ou à verrouillage) mentionné par helloworld922 est plus facile à utiliser.

Lorsque vous regardez comment cela a été fait dans les premiers ordinateurs, vous devez vous rendre compte qu'il existe un équilibre entre la complexité de la cellule unique et la complexité du circuit de conduite. Un noyau en ferrite est très simple, mais le circuit de pilotage et surtout le circuit de lecture est très complexe. Pour un relais bi-stable, c'est l'inverse: le relais est assez complexe par bit, mais le circuit de contrôle est très simple.

Quel est ton but?

  • Si vous voulez faire une seule cellule pour le plaisir, utilisez un relais bi-stable.

  • Si vous souhaitez démontrer comment cela se fait dans la pratique (DRAM / Flash) sans être pratique, utilisez une charge stockée dans un condensateur et actualisez-la régulièrement.

  • Si vous voulez faire quelque chose de pratique, utilisez un petit micro-contrôleur qui a une EEPROM intégrée (ou peut auto-programmer son FLASH).

Wouter van Ooijen
la source
5

Un fusible. Il peut être ennuyeux de le remplacer souvent, vous pouvez donc passer à un disjoncteur.

William Price
la source
5
C'est un peu mince pour une réponse sur EE.SE. Veuillez développer.
Nick Alexeev
2
Donc ... monte un 1 par défaut (le courant passera), pour mettre à zéro, vous envoyez une limace de courant à travers le fusible pour le faire sauter, maintenant le courant ne passera pas, pour remettre à 1, vous remplacez le fusible?
Michael
1
J'aime la pensée originale ici. Lorsque vous appuyez sur le bouton pour éteindre la LED, il déclenche le disjoncteur. Lorsque vous appuyez sur le bouton pour allumer la LED, il réinitialise le disjoncteur. C'est juste une version étrange du relais à verrouillage. Probablement pas la meilleure option, mais j'aime toujours la créativité.
MichaelS
1
Je faisais simplement référence au fonctionnement des premiers périphériques ROM. C'était une série de fusibles. Faites sauter les fusibles là où vous voulez des zéros. Je ne pensais pas que cela nécessiterait une analyse plus approfondie. Très old-school.
William Price
3

Solution pratique:

Un relais à verrouillage tel que mentionné par @DaveTweed est le plus simple.

Si vous voulez une solution à semi-conducteurs, vous pouvez utiliser un CI de mémoire d'interface parallèle comme celui-ci . Vous pouvez simplement lier les lignes d'adresse à une adresse fixe et utiliser uniquement l'une des lignes de données. Vous aurez besoin d'une logique de collage supplémentaire.

Solution intéressante:

Si vous cherchez un projet pour démontrer la mémoire, vous pouvez utiliser un solénoïde avec un noyau hystérétique. Saturer le noyau dans une direction pour stocker un 1, le saturer dans l'autre direction pour stocker un 0. Cela prend en charge les écritures.

Ensuite, montez-le juste au-dessus d'un capteur comme ce capteur à effet Hall . Ensuite, vous pouvez regarder la polarité du champ rémanent avec le capteur à effet Hall (juste un comparateur analogique) pour déterminer l'état.

Houston Fortney
la source
3

De la réponse fusible / disjoncteur donnée par William Price est venue la solution la plus évidente:

Un interrupteur.

Prenez une lampe. Branchez-le. Allumez-le. Débranchez-le. Déplacez-le à Hawaï. Branche le.
Il se rallume.

Éteignez-le. Débranchez-le. Ramène ça à la maison. Branchez-le.
Il reste éteint.

Si vous voulez qu'un ordinateur active / désactive la LED, ce n'est pas aussi utile. Cependant, si vous utilisez un interrupteur à bascule à bouton-poussoir et un solénoïde activé électroniquement, vous pourriez faire le travail. Appuyez sur le bouton pour allumer la LED, il active le solénoïde, la LED s'allume. Appuyez à nouveau, la LED s'éteint. Débranchez-le et le bouton est toujours activé ou désactivé mécaniquement.

Si vous vouliez conserver la fonctionnalité explicite "ceci si définitivement allumé, qui est définitivement éteint" (au lieu d'une bascule), vous pourriez avoir le bouton du haut activer un solénoïde qui appuie sur le haut d'un interrupteur à bascule. Ensuite, le bouton du bas active un deuxième solénoïde qui appuie sur le bas de l'interrupteur à bascule.

Ne pas dire que c'est à distance la meilleure façon de le faire, mais c'est fonctionnel.

MichaelS
la source
1
Tout ce que vous avez fait est de décrire comment construire un relais bistable, qui a été l'une des premières solutions proposées.
Dave Tweed
La deuxième partie, oui, n'est qu'une description d'un relais bistable maladroit, peut-être utile s'il est intéressé par la construction de son propre relais. Mais la première partie ne l'est pas. Je ne pense pas que cela corresponde à l'intention de la question (je suppose qu'il s'intéresse à l'apprentissage de l'électronique plutôt qu'à la construction de la conception la plus simple possible), mais un interrupteur à bascule unique est une conception plus simple et plus facile que les bits électroniques, et répond aux exigences données dans les deux premières phrases.
MichaelS
Vous avez peut-être raison, mais nous ne serons jamais sûrs car le PO n'est jamais revenu pour en discuter - bien qu'il ait «accepté» ma réponse. J'ai interprété l'intention générale de la question de faire référence à une mémoire réinscriptible électroniquement, basée sur "Le circuit devrait être capable de se souvenir de l'état d'une LED" . Cela exclurait la mémoire morte (commutateurs, cavaliers, diodes, etc.) et la mémoire à écriture unique (fusibles).
Dave Tweed
Ma pensée est que l'état de la LED est directement lié au bouton qui a été enfoncé en dernier. D'un point de vue logique, la capture de l'état des boutons est identique à la capture de l'état de la LED.
MichaelS
2

La solution à un composant la plus simple serait un relais bi-stable. Et vous n'aurez besoin que d'une résistance pour lire l'état.

Bruce
la source
2

Vous pouvez utiliser un microcontrôleur intégré à l'EEPROM. Le PIC16F84A 8 bits possède 64 octets d'EEPROM, ce qui est généralement bon pour 10 000 000 et un minimum de 1 000 000 d'écritures dans chaque octet (c'est ce que l'on appelle l'endurance des octets). Le PIC choisi dans une autre réponse, PIC12F635 a une EEPROM de 128 octets et une endurance d'octets de 100 000 écritures. Le PIC24F16KA102 , un processeur 16 bits, possède 512 octets d'EEPROM et également une endurance d'octets de 100 000 écritures.

L'OP n'indique pas à quelle fréquence la LED clignote. Aux fins de cette discussion, supposons qu'il s'agit de quatre fois par minute.

Dans un an, il clignotera

46024365=2,102,400 tjemes.

Étant donné que l'EEPROM doit capturer à la fois les derniers événements d'activation et de désactivation, elle sera écrite au double de ce nombre, soit environ 4,2 millions de fois . En cinq ans, c'est 21 millions de fois.

De toute évidence, cela dépassera les spécifications de toute EEPROM que j'ai maintenant intégrée dans un microcontrôleur.

Mais il existe une solution simple à cela. Au lieu d'utiliser le même octet encore et encore pour garder une trace de l'état activé ou désactivé, on peut utiliser un tableau d'octets, qui remplit la puce entière.

Vous avez besoin de deux octets pour chaque élément du tableau. Une EEPROM de 64 octets, comme celle du PIC16F84A, pourrait donc contenir 32 éléments. Chaque fois que vous écrivez dans l'EEPROM, vous écrivez un 0 à l'octet d'état (ce qui signifie que cet élément contient des données), et soit un 0 à l'octet de données (la LED était éteinte en dernier) ou un 0xFF (la LED était allumée en dernier). La prochaine fois que vous accédez à l'EEPROM, vous indexez les éléments jusqu'à ce que vous en trouviez un avec un octet d'état 0xFF, puis utilisez cet élément. S'il n'en reste plus, réinitialisez l'EEPROM et recommencez (pour les PIC bas de gamme, cela signifie écrire 0xFF dans chacun des octets d'état; pour le PIC24, il existe une commande pour effacer la totalité de l'EEPROM). Si vous avez besoin de connaître le dernier état de la LED, vous indexez le tableau comme précédemment, mais vous revenez maintenant à un élément et lisez l'octet de données.

entrez la description de l'image ici

Cela divise essentiellement le nombre d'accès à un seul octet par un facteur de 16 pour le PIC16F84A (16 et non 32 car chacun des octets d'état est écrit deux fois). Ainsi, il serait capable de gérer 16 millions d'écritures au total, assez pour près de quatre ans de données. Et le PIC12F635 avec sa plus grande EEPROM mais une endurance d'octets plus petite de 100K, serait capable de gérer 3,2 millions d'écritures au total, assez pour neuf mois.

Le PIC24F16KA102, avec son EEPROM de 512 octets et sa fonction d'effacement en masse, serait capable de gérer 25,6 millions d'écritures, ce qui est suffisant pour plus de cinq ans.

Si le taux de clignotement n'était que de quatre fois par heure au lieu de quatre fois par minute , cela signifie un total de 70 080 écritures par an. Même le PIC12F635, avec son endurance de 100 000 écritures par octet, durerait 45 ans!

tcrosley
la source
Vous pouvez vous abstenir d'écrire dans l'EEPROM jusqu'à une coupure de courant. Les condensateurs doivent stocker suffisamment de charge pour que l'UC fonctionne suffisamment longtemps pour écrire l'état actuel. Cela pourrait augmenter considérablement la longévité de votre EEPROM.
MichaelS
Aussi, pourquoi ne pas utiliser plusieurs bits par octet? Le premier octet stocke 7 bits de données de comptage et 1 bit de données LED. La première fois que vous écrivez, vous définissez l'octet sur 0000001L, puis 0000010L, etc. Lorsqu'il atteint 1111111L, vous réinitialisez l'octet suivant à tous les zéros. Après avoir atteint le dernier octet, vous remettez le premier octet à zéro. Ensuite, votre prochain emplacement de lecture est le premier octet dont les 7 premiers bits sont 0 <7 bits <= 127, et le prochain emplacement d'écriture est le premier octet avec 7 bits <127. Maintenant, vous avez presque doublé vos accès car (presque ) chaque écriture se fait sur un seul octet au lieu de deux.
MichaelS
@MichaelS J'y ai pensé aussi. Tout d'abord, vous ne pouvez pas passer de 11111110 à 11111101 car vous ne pouvez pas écrire de 1 (j'ai inversé votre condition de départ.) Au lieu de cela, vous écririez des 0, un à la fois dans l'octet. Mais cela ne fait pas vraiment de bien en termes de limitation du nombre d'écritures par octet - vous finissez par devoir écrire sur chaque octet huit fois au lieu d'une fois.
tcrosley
Je n'ai pas utilisé les périphériques PIC exacts en question, mais je crois comprendre que vous effacez toutes les données, puis modifiez immédiatement les bits qui ne devraient pas être par défaut. Donc, si "effacé" signifie tous les 1, vous effacez tout et changez les bits 1-6 et éventuellement L. Ensuite, vous effacez tout et changez les bits 1-5, 7, éventuellement L. Vers la fin du décompte , vous ne changeriez que quelques bits (1110110L -> 1110111L ne change que les bits 4 et L). Parce qu'il y a 50% de chances par effacement et 50% par écriture, pour un bit donné à effacer, c'est une moyenne de 100%, ou 8 bits par cycle d'effacement / écriture.
MichaelS
Avec votre méthode, l'octet d'état entier est effacé un certain temps avant utilisation, puis remis à zéro lors de l'utilisation, ou 16 bits par cycle d'effacement / écriture. Dans le même temps, l'ensemble de vos octets de données a 50% de chances par effacement, 50% de chances par écriture ou une moyenne de 8 bits par cycle d'effacement / écriture. Le total est alors de 24 bits par cycle. Même si nous supposons que chaque cycle d'effacement / écriture est équivalent par octet, c'est toujours deux octets qui changent au lieu d'un. (Impossible de modifier le commentaire ci-dessus, je voulais dire 50/50 pour un bit donné à changer , pas effacé, dans la dernière phrase.)
MichaelS
2

Cela peut être une suggestion très naïve ... mais que diriez-vous de construire un verrou de transistor de faible puissance entraîné par une pile bouton . Utilisez ensuite la sortie de celle-ci pour alimenter un ampli-OP alimenté par l'alimentation . De cette façon, vous déchargez la pile bouton de la tension d'alimentation de la sortie utile; vous ne pouvez pas l'utiliser de toute façon lorsque l'alimentation est coupée, non?

EDIT: Aussi - selon le commentaire ci-dessous - il est conseillé de faire en sorte que le loquet soit isolé de l'ampli OP en cas de coupure de l'alimentation. Tout type de relais - ou circuit équivalent - alimenté par l'alimentation doit pouvoir y effectuer le travail.

Étant donné qu'une simple montre-bracelet peut être entraînée par une pile bouton pendant des années, alimenter un simple verrou devrait lui donner une durée de vie par pile qui dure une décennie. Vous pouvez même mettre deux batteries en parallèle afin de pouvoir les échanger - une à la fois - sans perdre les informations.

MichaelK
la source
Il n'y a que très peu d'amplificateurs opérationnels disponibles qui permettent une tension à l'entrée supérieure à la tension d'alimentation, ce qui serait le cas lors de l'arrêt.
Arsenal le
Si tel est le cas, n'y a-t-il pas un moyen de couper l'entrée de l'ampli-OP si l'alimentation disparaît, isolant essentiellement le loquet? N'importe quel type de relais - ou circuit équivalent - ferait l'affaire, n'est-ce pas?
MichaelK
0

Un petit CPLD peut être programmé pour piloter le protocole nécessaire à l'écriture d'un simple ensemble de valeurs sur un bus I2C.

NXP fabrique une gamme de très petites mémoires, destinées à remplacer les commutateurs DIP, par exemple PCA8550 / PCA9561.

Combinez les deux et vous avez un très petit commutateur à semi-conducteurs qui se souvient de son état.

Jason Morgan
la source