Hallo!
Ich versuche gerade mein erstes Programm komplett in Assembler zu
schreiben. Fehler gibts beim Build schon mal nicht - freut mich. Aber
beim Simulieren gibts ein Problem mit dem Timer-Interrupt.
Es werden zunächst ganz normal die Einzelschritte bis zur loop-Schleife
gemacht - aber wenn der Timer-Interrupt auslöst springt das Programm zum
ersten Befehl nach dem Label "main" und nicht zu "timer0_overflow".
Irgendwie finde ich nicht heraus, warum da so ist - habe auch schon
einiges aus dem Netz probiert - immer der gleiche Fehler...
Wer kann mir da weiterhelfen?
Gruß
Jens
Kann ja nich sein. Lad mal die Include-Datei in nen Editor und guck Dir
an, welcher Wert OVF0addr darin zugewiesen ist. Dann vergleichen mit der
Interrupttabelle im Datenblatt (des richtigen Controllers).
Für OVF0addr steht 0x0006 drin - stimmt mit dem Datenblatt überein.
kommt aber bei 0x000D raus. Richtige Sprungmarke wäre bei 0x003E...
@flätz:
Glaube ich nicht, dass mir der Debugger das "verheimlicht", denn von der
Taktanzahl her springt der direkt an diese Stelle. Da würde sich mehr
ändern, da einiges im Int-Handler abgearbeitet wird (geposteter
Quelltext ist gekürzt). Außerdem sollte der doch beim reti wieder in die
loop springen - nicht ein ganzes Stück drüber...
> Außerdem sollte der doch beim reti wieder in die> loop springen - nicht ein ganzes Stück drüber...
ja, stimmt.
Einfach mal die Sprungtabelle ausführlich hinschreiben?
rjmp main
nop
nop
nop
nop
nop
rjmp timer0_overflow
Wo springt er hin, wenn Du das als Sprungtabelle verwendest?
.ORG 0
rjmp main //0
reti // 1
reti // 2
reti // 3
reti // 4
reti // 5
reti // 6
reti // 7
reti // 8
reti // 9
reti // 10
reti // 11
reti // 12
reti // 13
reti // 14
reti // 15
reti // 16
reti // 17
reti // 18
reti // 19
reti // 20
reti // 21
reti // 22
reti // 23
reti // 24
reti // 25
reti // 26
reti // 27
reti // 28
reti // 29
reti // 30
Aaaah... da springt der zur 13 - dann stimmt wohl was mit der
Initialisierung des Timers nicht. Das wäre ja "Compare Match A" und
nicht "Overflow"...
Mal gucken, wie es "richtig" funktioniert... ;)
>dann stimmt wohl was mit der Initialisierung des Timers nicht
Mit Verlaub - sowas notiert man auch nicht so...
>ldi temp, 0b00000001 ;TOIE0: Interrupt bei Timer Overflow
...sondern so:
ldi temp, 0<<OCIE2 | 0<<TOIE2 | 0<<TICIE1 | 0<<OCIE1A | 0<<OCIE1B |
0<<TOIE1 | 0 | 0<<TOIE0
-----------------
(kopiert aus ner Datei für den ATmega8, also nicht ungeprüft
übernehmen!)
Da hatten wir jetzt wohl auch die gleiche Idee ;) Die Initialisierung
stammt aus dem Tutorial "AVR-Tutorial: PWM" hier auf der Seite... mit
hatte es so auch nicht gefallen - so wie es jetzt ist, ist es auch viel
übersichtlicher.
So, Problem ist also gelöst. Vielen Dank für die Hilfe ;)
Gruß
Jens