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