Der ATtiny2313 weckt nach einem Power Down Mode zuverlässig auf. Dazu verwende einen 'low level' an INT1. Nur dumm das der AVR den Interrupt solang macht wie der der INT1 auf '0' liegt. Wie kann ich das Teil dazu bringen nur ein einziges Mal in die 'EXT_INT1' zu springen und dann nie wieder? Hardware mässig (Zeitglied mit Kondensator) geht nicht, da ich den Eingang im weiteren Verlauf auch länger auf '0' halten muss. Ted
Wenn du es dir leisten kannst, den Controller solange wach zu halten bis INT wieder inaktiv ist: INT1 im Interrupt erst auf positive Flanke einstellen, und wenn der kommt wieder zurück auf Pegel. Danach darf er dann wieder zur Ruhe gebettet werden.
Andreas Kaiser wrote: > Wenn du es dir leisten kannst, den Controller solange wach zu halten bis > INT wieder inaktiv ist: INT1 im Interrupt erst auf positive Flanke > einstellen, und wenn der kommt wieder zurück auf Pegel. Danach darf er > dann wieder zur Ruhe gebettet werden. Hmm, wenn der Request evtl. mal wieder sehr schnell auf High geht, sehe ich die Gefahr, dass der AVR die positive Flanke verpasst (weil zu spät umkonfiguriert). Damit reagiert er dann auf den nächsten IRQ nicht. Könnte ungünstig sein... Was spricht eigentlich dagegen, den pin change interrupt dafür zu verwenden? Wobei mir aus der Dokumentation nicht klar ist, ob der funktionieren kann. Denn eigentlich wird der ja erst auf die Clock synchronisiert. Mal wieder ein faszinierendes Problem... :)
Hallo, was hindert Dich, nach dem Aufwecken in der ISR diesen Interrupt auszuschalten und ihn vor dem Schlafen schicken, wenn geordnete Verhältnisse herrschen, wieder einzuschalten? Gruß aus Berlin Michael
>Wie kann ich das Teil dazu >bringen nur ein einziges Mal in die 'EXT_INT1' zu springen und dann nie >wieder? Deaktivier den Interrupt doch einfach im Interrupthandler über die entsprechenden I/O-Register.
Hallo Ted, >...... Nur dumm das der AVR den Interrupt solang macht wie der der INT1 > auf '0' liegt. Wie kann ich das Teil dazu bringen nur ein einziges... Vielleicht habe ich Dein Problem nicht richtig kapiert. Ich würde INT1 einfach auf die fallende Flanke triggern lassen und hätte das Problem dann nicht. Gruß Fred
Hallo Fred, Aus einem 'Idel' mit SM1=0 und SM0=0 kann man den AVR auch mit Flanken aus seinen Schlaf holen. Aber ich will mehr Strom sparen und den 'Power Down' mit SM1=1 und SM0=0 verwenden (4mA Strom statt 9mA). Also geht ersteinmal nur der Low-Level zu verwenden. Irgend wie bekommt der µC nach so einem Schlafzustand aber nicht mit, das noch in der Interruptroutine noch direkt nach der Routine ein CLI (global Interrupt AUS) im eigentlich den Interrupt abgewöhnen soll. Gruß Ted
Ich würde in der Ext-Int-ISR den Sleep-Mode auf Idle setzen und den Ext-Int deaktivieren. Nun kann der AVR ganz gemütlich seine Arbeit machen, also Timer (und andere, wie UART, SPI, ADC, ...) -Inerrupts auslösen, bei Bedarf Jobs (wie Tastenentprellung) abarbeiten, zwischen den Jobs und Interrupt im Idle pennen gehen. Dabei einen Timeout herunterzählen, wenn nix passiert, also der Benutzer nix tut. Ist Timeout abgelaufen, dann Ext-Int aktivieren und Sleep-Mode auf Tiefschlaf umschalten. Nun bleiben Takt und Timer stehen und der AVR spart Strom, bis zum nächsten Ext-Int... ...
>Vielleicht habe ich Dein Problem nicht richtig kapiert. Ich würde INT1 >einfach auf die fallende Flanke triggern lassen und hätte das Problem >dann nicht. AVR erkennen keine Flanken, wenn sie schlafen. Das geht nur mit längeren L-Pegeln. >Mal wieder ein faszinierendes Problem... :) Wenn man wüsste, was das Problem ist, könnte man auch besser helfen. Den EXT-INT1 würde ich sofort in der eigenen ISR sperren oder auf steigende Flanke konfigurieren. Dann arbeitet man das Programm ab, und schaltet den EXT-Int1 wieder auf Pegel und legt ihn schlafen. Was soll der Controller überhaupt machen?
Hallo Ted, tut mir leid, ich hatte "idle" gedacht, obwohl Du eindeutig "power down" geschrieben hattest! Gruß Fred
>Was soll der Controller überhaupt machen?
Das Ganze ist eine 1-Tasten-Bedienung. Bei kurzen Tastendruck wird
zwischen einem Timer von 20/40/60 Sekunden umgeschaltet. Wenn man die
Taste länger betätigt (>1 Sekunde) läuft der Timer ab und ein
Portausgang wird für diesen Zeitraum geschaltet. Wenn die Taste >5
Minuten nicht betätigt wird geht die Schaltung in 'Power Down' um die
Akkus zu schonen. Damit sollen Akkustandzeiten von bis zu 200h (800mAh
Akkus) erreicht werden.
Gruß Ted
Ted wrote: >>Was soll der Controller überhaupt machen? > > Das Ganze ist eine 1-Tasten-Bedienung. Bei kurzen Tastendruck wird > zwischen einem Timer von 20/40/60 Sekunden umgeschaltet. Wenn man die > Taste länger betätigt (>1 Sekunde) läuft der Timer ab und ein > Portausgang wird für diesen Zeitraum geschaltet. Wenn die Taste >5 > Minuten nicht betätigt wird geht die Schaltung in 'Power Down' um die > Akkus zu schonen. Damit sollen Akkustandzeiten von bis zu 200h (800mAh > Akkus) erreicht werden. > > Gruß Ted Schau Dir das mal an: http://www.hanneslux.de/avr/divers/melody/melody04.html Nach "getaner Arbeit" wird im Power-Down gepennt, in den Pausen während der Arbeit (also während Timer, ADC usw. gebraucht werden) im Idle-Mode. Ich denke, das ist genau das, was Du brauchst... ...
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.