Forum: Mikrocontroller und Digitale Elektronik Interrupt bei Power Down Mode


von Ted (Gast)


Lesenswert?

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

von Andreas K. (a-k)


Lesenswert?

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.

von Torsten L. (bluehorn)


Lesenswert?

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... :)

von Michael U. (amiga)


Lesenswert?

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

von AVRFan (Gast)


Lesenswert?

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

von Fred S. (Gast)


Lesenswert?

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

von Ted (Gast)


Lesenswert?

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

von Hannes L. (hannes)


Lesenswert?

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

...

von STK500-Besitzer (Gast)


Lesenswert?

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

von Fred S. (Gast)


Lesenswert?

Hallo Ted,

tut mir leid, ich hatte "idle" gedacht, obwohl Du eindeutig "power down" 
geschrieben hattest!

Gruß

Fred

von Ted (Gast)


Lesenswert?

>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

von Hannes L. (hannes)


Lesenswert?

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