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