Come realizzare un circuito di memoria permanente a 1 bit?


13

Vorrei creare un semplice circuito per archiviare o salvare 1 bit di dati. Il circuito dovrebbe essere in grado di ricordare lo stato di un LED (acceso o spento) anche se l'alimentazione è scollegata dal circuito. Ne ho bisogno per funzionare come un disco rigido, una memoria flash o una scheda di memoria SD dei telefoni cellulari.

Ho realizzato un circuito come mostrato in figura, L'uscita è un LED in serie con resistenza da 470 ohm. Uso due pulsanti a bussola per caricare o scaricare il condensatore in modo che il LED di uscita sia acceso o spento.

Dopo aver scollegato l'alimentazione o spento l'elettricità, il circuito è stato in grado di ricordare lo stato del LED per alcuni minuti.

Dopo 2 o 3 minuti, il condensatore si è scaricato completamente e il circuito ha perso i suoi dati.

inserisci qui la descrizione dell'immagine Come posso impedire al condensatore di scaricarsi? o come posso rallentare la velocità di scarica in modo che il circuito perda i suoi dati dopo una settimana o più?

In questo circuito utilizzo 555 come inverter (non gate) ma posso usare qualsiasi altro circuito integrato, il mio obiettivo è semplicemente quello di creare una semplice memoria permanente.


1
Quanto sei contrario all'utilizzo di una cella a bottone? Non è possibile duplicare una cella EEPROM / flash / FRAM a livello macro.
Ignacio Vazquez-Abrams,

8
@ IgnacioVazquez-Abrams Potresti usare un relè di ritenuta ...
helloworld922

2
@MichaelGeorge: No, il punto cruciale di un relè a ritenuta è che utilizza un magnete permanente per preservare il suo stato senza l'applicazione di energia esterna. Hai solo bisogno di un impulso di elettricità per cambiarne lo stato.
Dave Tweed

6
È possibile ottenere un condensatore per mantenere la carica per una settimana con una progettazione e una costruzione accurate
pjc50

3
Riguardo alla scarica del condensatore: possono mantenere la tensione per un LUNGO tempo, se correttamente scollegati. robotroom.com/Capacitor-Self-Discharge-1.html
FarO

Risposte:


29

La memoria elettronica non volatile originale si basa su nuclei di ferrite. Mentre è relativamente facile magnetizzare un tale nucleo in una direzione o nell'altra per memorizzarne uno o uno zero, sono necessari alcuni circuiti abbastanza sofisticati per rileggerlo in modo affidabile.

I chip non volatili moderni si basano sull'archiviazione della carica, ma per far funzionare tutto ciò, è necessario essere in grado di creare un condensatore con una perdita sostanzialmente pari a zero e un modo per leggere tale carica. Questo può essere fatto solo nel contesto della microelettronica, in cui il condensatore è un minuscolo pezzo di metallo (il "gate flottante") che è completamente racchiuso nel vetro (biossido di silicio) e viene letto mediante la sua influenza su un transistor vicino .

Un'altra scelta è la RAM ferrorelettrica (FRAM), che utilizza uno speciale materiale dielettrico con due stati di polarizzazione distinti e stabili. Ancora una volta, questo funziona solo in microelettronica.

Pertanto, è necessario scegliere qualche altro fenomeno fisico per memorizzare le informazioni. Una scelta ovvia è il relè a ritenuta, che memorizza le informazioni nella posizione fisica della sua armatura, che è tenuto in una delle due posizioni stabili da un magnete permanente o da una molla. La posizione può essere cambiata applicando un impulso di corrente relativamente breve e la lettura si ottiene collegando i contatti elettrici all'armatura.



Dato che hai un solo core, non potresti leggerlo con un sensore ad effetto Hall o qualcosa del genere?
user253751

1
@immibis: non facilmente. Il campo magnetico è quasi completamente contenuto all'interno del nucleo stesso, con perdite esterne minime.
Dave Tweed

8

Crea un circuito che aziona un interruttore meccanico, ad es. scatola inutile. Il circuito dovrebbe essere alimentato per cambiare / leggere lo stato ma lo manterrebbe nel mezzo.


6

Una soluzione semplice sarebbe un microcontrollore come un PIC12F635 che è disponibile in un DIP a 8 pin o più piccolo, e ha un orologio incorporato e un circuito di reset brown-out (quest'ultimo è importante per mantenere l'integrità della EEPROM non volatile Conservazione).

Il codice richiesto non è molto, un buon progetto di partenza.

Le uniche parti esterne richieste sarebbero un condensatore di bypass e una resistenza di limitazione della corrente per il LED.

La soluzione più semplice è probabilmente un relè di segnale a ritenuta a 2 bobine.


6

