Hallo Jericho_one,
die AVRs haben einen eingebauten EEPROM-Speicher, dieser behält seine Werte auch ohne Strom. Wie man den benutzt kannst Du auf http://www.mikrocontroller.net/artic...utorial#EEPROM erfahren.
MfG Mark
Hallo!
Ich müsste zwei Variablen zwischenspeichern - geht das irgendwie mit AVR mitteln?
also zwischenspeichern = Strom weg und er behält trotzdem die veränderten Werte -> Also wie kann man beim Atmega32 aus dem Programmcode auf nichtflüchtigen speicher zugreifen?
Gruß und Danke
Hallo Jericho_one,
die AVRs haben einen eingebauten EEPROM-Speicher, dieser behält seine Werte auch ohne Strom. Wie man den benutzt kannst Du auf http://www.mikrocontroller.net/artic...utorial#EEPROM erfahren.
MfG Mark
Das geht wie p_mork auch schreibt.
Allerdings solltest du beachten, das das EEPROM nur bis zu 100.000 mal mit neuen Werten beschrieben werden kann.
Du solltest also deine Variablen wenn möglich nur 1x pro Einschalt bzw. Ausschaltvorgang abspeichern.
Wenn Du ständig während des Programmablaufs ins EEPROM einspeicherst wird der Bereich bald hinüber sein.
Ein möglicher Lösungsansatz:
Ich würd den AVR mit einem Kondensator (z.B.Goldcap) puffern und einen Eingang als Power down Kontrolle nutzen.
Wird der Strom für die Schaltung abgeschaltet läuft der AVR über den Goldcap weiter und eine Power down Routine wird aufgerufen, die Dir deine Variablen ins EEPROM speichert.
Die Spannung am Goldcap sollte während des Speichervorganges nicht zu sehr einbrechen, sonst könnte es Probleme mit dem Abspeichervorgang geben.
Beim Start deines Controllers werden deine Werte wieder aus dem EEPROM geholt und ins Ram zurückgeschrieben.
Danke soweit - werd mir das mal anschauen - gerade das mit dem Kondensator - da 100.000 schreibzugriffe ja doch nicht sooo wahnsnnig viel ist, wenn ich meine Variablen im laufenden Betrieb schreib!
Danke für den Tip )
Gruß
ist das mit dem eeprom nicht ein mythos? ja mit 100.000 mal stehts drin, aber wenn du under 120.000 mal das machst gehts ja auch noch nur die speicherzeit hält halt dann nicht mehr 20 jahre oder so?
Du musst die Variablen ja nicht ständig ins EEPROM schreiben. Per BOD (Brown Out Detection)-Interrupt kannst Du das auf den Ausschaltfall beschränken.
Das geht?
Dazu müsste der BOD maskierbar sein und sichergestellt sein, daß die VCC lange genug ausreichend hoch ist, um den EEPROM zu schreiben und nicht einen inkonsistenden Zustand zu hinterlassen, weil zB dauern der BOD triggert.
In einer Anwendung bin ich dieses Problem folgendermassen angegangen, wie auch von wkrug vorgeschlagen:
Die Spannungsversorgung sieht so aus:
Netzteil -- X -- Linearregler -- Diode -- Goldcap -- µC
Der Punkt X wird über einen NPN invertiert (ich nehme ein Kanal eines ULN2803) und mit einem INT-Port des µC verbunden. INT ist IN + PullUp.
Wenn das Netzteil Spannung liefert, funzt die Schaltung ganz normal und treibt Motoren oder weiß der Teufel was.
Wird das Netzteil ausgeschaltet, steigt die Spannung am X-Port. Das erkennt man, deaktiviert alle Hardware und legt sich in den SLEEP-Mode schlafen. Der LOW-Level am INT, ausgelöst wenn das Netzteil wieder Saft liefert, weckt den µC auf (das geht leider nur mit LOW). Da der NPN beim Schlafen sperrt, fliesst über den PullUp kein Leckstrom.
Mit dieser Strategie schaffe ich mit einem ATmega88 bis zu 8 Stunden bei VCC=4.5V hinter der Diode und C=1F des Goldcap.
Mit einem ATmega88V (geht bis 1.8V) dürfte sich die Zeut deutlich verlängern.
Falls die Zeit kürzer ist und du nicht in den SLEEP gehen willst/brauchst, dann man den SLEEP und die Invertierung des X-Signals sparen, wodurch der Zusatzaufwand im Layout durch eine einzige Leitung -- evtl mit Begrenzerdiode und Widerstand -- besteht (kleiner NPN + Basiswiderstand ist aber kaum mehr Aufwand als Z-Diode + Widerstand).
Den EEPROM brauch man in diesem Fall nicht zu bemühen. Er wird nur dazu verwendet, Benutzereinstellungen/Konfigurationen zu speichern.
Disclaimer: none. Sue me.
Da habe ich wohl etwas verwirrend geschrieben. Geht natürlich nicht mit dem Internen BOD. Man muss dafür eine externe Schaltung verwenden, die dann einen Interrupt im AVR triggert.
Prinzip entspricht dem, was Sprinter geschrieben hat. Vcc des AVR ist gepuffert (für BOD nicht zwingend mit Goldcap). Beim BOD von Vcc wird der Interrupt getriggert und die Werte im EEPROM gesichert. Nach einem Reset initialisiert die Applikation die Variablen dann aus dem EEPROM.
Lesezeichen