Forum: Mikrocontroller und Digitale Elektronik timer bis 1 minute zählen lassen


von tank_84 (Gast)


Lesenswert?

Hallo,

ich habe folgendes Problem:
Mein Programm setzt den Mikrocontroller in den Standby Modus. Ein 
Interrupt (timer1) weckt ihn jede Sekunde, eine Messung wird 
durchgeführt.
Ich möchte jedoch nur alle 60 Sekunden messen lassen, allerdings erlaubt 
die Timerkonfiguration einen so hohen Zählwert nicht.
Jetzt habe ich eine Zählvariable, die bei jedem Interrupt um 1 erhöht 
wird, die permanent abgefragt wird. Beim Zählstand 60 (= 1Minute) wird 
die Messung dann durchgeführt.
Allerdings wird dadurch der Controller jede Sekunde aus dem Standby 
"aufgeweckt", um den Variablenzählstand zu überprüfen.

Wie kann ich das eleganter lösen, so dass der Controller eine komplette 
Minute im Standby verharrt?

von Zählschleife (Gast)


Lesenswert?

>Wie kann ich das eleganter lösen, so dass der Controller eine komplette
>Minute im Standby verharrt?

Das wird nur durch einen externen Interrupt gehen, welcher dann jede 
Minute den MC weckt. (ob das eleganter ist sei jetzt mal offen 
gelassen).

von Falk B. (falk)


Lesenswert?

@ tank_84 (Gast)

>Allerdings wird dadurch der Controller jede Sekunde aus dem Standby
>"aufgeweckt", um den Variablenzählstand zu überprüfen.

Ja und? Wie lange arbeitet er denn dann? Ein paar Dutzend Mikrosekunden.

>Wie kann ich das eleganter lösen, so dass der Controller eine komplette
>Minute im Standby verharrt?

Gar nicht. Reche mal aus wieviel Strom das sparen würde.

MFG
Falk

von AVRFan (Gast)


Lesenswert?

>Allerdings wird dadurch der Controller jede Sekunde aus dem Standby
>"aufgeweckt", um den Variablenzählstand zu überprüfen.

Ja. Aber wo ist das Problem?

von yalu (Gast)


Lesenswert?

Wie schon die Vorposter schrieben: Das Bisschen mehr Strom, das der
Controller aufnimmt, wenn jede Sekunde für ein paar Sekunden die CPU
aktiviert bewegt sich sim Subsubpromillebereich.

Wenn du dir CPU trotzdem 1 Minute lang schlafen legen möchtest, kannst
du an verschiedenen Schrauben drehen:

1. Nimm den bitbreitesten Timer/Counter, der verfügbar ist.

2. Stelle den größten Vorteilerfaktor ein, der möglich ist.

3. Reduziere die globale Taktfrequenz auf einen geeigneten Wert.
   Dadurch laufen zwar auch Berechnungen langsamer, was aber in deiner
   Anwendungen vielleicht keine Rolle spielt.

Bsp.: Ein ATmega hat mindestens einen 16-Bit-Timer, der größte
Vorteilerfaktor ist 1024. Bei der Defaulttaktfreqeuenz von 1 MHz
kommst du schon bis ca. 67 Sekunden. Oder habe ich mich verrechnet?

Bei manchen Controllern kann man mehrere Timer kaskadieren, um längere
Zeitintervalle zu realisieren.

von Michael Wilhelm (Gast)


Lesenswert?

>...wenn jede Sekunde für ein paar Sekunden ...

wir bewegen uns durch Raum und Zeit :-)

MW

von Albert Eisbein (Gast)


Lesenswert?

.....und spalten Haare. ;-)

Albert Eisbein

von Falk B. (falk)


Lesenswert?

@ yalu (Gast)

>Bsp.: Ein ATmega hat mindestens einen 16-Bit-Timer, der größte
>Vorteilerfaktor ist 1024. Bei der Defaulttaktfreqeuenz von 1 MHz
>kommst du schon bis ca. 67 Sekunden. Oder habe ich mich verrechnet?

Nur dass der OP sicher ein 32,768 kHZ Uhrenquarz als Taktquelle nutzt. 
Bei 16 Bit läuft der alle 2 Sekuden über. Mit Vorteiler 1024 alle 2048 
Sekunden.

MFG
Falk

von Albert Eisbein (Gast)


Lesenswert?

@Falk

QUARZFORMATE!!!

Albert Eisbein

von Albert Zweistein (Gast)


Lesenswert?

@Albert Eisbein

Du sprichst aus was ich denke...

von Magnus Müller (Gast)


Lesenswert?

Noch ein Lösungsansatz, welcher es ermöglichen würde, den µC im 
Minutentakt aufzuwecken:

Verwendet werden zwei Hardwaretimer (1x 16Bit und 1x 8Bit)

16Bit-Timer läuft z.B. im CTC-Modus mit Ouput Compare um am OCx-Pin eine 
relativ niedrige "Zwischenfrequenz" zu erzeugen. Der OCx-Pin wird mit 
dem Pin verbunden, über welchen der 8Bit-Timer extern getaktet werden 
kann. Der µC soll dann geweckt werden, sobald der 8Bit-Timer überläuft.

Auf diese Weise lässt sich (rein rechnerisch) auch ein sehr langes 
Zeitintervall realisieren.

Ein kleines Rechenbeispiel:

- µC-Takt 16MHz
- 16Bit-Timer mit Prescaler 1024; OCx-Toggle

--> Zwischenfrequenz = 16MHz/1024/65536/2 = 119,20929 mHz
    (dies entspricht einer Zeitbasis von 8,389 Sekunden!)

Diese Frequenz (Zeitbasis) wird nun nochmals vom 8Bit-Timer durch 256 
geteilt:

--> Zeitbasis = 16MHz/1024/65536/2/256 = 0,4657 mHz
    dies entspricht 2147 Sekunden (33 Minuten 47 Sekunden) !!!


Man beachte, dass diese Werte für eine Taktfrequenz von 16MHz gelten. 
Bei niedrigeren Taktfrequenzen lassen sich dann natürlich entsprechend 
längere Zeitintervalle realisieren.

Gruß,
Magnetus

von yalu (Gast)


Lesenswert?

Michael Wilhelm schrieb:
>>...wenn jede Sekunde für ein paar Sekunden ...
>
> wir bewegen uns durch Raum und Zeit :-)

Das Mikro von den Sekunden ist so mikro, dass du es glatt übersehen
hast. Nicht einmal ich kann es erkennen, so winzig ist es ;-)

von Stefan B. (stefan1975)


Lesenswert?

hallo tank

hast du das problem inzwischen gelöst?
ich habe nämlich ein ähnliches problem !

könntest du das programm mal als anhang in diesen beitrag einstellen !

wäre echt nett!!

mfg
stefan

von fubu1000 (Gast)


Lesenswert?

Guten Morgen,
schaut mal ins Datenblatt!
Schliesst einen 1MHz Quarz an.
Vorteiler auf 1024.
16bit Timer.
Dann habt ihr ca die Minute(sogar mehr).

gruss fubu

von fubu1000 (Gast)


Lesenswert?

Nochmal ich ;-)
Wenn es sein muss schreibe ich euch wohin der Quarz angeschlossen wird 
und welche Register wie gesetzt werden müssen !!! Aber nur nach 
Nachfrage !!!

gruss

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.