ATmega8 INT0 Interrupt Zähler geht nicht

Gast #1134994
Lesenswert?
• ▲
▼
Hallo zusammen,
ich wollte heute einen ganz einfachen Interrupt Zähler Programmieren. 
Dieser soll die Zahl, die auf dem Bildschirm ausgegeben wird bei jedem 
Tastendruck erhöhen.

Komischerweise funktioniert es bei mir nicht, die 0 bleibt auf dem 
Bildschirm stehen, sie erhöht sich nicht und es scheint als ob der 
Bildschirm flackert, unter der Null kann man auch Stücken von zeichen 
flackern sehen.

Kann vielleicht jemand einen Fehler erkennen?
Angehängte Dateien:
#1135093
Lesenswert?
• ▲
▼
Hallo,

wenn ich es richtig sehe, gibst Du mit
ldi temp, 0b00010000  ; Interrupt on Compare
out TIMSK, temp

einen Timer-Interrupt frei, zu dem es keine ISR gibt -> Absturz.

Weiterhin dürfte Dein 'n' ziemliche Srünge durch Prellen des Tasters 
machen.
Ansonsten fehlt das Retten und Wiederherstellen des SREG in der 
Interruptroutine. Wenn da z.B. der Interrupt ausgelöst wird

delay5ms:                               ; 5ms Pause
           ldi  temp1, ( XTAL * 5 / 607 ) / 1000
WGLOOP0:   ldi  temp2, $C9
WGLOOP1:   dec  temp2
->> IRQ
           brne WGLOOP1
           dec  temp1
->> IRQ
           brne WGLOOP0
           ret                          ; wieder zurück

ist das Z-Flag durch den inc-Befehl in der ISR u.U. verändert und die 
delay5ms macht alles andere als 5ms...

Gruß aus Berlin
Michael
Gast #1136126
Lesenswert?
• ▲
▼
So, ich habe den Interrupt Zähler jetzt mal so umprogrammiert, dass er 
auch Zehnerstellen ausgeben sollte.

Dabei habe ich alles wie vorher belassen, ich rechne aber in der 
Ausgabeschleife noch die Zehner und Einerstellen aus.

Jetzt flackert aber der Bildschirm wieder, und auf der Erste Stelle 
zählen ganz schnell irgendwelche Zeichen hoch.

Langsam geht meine Geduld zuende. Findet jemand vielleicht einen Fehler?
Angehängte Dateien:
Gast #1136981
Lesenswert?
• ▲
▼
Habe mein Problem jetzt selber gefunden. Nun läuft mein Programm.

Einmal muss ich SREG am Anfang jeder Prozedur sichern und vor dem 
Aufrufen des lcd_data befehls wiederherstellen.

Außerdem muss ich nach jeder Dezimal-Ausgabe-Schleife die vorher 
errechneten Werte löschen, da sonst im nächsten Durchlauf etwas zum 
vorher errechneten Wert addiert wird.

Hier ist noch das funktionierende Programm, dass bis 99 zählen kann.

Mit dem Prellen der Tasten habe ich übrigens kein problem.
Angehängte Dateien:

Antwort schreiben

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.

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.