Hallo, ich habe folgendes Problem: Ich programmiere in Assembler einen mega32.An Int0 ligt ein Signal an,zum Testen ein Schalter.Habe soweit alles fertig,Wenn ich den Interrupt mit dem Schalter auslöse,springt das Programm an die richtige Stelle (Interruptroutine) und erhöht dort nur ein Register.Danach gehts zurück in den Sleep modus.Das Problem,er erhöht das Register immer genau doppelt,also 1 mal auslösen registerinhalt 2 usw. Prellen kann nicht sein,in der Interruptroutine lass ich ihn erstmal eine halbe sekunde nichts tun. Also die Routine sieht so aus: call Pause inc Zaehler reti Das Register wird auch garantiert nicht noch wo anders benutzt. Wäre schön,wenn mir das mal jemand erklären könnte. gruss Andy
Hallo,wenn der Schalter auslöst,gehts ja erst mal für eine halbe Sekunde in eine Pause (call Pause).Danach wird erst erhöht.Sollte ausreichen um prellen zu verhindern. gruss Andy
höhö, witzig: Andy (Gast): Prellen kann nicht sein,in der Interruptroutine lass ich ihn erstmal eine halbe sekunde nichts tun. Sir alan Teplotaxl (t3plot4x1): Hast du den Taster entprellt? :)
Du mußt am Ende der Routine das Interruptflag durch schreiben einer 1 löschen, sonst tritt der von dir beschriebene Effekt auf weil sich der AVR "mekrt" das (mindestens) ein weiterer Interupt auftrat während du in deiner warteschleife bist (=Prellender Taster)
Hallo, ich hab schon öfters was mit Interrupts gemacht,aber auf anderen avrs. Das Interruptflag hab ich noch nie gelöscht und die Sachen klappen einwandfrei. Ist das was besonderes bei diesem avr so oder allgemein. gruss Andy
Das Interuptflag wird gelöscht sobald die Interruptroutine aufgerufen wird. Das ist auf jedem AVR so. Wenn aber WÄHREND du in der interruptroutine bist der Interrupt nochmal auftritt wird es nochmal gesezt und die ISR nach verlassen erneut aufgerufen. Ist ja normal auch okay, nur in diesem Fall produziert das prellen des Tasters halt eine zweiten Interrupt... So in etwa: Druck der Taste --> ISR wird aufgerufen --> Flag gelöscht Taste Prellt (mehrmals) --> Flag wird wieder gesezt warten warten warten ISR verlassen Da Flag gesezt wird die ISR ein weiteres mal aufgerufen (jezt ist das Prellen vorbei)--> Flag wird gelöscht warten warten warten ISR verlassen warten auf nächsten Tastendruck. Resultat: Variable wurde 2 mal erhöht..)
Andy wrote: > Hallo, > ich hab schon öfters was mit Interrupts gemacht,aber auf anderen avrs. > Das Interruptflag hab ich noch nie gelöscht und die Sachen klappen > einwandfrei. > Ist das was besonderes bei diesem avr so oder allgemein. > gruss Das ist bei allen AVRs so (und vermutlich nicht nur da)! Wenn das Interrupt-Flag sofort nach dem automatischen Löschen (durch den Aufruf des Interrupt Handlers) durch das Prellen wieder gesetzt wird, dann kannst Du ne Stunde warten und trotzdem wird sofort nach Verlassen des Interrupt Handlers dieser erneut aufgerufen.
> Das Interruptflag hab ich noch nie gelöscht und die Sachen klappen > einwandfrei. Dann ist mit 100% Sicherheit Dein Prozessor kaputt. Ich mache auch nie Programmierfehler.
Hallo, danke für die antworten. Und ich sitz hier den halben Sonntag und wundere mich. Die Schaltung hägt im Moment an meinem Gaszaehler und zählt impulse. In 2 Tagen kann ich das Programm ändern und testen. gruss Andy
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.