mega32 interrupt zählt doppelt

Gast #1008534
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
Gast #1008545
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
Gast #1008547
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?

:)
Gast #1008552
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
Persönliche Seite #1008556
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..)
#1008558
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.
Gast #1008565
> 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.
Gast #1008567
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.