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
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!
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
>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.
@ Santa Klaus gute erklärung, da hab ich so noch nicht dran gedacht. Danke
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
@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?
Vielleicht findest du ja hier ein paar Denkanstöße: http://www.hanneslux.de/avr/divers/melody/melody04.html ...
@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
> 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. ...
>>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
> >>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. ...
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
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.