Atmega8 Timer Interrupt Problem

OP #314955
Hallo,

ich (Anfänger) möchte ein Register mittels Timer hochzählen lassen und
anschliesend das Register auf ein Port ausgeben(LED).Da ich noch in der
Lernphase bin und meine ersten Schritte in Assembler wage möchte ich
euch bitten mal meinen Code zu checken und mir dann Mitteilen was hier
schief läuft. Ich glaube ich habe die Sache mit dem Interrupt Handling
nicht richtig verstanden... Also zusammenfassend bzw. wie ich das
verstanden habe:
Atmega8, Quarz 3,6864Mhz, 8bit Timer,Prescaler 1024. Müsste
dementsprechend alle 71ms einen Interrupt bekommen, den ich mit 14
multipliziere (~1sec)... und auf LED Port raus...
Angehängte Dateien:
Simuliere es doch mal in AVR-Studio, dann zeigen sich die Fehler.

Beim kurzen drüberschaun fiel mir auf:
- Als erstes im Reset (heißt bei dir start) ist der Stackpointer
  einzurichten. Das löst bei dir zwar nicht den Fehleraus, das sollte
  man sich aber trotzdem angewöhnen.
- Deine Start-Routine endet nicht in der Mainloop, sondern das
  Programm läuft in die ISR rein. Sowas ist tödlich.
- Deine ISR muss mit dem Befehl 'reti' abgeschlossen werden, damit
  der Stack ausgeglichen wird. Ansonsten überschreibt dir der Stack
  I/O und Register.
- Deine Reset-Routine ist an dieser Stelle völlig fehl am Platz.
  Sie müsste 'Mainloop' heißen und am Ende der Reset-Sequenz (die
  bei dir 'start' heißt) liegen.

Das Initialisieren des Timers scheint richtig zu sein.
Das Push und Pop in der ISR kann ich nicht nachvollziehen.

Der gesamte Code sieht aus, wie von verschiedenen Quellen per Copy und
Paste zusammengestoppelt. Das bringt nix, Erfolg hast du nur, wenn du
jede Codezeile verstehst und genau weißt, warum sie an dieser Stelle
steht und welche Aufgabe sie erledigt.

Ich strukturiere meine Programme meist so:
- Kommentare, wozu das Programm dient
- Include-Datei mit I/O-Definitionen (m8def.inc)
- Vereinbarungen (Konstanten, SRAM-Variablen, Registernamen)
- Interrupt-Sprungtabelle
- Eventuelle Include-Dateien mit Code (LCD-Treiber, Print-Routinen)
- Reset-Routine (Initialisierungen)
- Mainloop (meist mit Sleep)
- Interrupt-Service-Routinen (ISRs)
- Tabellen, Texte usw.
- Evtl. EEPROM-Daten

Kannst dir ja mal 'n paar Quelltexte ansehen:
www.hanneslux.de

...

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 20 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.