Forum: Mikrocontroller und Digitale Elektronik Sleep Modus und Interrupt


von Frank (Gast)


Lesenswert?

Hallo,

ich habe ein 90ls4433 der über eine Batterie betreiben werden soll.
In den sleep modus (Power Down Mode; Seite 27) komme ich rein.
Nun will ich, wenn INT1 gegen masse geschaltet wird, den Controller
wieder wecken. Der interrupt geht ohne probleme(ohne sleep modus).
Aber er will nicht wieder aufwachen.
Im Datenblatt steht aber: Only an external reset .... can wake up the
MCU?

Was mache ich denn falsch?

Danke!!

Frank

von Frank (Gast)


Lesenswert?

Sorry

das zitat beinhaltet auch:

Only an external reset, a watchdog reset, an external level interrupt,
or a pin change interrupt can wake up the
MCU?


Danke!

von Michael Wilhelm (Gast)


Lesenswert?

Hast du den Int auch auf Pegel und nicht auf Flanke eingestellt?

MW

von Frank (Gast)


Lesenswert?

Hallo,


nee der steht auf falling edge! Ich werds malt testen!!

danke

von Frank (Gast)


Lesenswert?

Hi

@ Michael Wilhelm

vielen, vielen Dank!!!!

jetzt funktionierts. Aber, der Controller "rennt" ja dann immer in
der interrupt routiene. Aber das kann man ja auch nutzen.

Warum geht das aber bei Flankenerkenung nicht? Liegt das an der zu
kurzen dauer der flanke? Bekommt das der Controller dann nicht mit?

Nochmals Danke

Frank

von Santa Klaus (Gast)


Lesenswert?

>Aber, der Controller "rennt" ja dann immer in
>der interrupt routiene. Aber das kann man ja auch nutzen.

Wenn Du es nicht nutzen willst, kannst Du es auch unterbinden, indem Du
einfach in der Interruptroutine den Interrupt deaktivierst, und erst vor
Ausführung der SLEEP-Instruktion wieder aktivierst.  Alternativ zum
Deaktivieren kannst Du auch den Modus auf "flankengetriggert" setzen,
solange das Programm läuft, und unmittelbar vor der SLEEP-Instruktion
auf "pegelgetriggert" umstellen.

>Warum geht das aber bei Flankenerkenung nicht? Liegt das an der zu
>kurzen dauer der flanke? Bekommt das der Controller dann nicht mit?

Der µC bekommt es nicht mit.  Wie sollte er auch? Im Power-Down-Modus
ist der System-Oszillator und damit der gesamte Controller
abgeschaltet.  Aufzuwecken ist er nur noch durch einen Reset, oder
durch einen _pegel_getriggerten Interrupt (*).  Mit flankengetriggertem
Interrupt geht es deshalb nicht, weil der µC das Auftreten einer Flanke
am Interruptpin ohne Takt nicht erkennen kann (mit Takt: "0" bei Takt
n, "1" bei Takt n+1 --> Aha, wir haben eine 0-1-Flanke entdeckt!).

(*) oder durch einen Watchdog-Timeout.  Der Watchdog kann auch im
Power-Down-Modus enabled sein.  Er verfügt über eine eigene
RC-Taktversorgung.

von Frank (Gast)


Lesenswert?

@ Santa Klaus

gute erklärung, da hab ich so noch nicht dran gedacht.

Danke

von Michael Wilhelm (Gast)


Lesenswert?

Zur Vollständigkeit:

Beim Einsprung in die ISR wird das Flag gelöscht, welches der Hardware
den Interrupt mitteilt, außer der RxD und der Level Int bei ext.
Interrupts. Die müssen zu Fuß gelöscht werden. beim RxD Int wird das
Flag gelöscht, wenn lesend auf UDR zugegriffen wird. Beim level Int
mußt du das Flag in der Routine zurücksetzen und alles sollte im grünen
Bereich sein.

MW

von Philipp (Gast)


Lesenswert?

@Santa Klaus oder @all:

>Im Power-Down-Modus ist der System-Oszillator und damit der gesamte
Controller abgeschaltet.  Aufzuwecken ist er nur noch durch einen
Reset, oder durch einen _pegel_getriggerten Interrupt


Aber sollte es nicht auch mit einem flanken-getriggerten Interrupt
funktionieren.
Laut SantaKlaus erklärung nicht, aber im DAtenblatt des
Mikrocontrollers (ATmega128) steht "...an External LEvel Interrupt on
INT7:4 or an External Interrupt on INT3:0 can wake up the MCU"

Sollte nun der yC nicht auch über z.B. eine steigende Flanke an INT3
aufwachen?

von Hannes L. (hannes)


Lesenswert?

Vielleicht findest du ja hier ein paar Denkanstöße:

http://www.hanneslux.de/avr/divers/melody/melody04.html

...

von Philipp (Gast)


Lesenswert?

@hannes
Danke erstmal, aber
soweit ich es sehe hast du jedoch einen Low-Level-Interrupt verwendet
um den Mikrocontroller mit Hilfe eines Tasters zu wecken.

Dies ist jedoch in meinem Fall nicht möglich. Bei mir kann/darf der uC
nur über eine L-H-Transition aufwachen.

DArum noch mal die Frage:
Ist es in irgendeinem Sleep-Modus möglich den Atmega128 über eine
steigende Flanke zu wecken (lt.Datenblatt ja, lt.Santa Klaus nein)

mfg Philipp

von Hannes L. (hannes)


Lesenswert?

> Ist es in irgendeinem Sleep-Modus möglich den Atmega128 über eine
> steigende Flanke zu wecken

Mit dem Mega128 habe ich noch nichts gemacht.
Aber aus den Stromsparmodus, in dem jeglicher Takt für MCU, ADC, TIMER,
I/O deaktiviert ist, kann kein flankengetriggerter Interrupt greifen,
den Flankenerkennung braucht Takt und Takt ist deaktiviert. Es geht
daher nur der Low-Level-Interrupt.

Im Datenblatt des Tiny15 steht auch, dass der Pinchange-Interrupt zum
Wecken funktionieren soll. In der Realität ging es auch nicht, es ging
nur Low-Level.

...

von Philipp (Gast)


Lesenswert?

>>Im Datenblatt des Tiny15 steht auch, dass der Pinchange-Interrupt zum
Wecken funktionieren soll. In der Realität ging es auch nicht, es ging
nur Low-Level.

Laut ATmega128 Datenblatt SOLLTE es auch funktionieren. Tatsache ist
das es nicht geht.


>>Stromsparmodus

Meinst du nur Power-down-mode oder generell alle Sleep-Modi

von Hannes L. (hannes)


Lesenswert?

> >>Stromsparmodus
>
> Meinst du nur Power-down-mode oder generell alle Sleep-Modi

Ich habe mit Absicht die Bezeichnung "Stromsparmodus" benutzt, da ich
schon unterschiedliche Bezeichnungen in den Datenblättern gesehen habe
(Power-Down, Power-Save, Standby) und jetzt keine Lust hatte, mich auf
eine Wortspielerei einzulassen.
Ich meine damit den Sleep-Modus, bei dem MCU-Takt, Timertakt, ADC-Takt
und I/O-Takt deaktiviert sind und der Stromverbrauch auf ein Minimum
reduziert wird.

Der Idle-Mode deaktiviert nur den MCU-Takt. ADC, Timer und I/O-Takt
klappern weiter, die Stromaufnahme sinkt kaum.

Der ADC-Noise-Canceler-Mode deaktiviert MCU und Timer und ermöglicht
ungestörte ADC-Wandlung. So richtig stromsparend ist das aber auch noch
nicht.

Erst wenn alle Taktquellen abgeschaltet sind, wird wirksam Strom
gespart. Beim Tiny15 war das wohl der Power-Down-Mode.

...

von Philipp (Gast)


Lesenswert?

Danke sehr.
Das erklärt eigentlich alles.
Ich finde es nur etwas komisch das die Flanken-Interrupt-Weckmethode
dann überhaupt im Datenblatt angegeben wird!

mfg Philipp

von Hannes L. (hannes)


Lesenswert?

> Ich finde es nur etwas komisch das die Flanken-Interrupt-Weckmethode
> dann überhaupt im Datenblatt angegeben wird!

Flanken-Interrupt funktioniert zum Wecken, solange I/O mit Takt
versorgt wird. Das ist im Idle-Mode ja der Fall. Schau mal in Tabelle
18 auf Seite 44 des Datenblatts zum Mega128, da siehst du, welche
Taktquellen in welchen Sleepmodi aktiv sind und welche Interrupts den
128er wecken können.

Übrigens laufen seit einiger Zeit alle meine Programme standardmäßig
mit Sleep. Also nicht nur, wenn "die Anlage schläft", sondern auch im
normalen Betrieb. Der AVR schläft dabei im Idle-Mode und wird von einem
Timer-Interrupt (der als Zeitbasis den gesamten Programmablauf
synchronisiert) geweckt. Dann wird die ISR abgearbeitet und danach die
Mainloop einmal durchlaufen, um dann wieder im Sleep zu landen. Sollten
Betriebsbedingungen auftreten, die den "Tiefschlaf" (Stromsparmode)
erfordern, dann wird der "Weckinterrupt" initialisiert und der
Sleepmode umgeschaltet. Aufgerufen wird Sleep dann an gewohnter Stelle
am Ende der Mainloop. Damit wird den Timern, dem I/O und evtl. dem ADC
der Takt eingefroren, worauf meist nur noch der initialisierte
Low-Level-Int zum Wecken geeignet ist. Bei größeren AVRs sind auch noch
andere Ereignisse zum Wecken geeignet, wie z.B. der asynchron (mit
Uhrenquarz) laufende Timer oder I²C-Interrupt. Ich sehe gerade an der
Tabelle 18 im Mega128-DB, dass es bei den Interrupts weitere
Einschränkungen gibt, schau dir mal die Fußnoten unter der Tabelle an.

Aber wie gesagt, mit Mega128 habe ich noch nix gemacht, da fehlt mir
die Erfahrung.

...

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.