PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : AVR Studio "Invalid Opcode..." bei Simulation



MinisterK
05.08.2006, 19:07
Hallo. :)

Ich habe ein Problem, an dem ich schon seit ein paar Stunden
sitze. Wenn ich folgenden Code für den Mega32 im AVR Studio simuliere
(Compiliere mit F7, dann auf "Play" klicke und denn F5), macht
der Simu garnichts, ausser mir ewige Fehlermeldungen der Bauart
"AVR Simulator: Invalid opcode 0xffff at address 0x003f01" auszuspucken.
Wenn ich mich mit F11 durch das Programm tickere, klappt das wunderbar,
ebenso das automatische durchspringen mit Alt+F5).

Das Programm ist noch in den Anfängen und im Moment so geschrieben, um die Taktzyklen der einzelnen Pausen zu zählen.

Warum hängt AVR Studio immer beim "Run"? :-k

Das Programm:


.NOLIST
.INCLUDE "E:\Programme\Atmel\AVR Tools\AvrAssembler2\Appnotes\M32def.inc"
.LIST
.CSEG

.DEF dot = R20
.DEF hsync = R21
.DEF vsync = R22
.DEF hvsync = R23
.DEF off = R24

reset: RJMP main

main:

LDI dot,0b00100000
LDI hsync,0b00001000
LDI vsync,0b00000100
LDI off,0b00000000


LDI R16,0xFF
OUT DDRB,R16
OUT DDRD,R16

rjmp pause16320

ende: rjmp ende
;----------------------------------------
pause960:

ldi r16,255
loopXA:
dec r16
brne loopXA
ldi r16,63
loopXB:
dec r16
brne loopXB

ret
;........................................
pause16320:

rjmp pause960
rjmp pause960
rjmp pause960
rjmp pause960
rjmp pause960
rjmp pause960
rjmp pause960
rjmp pause960
rjmp pause960
rjmp pause960
rjmp pause960
rjmp pause960
rjmp pause960
rjmp pause960
rjmp pause960
rjmp pause960

ldi r16,255
loopXC:
dec r16

brne loopXC
ldi r16,63
loopXD:
dec r16
brne loopXD


ret
;........................................

Mehto
05.08.2006, 19:40
Hallo,

ganz einfach, wenn man mit rjmp springt kann man mit ret nicht zurück ;-)
Mit rjmp kann man also nur in eine Richtung springen, um wieder weg zu kommen muss man dann ein zweites mal springen.

Aber dafür gibt es den Befehl rcall, wenn man den benutzt speichert der µC seine momentane Adresse in den Stack und springt zur Subroutine, sobald dann ein ret kommt springt er an die Adresse die er im Stack vorm springen abgelegt hat und ist wieder zurück.

Da du keinen Stack eingerichtet hast und nicht mit Rcall gesprungen bist kommt die Fehlermeldung im Simulator. Rein von den Befehlen und schreibweise her ist alles richtig, deshalb klappt das übersetzen.

Gruß,
Mehto


P.s.: Hab deinen Code mal richtig formatiert. Nächstes mal einfach die "[code]" funktion nutzen

MinisterK
05.08.2006, 20:27
Alles klar. Jetzt klappts. Vielen Dank. :cheesy: