Forum: Mikrocontroller und Digitale Elektronik mega32 interrupt zählt doppelt


von Andy (Gast)


Lesenswert?

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

von Teplotaxl X. (t3plot4x1)


Lesenswert?

Hast du den Taster entprellt?

von Andy (Gast)


Lesenswert?

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

von Die Uhr (Gast)


Lesenswert?

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?

:)

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

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)

von Andy (Gast)


Lesenswert?

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

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

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

von Johannes M. (johnny-m)


Lesenswert?

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.

von Gast (Gast)


Lesenswert?

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

von Andy (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.