Wie erstelle ich eine 1-Bit-Permanentspeicherschaltung?

Ich möchte eine einfache Schaltung zum Speichern oder Speichern von 1 Datenbit erstellen. Die Schaltung sollte in der Lage sein, sich den Zustand einer LED (an oder aus) zu merken, auch wenn die Versorgung von der Schaltung getrennt ist. Ich brauche es, um wie eine Festplatte, ein Flash-Speicher oder eine SD-Speicherkarte von Mobiltelefonen zu funktionieren.

Ich habe eine Schaltung wie im Bild gezeigt, Der Ausgang ist eine LED in Reihe mit einem 470-Ohm-Widerstand. Ich verwende zwei Buschtasten, um den Kondensator zu laden oder zu entladen, damit die Ausgangs-LED ein- oder ausgeschaltet ist.

Nach dem Trennen der Versorgung oder dem Ausschalten des Stroms konnte sich die Schaltung den Zustand der LED für einige Minuten merken.

Nach 2 oder 3 Minuten war der Kondensator vollständig entladen und die Schaltung verlor ihre Daten.

Geben Sie hier die Bildbeschreibung einWie kann ich verhindern, dass sich der Kondensator entlädt? oder wie kann ich die Entladerate verlangsamen, so dass die Schaltung nach einer Woche oder länger ihre Daten verliert?

In dieser Schaltung verwende ich 555 als Inverter (nicht als Gate), aber ich kann andere ICs verwenden. Mein Ziel ist es, nur einen einfachen permanenten Speicher zu erstellen.

Wie abgeneigt sind Sie der Verwendung einer Knopfzelle? Es gibt keine Möglichkeit, eine EEPROM/Flash/FRAM-Zelle auf Makroebene zu duplizieren.
@IgnacioVazquez-Abrams Sie könnten ein Verriegelungsrelais verwenden ...
@IgnacioVazquez-Abrams Ich möchte nichts duplizieren, ich möchte wissen, wie es funktioniert, und eine einfache Speicherzelle erstellen. oder etwas, das die gleiche Aufgabe einer Speicherzelle erledigt. Nur um Elektronik zu lernen
Eine Speicherzelle ist einfach. Eine nichtflüchtige Speicherzelle ist es nicht.
@MichaelGeorge: Nein, der springende Punkt bei einem Verriegelungsrelais ist, dass es einen Permanentmagneten verwendet, um seinen Zustand ohne das Anlegen von externer Energie beizubehalten. Sie brauchen nur einen Stromimpuls, um seinen Zustand zu ändern.
Mit sorgfältigem Design und Konstruktion können Sie einen Kondensator dazu bringen, seine Ladung eine Woche lang zu halten: m.electronicdesign.com/analog/…
In Bezug auf die Kondensatorentladung: Sie können die Spannung für eine LANGE Zeit halten, wenn sie ordnungsgemäß getrennt werden. robotroom.com/Capacitor-Self-Discharge-1.html
Einer der frühesten elektronischen Computer, der Atanasoff-Berry Computer , verwendete Kondensatoren im allerersten DRAM. Sie waren auf einem Trommelpaar montiert, das sich drehte, um sie nacheinander mit Kontaktsätzen zum Schreiben, Lesen und Auffrischen (einmal pro Sekunde) zu verbinden.

Antworten (11)

Der ursprüngliche elektronische nichtflüchtige Speicher basiert auf Ferritkernen. Während es relativ einfach ist, einen solchen Kern in die eine oder andere Richtung zu magnetisieren, um eine Eins oder eine Null zu speichern, sind einige ziemlich ausgeklügelte Schaltkreise erforderlich, um sie zuverlässig zurückzulesen.

Moderne nichtflüchtige Chips sind auf Ladungsspeicherung angewiesen, aber damit dies funktioniert, müssen Sie in der Lage sein, einen Kondensator zu schaffen, der im Wesentlichen keine Leckage aufweist, und eine Möglichkeit, diese Ladung auszulesen. Dies ist nur im Rahmen der Mikroelektronik möglich, wo der Kondensator ein winziges Stück Metall ist (das "schwebende Gate"), das vollständig in Glas (Siliziumdioxid) eingeschlossen ist und durch seinen Einfluss auf einen nahe gelegenen Transistor ausgelesen wird .

