mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega8 Timer Interrupt Problem


Autor: Jens Jelo (jelo75)
Datum:
Angehängte Dateien:

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

Autor: Hannes Lux (hannes)
Datum:

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

...

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.