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?
>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).
@ 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
>Allerdings wird dadurch der Controller jede Sekunde aus dem Standby >"aufgeweckt", um den Variablenzählstand zu überprüfen. Ja. Aber wo ist das Problem?
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.
>...wenn jede Sekunde für ein paar Sekunden ...
wir bewegen uns durch Raum und Zeit :-)
MW
@ 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
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
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 ;-)
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.