Eine andere Wahl ist ferroelektrischer RAM (FRAM), der ein spezielles dielektrisches Material verwendet, das zwei unterschiedliche, stabile Polarisationszustände aufweist. Auch dies funktioniert nur in der Mikroelektronik.

Daher müssen Sie ein anderes physikalisches Phänomen auswählen, um Ihre Informationen zu speichern. Eine offensichtliche Wahl ist das Stromstoßrelais, das Informationen in der physikalischen Position seines Ankers speichert, der durch einen Permanentmagneten oder eine Feder in einer von zwei stabilen Positionen gehalten wird. Die Position kann durch Anlegen eines relativ kurzen Stromimpulses geändert werden, und das Auslesen erfolgt durch Anbringen elektrischer Kontakte am Anker.

Da Sie nur einen Kern haben, könnten Sie ihn nicht mit einem Hall-Effekt-Sensor oder so lesen?
@immibis: Nicht leicht. Das Magnetfeld ist fast vollständig im Kern selbst enthalten, mit sehr geringer externer Streuung.

Machen Sie eine Schaltung, die einen mechanischen Schalter umlegt, z. nutzlose Kiste. Die Schaltung müsste eingeschaltet werden, um den Zustand zu ändern / zu lesen, aber sie würde ihn dazwischen halten.

Reine Elektronik stellt keine permanente Speicherzelle her, aber die Ladung in einem Kondensator kann sich ihr annähern (muss regelmäßig aufgefrischt werden). EEPROM/Flash-Speicher erweitert diese Anforderung auf 10 Jahre, daher wird er für praktische Zwecke als permanent bezeichnet. Aber das ist nicht etwas, was Sie mit gewöhnlichen Komponenten erreichen können.

Ein echter permanenter Speicher verwendet eine Art physikalisches bistabiles Phänomen. Die von Dave erwähnte Magnetisierung von Ferritkernen wurde ausgiebig verwendet (jemals von einem „Core Dump“ gehört?). Das von helloworld922 erwähnte bistabile (oder selbsthaltende) Relais ist einfacher zu verwenden.

Wenn Sie sich ansehen, wie dies in frühen Computern gemacht wurde, müssen Sie erkennen, dass es ein Gleichgewicht zwischen der Komplexität der einzelnen Zelle und der Komplexität der Treiberschaltung gibt. Ein Ferritkern ist sehr einfach, aber die Ansteuerung und insbesondere die Ausleseschaltung ist sehr komplex. Bei einem bistabilen Relais ist es umgekehrt: Das Relais ist pro Bit ziemlich komplex, aber die Steuerschaltung ist sehr einfach.

Was ist dein Zweck?

  • Wenn Sie nur zum Spaß eine Zelle herstellen möchten, verwenden Sie ein bistabiles Relais.

  • Wenn Sie zeigen möchten, wie es in der Praxis (DRAM/Flash) funktioniert, ohne praktisch zu sein, verwenden Sie eine in einem Kondensator gespeicherte Ladung und aktualisieren Sie sie regelmäßig.

  • Wenn Sie etwas Praktisches machen wollen, verwenden Sie einen kleinen Mikrocontroller mit eingebautem EEPROM (oder kann sein FLASH selbst programmieren).

Eine Sicherung. Es kann lästig sein, es oft auszutauschen, also könnten Sie auf einen Unterbrecher aufrüsten.

Dies ist ein bisschen dünn für eine Antwort auf EE.SE . Bitte näher erläutern.
Also ... kommt standardmäßig eine 1 (Strom wird durchgelassen), um auf Null zu setzen, senden Sie einen Stromstoß durch die Sicherung, um sie durchzubrennen, jetzt fließt kein Strom, um wieder auf 1 zu setzen, ersetzen Sie die Sicherung?
Ich mag das Out-of-the-Box-Denken hier. Wenn Sie die Taste drücken, um die LED auszuschalten, wird der Unterbrecher ausgelöst. Wenn Sie die Taste drücken, um die LED einzuschalten, wird der Unterbrecher zurückgesetzt. Es ist nur eine seltsame Version des Verriegelungsrelais. Wahrscheinlich nicht die beste Option, aber ich genieße immer noch die Kreativität.
Ich bezog mich einfach darauf, wie frühe ROM-Geräte funktionierten. Sie waren eine Reihe von Sicherungen. Brennen Sie die Sicherungen durch, wo Sie Nullen wollen. Ich dachte nicht, dass es eine tiefere Einsicht erfordern würde. Sehr altmodisch.

