mikrocontroller.net

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


Autor: Andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Teplotaxl X. (t3plot4x1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du den Taster entprellt?

Autor: Andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Die Uhr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

:)

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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..)

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.