Forum: Mikrocontroller und Digitale Elektronik Aktionszähler mit ATTiny85 und Lithiumbatterie?


von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Es soll gezählt werden, wie oft ein Maschinenteil in einem Jahr hin- und 
her bewegt wird. Die Frequenz berägt max. 3Hz, es kann aber auch 
deutlich weniger sein oder gar tagelang garnix passieren.

Dazu dachte ich an einen Tiny, der nach dem Programmstart einen Zähler 
im EEProm hochzählt und danach sofort in den Tiefschlaf "fährt". Bei 
jedem Durchgang des bewegten Teiles wird der Tiny von einem 
Magneten/SMD-Reedschalter resettet und das Spiel beginnt von vorne.**

Soll der Zähler ausgelesen werden, wird mittels eines anderen 
Reedkontaktes an einem Pin des Tiny verhindert, dass dieser in den 
Tiefschalf geht, statt dessen lässt er eine LED in einem speziellen 
Rhytmus blinken, so dass ein Lesegerät mit optischem Sensor die Signale 
empfangen und auswerten/aufzeichen kann.

Hat jemand Erfahrungen, ob sich sowas mit einer Lithiumzelle CR2032
 über einen zeitraum von mind. 1 Jahr machen lässt?

Das rel. energieaufwändige Auslesen findet höchstens 2 mal im Jahr statt 
und dauert nur 2..3 Sekunden.

** ein Algorithmus, um Zählfehlern durch Alterung/Abnutzung der 
EEProm-Zellen vorzubeugen, ist implementiert.

: Bearbeitet durch User
von Michael U. (amiga)


Lesenswert?

Hallo,

rechne es grob aus. Nimm den ungünstigsten Fall, daß ein Jahr lang 3x 
pro Sekunden gezählt wird.
Wieviel mA braucht Dein Tiny beim Zählen und wie lange ist er dazu wach?
Wieviel mA (µA) braucht er im Schlaf?

Dann hast Du den durchscnittlichen Stromverbrauch pro Sekunden, eine 
CR2032 hat wohl ca. 220mAh.

Mein CR2032 im Gefriefach betreibt einen Tiny45 und einen RFM02 433MHz 
Sender. Sendet ca. alle Minute, Spitzenstrom ist ca. 12mA, hält 6-9 
Monate.

Gruß aus Berlin
Michael

von Jonas G. (jstjst)


Lesenswert?

Kann man schon so machen, allerdings würde ich den Tiny über einen 
Interrupt aufwachen lassen.

von Stone (Gast)


Lesenswert?

Wenn du das Programm gut schreibst kommst du mit einer CR2032 
wahrscheinlich 5-10 Jahre aus.
da du über einen ext.  Interrupt aufwachen kannst würde ich den Power 
Down Modus wählen im sleep hat der uC dann einen Stromverbrauch von 
<1uA. Statt Reset lieber Programm mit sleep und nur alle 100 oder 1000 
Aktivierung in das eeprom schreiben, da das Schreiben im Vergleich zum 
Sram ewig dauert und mehr Strom kostet. Um entprellen solltest du dich 
noch kümmern, da es sonst zu sehr falschen Werten kommen kann. 
Datenübertragung am besten mit crc am Ende um sicher zu sein das es auch 
stimmt.

Gruß Matthias

von S. Landolt (Gast)


Lesenswert?

Das muss mit einer wesentlich kleineren Zelle machbar sein.

Beispiel: Fahrradfahrtenschreiber, ATmega328 mit angeschlossenem 512 
KiB-RAM, 8000 km/a entsprechend rund 4 Millionen Kontakte, es wird im 
Schnitt alle 80 km, also 100 mal pro Jahr, ausgelesen per Infrarot für 
etwa 1 Minute: der Akku mit 60 mAh wird 2-3 mal im Jahr geladen.

von HildeK (Gast)


Lesenswert?

Frank E. schrieb:
> Dazu dachte ich an einen Tiny, der nach dem Programmstart einen Zähler
> im EEProm hochzählt und danach sofort in den Tiefschlaf "fährt". Bei
> jedem Durchgang des bewegten Teiles wird der Tiny von einem
> Magneten/SMD-Reedschalter resettet und das Spiel beginnt von vorne.**

> ** ein Algorithmus, um Zählfehlern durch Alterung/Abnutzung der
> EEProm-Zellen vorzubeugen, ist implementiert.

Naja, im schlechtesten Fall sind es (bei 3 Schreibvorgängen/s) rund 10^8 
Zugriffe auf das EEPROM. Nimmst du jedes Mal eine andere Speicherzelle, 
dann ist der Maximalwert (10k Writes) nach einem Jahr schon 
überschritten - worst case!
Warum kannst du die Werte nicht im RAM lassen? Angst vor Stromausfall 
musst du ja wegen der Batterieversorgung nicht haben. Das ist vermutlich 
auch sparsamer im Batterieverbrauch als die EE-Zugriffe.
Reset ist dann allerdings nicht das Mittel, um den Tiny wieder zu 
aktivieren, aber mit dem INT0 kannst du ihn aus dem Tiefschlaf holen, 
ohne dass der RAM-Inhalt verloren geht.
Zum weiteren Strom sparen kann man mit dem PRR-Register noch einige 
ungenutzte Hardwareblöcke ruhig stellen.

von F. F. (foldi)


Lesenswert?

Muss das so winzig sein? Die CR123 sind auch nicht so groß, bieten aber 
viel mehr Energie

von Timmo H. (masterfx)


Lesenswert?

Im Prinzip sollte das machbar sein. Allerdings dauert das schreiben ins 
eeprom relativ lange. Dann kann das evtl. eng werden. Vielleicht wäre es 
besser einfach nur im RAM eine variable hochzuzählen zu und nur alle 
paar Stunden oder Tage ins eeprom zu schreiben

von Frank (Gast)


Lesenswert?

HildeK schrieb:

> Naja, im schlechtesten Fall sind es (bei 3 Schreibvorgängen/s) rund 10^8
> Zugriffe auf das EEPROM. Nimmst du jedes Mal eine andere Speicherzelle,
> dann ist der Maximalwert (10k Writes) nach einem Jahr schon
> überschritten - worst case!

Bei 512 EEPRom-Zellen und 4Byte (256 hoch 4 ist ca. 10 hoch 8) 
Zählerumfang kann ich die Einer- und Zehner-Stelle ziemlich oft wechseln 
...

von S. Landolt (Gast)


Lesenswert?

Das ist nicht der Punkt - wie von vielen bereits geschrieben, benötigt 
das häufige Schreiben ins EEPROM zuviel Strom.

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

S. Landolt schrieb:
> Das ist nicht der Punkt - wie von vielen bereits geschrieben,
> benötigt
> das häufige Schreiben ins EEPROM zuviel Strom.

Ok, akzeptiert. Dann werde ich nur z.B. alle 100mal eine Kopie des 
Zählers im EEPRom ablegen. Das reduziert den Stromverbrauch, sichert 
trotzdem die Daten in einer akzeptablen Genauigkeit und reduziert 
zusätzlich die "Abnutzung", so dass ich evtl. auf aufwändigere 
EEPROM-schonende Algorithmen verzichten kann (die ja auch Rechenzeit und 
damit Strom kosten) ...

: Bearbeitet durch User
von Dirk D. (dicky_d)


Lesenswert?

Frank E. schrieb:
> S. Landolt schrieb:
>> Das ist nicht der Punkt - wie von vielen bereits geschrieben,
>> benötigt
>> das häufige Schreiben ins EEPROM zuviel Strom.
>
> Ok, akzeptiert. Dann werde ich nur z.B. alle 100mal eine Kopie des
> Zählers im EEPRom ablegen.

Wenn du jedes 100ste mal ins eeprom schreibst, schreib doch auch einfach 
nur ein 100stel ins eeprom.
also schreib 1,2,3 statt 100, 200, 300.
Dann kommst du mit 3 byte auch 150Jahre aus.

von LostInMusic (Gast)


Lesenswert?

>Warum kannst du die Werte nicht im RAM lassen?

>Reset ist dann allerdings nicht das Mittel, um den Tiny wieder zu aktivieren

Wieso? Ein Reset hat auf den SRAM überhaupt keine Auswirkung, d. h. 
dessen Inhalt bleibt erhalten.

von Timmo H. (masterfx)


Lesenswert?

LostInMusic schrieb:
> Warum kannst du die Werte nicht im RAM lassen?
>
> Reset ist dann allerdings nicht das Mittel, um den Tiny wieder zu
> aktivieren
>
> Wieso? Ein Reset hat auf den SRAM überhaupt keine Auswirkung, d. h.
> dessen Inhalt bleibt erhalten.

Aber dann sollte man noinit nicht vergessen
1
int foo __attribute__ ((section (".noinit")));

von HildeK (Gast)


Lesenswert?

LostInMusic schrieb:
> Wieso? Ein Reset hat auf den SRAM überhaupt keine Auswirkung, d. h.
> dessen Inhalt bleibt erhalten.

Timmo H. hat einen Vorschlag gemacht, was man wohl tun kann (gut, das 
kenne ich nicht).
Aber in C sollte man üblicherweise eine Variable, die man z.B. 
hochzählen will, eingangs mal mit einem Startwert vorbelegen.
Nach dem Reset wird sie eben wieder mit dem neuen Startwert vorbelegt. 
Und dann?
Kann aber auch sein, dass ich da was übersehen habe oder dass man das 
trickreich umgehen kann.

von Jan H. (jan_m_h)


Lesenswert?

HildeK schrieb:
> Kann aber auch sein, dass ich da was übersehen habe oder dass man das
> trickreich umgehen kann.

Gibt ein Statusregister, wo man nachgucken kann, wo der Reset herkam. 
Und dann initialisieren, solange der Reset nicht vom externen Reset-pin 
kommt.

von LostInMusic (Gast)


Lesenswert?

>Aber in C ...

Deshalb würde ich dem TO ja auch raten, sein kleines Programm in 
Assembler zu schreiben. Kein C --> keine Probleme :-)

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

HildeK schrieb:
> Aber in C sollte man üblicherweise eine Variable, die man z.B.
> hochzählen will, eingangs mal mit einem Startwert vorbelegen.
> Nach dem Reset wird sie eben wieder mit dem neuen Startwert vorbelegt.
> Und dann?

 Startwert wird aus EEPROM gelesen, ebenso die letzte, bzw. aktuelle
 Adresse.
 Beim programmieren sind die beiden auf Null, beim bewegen werden
 die Daten ins RAM geschrieben - wenn RAM-Variable >= 250, wird die
 EEPROM-Variable (WORD) um eins erhöht, wenn EEP-Variable > 65000,
 wird der EEPROM-Pointer um eins erhöht...

 Somit hast du in einer EEP-Variable 16,250,000 Bewegungen, das ist
 im ungünstigsten Fall (24 Stunden mit 3Hz) 1 EEP-Zelle pro 2 Monate,
 bzw. mehr als 1000 Monate ununterbrochen mit 3Hz.
 Allerdings ist möglicher Fehler bei Stromausfall +/- 250 Bewegungen,
 mit nur 10 Bewegungen in RAM-Variable ist Fehler +/- 10 Bewegungen
 und ununterbrochenem Betrieb von 3,5 Jahren.

Frank E. schrieb:
> ** ein Algorithmus, um Zählfehlern durch Alterung/Abnutzung der
> EEProm-Zellen vorzubeugen, ist implementiert.

 Unnötig, allerdings ist EEP-Page 4 Bytes, da würde ich zur Sicherheit
 EEP-Pointer auch um 4 erhöhen, anstatt um zwei.
 Oder long, anstatt word nehmen.

: Bearbeitet durch User
von F. F. (foldi)


Lesenswert?

Marc V. schrieb:
> das ist
>  im ungünstigsten Fall (24 Stunden mit 3Hz)

94.608.000 Daten in einem Jahr.

von Fritz F. (Gast)


Lesenswert?

Falls dies noch jemand liest (ist schon lange her):

Ganz klar einen externen Zählerbaustein verwenden.

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.