Eine einfache Lösung wäre ein Mikrocontroller wie ein PIC12F635 , der in einem 8-Pin-DIP oder kleiner erhältlich ist und über eine eingebaute Uhr und eine Brown-Out-Reset-Schaltung verfügt (letztere ist wichtig, um die Integrität des nichtflüchtigen EEPROM aufrechtzuerhalten Lagerung).

Der erforderliche Code ist nicht viel, ein gutes Starterprojekt.

Die einzigen erforderlichen externen Teile wären ein Überbrückungskondensator und ein Strombegrenzungswiderstand für die LED.

Die einfachste Lösung ist wohl ein 2-Spulen-Signalrelais.

Praktische Lösung:

Ein Verriegelungsrelais, wie von @DaveTweed erwähnt, ist das einfachste.

Wenn Sie eine Solid-State-Lösung wünschen, können Sie einen Speicher-IC mit paralleler Schnittstelle wie dieses Ding verwenden . Sie können die Adressleitungen einfach an eine feste Adresse binden und nur eine der Datenleitungen verwenden. Sie benötigen zusätzliche Klebelogik.

Interessante Lösung:

Wenn Sie nach einem Projekt suchen, um den Speicher zu demonstrieren, können Sie eine Magnetspule mit einem hysteretischen Kern verwenden. Sättigen Sie den Kern in einer Richtung, um eine 1 zu speichern, sättigen Sie ihn in der anderen Richtung, um eine 0 zu speichern. Das kümmert sich um Schreibvorgänge.

Montieren Sie das dann direkt über einem Sensor wie diesem Hallsensor . Dann können Sie mit dem Hallsensor (nur ein analoger Komparator) die Polarität des remanenten Feldes betrachten, um den Zustand zu bestimmen.

Aus der Antwort von William Price auf Sicherung/Unterbrecher ergab sich die naheliegendste Lösung:

Ein Schalter.

Nimm eine Lampe. Schließen Sie es an. Schalten Sie es ein. Steck es aus. Bewegen Sie es nach Hawaii. Schließen Sie es an.
Es schaltet sich wieder ein.

Schalte es aus. Steck es aus. Nimm es mit nach Hause. Stecken Sie es ein.
Es bleibt ausgeschaltet.

Wenn Sie möchten, dass ein Computer die LED aktiviert / deaktiviert, ist dies nicht so hilfreich. Wenn Sie jedoch einen Druckknopf-Kippschalter und ein elektronisch aktiviertes Solenoid verwenden, könnten Sie die Arbeit erledigen. Drücken Sie die Taste, um die LED einzuschalten, sie aktiviert das Solenoid, die LED schaltet sich ein. Nochmals drücken, LED erlischt. Trennen Sie es, und die Taste ist immer noch mechanisch auf Ein oder Aus eingestellt.

Wenn Sie die explizite Funktion „dies, wenn definitiv an, das ist definitiv aus“ (anstelle eines Umschalters) beibehalten möchten, können Sie mit der oberen Taste einen Magneten aktivieren, der auf die Oberseite eines Kippschalters drückt. Dann aktiviert die untere Taste ein zweites Solenoid, das die Unterseite des Kippschalters drückt.

Ich sage nicht, dass dies der beste Weg ist, es zu tun, aber es ist funktional.

