Forum: Mikrocontroller und Digitale Elektronik Laufzeitzähler mit ATmega32 und EEPROM, beste Lösung ?


von Jürgen S. (jsachs)


Lesenswert?

Hallo,

ich will die "Laufzeit" meiner Modelle mitprotokollieren.
Bisher habe ich meiner Software einen Zähler für die Sekunden, Minuten 
und Stunden. Das klappt prima.
Jetzt will ich das im EEPROM speichern, das ich einen Laufzeit Zähler 
habe.

Jetzt kann ich ja nicht jede Minute die Zeit Prophylaktisch speichern, 
da wäre das EEPROM nach 70 Tagen hinüber. Den Fehler durch eventuell 
verlorene Sekunden Akzeptiere ich bewusst.

Einen Pin mit Interrupt um die Spannungsversorgung zu Überwachen habe 
ich nicht mehr frei. Ich messe jedoch die Spannungsversorgung mit einem 
Analogeingang. Bisher jedoch nur alle 15 Sekunden um eine Unterspannung 
des Akku vorzubeugen.

Jetzt meine Frage:
Gilt die 100000 Zyklen pro Zelle oder pro "Page" des EEPROM ?

Ich könnte einen kleinen Ringpuffer aufbauen und beim Start den Wert mit 
dem höchsten Eintrag verwenden.
Also 10 direkt aufeinander liegende uint32_t Bereiche im EEPROM, die ich 
der reihe nach beschreibe und am Ende wieder von Vorne.
Beim Start lese ich alle Werte ein und übernehme den höchsten Wert 
(Sonderfall überlauf lasse ich jetzt mal weg :) ).
Aber bringt mir das mehr schreib Zyklen, also ca 700 Tage statt 70 Tage 
?

Danke
Juergen

von Thomas E. (thomase)


Lesenswert?

Jürgen Sachs schrieb:
> Gilt die 100000 Zyklen pro Zelle oder pro "Page" des EEPROM ?
Das gilt pro Zelle. Das hat keine Pages, sondern ist ein echtes und kein 
Möchtegern-EEPROM mit Flashspeicher.

mfg.

von Karl H. (kbuchegg)


Lesenswert?

> Prophylaktisch speichern, da wäre das EEPROM nach 70 Tagen hinüber

Deine Modelle laufen tatsächlich 24 Stunden / 7 Tage die Woche durch?
Ist das tatsächlich realistisch?

> Ich messe jedoch die Spannungsversorgung mit einem Analogeingang. Bisher
> jedoch nur alle 15 Sekunden um eine Unterspannung des Akku vorzubeugen.

Was du brauchst ist eine kleine Spannungsreserve, so dass nach Ausfall 
der Versorungsspannung noch ein paar Milli-Sekunden Zeit bleibt um das 
EEPROM zu beschreiben. Wenn du Unterspannung feststellst hast du die 
paar Millisekunden zum Schreiben ins EEPROM immer noch. Deswegen ist der 
Akku nicht gleich kaputt.

Alternativ kann man natürlich auch einfach nach einer gewissen Zeit 
einen anderen EEPROM Bereich zum Speichern benutzen. Die ursprünglichen 
Zellen als ungültig markieren und dann einfach die nächste benutzen.

(Wobei die 100000 das sind was dir Atmel auf jeden Fall garantiert. Das 
EEPROM fällt ja nicht exakt nach dem 100000-ten Schreibzugriff aus.)

von Purzel H. (hacky)


Lesenswert?

Ich wuerd pro Zeiteinheit nur ein einzelnes Bit schreiben.

Besser waere etwas Vorwarnzeit, sodass man bei Spannungsunterbruch einen 
Wert schreiben kann. Die Vorwarnzeit erhaelt man, indem man die Spannung 
vor dem Regler uberwacht.

von Lutz (Gast)


Lesenswert?