L'elettronica pura non crea una cella di memoria permanente, ma la carica in un condensatore può avvicinarsi (avrà bisogno di un aggiornamento periodico). La memoria EEPROM / Flash estende questo requisito a 10 anni, quindi per scopi pratici si chiama permanente. Ma questo non è qualcosa che raggiungi con componenti ordinari.

La vera memoria permanente utilizza una sorta di fenomeno fisico stabile. La magnetizzazione dei nuclei di ferrite menzionata da Dave è stata ampiamente utilizzata (mai sentito parlare di una "discarica di nucleo"?). Il relè bi-stabile (o aggancio) menzionato da helloworld922 è più facile da usare.

Quando osservi come ciò è stato fatto nei primi computer, devi capire che esiste un equilibrio tra la complessità della singola cella e la complessità del circuito di pilotaggio. Un nucleo di ferrite è molto semplice, ma il circuito di guida e in particolare il circuito di lettura è molto complesso. Per un relè bi-stabile è l'opposto: il relè è abbastanza complesso per bit, ma i circuiti di controllo sono molto semplici.

Qual'e 'il tuo scopo?

  • Se vuoi creare una cella solo per divertimento, usa un relè bi-stabile.

  • Se vuoi dimostrare come è fatto in pratica (DRAM / Flash) senza essere pratico, usa una carica memorizzata in un condensatore e aggiornala regolarmente.

  • Se vuoi fare qualcosa di pratico, usa un piccolo micro-controller con EEPROM incorporata (o può auto-programmare il suo FLASH).


5

Un fuso. Potrebbe essere fastidioso sostituirlo spesso, quindi potresti passare a un interruttore.


5
Questo è un po 'sottile per una risposta su EE.SE. Per favore, elabora.
Nick Alexeev

2
Quindi ... arriva un 1 di default (la corrente passerà), per impostare uno zero, si invia una lumaca di corrente attraverso il fusibile per soffiarlo, ora la corrente non passerà, per impostare di nuovo su 1, si sostituisce la miccia?
Michael,

1
Mi piace pensare fuori dagli schemi qui. Quando si preme il pulsante per spegnere il LED, fa scattare l'interruttore. Quando si preme il pulsante per accendere il LED, ripristina l'interruttore. È solo una versione strana del relè di ritenuta. Probabilmente non è l'opzione migliore, ma mi piace ancora la creatività.
MichaelS,

1
Mi riferivo semplicemente a come funzionavano i primi dispositivi ROM. Erano una serie di micce. Soffia i fusibili dove vuoi gli zeri. Non pensavo che avrebbe richiesto approfondimenti. Molto vecchia scuola.
William Price,

3

Soluzione pratica:

Un relè di blocco, come indicato da @DaveTweed, è il più semplice.

Se si desidera una soluzione a stato solido, è possibile utilizzare un CI di memoria con interfaccia parallela come questa . Puoi semplicemente collegare le righe dell'indirizzo a un indirizzo fisso e utilizzare solo una delle righe dei dati. Avrai bisogno di una logica di colla aggiuntiva.

Soluzione interessante:

Se stai cercando un progetto per dimostrare la memoria, allora potresti usare un solenoide con un nucleo isteretico. Saturare il nucleo in una direzione per memorizzare un 1, saturarlo nell'altra direzione per memorizzare uno 0. Questo si occupa delle scritture.

Quindi montalo appena sopra un sensore come questo sensore hall . Quindi puoi guardare la polarità del campo residuo con il sensore di hall (solo un comparatore analogico) per determinare lo stato.


3

Dalla risposta miccia / interruttore fornita da William Price è arrivata la soluzione più ovvia:

Un interruttore.

Prendi una lampada. Collegalo. Accendilo. Scollegalo. Spostalo alle Hawaii. Collegalo.
Si riaccende.

Spegnilo. Scollegalo. Porta a casa. Collegalo.
Rimane spento.

Se vuoi che un computer attivi / disattivi il LED, non è altrettanto utile. Tuttavia, se si utilizza un interruttore a levetta a pulsante e un solenoide attivato elettronicamente, è possibile eseguire il lavoro. Premere il pulsante per accendere il LED, si attiva il solenoide, il LED si accende. Premere di nuovo, il LED si spegne. Scollegalo e il pulsante è ancora impostato meccanicamente su on o off.

Se si desidera mantenere la funzionalità esplicita "this if if on, that is definit off" (anziché un interruttore), è possibile che il pulsante superiore attivi un solenoide che preme sulla parte superiore di un interruttore a levetta. Quindi il pulsante in basso attiva un secondo solenoide che preme la parte inferiore dell'interruttore a vibrazione.

Non dire questo è in remoto il modo migliore per farlo, ma è funzionale.


1
Tutto quello che hai fatto è descrivere come costruire un relè bistabile, che è stata una delle prime soluzioni proposte.
Dave Tweed