Sie haben lediglich beschrieben, wie man ein bistabiles Relais baut, was eine der ersten vorgeschlagenen Lösungen war.
Der zweite Teil, ja, ist nur eine Beschreibung eines klobigen bistabilen Relais, vielleicht nützlich, wenn er daran interessiert ist, sein eigenes Relais zu bauen. Der erste Teil jedoch nicht. Ich denke nicht, dass es der Absicht der Frage entspricht (ich nehme an, er ist eher daran interessiert, Elektronik zu lernen als das einfachst mögliche Design zu bauen), aber ein einzelner Kippschalter ist ein einfacheres, einfacheres Design als elektronische Bits und erfüllt die angegebenen Anforderungen in die ersten paar Sätze.
Sie mögen Recht haben, aber wir werden es nie sicher sein, da das OP nie zurückgekommen ist, um es zu besprechen - obwohl er meine Antwort "akzeptiert" hat. Ich habe die allgemeine Absicht der Frage so interpretiert, dass sie sich auf elektronisch wiederbeschreibbaren Speicher bezieht, basierend auf "Die Schaltung sollte in der Lage sein, sich an den Zustand einer LED zu erinnern" . Dies würde Nur-Lese-Speicher (Schalter, Jumper, Dioden usw.) und Einmal-Schreib-Speicher (Sicherungen) ausschließen.
Ich denke, der Status der LED hängt direkt damit zusammen, welche Taste zuletzt gedrückt wurde. Aus logischer Sicht ist das Erfassen des Zustands der Tasten identisch mit dem Erfassen des Zustands der LED.

Die einfachste Einkomponentenlösung wäre ein bistabiles Relais. Und Sie brauchen nur einen Widerstand, um den Zustand zu lesen.

Sie könnten einen Mikrocontroller mit eingebautem EEPROM verwenden. Der 8-Bit- PIC16F84A verfügt über 64 Bytes EEPROM, was für typischerweise 10.000.000 und mindestens 1.000.000 Schreibvorgänge auf jedes Byte gut ist (dies wird als Byte-Ausdauer bezeichnet). Der in einer anderen Antwort gewählte PIC, PIC12F635, hat ein 128-Byte-EEPROM und eine Byte-Ausdauer von 100.000 Schreibvorgängen. Der PIC24F16KA102 , ein 16-Bit-Prozessor, hat 512 Byte EEPROM und auch eine Byte-Ausdauer von 100.000 Schreibvorgängen.

Das OP zeigt nicht an, wie oft die LED blinkt. Nehmen wir zum Zwecke dieser Diskussion an, dass es viermal pro Minute ist.

In einem Jahr wird es blinken

4 60 24 365 = 2 , 102 , 400   t ich m e s .

Da das EEPROM sowohl die letzten Ein- als auch Aus-Ereignisse erfassen muss, wird es auf die doppelte Anzahl oder etwa 4,2 Millionen Mal geschrieben . In fünf Jahren ist dies 21 Millionen Mal.

Dies übertrifft eindeutig die Spezifikationen jedes EEPROMs, das ich jetzt in einen Mikrocontroller eingebaut habe.

Aber dafür gibt es eine einfache Lösung. Anstatt immer wieder dasselbe Byte zu verwenden, um den Ein- oder Aus-Status zu verfolgen, kann man ein Array von Bytes verwenden, die den gesamten Chip füllen.

Sie benötigen zwei Bytes für jedes Element im Array. Ein 64-Byte-EEPROM, wie das im PIC16F84A, könnte also 32 Elemente enthalten. Jedes Mal, wenn Sie in das EEPROM schreiben, schreiben Sie eine 0 in das Statusbyte (was bedeutet, dass dieses Element Daten enthält) und entweder eine 0 in das Datenbyte (LED war zuletzt aus) oder ein 0xFF (LED war zuletzt an). Wenn Sie das nächste Mal auf das EEPROM zugreifen, indizieren Sie die Elemente, bis Sie eines mit einem 0xFF-Statusbyte finden, und verwenden dann dieses Element. Wenn keine mehr vorhanden sind, initialisieren Sie das EEPROM neu und beginnen Sie von vorne (für die Low-End-PICs bedeutet dies, dass 0xFFs in jedes der Statusbytes geschrieben werden; für den PIC24 gibt es einen Befehl zum Löschen des gesamten EEPROM). Wenn Sie den letzten Status der LED wissen müssen, indizieren Sie das Array wie zuvor, aber gehen Sie jetzt ein Element zurück und lesen Sie das Datenbyte aus.

Geben Sie hier die Bildbeschreibung ein

