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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren