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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.