Dies teilt im Wesentlichen die Anzahl der Zugriffe auf ein einzelnes Byte durch den Faktor 16 für den PIC16F84A (16 und nicht 32, weil jedes der Statusbytes zweimal beschrieben wird). Es wäre also in der Lage, insgesamt 16 Millionen Schreibvorgänge zu verarbeiten, genug für fast vier Jahre Daten. Und der PIC12F635 mit seinem größeren EEPROM, aber einer kleineren Byte-Ausdauer von 100 K könnte insgesamt 3,2 Millionen Schreibvorgänge verarbeiten, genug für neun Monate.

Der PIC24F16KA102 mit seinem 512-Byte-EEPROM und der Bulk-Erase-Funktion könnte 25,6 Millionen Schreibvorgänge verarbeiten, genug für über fünf Jahre.

Wenn die Blinkfrequenz statt viermal pro Minute nur noch viermal pro Stunde betrug , dann bedeutet dies insgesamt 70.080 Schreibvorgänge pro Jahr. Selbst der PIC12F635 würde mit seiner Ausdauer von 100.000 Schreibvorgängen pro Byte 45 Jahre halten!

Sie könnten das Schreiben ins EEPROM bis nach einem Stromausfall unterlassen. Die Kondensatoren sollten genügend Ladung speichern, um den uC lange genug laufen zu lassen, um den aktuellen Zustand zu schreiben. Dies könnte die Langlebigkeit Ihres EEPROMs erheblich erhöhen.
Warum also nicht mehrere Bits pro Byte verwenden? Das erste Byte speichert 7 Bits Zähldaten und 1 Bit LED-Daten. Wenn Sie das erste Mal schreiben, setzen Sie das Byte auf 0000001L, dann auf 0000010L usw. Wenn es 1111111L erreicht, setzen Sie das nächste Byte vollständig auf Nullen zurück. Nachdem Sie das letzte Byte erreicht haben, setzen Sie das erste Byte auf Null zurück. Dann ist Ihre nächste Lesestelle das erste Byte, dessen obere 7 Bits 0 < 7-Bit <= 127 sind, und die nächste Schreibstelle ist das erste Byte mit 7-Bit < 127. Jetzt haben Sie Ihre Zugriffe fast verdoppelt, weil (fast ) erfolgt jeder Schreibvorgang auf ein einzelnes Byte statt auf zwei.
@ MichaelS Daran habe ich auch gedacht. Erstens können Sie nicht von 11111110 zu 11111101 gehen, weil Sie keine 1 schreiben können (ich habe Ihre Startbedingung umgekehrt). Stattdessen würden Sie 0 schreiben, eine nach der anderen über das Byte. Aber es nützt nichts, wenn es darum geht, die Anzahl der Schreibvorgänge pro Byte zu begrenzen – am Ende müssen Sie jedes Byte achtmal statt einmal schreiben.
Ich habe nicht genau die fraglichen PIC-Geräte verwendet, aber ich verstehe, dass Sie alle Daten löschen und dann alle Bits ändern, die nicht sofort Standard sein sollten. Wenn also „gelöscht“ alle Einsen bedeutet, dann würden Sie alles löschen und die Bits 1–6 und möglicherweise L ändern. Als nächstes würden Sie alles löschen und die Bits 1–5, 7, möglicherweise L, ändern. Gegen Ende der Zählung , würden Sie nur ein paar Bits ändern (1110110L -> 1110111L ändert nur Bit 4 und L). Da die Wahrscheinlichkeit, dass ein bestimmtes Bit gelöscht wird, bei 50 % pro Löschvorgang und 50 % pro Schreibvorgang liegt, liegt der Durchschnitt bei 100 % oder 8 Bits pro Lösch-/Schreibzyklus.
Bei Ihrer Methode wird das gesamte Statusbyte einige Zeit vor der Verwendung gelöscht und dann bei Verwendung auf Null gesetzt, oder 16 Bit pro Lösch-/Schreibzyklus. Gleichzeitig hat Ihr gesamtes Datenbyte eine Chance von 50 % pro Löschung, eine Chance von 50 % pro Schreibvorgang oder durchschnittlich 8 Bits pro Lösch-/Schreibzyklus. Die Summe beträgt dann 24 Bits pro Zyklus. Selbst wenn wir davon ausgehen, dass jeder Lösch-/Schreibzyklus pro Byte äquivalent ist, ändern sich immer noch zwei Bytes anstelle von einem. (Ich kann den obigen Kommentar nicht bearbeiten, ich meinte 50/50 für ein bestimmtes Bit , das im letzten Satz geändert und nicht gelöscht werden soll.)
@MichaelS Das Löschen, das alle Bytes auf 0xff zurücksetzt, erfolgt erst, nachdem alle Bytes verwendet wurden. In einem 256-Byte-EEPROM würde das Löschen also einmal alle 256 Zählwerte erfolgen. Sie müssen in diesem Schema nicht vor jedem Schreiben löschen. Es gibt zwei Arten von "Verschleiß"-Grenzwerten in einem EEPROM; eine auf Byte-Ebene (sogenannte "Endurance") und die andere auf globaler Ebene aufgrund von Löschungen. Letzteres ist in der Regel zehnmal so groß wie das erstere.
Beide PICs, die Sie verknüpft haben, löschen jedes Mal, wenn Sie schreiben, Byte-Ebene. Siehe Seite 13 (Ihr Link) und 93 (PIC12F635). Ich sehe nichts von einer globalen Löschung. In jedem Fall ist es immer noch ein Löschen, ein Schreiben pro Schreiben. Ich bin mir nicht sicher, warum eine globale Löschung weniger anstrengend wäre als eine lokale Löschung.
@MichaelS - danke für die Korrekturen bezüglich des globalen Löschens. Ich habe meine Berechnungen sowieso auf die Byte-Ausdauer gestützt, also spielt es keine Rolle. Ich werde meine Antwort jedoch aktualisieren, um anzuzeigen, dass einige EEPROMs keinen separaten Löschvorgang erfordern. (Die PIC24F-Familie hat beispielsweise eine Massenlöschfunktion.)

