Hallo, in welchem Speicher kann ich meine Variablen ablegen, die auch nach Auslauf der Stromversorgung erhalten bleiben? Kommt dafür der interne EEPROM in Frage? Grüsse Steffen
In den FLASH in den EEPROM ist eigentlich egal bei beiden bleiben die Variablen nach nem "Stromausfall" erhalten.
im Prinzip ja - aber: das setzt voraus, daß die Variablen auch in den EEPROM geschrieben wurden. Direkt sind die Variablen üblicherweise nicht im EEPROM lokalisiert, aufgrund der hohen Schreibzeit und der begrenzten Lebensdauer der EEPROM-Zellen. Um also tatsächlich die Variablen zu erhalten, ist folgendes Vorgehen erforderlich: der Netztausfall muß frühzeitig erkannt werden, und es muß noch genügend Energie zur Verfügung stehen, daß alle relevanten Variablen in eienm Notprogrammteil in den EEPROM geschrieben werden können.
Für wirklich wichtige Parameter verwende ich ein FRAM (z.B. 25C020). Keine langen Schreib- oder Test- Algorithmen. Daher so schnell wie ein SRAM. Da ein Ram nur beim Schreiben(dauerhaft) gestört werden kann bedeutet dies eine zusätzliche Datensicherheit. MfG Manfred Glahe
@Merle: Korrekt, aber Flash kann man normalerweise nur Sektorweise neuprogrammieren, so daß das für einzelne Variablen eher ungeschickt ist. Außerdem kann man bei den AVRs das Flash im laufenden Programm nicht ändern. @Manfred Glabe: Du mußt den Stromausfall trotzdem rechtzeitig erkennen können, denn sonst kann es vorkommen, daß bei einem Stromausfall Deine Daten inkonsistent werden. Der Vorteil am EEPROM ist, daß manche Microcontroller über internen EEPROM verfügen und man deswegen keine weiteren Bauelemente braucht. Außerdem habe ich den erwähnten 25C020 selbst bei Segor nicht gefunden, so daß er für Hobbybastler wohl relativ schwer zu beschaffen ist. Markus
Hallo Markus, sebstverständlich muß noch Spannung dasein um zu Sichern! ABER: ein externes FRAM kann mit einem externen Spannungswächter vorher abgeschaltet werden bevor der µP noch was reinschreiben kann. Das geht in 0 Zeit von Unterspannungserkennung zur Sicherung! (Bezugsquelle RM@msc-ge.com) MfG Manfred Glahe
Hallo Manfred, was machst Du, wenn der µP gerade in das RAM reinschreibt? Unterbrichst Du dann den laufenden Schreibvorgang? Falls ja, was passiert, wenn Du z.B. einen 16- oder 32-Bit-Wert in einen 8-Bit Speicher schreibst und mittendrin fällt der Strom aus? Markus
Hallo Markus, je nach FRAM Typ wird erst der komplette Schreibvorgang übernommen, das heißt ein abgebrochener Schreibvorgang wird verworfen. "Falls ja, was passiert, wenn Du z.B. einen 16- oder 32-Bit-Wert in einen 8-Bit Speicher schreibst und mittendrin fällt der Strom aus? Wie schon gesagt, Betriebsspannung muß noch da sein aber das gilt auch für den µP! Wenn Du ganz sicher gehen willst, dann stellst Du den Überwachungsbaustein auf eine etwas höhere UB/AUS als die des µP ein und pufferst über einen Transistor und Elko die Betriebsspannung des FRAM. Wichtig ist doch aber, daß der externe Spannungswächter schnell genug erkennt, daß Probleme im Anmarsch sind und daraufhin das FRAM sofort und sicher sperrt. Dein µP weiß zu diesem Zeitpunkt von alldem noch garnichts und bevor der dies auch merkt ist es manchmal eben schon zu spät. Ein Datalogger z. B., der einen Monat lang im Feld Aufzeichnungen gemacht hat soll doch zum Schluß nicht noch unwiederbringliche Daten zerstören. MfG Manfred Glahe
Hallo Manfred, irgendwie reden wir gerade aneinander vorbei. Um was es mir geht ist folgendes: Angenommen im im RAM steht eine 16Bit-Variable mit dem Wert 0x1122. Jetzt soll sie verändert werden und der µP versucht 0x3344 reinzuschreiben. Da der Speicher nur 8 Bit hat, muß er das in zwei Schreibvorgänge aufteilen. Gerade mittendrin fällt der Strom aus und der Spannungswächter unterbricht die Verbindung zwischen µP und RAM. Jetzt steht im Speicher allerdings 0x3322 - eine Mischung aus altem und neuen Wert. Sowas kann man meines Erachtens nur verhindern, wenn der µP weis, daß der Strom gleich ausfällt und vorher noch alle Schreiboperationen abschließen kann. Markus
Hi Markus, an sowas haben wohl auch die Dallas-Leute beim DS80C320 gedacht. Der hat nämlich einen Early-Power-Fail Interrupt. Dessen Schwellspannung liegt etwas über der Unterspannungs-Reset-Schwelle. Dann hat er auch die höchste Priorität, kann also jeden anderen Interrupt unterbrechen. Man braucht also keine extra Überwachungsschaltung, das macht der DS80C320 alles intern. Und im Interrupthandler kann man dann bequem seine Daten in einen EEPROM sichern. Die EEPROM der 24Cxx Serie gestatten ja auch ein Blockschreiben, d.h. man kann je nach Größe, einen ganzen Block von 8 ... 256 Bytes in einem Rutsch (max 10ms) sichern. Der Ladeelko im Netzteil muß also nur so groß sein, um noch für 10ms den EEPROM versorgen zu können. Wenn man einen 2,7V-EEPROM nimmt, kann der bequem den internen Schreibzyklus beenden, während die CPU schon längst schlafen gegangen ist. Peter
Kritische Zustände beim Abspeichern vermeidet man, indem man die Schreiboperationen durch globales Sperren von Interrupts schützt und anschließend die Interrupts wieder freigibt. Bei 'power fail' wird ein Interrupt ausgelöst (aber nicht /Reset), der eine Endlosschleife aufruft. Anschließend kann das Programm nur durch einen Reset neu gestartet werden.
Hallo Steffen! Habe ich es überlesen oder nicht? Was für eine Anwendung möchtest du überhaupt machen? Wenn du das EEPROM dafür benutzen möchtest um ab und zu Parameter für den Programmablauf abzuspeichern (z.B: Baudrate für die Serielle usw), dann glaube ich lohnt sich der Aufwand wie externes EEPROM, Spannungsüberwachung usw. nicht. Oder? Wenn manche Parameter sehr wichtig sind, kann man sie ja öfters abspeichern und vielleicht zusätlich mit einer Checksumme. Dann ist es egal, wenn während des Schreibens der Strom ausgeht. Martin
wieso nicht vor den µP + eprom einen goldcap schalten? der hält die spannung noch locker für 1-x min aufrecht, in der zeit sollte selbst der schlechteste code seine daten gesichert haben ;) die spannung sollte man aber vor dem goldcap abfragen, ich hoffe du verstehst meinen gedankengang :) Mfg Marcel
Hallo Martin, ich arbeite zur Zeit an einem Telemetriegerät, das einige Parameter speichern soll, die auch nach einer Zeit ganz ohne Spannung noch erhalten sein sollen. Die Parameter werden durch den Bediener geändert, also relativ wenige Änderungen. Daher denke ich, ich bin mit dem internen EEPROM gut bedient, wenn es die Daten entsprechend behalten kann. Die Ansteuerung dürfte dann ja wohl so funktionieren wie in der BASCOM-Hilfe beschrieben, oder? Grüsse Steffen
goldcap = sehr guter kondensator, sehr kleine baugröße, hohe kapazität siehe: http://reichelt.de/Info.html?PtkDEqwQAQsAADQhPCU+B318+0+50+SPK%201%2C0F+GOLDCAP++++artnr Mfg Marcel
@Michael: Die Lösung mit den Interrupts ist mir bekannt, sie ist aber nicht praktikabel wenn man - wie von Manfred vorgeschlagen - die Daten im "normalen" RAM sind, das einfach seine Werte bei Stromausfall behällt. Da müsste man ja vor jeder Variablenzuweisung die Interrupts abschalten. Markus
@Markus Ich gehe davon aus, daß immer nur ein begrenzter Teil der Variablen gepuffert werden muß, z.B. Meß- oder Kalibrierdaten; Schleifenzähler z.B. wohl kaum. Dann ist dies durchaus ein gangbarer Weg. Andersherum könnte man den Interrupt, der den µP runterfahren soll, nur selektiv freigeben, wenn keine neuen Änderungen passieren. z.B. alle 10ms.
Hallo Markus, "irgendwie reden wir gerade aneinander vorbei." Es ist eben nicht leicht mit kurzem Text genau darzustellen was gemeint ist. Aber nochmal: Wenn der µP einen Datenblock einer (fast) beliebigen Länge sendet, dann erwartet er eine Erfolgsmeldung (Acknowledge Condition). Kommt diese nicht , dann ist die GANZE Übertragung (vorsichtshalber) gescheitert! Als FRAM benutze ich für den Datalogger den FM24C256 mit 2 Draht Bus. Im Datenblatt steht gut beschrieben daß keine Daten überschrieben werden (Acknowledge Condition)in diesem Fall und auch der Adresszähler wird nicht weitergezählt. Da der µP kein ACK erhält weiß er, daß die Übertragung fehlgeschlagen ist. Das FRAM steht noch auf der letzten erfolgreich bearbeiteten Adresse (direkte lineare Adressierung). Nochwas zur Sicherheit, ein Speicherinhalt kann nur (abgesehen von harter Strahlung) während des WR\ Impulses verändert werden! Es gilt also diese Zeit möglichst klein zu halten um induktive-, kapazitive- oder UB- Störungen auf nur noch diese kurze Zeit zu begrenzen! Ein EEPROM kann diese Zeiten nicht im entferntesten erreichen! Eine INT gesteuerte Sicherung braucht wesentlich mehr Zeit als ein nS langer Abschaltvorgang eines UB- Überwachungsbausteins. Das Argument zusätzliche Bauteile und Kosten wird immer dann vorgeschoben (in einigen anderen Projekten) wenn den Kritikern nichts anderes mehr einfällt. Bei kleinen Stückzahlen ist die Sicherheit und Wartugsfreundlichkeit wesentlich wichtiger. Wer kennt denn nicht diesen Text: "Eigentlich darf das garnicht passieren" (gilt manchmal auch für namhafte Hersteller)? MfG Manfred Glahe
@Manfred, "Ein EEPROM kann diese Zeiten nicht im entferntesten erreichen!" Da gebe ich dir vollkommen recht, aber das hat bloß für fast alle Anwendungen keinerlei praktische Bedeutung. Ein Netzteil sollte üblicher Weise mindestens 2 ausgefallenen Netzperioden (40ms) überbrücken können. D.h. die benötigten 10ms bis zum Abfall unter 2,7V für das Beenden des Schreibens im EEPROM sind mit mehrfacher Sicherheit vorhanden. Kein Grund also teuere Bausteine einzusetzen. @Steffen, für Deine Anwendung, wenn die Daten nur nach Benutzereingabe geändert werden, brauchst du aber keinerlei besondere Vorkehrungen treffen. Die Warscheinlichkeit, daß gerade beim Drücken der "Save"-Taste gleichzeitig ein Stromausfall passiert, ist quasi Null. Zu empfehlen ist nur, daß Du 2 Datensätze abspeicherst, die einen CRC-Prüfwert enthalten. Stimmt nach dem Einschaltreset die CRC bei einem Satz nicht, wird dahin der andere Satz mit korrekter CRC kopiert. Peter
@Manfred: Ob der µP ein ACK bekommt oder nicht macht keinen Unterschied. Da demnächst der Strom ausfällt und die Verbindung zum nichtflüchtigen Speicher gekappt wurde kann er das nicht weitererzählen. Das grundsätzliche Problem bleibt aber. Wenn Du 10 Bytes schreiben willst und nach 6 Bytes wird die Übertragung unterbrochen, dann werden eben die 6 Bytes geschrieben und die restlichen 4 nicht. Was das auch immer für Deine Daten bedeuten mag. Markus
Hallo Markus, es geht hier darum ein unbeabsichtigtes Beschreiben des FRAM im Störungsfall wie geschildert zu verhindern. Das was Du meinst ist eine Unterbrechung des Schreibvorganges. Das FRAM geht darauf ein um einem INT des µP den Vorrang zu lassen und danach an gleicher Stelle weiterzumachen. Ob Du nur 6 von 10 Byte's geschrieben hast bevor abgebrochen wird kann niemand außerhalb Deines µP wissen. Das muß der µP selbst erkennen und berücksichtigen. Dem FRAM muß er nichts "weitererzählen" das hat nur richtige Daten gespeichert! MfG Manfred Glahe
@Markus, deshalb empfehle ich ja auch das Blockschreiben in einen EEPROM. Der 24C16 hat z.B. 16 Byte-Blöcke. Du schickst also erstmal bis zu 16 Bytes hin. Entweder es gelingt Dir dann noch ein Stop zu senden, dann erst fängt der EEPROM intern an zu schreiben. Wenn das dann ein 2,7V-Typ ist, hat er auch alle Zeit der Welt dieses Schreiben auch korrekt zu beenden. Ob die CPU inzwischen durch den Brown-Out-Reset schon längst schlafen geschickt wurde, spielt keine Rolle. Beim nächsten Einschalten sind jedenfalls alle 16 Byte korrekt. Kann die CPU das Stop aber nicht mehr senden, passiert auch nichts. D.h. keines der 16 Byte im EEPROM wurde geändert und alle enthalten noch den kompletten alten Datensatz. Peter
@Manfred: Wenn die Stromversorgung ausfällt, dann wird doch von Deiner Hardware sofort der Zugriff auf das FRAM gestoppt. Das FRAM schreibt jedes vollständig empfangene Byte sofort in den Speicher. Es kennt keinen Pagemode wie ihn Peter bei den normalen seriellen EEPROMs beschreibt. Wenn also der Stromausfall passiert während die CPU gerade schreibt, dann unterbricht die Schutzschaltung den gerade laufenden Schreibvorgang. Die CPU kann das hinterher erkennen, aber ich finde es viel eleganter, wenn überhaupt keine unvollständigen Datensätze geschrieben würden. Markus
@Markus Das währe sicher gut, aber wie willst Du das außerhalb des µP lösen? Wenn der µP die Kontrolle übernimmt wirds extrem langsam, der INT dauert eben. Im Falle des Dataloggers (FRAM ist seriell mit Informationen beschrieben) ist es nicht wichtig ob der letzte Block mit 6 oder den Ganzen 10 Byte übertragen wurde. Ein Beschreiben einer falschen Adresse aber kann den gesamten Inhalt zerstören, da die Rekonstruktion der gespeicherten Daten unmöglich wird. Beim Auslesen muß doch mitgezählt werden wann ein Datenwort (wieviel Bit auch immer es lang sein mag) zu Ende ist. MfG Manfred Glahe
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.