Jürgen Sachs schrieb:
> Einen Pin mit Interrupt um die Spannungsversorgung zu Überwachen habe
> ich nicht mehr frei. Ich messe jedoch die Spannungsversorgung mit einem
> Analogeingang. Bisher jedoch nur alle 15 Sekunden um eine Unterspannung
> des Akku vorzubeugen.

Wie wird der Controller denn aus/abgeschaltet? Mit der Akkumessung 
funktioniert das ja nur, wenn der Akku Unterspannung hat. Wenn aber z.B. 
per Schalter einfach die Versorgungsspannung abgeschaltet wird, kannst 
du damit ja nicht das reguläre Laufzeitende erkennen.

Sollte der Controller wirklich immer Laufen und nur durch Unterspannung 
ausgeschaltet werden, sollte es vollkommen ausreichen, nur bei zu 
niedrig gemessener Akkuspannung den Wert ins EEPROM zu schreiben. 
Ansonsten läuft der Zähler einfach im RAM. Und das sollte ja den 
Lebenszyklus des EEPROM nicht mal ansatzweise erreichen.

Grundsätzlich stellt sich natürlich auch immer die Frage, wie genau das 
ganze sein soll. Wenn das Ding mehrere Jahre läuft, sollte es ja auf 
wenige Tage "verlorene" Zeit nicht ankommen. Also statt jeder Minute 
jede Stunde den Zähler inkrementieren.

Was für Pins und wie viele wären überhaupt noch frei?

Kurzum: Es gibt viele Lösungen, aber dazu sind mehr Infos erforderlich.

von Jürgen S. (jsachs)


Lesenswert?

Also,

das Modell läuft natürlich nicht 24/7, sonst müsste ich ja nicht ins 
EEPROM schreiben :-)
Das es ein RC Modell ist (Truck), kann die "Arbeitszeit" Minuten und 
Stunden am Stück betragen.

Wenn ich das richtig sehe muss, ist es das beste die Externe Spannung 
(Akku) mit dem Interrupt zu überwachen (INT0/1/2) des mega32.
Die Akkus werden einfach abgesteckt oder per Schalter getrennt.

Am Receiver könnte ich INT0/1 frei machen.
Am Transmitter INT0.

Die Akkuspannung beträgt 7,2V und geht unter last auch leicht auf 6,5V.
Die CPU läuft im Receiver zwangsweise mit 5V (wegen den Servos).
Also müsste ich eine Spannung unter 6V erkennen.

Außerdem müsste der Spannungsregler am Ausgang höhere Spannung 
verkraften als am Eingang. Meines Wissens ist das zumindest am 7805 
nicht empfohlen.

Hat da jemand eine Schaltung zur Hand womit ich die Erkennung machen 
kann und eventuell die Schwelle einstellen kann ? Ein Smitt Trigger 
währe vermutlich auch nicht verkehrt ?

von STK500-Besitzer (Gast)


Lesenswert?

Jürgen Sachs schrieb:
> Wenn ich das richtig sehe muss, ist es das beste die Externe Spannung
> (Akku) mit dem Interrupt zu überwachen (INT0/1/2) des mega32.
> Die Akkus werden einfach abgesteckt oder per Schalter getrennt.

Wozu ein Interrupt?
Die Spannung solltest entweder mit dem Analog Komparator oder einem 
ADC-Kanal überwachen.

von Jürgen S. (jsachs)


Lesenswert?

Dann müsste ich die Versorgungs Spannung aber sehr schnell abtasten.
Der Prozessor hat ja auch noch was anderes zu tun ;-)
Bisher passiert das immer in der langen "Mainline" while. Ohne 
Zeitzwang.

von STK500-Besitzer (Gast)


Lesenswert?

Jürgen Sachs schrieb:
> Dann müsste ich die Versorgungs Spannung aber sehr schnell abtasten.

alle paar Millisekunden...
Solange deine Pufferung groß genug gewählt wurde, sollte das kein 
Problem sein.