Dies mag ein sehr naiver Vorschlag sein ... aber wie wäre es , wenn Sie einen Transistor-Latch mit niedriger Leistung bauen, der von einer Knopfbatterie angetrieben wird ? Verwenden Sie dann den Ausgang davon, um in einen OP-Verstärker einzuspeisen, der von der Stromversorgung angesteuert wird . So entlasten Sie die Knopfbatterie von der Belastung, die Nutzleistung zu speisen; Sie können das sowieso nicht verwenden, während die Versorgung abgeschaltet ist, oder?

BEARBEITEN: Außerdem ist es - laut Kommentar unten - ratsam, es so zu machen, dass der Latch vom OP-Verstärker isoliert ist, wenn die Versorgung unterbrochen wird. Jede Art von Relais - oder äquivalenter Schaltung - die von der Versorgung gespeist wird, sollte in der Lage sein, dort die Arbeit zu erledigen.

Wenn man bedenkt, dass eine einfache Armbanduhr jahrelang mit einer Knopfbatterie betrieben werden kann, sollte die Stromversorgung eines einfachen Riegels ihr eine Lebensdauer pro Batterie von einem Jahrzehnt geben. Sie können sogar zwei Batterien parallel schalten, um sie einzeln auszutauschen, ohne die Informationen zu verlieren.

Es gibt nur sehr wenige Operationsverstärker, die eine Spannung am Eingang zulassen, die höher ist als die Versorgungsspannung, was beim Herunterfahren der Fall wäre.
Wenn dies der Fall ist, gibt es keine Möglichkeit, den Eingang zum Operationsverstärker abzuschalten, wenn die Versorgung unterbrochen wird, wodurch der Latch im Wesentlichen isoliert wird? Jede Art von Relais - oder äquivalenter Schaltung - würde dort ausreichen, oder nicht?

Ein kleines CPLD kann so programmiert werden, dass es das Protokoll steuert, das zum Schreiben eines einfachen Wertesatzes auf einen I2C-Bus erforderlich ist.

NXP stellt eine Reihe sehr kleiner Speicher her, die Dip-Schalter ersetzen sollen, z. B. PCA8550 / PCA9561.

Kombinieren Sie die beiden und Sie haben einen sehr kleinen Halbleiterschalter, der sich an seinen Zustand erinnert.