Hallo, ich habe einen Attiny13A und möchte in in Power Down Modus versetzen und über den INT0 wieder raus holen. Leider habe ich übersehen, dass das nur mit einem Level Interrupt geht. Ich benötige aber einen Falling Edge interrupt. Parralel soll noch ein WDT Interrupt ohne System Reset als Timer laufen. Im Idle Modus funktioniert auch alles gut(mit dem Falling Edge Interrupt). Ich will, dass der MCU beim kurzen Drücken einschaltet und nach einer Zeit X oder 4sec gedrückt halten wieder ausgeht. Meine Frage ist also: Wie kann ich softwareseitig aus einem Low Level Interrupt ein nicht blockierendes Falling Edge Interrupt machen, ohne das andere Interrupts ausgeschaltet werden? Grüße, Florian
Flo schrieb: > Hallo, > ich habe einen Attiny13A und möchte in in Power Down Modus versetzen und > über den INT0 wieder raus holen. Leider habe ich übersehen, dass das nur > mit einem Level Interrupt geht. Ich benötige aber einen Falling Edge > interrupt. Das versteh ich jetzt nicht. Warum brauchst du einen Falling Edge Interrupt? Wenn du auf einen Taster drauf drückst, dann hast du doch eine gewisse Zeit lang einen konstanten Level. Der Level Interrupt reagiert, den deaktivierst du dann kurzerhand kurzfristig, machst dein Ding und legst den µC wieder schlafen. So kurz kannst du händisch gar nicht auf einen Taster drücken, dass sich das für einen µC nicht als 'ist der Benutzer schon wieder auf der Taste eingeschlafen?' 'anfühlt'.
Flo schrieb: > Wie kann ich softwareseitig aus einem Low Level Interrupt ein nicht > blockierendes Falling Edge Interrupt machen Du kannst doch einfach den Interrutp beim Verlassen des Sleep-Modes auf Flanke umschalten und vor Eintreten in den Sleep-Mode wieder auf Pegel umstellen... BTW: es ist üblicherweise eine schlechte Idee, Taster im "normalen" Programmablauf mit Interrupts abzufragen. Polling in der Main-Loop ist hier das langfristige Mittel zum Erfolg.
Aber wärend der Taster ~4sec gedrückt wird soll der WDT interrupt (jede 1sec) noch ausgelöst werden können.
Die übliche Methode ist, man nimmt den Interrupt nur zum Aufwachen. Dann macht der MC sein Ding mit einer standard Entprellroutine (Flanken-, Drückdauererkennung). Und wenns nichts mehr zu tun gibt, geht er wieder schlafen. Beitrag "AVR Sleep Mode / Knight Rider"
ja das ist mir klar. ich versuch es mal so: T= Taster, W = WDT, X = Zähler A= Ausgang Szenario 1: Taster wird kurz gedrückt und WDT und Ausgang wird eingechaltet. Der MCU befindet sich fast die ganze Zeit im Tiefschlaf. Der WDT macht einen Interrupt jede Sekunde und zählt einene Variable hoch. Nach einer Zeit X (~15min) wird wird der WDT und der Ausgang ausgeschaltet. 1 Sekunden Takt: T - W X A 1 - 0 0 0 0 - 1 1 1 Startet bei Falling edge. 1 - 1 2 1 1 - 1 3 1 1 - 1 4 1 ... 1 - 1 9 0 1 - 0 0 0 ist der WDT aus gibt es nurnoch den INT0 Interrupt Szenario 2: Taster wird lang gedrückt. Falls WDT und/oder Ausgang ausgeschaltet sind, werden diese eingeschaltet. Der MCU befindet sich fast die ganze Zeit im Tiefschlaf. Der WDT macht einen Interrupt jede Sekunde und zählt einene Variable hoch, falls der Taster wärend des WDT interrupts gedrückt ist, zählt er einen "Totzähler" hoch. Nach einer Zeit Xtot (~5sec) wird wird der WDT und der Ausgang ausgeschaltet. Das ist die vorzeitige Abbruchfunktion. Der ander Zähler läuft parralel dazu, Verhalten wie in #1. ~ = egal, t= Totzähler T - W t A 1 - ~ 0 ~ 1 - ~ 0 ~ 0 - 1 1 1 Zähler startet bei Falling Edge und wird auf Null gesetzt. 0 - 1 2 1 0 - 1 3 1 0 - 1 4 1 0 - 0 5 0 ist der WDT aus gibt es nurnoch den INT0 Interrupt Ich hoffe das hat es verständlicher gemacht. Lg, Florian
muss ich da jetzt dann jedes mal nach dem letzten zustand abfragen?
1 | ISR(INT0_vect){ |
2 | thisState = INT0pinAbfrage; |
3 | if(lastState == thisState) |
4 | {
|
5 | lastState = thisState; |
6 | return; |
7 | }
|
8 | ....
|
9 | anderer code |
10 | ....
|
11 | |
12 | }
|
Flo schrieb: > ich habe einen Attiny13A und möchte in in Power Down Modus versetzen und > über den INT0 wieder raus holen. Leider habe ich übersehen, dass das nur > mit einem Level Interrupt geht. Ich benötige aber einen Falling Edge > interrupt. Dann benutzt du eben nicht den INT0, sondern PCINT1. Der liegt auf genau demselben physischen Pin und kann per Flanke das Teil aus dem Tiefschlaf holen. Wie wär's mal mit vorbeugender Lektüre des Datenblatts?
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.