Hallo Zusammen, ich versuche zur zeit eine RTC auf einem mega8 im Batteriebetrieb zu Programmieren. Die Software läuft bis auf eine kleinigkeit Anstandslos. Mit einem Taster schicke ich den mcu in sleep mode power save. Der Asynchron Timer weckt diesen auch wieder auf, und schickt ihn danach wieder schlafen. Mit einem anderen Taster wird der Schlafmodus unterbrochen. In 50% der Fälle liegt der Stromverbrauch bei um die 30 µA. Bei den anderen 50% brauch der mcu aber ca 1,6mA lässt sich aber wie gewohnt wieder per taster aufwecken. Wodurch könnte dieser Fehler hervorgerufen werden? Vielen Dank im Vorraus Grüße Martin
Martin schrieb: > Wodurch könnte dieser Fehler hervorgerufen werden? Durch die doppelte Tastenabfrage in Timer2 ISR und in main() ?
Hallo, Danke für die Antwort habs probiert bringt leider keine Veränderung. Ich habe noch festgestellt das der mcu nach tasterdruck für 1 Sekunden wenig Strom braucht und danach wieder 1,6mA. Das bedeutet für mich das er 1 zyklus im sleep modus ist und danach etwas unvorhergesehees passiert.
Schaltest du vll die pullups ab? Löscht du alle events, bevor du schläfst? Wieso eigentl 30uA? Gemittelt? Klaus.
An den Pullups wird nichts geändert. Wie meinst du das mit Events löschen? ja genau das ist das was meine messgerät mir so ungefähr anzeigt. Martin
Martin schrieb: > habs probiert bringt leider keine Veränderung. Dein Programm ist auch ein bisschen schwer zu lessen. Normalerweise nimmt man Konstanten für so etwas. menu1´= 3, sleepon = 3, sagt mir absolut nichts. Martin schrieb: > Das bedeutet für mich das er 1 zyklus im sleep modus ist und danach > etwas unvorhergesehees passiert. So soll es auch sein (nach deinem Programm). uC geht nur dann schlafen wenn Enter gedruckt ist:
1 | if(!(PINB & (1<<0))) //Enter |
2 | {
|
3 | switch(menu1) |
4 | {
|
switch(menu1) nach oben verlegen, Abfrage in Timer2 ISR und gut ist es. Eventuell Timer2 etwas beschleunigen (wegen Tasterabfrage) und bei jedem zweiten oder vierten Durchlauf Sekunden erhohen.
:
Bearbeitet durch User
menu1 ist für die Menü Auswahl, nur in menü "3" kann der mcu in sleep versetzt werden. sleepon ist dafür verantwortlich den mcu nach dem Aufwachen durch den timer interrupt und abarbeiten des selbigen wieder schlafen zu legen.
1 | while(sleepon) asm volatile("sleep"); |
Die Abfrage in den Interrupt zu verlagern hat auch nicht den gwünschten erfolg gebracht.
Danke für die Hilfe. Hab das Problem nun gelöst. Es lag am eingeschalteten TWI, durch deaktivieren des TWI vor dem Sleep läuft nun alles wie Gewünscht.
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.