www.mikrocontroller.net

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


Autor: Philipp (Gast)
Datum:
Angehängte Dateien:

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

Autor: Michael U. (amiga)
Datum:

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

Autor: Philipp (Gast)
Datum:
Angehängte Dateien:

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

Autor: Philipp (Gast)
Datum:
Angehängte Dateien:

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

Autor: Philipp (Gast)
Datum:
Angehängte Dateien:

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

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.