Forum: Mikrocontroller und Digitale Elektronik Ext. Interrupt für exakte 200ms lowlevel


von Gustav M. (Gast)


Lesenswert?

Hallo,

ich benötige folgende Funktion:

Der Interrupt Pin 0 wird extern für 200ms ( +-5ms ) auf low gezogen, nur 
dann soll etwas geschehen.

Wie würde man so etwas am geschicktesten Lösen?

Interrupt bei fallender Flanke aktivieren, in der entsprechenden ISR als 
erstes den INT0 deaktivieren, einen Timer auf 195ms setzen, danach im 
Timer Interrupt abfragen ob es nach wie vor Low ist, und den Timer 
erneut auf 10ms setzen und prüfen ob es jetzt wieder High ist, falls ja 
- > darf aktion ausgeführt werden, falls nein eben nicht. Und danach den 
INT0 wieder aktivieren.

Gibt es dazu nicht eine einfachere geschicktere Lösung, oder ist das 
schon am optimalsten?

Gustav

von chris (Gast)


Lesenswert?

Gustav M. schrieb:
> Gibt es dazu nicht eine einfachere geschicktere Lösung, oder ist das
> schon am optimalsten?

Stichwort Input Capture Unit (Timer)

von Ingo Less (Gast)


Lesenswert?

Im 1ms Interval das Signal abtasten und auswerten

von Georg G. (df2au)


Lesenswert?

Pin Change Interrupt. Auf der ersten Flanke Timer starten, auf der 
zweiten Flanke Timer lesen. Zeit auswerten. Aktion ausführen.

von W.S. (Gast)


Lesenswert?

Gustav M. schrieb:
> Wie würde man so etwas am geschicktesten Lösen?

Indem  man sich eine Systemuhr einrichtet, die die Systemzeit auf 1 ms 
auflöst und im Interrupthandler selbige abfragt.

Solche Ideen wie Timer und Capture ist für sowas eher schlechter 
geeignet - insbesondere wenn man nicht so tief in der Materie steckt, 
daß man fragen muß.

Aber mal was anderes: von was für einem Prozessor schreibst du? Bei 
Cortexen hat man den Systemtimer quasi gratis immer dabei.

W.S.

von Mein grosses V. (vorbild)


Lesenswert?

Gustav M. schrieb:
> oder ist das schon am optimalsten?

Das ist die schlechteste Lösung, die man sich vorstellen kann.


1
while(1)
2
{
3
....
4
   while(!(PINx & (1 << y)))
5
   {
6
     //Tu was
7
   }
8
....
9
}

Wenn er noch was anderes nebenbei tun soll:


1
while(1)
2
{
3
....
4
   if(!(PINx & (1 << y)))
5
   {
6
     //Tu was
7
   }
8
....
9
}

: Bearbeitet durch User
von c-hater (Gast)


Lesenswert?

Gustav M. schrieb:

> Der Interrupt Pin 0 wird extern für 200ms ( +-5ms ) auf low gezogen, nur
> dann soll etwas geschehen.
>
> Wie würde man so etwas am geschicktesten Lösen?

Mit Capture-Interrupt.

> Gibt es dazu nicht eine einfachere geschicktere Lösung, oder ist das
> schon am optimalsten?

"Optimal" ist eins derjenigen Adjektive, die sich nicht sinnvoll 
steigern lassen. Wenn man auch nur die Wortbedeutung versteht, sollte 
klar sein, warum das so ist...

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.