Hallo, sicher werdet Ihr mich jetzt auf das Datenblatt verweisen... Ich habe einen ATMega8, mit dem ich zyglisch einen Wert abfragen und auf ein LCD-Display ausgeben will. Es wird bei mir mittes 16Bit-Timer alle 33 Sek. der Status am AD-Wandler abgefragt und auf das Display ausgegeben. Das klappt auch soweit ordentlich. Nun soll das Ganze aber mit Batterie gespeist werden. Ich dachte mir - da gibt es doch den SLEEP-Modus. Leider habe ich überhaupt keinen Plan, wie ich das realisieren kann. Ein kläglicher ersuch: ldi rmp, (1 << SE) | (0b010 << SM0) out MCUCR, rmp sleep scheitert mit Tiefschlaf. :-) Nun wälze ich schon Stunden das Internet (Ich war schom an dessen Ende) und finde nichts. Wäre jemand so nett und könnte mir einen Tipp / Codeschnipsel geben? Alles was ich finde ist, wie ich den Tiefschlaf mit INT beenden kann. Ich hoffe, mir kann dazu jemand helfen? MfG LotharK
Was lässt Dich annehmen, daß das im Forum "Webseite" unterzubringen ist? -> Verschoben.
Wenn er schläft kannst du ihn aber auch nur durch interrupts wieder aufwecken. Machst du das auch?
Hi, Erst mal Entschuldigung für das Fehlposting und Danke fürs Verdschieben - Entschuldigung: Neuling - 1. Posting. @Timo Bis jetzt habe ich noch gar keinen Plan. So fest stecke noch ich nicht in dieser Materie - leider. @Werner Du hast sicher den Nagel auf den Kopf getroffen. Ich hatte gehofft, dass mir jemand die Zeilen fürs "In den Schlaf schicken" und wieder "mittels Timer aufwecken" hier posten würde. Irgendwie finde ich nirgends ein Beispiel und auch in die Dokumentation des ATMega8 finde ich mich eher schlecht rein. MfG Lothar
Die ATMegas haben verschiedene Sleep-modi. In manchen laufen die Timer weiter (das brauchst du) und in manchen nicht. Wenn die Timer weiterlaufen, dann wird der Controller durch einen Timerinterupt wieder aufgeweckt (und bleibt wach bis man ihn wieder schlafen legt). Welchen Sleep-modus man haben will muss man vorher festlegen indem man ein Paar Bits in einem register setzt. Welche müsste ich auch erst im Datenblatt nachschaun. Dort gibt es auch eine schöne Tabelle, welche Ressurcen in welchem Sleep-Modus noch laufen und welche nicht. Such einfach mal im Datenblatt nach "Sleep". Bzw: Ich glaub es gibt sogar eine Kapitelüberschrift dazu. Du wirst aber das kompette datenblatt brauchen und nicht die Kurzform. Sebastian
http://209.85.135.104/search?q=cache:X2I59NMtgcoJ:www.uni-koblenz.de/~physik/informatik/MCU/clock.pdf+sleep+mode+atmega8&hl=de&ct=clnk&cd=3&gl=de Ansonsten hilft hier wirklich das original Datenblatt. Da stehen ja sogar meist Codeexamples drin.
Du kannst denjenigen Schlafmodus auswählen, in dem nur noch der Watchdog und Level-INTs funktionieren. Dann stellst Du den Watchdog auf längstes Intervall. Beim Starten des Controllers aus dem Sleep zählst Du eine Variable hoch, die multipliziert mit dem Wachdog-Interval, nach 33 Sekunden zuschlägt, die gewünschte Funktionen aufruft und zurückgesetzt wird. Ist die Zeit noch nicht erreicht, wacht der Controller nur kurz auf, testet die Variable und schläft sofort wieder ein.
Hm, diese ganze Theorie habe ich schon gelesen und begriffen. Leider kann ich das Ganze nicht in die Tat umsetzen. Wenn ich wüßte, welche Register ich wie und wann ansprechen muss, dann - so glaubt mir bite - ich würd es tun. Ich dachte, es hätte schon mal irgend wer den ATMega8 in den Schlaf geschickt und dann auch wieder mittels Timer geweckt. Wenn es Dich hier gibt, ich wäre Dir unendlich dankbar, wenn Du mir den nötigen Assembler-Code posten könntest. Meine Email: l_kriegerow@gmx.de Du ersparst mir Tagelanges Rumprobieren, bei dem ich am Ende resigniere - ich weiß das. Danke dem, der mir bei meinem Problem weiter helfen kann. Also: ATM in den Schlaf schicken und mittels Timer wieder aufwecken. Nichts weiter - DANKE! MfG Lothar
Manchmal frage ich mich, wozu es Datenblätter gibt... zuerst den Watchdog initialisieren: wdr ldi r16, (1<<WDCE)|(1<<WDE) out WDTCR, r16 ldi r16, (1<<WDP2)|(1<<WDP2)|(1<<WDP2) ;2 Sekunden Timeout out WDTCR, r16 jetzt noch das Power-management wdr in r16, MCUCR ori r16, (1<<SM1)|(1<<SE) ;PowerDown out MCUCR, r16 sleep Zusätzlich sollte man noch die WDTON-Fuse prongrammieren. In der Main muß der Befehl "wdr" stehen, der innerhalb des eingestellten Zeitintervalls des Watchdogs mindestestens einmal aufgerufen werden muß. Die Power-Management-Routine muß an der Stelle im Programm aufgerufen werden, wo der Vergleich der Varible auf die 33 Sekunden erfolgt. Der Controller wacht nun alle 2 Sekunden auf, geht über RESET und muß die Variable hochzählen. Ist sie hoch genug, wird in´s Hauptprogramm gesprungen, alles abgearbeitet und dann wieder eingeschlafen. So, den Rest mußt Du selber machen.
Hallo, allerbesten Dank. Genau diese Antwort habe ich gesucht. Ich werde das heuta Abend gleich testen. Ciao Lothar
Hallo noch mal. Ich dachte nun, ich hätte das Ganze verstanden?!? Leider startet der Watchdog nicht neu. Das Register rRun bleibt unverändert. Was ist denn nun noch falsch? Diesen Code habe ich nun: *********************************************************** .NOLIST .include "m8def.inc" .LIST .Def rRun = R17 .org 0x0000 rjmp main main: wdr ldi r16, (1<<WDCE)|(1<<WDE) out WDTCR, r16 ldi r16, (1<<WDP2)|(1<<WDP1)|(1<<WDP0) out WDTCR, r16 inc rRun CPI rRun, 5 breq Programm wdr in r16, MCUCR ori r16, (1<<SM1)|(1<<SE) out MCUCR, r16 sleep Loop: RJmp Loop Programm: ; Hier steht mein Code - oder? Ret ************************************************************* MfG LotharK
Ich wette, rRun steht unverändert auf 5? Du hast vergessen, es im auszuführenden Code zurückzusetzen. Und die Watchdog-Init ist fehlerhaft, sie muß so aussehen: ldi r16, (1<<WDCE)|(1<<WDE) out WDTCR, r16 ldi r16, (1<<WDE)|(1<<WDP2)|(1<<WDP1)|(1<<WDP0) out WDTCR, r16 Sorry.
Hi, <... die Watchdog-Init ist fehlerhaft.> Na ja, ich hab es doch vom obigen Posting rauskopiert. Ich hab es geändert, aber rRun bleibt unverändert auf 1. Der WatchDog wird also nie ausgelöst. Wo könnte da denn noch ein Fehler stecken? Danke für Deine Mühe - Lothar
>Na ja, ich hab es doch vom obigen Posting rauskopiert.
Weiß ich doch. Deswegen das "Sorry".
Simulierst Du den Code oder testest Du ihn auf einem Controller?
Hallo, ich noch mal. Es funktioniert. Ich wußte nicht, dass das AVR Studio4 den Watchdog nicht verarbeiten kann. Das Programm in dieser Konstellation friert einfach ein. MfG Lothar
Na sach ich doch. Simulieren ist nicht dasselbe, wie auf dem Controller real laufen lassen.
Tja, die Erfahrungen muss ich alle noch sammeln. Ich danke Dir recht herzlich für Deine Hilfe. Den Rest bekomme ich selber hin - hoffe ich. :-) Ciao Lothar
Das ist aber ein sehr interessanter Beitrag. Nur eins verstehe ich nicht. Was bewirken diese Zeilen? Geht es nicht ohne die auch? in r16, MCUCR ori r16, (1<<SM1)|(1<<SE) out MCUCR, r16 Cu Frank
Die Zeilen bewirken die Auswahl des Schlafmodus und schalten den Sleep-Befehl unmittelbar vor dessen Benutzung erst frei. Der Controller kann verschieden tief schlafen. Je tiefer, desto weniger Strom braucht er, aber desto weniger Möglichkeiten des Aufweckens bleiben übrig. Siehe Datenblatt.
Hallo, dank der Hilfe hier, habe ich meine Schaltung fertig bekommen. Alles funktioniert so weit super. Ich überwache eine Solarbatterie. Wenn die Akkuspannung unter 11 Volt sinkt, schicke ich den µC in den Tiefschlaf. Trotz dieses Modis zieht der µC immer noch 6 mA. Ist es möglich, die Stromaufnahme noch weiter zu senken? Ich verwende den ADC, den Watchdog, PortB zur Ausgabe ans LCD PortD,2 als Schaltereingang (Nicht Interrupt) und PortD, 7 als Ausgang zum Ansteuern einer weiteren Schaltung. Ich hoffe, anhand dieser Informationen kann mir jemand mitteilen, wie ich den Verbrauch noch etwas senken kann? Weiter oben schrieb Travelrec: Zusätzlich sollte man noch die WDTON-Fuse prongrammieren. Ich habe an den Fuses nichts gemacht. Was bewirkt das Setzen? (Der Watchdog funktioniert bei mir problemlos) MfG LotharK
>Trotz dieses Modis zieht der µC immer noch 6 mA. Der µC allein oder die komplette Schaltung? Wahrscheinlich letzteres und wahrscheinlich fließen über irgendwelche Widerstände (Spannungsteiler etc.) noch Ströme. Wie groß sind die? >Ist es möglich, die Stromaufnahme noch weiter zu senken? Davon ist auszugehen. >Ich verwende den ADC, den Watchdog, >PortB zur Ausgabe ans LCD PortD,2 als Schaltereingang (Nicht Interrupt) >und PortD, 7 als Ausgang zum Ansteuern einer weiteren Schaltung. Siehe oben. Was genau zieht da Strom?
Hi, Also noch mal. Der µC zieht den Strom und nicht die Schaltung. (Also der µC inkl. 10K Widerstand gegen Vcc und RESET.) Habe ich doch aber schon oben extra so deutlich geschrieben. MfG Lothar
Ein ATmega8 kann 6 mA Strom ziehen. Z. B. wenn er permanent aktiv ist (d. h. kein Schlafmodus; nicht mal "Idle") und mit ca. 4 MHz @ 5 V läuft - siehe Datenblatt. Ob das für Dein Projekt zutrifft, kann ich natürlich nicht wissen. Ich kenn das Programm ja nicht.
@ Lothar Kriegerow (lothark) >Trotz dieses Modis zieht der µC immer noch 6 mA. Ist es möglich, die Das ist sehr viel, der AVR ist somit garatiert NICHT im Sleep Mode. >Stromaufnahme noch weiter zu senken? Ich verwende den ADC, den Watchdog, >PortB zur Ausgabe ans LCD PortD,2 als Schaltereingang (Nicht Interrupt) >und PortD, 7 als Ausgang zum Ansteuern einer weiteren Schaltung. Den ADC kann man ausschalten, wenn er nicht gebraucht wird. Eingänge dürfen nicht in der Luft hängen, wenn doch dann internen Pull-Up einschalten. Ausgänge dürfen nix treiben, z.B. LEDs etc. >Ich hoffe, anhand dieser Informationen kann mir jemand mitteilen, wie >ich den Verbrauch noch etwas senken kann? Ultra low power >Ich habe an den Fuses nichts gemacht. Was bewirkt das Setzen? RTFM! MFG Falk
Hi, Hm - ich sehe an der zum Test angeschlossenen LED, dass der Watchdog alle 2 Sek. angesprochen wird... die offenen, unberücksichtigten Ports können tatsächlich die Ursache sein. Da habe ich gar nicht dran gedacht, schäm. Bis jetzt habe ich die Ports immer als Ausgang geschalten, oder mit externen Widerständen beschaltet. Das ich interne Pull-UP Widerstände habe, das habe ich bis jetzt noch gar nicht beachtet. Bedeutet das auch, dass ich den Reset-Pin nur mit Schalter gegen Masse ziehen muss? Ich habe immer noch einen 10K-Widerstand gegen Masse gelegt Ähm, sicher werdet ihr gleich vor Lachen umfallen, aber wie aktiviere ich diese? Ich bin wirklich ein echter ATM-Neuling, deshalb bitte ich um Nachsicht. (Was ist RTFM?) MfG Lothar
@ Lothar Kriegerow (lothark) >Ähm, sicher werdet ihr gleich vor Lachen umfallen, aber wie aktiviere >ich diese? >Ich bin wirklich ein echter ATM-Neuling, deshalb bitte ich um Nachsicht. AVR-Tutorial: IO-Grundlagen >(Was ist RTFM?) http://de.wikipedia.org/wiki/Rtfm#R MFG Falk
OK, sicher hast Du Recht. Vielleicht bin ich auch 40 Jahte zu alt für den Sch... Ich werd mal sehen, ob ich irgend wo eine Antwort finde. Vielleicht setze ich mich auch noch hin und lerne Englisch. Ich dachte halt, wenn hier jemand ist, ders weiß, der erspart mir ein 309 Seiten langes Datenblatt. MfG Lothar
Danke und Sorry! Ich habe doch den Link zuerst glatt ignoriert. Ich habs gefunden. Danke Lothar
@ Lothar Kriegerow (lothark) >halt, wenn hier jemand ist, ders weiß, der erspart mir ein 309 Seiten >langes Datenblatt. Kleiner EDV-Tip. Im Acrobat Reader CTRL+F drücken, Suchwort eingeben "Watchdog" eingeben und ENTER drücken. Erspart das komplette Durchlesen von 309 Seiten Datenblatt. MFG Falk
Mir stellt sich die Frage: Unbenutzte Ports als Ausgang oder Eingang mit Pull-UP zu verwenden. Hat das Stromaufnahme-Konsequenzen? (Das steht nicht im DB) Lothar
Es gibt keinen Grund, warum man einen unbenutzten Pin als Ausgang schalten sollte. Konfigurier das Ding wie empfohlen als "Eingang mit aktiviertem Pullup" und fertig. Der Pullup führt auch nicht zu einer erhöhten Stromaufnahme, außer Du verbindest den Pin mit GND (was Du aus ebendiesem Grund nicht tun solltest).
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.