Forum: Mikrocontroller und Digitale Elektronik Interrupt läuft 2x durch


von Michael (Gast)


Lesenswert?

Hi,
das Problem ist ansich recht banal, aber ich komme nicht weiter:

INT0 wird über einen Taster (fallender Pegel) angesprochen. INT0 ruft 
dann den Interrupthandler auf, welcher dann eine Routine ausführt. 
Blöderweise wird diese immer 2x durchlaufen. Ich habe dann eine 
Verzögerung von 1s in die Routine gebaut so, dass die Routine 
durchlaufen wird und nach 1S dann mit "reti" zurück springt.

Es scheint als löse das Tasterprellen im Hintergrund einen zweiten IRQ 
aus, welcher dann nach dem durchlaufen des erstes den zweiten Duchlauf 
anstößt.

Ansich ging ich davon aus, dass, solange ein IRQ durchlaufen wird, das 
I-Flag auf "0" steht dun keine Interrupte mehr angenommen werden.

Die Frage ist nun, ob es da irgendwelche banalen Fallen gibt?

Grüße,
Michael

von Michael U. (amiga)


Lesenswert?

Hallo,

Michael schrieb:
> INT0 wird über einen Taster (fallender Pegel) angesprochen. INT0 ruft
> dann den Interrupthandler auf, welcher dann eine Routine ausführt.
> Blöderweise wird diese immer 2x durchlaufen. Ich habe dann eine
> Verzögerung von 1s in die Routine gebaut so, dass die Routine
> durchlaufen wird und nach 1S dann mit "reti" zurück springt.
Hier lasse ich das Thema "Tasten entprellen" jetzt mal weg...

> Es scheint als löse das Tasterprellen im Hintergrund einen zweiten IRQ
> aus, welcher dann nach dem durchlaufen des erstes den zweiten Duchlauf
> anstößt.
Einer? Hunderte, wenn Du Pech hast...

> Ansich ging ich davon aus, dass, solange ein IRQ durchlaufen wird, das
> I-Flag auf "0" steht dun keine Interrupte mehr angenommen werden.
Richtig, es werden keine angenommen. Das passiert erst, wenn reti die 
Interrupts wieder frei gibt.
Und da lauert dann schon das vom Prellen wieder gesetzte INT0-Flag und 
schon geht es wieder in die ISR.
Und wieder...
>
> Die Frage ist nun, ob es da irgendwelche banalen Fallen gibt?

Ja, Tasten per Timer einlesen und entprellen, IRQ nur zum aufwecken aus 
Sleep usw. und dann sofort abschalten z.B.

Gruß aus Berlin
Michael

von Fabian B. (fabs)


Lesenswert?

Nein, Interrupts werden sehr wohl angenommen. Das Flag wird beim starten 
der ISR gecleart und kann direkt von der Hardware wieder gesetzt werden.
Wenn du das vermeiden willst cleare das Flag manuell nochmal am Ende der 
Routine.
Dass ein Hardware-Int nicht optimal für Taster ist (eben wegen dem 
Prellen) und, dass man nicht 1s in einem Int wartet brauch ich dir 
bestimmt eigentlich nicht zu sagen.
Falls doch, liess die Artikel zu Entprellung und Interrupts.

Gruß
Fabian

von Michael (Gast)


Lesenswert?

Hi,

Ich weiß, dass das mit Tastern an den INTs eklig ist. Daher auch die 
Friekellösung.

Was ich (erfolglos) versuchte,war:

IRQ annehmen -> abarbeiten -> 1S warten -> im EIFR für INT0 den Flag 
löschen -> Reti.  (Attiny2313).

Springt aber dennoch wieder rein. Welche Flags müsste ich denn (noch) 
alle löschen?

Gruß,
Michael

von Karl H. (kbuchegg)


Lesenswert?

Michael schrieb:
> Hi,
>
> Ich weiß, dass das mit Tastern an den INTs eklig ist. Daher auch die
> Friekellösung.

Dann ändere das und du schläfst besser :-)
Das ist doch Sch....e, äh Mist, in einer IRQ 1s zu warten. Das führt 
doch das ganze Interrupt System ad absurdum.

> IRQ annehmen -> abarbeiten -> 1S warten -> im EIFR für INT0 den Flag
> löschen -> Reti.  (Attiny2313).

Wahrscheinlich hast du nicht wirklich gelöscht.
Ein derartiges Flag wird gelöscht, indem man eine 1 an der 
entsprechenden Position reinschreibt.

Aber wie gesagt:
Such dir den Entprell-Artikel. Da gibt es eine fix-fertige Lösung für 
Assembler. Brauchst du nur zu übernehmen.

von Peter D. (peda)


Lesenswert?

Es gibt Fehler, die wohl jeder Programmierer unbedingt selber machen muß 
und das Entprellen scheint einer davon zu sein.
Und Monsterdelays (>100µs) in Interrupts ist auch einer.

Je nachdem, wie lernresistent man ist, muß man erstmal 1..100 
Frickellösungen selber proggen, ehe man doch den alten Hasen glaubt und 
was ausgereiftes und bewährtes nimmt.

Leider muß diesen Fehler des Programmierers aber der Kunde ausbaden und 
sich über fehlende oder zuviele Tastendrücke und träge Programme ärgern.


Peter

von oldmax (Gast)


Lesenswert?

Hi
Warum unbedingt einen Schalter auf Interrupt? Dein Controller ist so 
schnell, das du Schaltereingaben ohne Probleme in der Hauptroutine oder 
Timer -ISR abfragen kannst. Ich glaube, es wird im allgemeinen 
überschätzt, das ein Schalter "übersehen" werden könnte und nur eine ISR 
hundert %tig zuverlässig ist. Selbst, wenn du ein Reaktionsmeßgerät 
erschaffst, wo es auf Genauigkeit ankommt, bist du mit einer "normalen" 
Abfrage eindeutig und genau genug....
Gruß oldmax

von Karl H. (kbuchegg)


Lesenswert?

Peter Dannegger schrieb:

> Je nachdem, wie lernresistent man ist, muß man erstmal 1..100
> Frickellösungen selber proggen,

Wobei das bei manchen Sachen gar nicht so schlecht ist.
Auch ein Fehlschlag trägt zur Lernkurve bei. Man lernt: so gehts nicht.

Nur muss man den Fehlschlag auch als solchen akzeptieren und bereit 
sein, ihn über Bord zu werfen. Und an dieser Bereitschaft scheitert es 
bei Neulingen oft :-) Die kleben oft viel zu sehr an ihrer 
Frickellösung, die sie doch aus dem Vorgängerprojekt übernommen haben 
:-)

> Leider muß diesen Fehler des Programmierers aber der Kunde ausbaden und
> sich über fehlende oder zuviele Tastendrücke und träge Programme ärgern.

Das ist natürlich dann besonders übel.

von Karl H. (kbuchegg)


Lesenswert?

oldmax schrieb:
> Ich glaube, es wird im allgemeinen
> überschätzt, das ein Schalter "übersehen" werden könnte und nur eine ISR
> hundert %tig zuverlässig ist.

IMHO ist es so, dass die Leistungsfähigkeit der µC gewaltig unterschätzt 
wird. Ist ja auch kein Wunder, wenn man sieht wie 'träge' ein 3GHz PC 
sich oftmals anfühlt. Und da soll dann ein mit lächerlichen 8Mhz 
getakteter Prozessor noch was ausrichten können.  :-)

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.