Forum: Mikrocontroller und Digitale Elektronik Atmega8 Timer Interrupt Problem


von Jens J. (jelo75)


Angehängte Dateien:

Lesenswert?

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...

von Hannes L. (hannes)


Lesenswert?

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

...

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.