Jürgen Sachs schrieb:
> Außerdem müsste der Spannungsregler am Ausgang höhere Spannung
> verkraften als am Eingang. Meines Wissens ist das zumindest am 7805
> nicht empfohlen.

Dafür gibt es solche Dinge wie Dioden...

von Karl H. (kbuchegg)


Lesenswert?

Jürgen Sachs schrieb:
> Dann müsste ich die Versorgungs Spannung aber sehr schnell abtasten.
> Der Prozessor hat ja auch noch was anderes zu tun ;-)

Alle paar Millisekunden den Akku nachsehen kostet dich weniger als ein 
Zehntel Prozent Prozessorleistung.

von Gerd E. (robberknight)


Lesenswert?

Das beste dürfte doch der schon genannte Analogkomparator sein. Die 
Akkuspannung mit einem simplen Spannungsteiler so runterteilen, daß die 
gewünschte Schwellspannung genau der internen Spannungsreferenz des 
Atmegas entspricht.

Die verschiedenen Atmega-Serien haben unterschiedliche 
Spannungsreferenzen, schau im Datasheet nach. Entweder 2,5V oder 1,1V 
sind gängig.

Wenn die Akkuspannung dann unter den Wert fällt löst der 
Analogkomparator aus und Du bekommst nen Interrupt.

von Helmut L. (helmi1)


Lesenswert?

Jürgen Sachs schrieb:
> Jetzt kann ich ja nicht jede Minute die Zeit Prophylaktisch speichern,
> da wäre das EEPROM nach 70 Tagen hinüber.

Fuer sowas gibt es FRAM.

http://www.ramtron.com/products/nonvolatile-memory/

von Fabian (Gast)


Lesenswert?

Ein ds1307 hast Du  nicht zufällig dran?

von Jürgen S. (jsachs)


Lesenswert?

Fabian schrieb:
> Ein ds1307 hast Du  nicht zufällig dran?

Leider Nein. Auch wenn ich schon I2C nutze, würde ich mehr Bauteile 
gerne vermeiden...

von Jürgen S. (jsachs)


Lesenswert?

Gerd E. schrieb:
> Das beste dürfte doch der schon genannte Analogkomparator sein. Die
> Akkuspannung mit einem simplen Spannungsteiler so runterteilen, daß die
> gewünschte Schwellspannung genau der internen Spannungsreferenz des
> Atmegas entspricht.
>
> Die verschiedenen Atmega-Serien haben unterschiedliche
> Spannungsreferenzen, schau im Datasheet nach. Entweder 2,5V oder 1,1V
> sind gängig.
>
> Wenn die Akkuspannung dann unter den Wert fällt löst der
> Analogkomparator aus und Du bekommst nen Interrupt.

Eben geprüft, könnte ich im Receiver machen, aber am Transmitter hängt 
dort ein 8 Bit Datenbus am Port.
Ich werde jetzt mal ein wenig testen, wie ich das hin bekomme.
Ein Spannungsteiler an AIN1 bringe ich noch gut unter im Receiver.

Im Transmitter kann man die Batterie nicht einfach entfernen, hier 
knoble ich im Moment an einem "Softpower" statt einem richtigen 
Schalter.
Ein PNP, der von einem Schalter auf "0" angesteuert wird und danach vom 
Prozessor gehalten wird, sollte nicht das Problem sein.
Dann weiß ich wann abgeschaltet wird und kann speichern.

Das ich den Analog Comperator auch auf eine Interne Referenz legen kann, 
wusste ich noch gar nicht :-)

Ich muss mir nur noch Gedanken machen, wegen der Spannungsüberbückung im 
RX. Da hängt ja noch ein Funkmodul dran an der gleichen 
Spannungsversorgung. Und die zieht richtig Strom.

Danke mal soweit.

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
Noch kein Account? Hier anmelden.