La seconda parte, sì, è solo una descrizione di un grosso relè bi-stabile, forse utile se è interessato a costruire il proprio relè. La prima parte, tuttavia, non lo è. Non penso che corrisponda all'intenzione della domanda (presumo sia interessato all'apprendimento dell'elettronica piuttosto che alla costruzione del design più semplice possibile), ma un singolo interruttore a levetta è un design più semplice e più semplice rispetto ai bit elettronici e soddisfa i requisiti indicati in le prime frasi di coppia.
MichaelS,

Forse hai ragione, ma non saremo mai sicuri poiché l'OP non è mai tornato per discuterne, anche se ha "accettato" la mia risposta. Ho interpretato l'intento generale della domanda di fare riferimento alla memoria riscrivibile elettronicamente, basata su "Il circuito dovrebbe essere in grado di ricordare lo stato di un LED" . Ciò escluderebbe la memoria di sola lettura (interruttori, jumper, diodi, ecc.) E la memoria di scrittura singola (fusibili).
Dave Tweed

Il mio pensiero è che lo stato del LED sia direttamente correlato a quale pulsante è stato premuto per ultimo. Da un punto di vista logico, catturare lo stato dei pulsanti è identico a catturare lo stato del LED.
MichaelS,

2

La soluzione monocomponente più semplice sarebbe un relè bi-stabile. E avrai solo bisogno di un resistore per leggere lo stato.


2

È possibile utilizzare un microcontrollore che ha incorporato EEPROM. Il PIC16F84A a 8 bit ha 64 byte di EEPROM, il che è buono per 10.000.000 e un minimo di 1.000.000 di scritture per ogni byte (questo è noto come resistenza dei byte). Il PIC scelto in un'altra risposta, PIC12F635 ha una EEPROM a 128 byte e una durata in byte di 100.000 scritture. Il PIC24F16KA102 , un processore a 16 bit, ha 512 byte di EEPROM e una durata in byte di 100.000 scritture.

L'OP non indica la frequenza con cui il LED lampeggerà. Ai fini di questa discussione, supponiamo che sia quattro volte al minuto.

Tra un anno lampeggerà

46024365=2,102,400 times.

Poiché la EEPROM deve acquisire sia gli eventi on che off ultimi, verrà scritta per il doppio di quel numero, ovvero circa 4,2 milioni di volte . In cinque anni, questo è 21 milioni di volte.

Chiaramente, questo supererà le specifiche di qualsiasi EEPROM che ora ho incorporato in un microcontrollore.

Ma c'è una soluzione semplice per questo. Invece di usare ripetutamente lo stesso byte per tenere traccia dello stato on o off, si può usare una matrice di byte, che riempie l'intero chip.

Sono necessari due byte per ciascun elemento dell'array. Quindi una EEPROM a 64 byte, come quella nel PIC16F84A, potrebbe contenere 32 elementi. Ogni volta che si scrive nella EEPROM, si scrive uno 0 nel byte di stato (nel senso che questo elemento ha dati) e uno 0 nel byte di dati (il LED era spento per ultimo) o uno 0xFF (il LED era acceso per ultimo). La prossima volta che si accede alla EEPROM, si indicizza attraverso gli elementi fino a quando non si trova uno con un byte di stato 0xFF, quindi si utilizza quell'elemento. Se non ne è rimasto nessuno, quindi reinizializzare la EEPROM e ricominciare (per i PIC di fascia bassa, questo significa scrivere 0xFF su ciascuno dei byte di stato; per il PIC24, c'è un comando per cancellare l'intera EEPROM). Se è necessario conoscere l'ultimo stato del LED, indicizzare l'array come prima, ma ora tornare indietro di un elemento e leggere il byte di dati.

inserisci qui la descrizione dell'immagine

Ciò sostanzialmente divide il numero di accessi a un singolo byte per un fattore 16 per PIC16F84A (16 e non 32 perché ciascuno dei byte di stato viene scritto su due volte). Quindi sarebbe in grado di gestire un totale di 16 milioni di scritture, sufficienti per quasi quattro anni di dati. E il PIC12F635 con la sua EEPROM più grande ma una minore durata dei byte di 100K, sarebbe in grado di gestire un totale di 3,2 milioni di scritture, sufficienti per nove mesi.

PIC24F16KA102, con la sua EEPROM da 512 byte e la funzione di cancellazione in blocco, sarebbe in grado di gestire 25,6 milioni di scritture, sufficienti per oltre cinque anni.

Se la frequenza di lampeggiamento era solo quattro volte all'ora anziché quattro volte al minuto , ciò significa un totale di 70.080 scritture all'anno. Anche il PIC12F635, con la sua resistenza di 100.000 scritture per byte, durerebbe 45 anni!


