-         

Ergebnis 1 bis 3 von 3

Thema: AVR Studio "Invalid Opcode..." bei Simulation

  1. #1

    AVR Studio "Invalid Opcode..." bei Simulation

    Anzeige

    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"?

    Das Programm:

    Code:
    .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
    ;........................................

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.02.2005
    Ort
    Freiburg
    Alter
    29
    Beiträge
    601
    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
    -

  3. #3
    Alles klar. Jetzt klappts. Vielen Dank.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •