mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Sleep Modus und Interrupt


Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Michael Wilhelm (Gast)
Datum:

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

MW

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,


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

danke

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Santa Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Santa Klaus

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

Danke

Autor: Michael Wilhelm (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Philipp (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht findest du ja hier ein paar Denkanstöße:

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

...

Autor: Philipp (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Philipp (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Philipp (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.