Forum: Mikrocontroller und Digitale Elektronik Level Interrupt in falling edge interrupt umwandeln


von Flo (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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.

von Flo (Gast)


Lesenswert?

Aber wärend der Taster ~4sec gedrückt wird soll der WDT interrupt (jede 
1sec) noch ausgelöst werden können.

von Peter D. (peda)


Lesenswert?

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"

von Flo (Gast)


Lesenswert?

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

von Flo (Gast)


Lesenswert?

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
}

von c-hater (Gast)


Lesenswert?

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