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