Si potrebbe astenersi dallo scrivere su EEPROM fino a dopo una perdita di potere. I condensatori dovrebbero immagazzinare una carica sufficiente per mantenere l'UC in funzione abbastanza a lungo da scrivere lo stato corrente. Ciò potrebbe aumentare notevolmente la longevità della tua EEPROM.
MichaelS,

Inoltre, perché non utilizzare più bit per byte? Il primo byte memorizza 7 bit di dati di conteggio e 1 bit di dati LED. La prima volta che si scrive, si imposta il byte su 0000001L, quindi su 0000010L, ecc. Quando raggiunge 1111111L, si reimposta il byte successivo su tutti gli zero. Dopo aver raggiunto l'ultimo byte, si reimposta il primo byte a zero. Quindi la tua prossima posizione di lettura è il primo byte i cui primi 7 bit sono 0 <7-bit <= 127, e la prossima posizione di scrittura è il primo byte con 7-bit <127. Ora hai quasi raddoppiato i tuoi accessi perché (quasi ) ogni scrittura è su un singolo byte anziché su due.
MichaelS,

@MichaelS Ci ho pensato anche io. Innanzitutto, non puoi passare da 11111110 a 11111101 perché non puoi scrivere 1 (ho invertito la tua condizione iniziale). Invece, dovresti scrivere 0, uno alla volta attraverso il byte. Ma in realtà non serve a nulla in termini di limitazione del numero di scritture per byte: alla fine devi scrivere su ogni byte otto volte anziché una volta.
Tcrosley,

Non ho usato gli esatti dispositivi PIC in questione, ma la mia comprensione è che tu cancelli tutti i dati, quindi cambi tutti i bit che non dovrebbero essere predefiniti in una volta. Quindi se "cancellato" significa tutti 1, allora cancelleresti tutto e cambieresti bit 1-6 e possibilmente L. Successivamente, cancelleresti tutto e cambieresti bit 1-5, 7, possibilmente L. Verso la fine del conteggio , cambieresti solo alcuni bit (1110110L -> 1110111L cambia solo i bit 4 e L). Perché c'è una probabilità del 50% per cancellazione e del 50% per scrittura, per un dato bit da cancellare, è una media del 100%, o 8 bit per ciclo di cancellazione / scrittura.
MichaelS,

Con il tuo metodo, l'intero byte di stato viene cancellato un po 'di tempo prima dell'uso, quindi impostato su zero all'utilizzo o su 16 bit per ciclo di cancellazione / scrittura. Allo stesso tempo, l'intero byte di dati ha una probabilità del 50% per cancellazione, una probabilità del 50% per scrittura o una media di 8 bit per ciclo di cancellazione / scrittura. Il totale è quindi di 24 bit per ciclo. Anche se supponiamo che ogni ciclo di cancellazione / scrittura sia equivalente per byte, cambiano comunque due byte anziché uno. (Non posso modificare il commento sopra, volevo dire 50/50 per un dato bit per essere cambiato , non cancellato, nell'ultima frase.)
MichaelS

2

Questo potrebbe essere un suggerimento molto ingenuo ... ma che ne dici di costruire un dispositivo di chiusura a transistor a bassa potenza azionato da una batteria a bottone . Quindi utilizzare l'uscita da quella per alimentare un OP-amp che è alimentato dall'alimentatore . In questo modo si scarica la batteria a bottone della tensione di alimentare l'output utile; non puoi usarlo comunque mentre l'alimentazione è spenta, giusto?

EDIT: Inoltre - secondo il commento qui sotto - è consigliabile farlo in modo che il latch sia isolato dall'amplificatore OP se l'alimentazione scompare. Qualsiasi tipo di relè - o circuito equivalente - che viene alimentato dall'alimentazione dovrebbe essere in grado di svolgere lì il lavoro.

Considerando che un semplice orologio da polso può essere azionato da una batteria a bottone per anni, alimentare un semplice fermo dovrebbe dargli una durata per batteria che dura un decennio. Puoi anche mettere due batterie in parallelo in modo da poterle sostituire, una alla volta, senza perdere le informazioni.


Sono disponibili solo pochissimi amplificatori operazionali che consentono una tensione in ingresso superiore alla tensione di alimentazione, come nel caso dell'arresto.
Arsenal,

In tal caso, non esiste un modo per disattivare l'ingresso dell'amplificatore operazionale se l'alimentazione scompare, essenzialmente isolando il fermo? Qualsiasi tipo di relè - o circuito equivalente - farebbe il trucco lì, no?
MichaelK,

0

Un piccolo CPLD può essere programmato per pilotare il protocollo necessario per scrivere un semplice set di valori su un bus I2C.

NXP crea una gamma di memorie molto piccole, destinate a sostituire i dip switch, ad esempio PCA8550 / PCA9561.

Combina i due e hai un interruttore a stato solido molto piccolo che ricorda il suo stato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.