Forum: Mikrocontroller und Digitale Elektronik ATmega8 INT0 Interrupt Zähler geht nicht


von Philipp (Gast)


Angehängte Dateien:

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?

von Michael U. (amiga)


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

von Philipp (Gast)


Angehängte Dateien:

Lesenswert?

Ok, habe die sachen mal so gut ich konnte verändert.

Die Timer Initialisierung habe ich verher vergessen zu entfernen.

Hier ist der nochmal überarbeitete Code, er funktioniert auch wie er 
soll.

Vielen Dank für eure Hilfe!!!

von Philipp (Gast)


Angehängte Dateien:

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?

von Philipp (Gast)


Angehängte Dateien:

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.

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.