Forum: Mikrocontroller und Digitale Elektronik Sleep-Modus beim ATMega8 (Assembler)


von Lothar K. (lothark)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Was lässt Dich annehmen, daß das im Forum "Webseite" unterzubringen ist?

-> Verschoben.

von Timmo H. (masterfx)


Lesenswert?

Wenn er schläft kannst du ihn aber auch nur durch interrupts wieder 
aufwecken. Machst du das auch?

von Werner (Gast)


Lesenswert?

Ich denke er möchte den Modus, wo der Timer weiterläuft...

von Lothar K. (lothark)


Lesenswert?

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

von Sebastian .. (zahlenfreak)


Lesenswert?

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

von Werner (Gast)


Lesenswert?

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.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

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.

von Lothar K. (lothark)


Lesenswert?

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

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

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.

von Lothar K. (lothark)


Lesenswert?

Hallo,

allerbesten Dank. Genau diese Antwort habe ich gesucht. Ich werde das 
heuta Abend gleich testen.

Ciao Lothar

von Lothar K. (lothark)


Lesenswert?

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

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

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.

von Lothar K. (lothark)


Lesenswert?

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

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

>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?

von Lothar K. (lothark)


Lesenswert?

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

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Na sach ich doch. Simulieren ist nicht dasselbe, wie auf dem Controller 
real laufen lassen.

von Lothar K. (lothark)


Lesenswert?

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

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Ja dann bitteschön :-)

von Frank (Gast)


Lesenswert?

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

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

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.

von Lothar K. (lothark)


Lesenswert?

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

von Gast (Gast)


Lesenswert?

>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?

von Lothar K. (lothark)


Lesenswert?

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

von Gast (Gast)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

@  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

von Lothar K. (lothark)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@ 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

von Lothar K. (lothark)


Lesenswert?

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

von Lothar K. (lothark)


Lesenswert?

Danke und Sorry!

Ich habe doch den Link zuerst glatt ignoriert.
Ich habs gefunden. Danke

Lothar

von Falk B. (falk)


Lesenswert?

@  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

von Lothar K. (lothark)


Lesenswert?

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

von Gast (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.