rcall im programm funktioniert nicht

OP #632043
Lesenswert?

Hallo,
bin blutiger Anfänger in Assembler und versuche einen ATMega 162 zu 
programmieren.
Jetzt wird in meinem Programm der rcall Befehl nicht ausgeführt, ich 
finde den Fehler nicht.
Wenn ich erst den Stack einrichte und dann rjmp reset, wird der rcall 
warte nicht ausgeführt, wird erst der rjmp reset ausgeführt, wird der 
Stack nicht eingerichtet und es gibt einen "AVR Simulator: Uninitialized 
stack pointer used at 0x001b" Fehler.
Ich blick da nicht durch.
Danke schon mal im voraus.



.include "m162def.inc"

.def  a = r16        ; definition r16 = a
.def  b = r17        ; definition r17 = b
.def  c = r18        ; definition r18 = c
.def  d = r19        ; definition r19 = d
.def  temp = r20      ; definition r20 = temp
.def  wart = r21      ; definition r21 = warte


.cseg            ; code in flash-speicher
.org  0x000        ; setzt den folgenden code ab adresse 0x000


;rjmp reset          ; sprung nach reset


  ldi temp,HIGH(RAMEND)  ; stack einrichten für sprungbefehle
  out SPh,temp
  ldi temp,low(RAMEND)
  out SPl,temp

 rjmp reset        ; sprung nach reset


warte:            ; warteschleife

  nop          ; 250 takte ==> jeder befehl 1 takt
  dec wart      ; 250 takte ==> jeder befehl 1 takt
  brne warte    ; 499 takte ==> bei sprung 2 takte, sonst 1er
  ret






reset:            ; reset-sprungmarke = Programmstart
  ldi temp,0xff      ; schreibt 255 in temp (r20)
  ldi  a,0b11111111    ; Bitmuster für a (alle lampen an)
  ldi b,0b01010101    ; Bitmuster für b (1 = an)
  ldi c,0b00000000    ; Bitmuster für c (alle aus)
  ldi d,0b10101010    ; Bitmuster für d (1 = an)

  out ddra,temp      ; schreibt temp (255) in DatenRichtungRegister a, 
(alles Ausgänge)
  out ddrb,temp      ; b auch Ausgänge
  out ddrc,temp      ; c auch Ausgänge
  out ddrd,temp      ; d auch Ausgänge

loop:            ; sprungmarke
  out porta,a        ; schreibt alles nach Port a
  out portb,b        ; ebenso
  out portc,c        ; ebenso
  out portd,d        ; ebenso
  dec a          ; decrement a
  dec b          ; decrement b
  dec c          ; decrement c
  dec d          ; decrement d
  ldi wart,0x05      ; warteschleife 5 x
  rcall warte        ; unterprogramm warteschleife

rjmp loop          ; relativer sprung nach loop



  rjmp reset
Gast #632050
Lesenswert?

Hallo Peter,

einen richtigen Fehler kann ich nicht ausmachen,
jedoch solltest Du das Programm geringfügig
umstellen:

RESET: ldi temp,HIGH(RAMEND)  ; stack einrichten für sprungbefehle
       out SPh,temp
       ldi temp,low(RAMEND)
       out SPl,temp
       ...
       ...
       ...


LOOP:  ...
       ...
       ldi r21,4
       rcall WARTE
       rjmp LOOP

WARTE: nop          ; 250 takte ==> jeder befehl 1 takt
       dec r21      ; 250 takte ==> jeder befehl 1 takt
       brne WARTE   ; 499 takte ==> bei sprung 2 takte, sonst 1er
       ret

Versuche mal, die Variable "wart" durch das Register "r21" zu ersetzen.
Evtl. kommt der Assembler durcheinander....
OP #632471
Lesenswert?

Erst mal danke für die Antwort,
hat aber nichts geändert.
Ich habe das Unterprogramm auch mal in test umbenannt, das Register mit 
r21 angesprochen, aber der rcall wird nicht ausgeführt.
Ist das ev. ein Fehler in AVRStudio 4.13 ??
Wenn ich den Stack rausnehme, dann gibt es wieder die Fehlermeldung:
AVR Simulator: Uninitialized stack pointer used at 0x000f
AVR Simulator: Invalid opcode 0xffff at address 0x0000ff
Das heißt doch, das der rcall ausgeführt wird, aber kein Stack 
eingerichtet ist, oder sehe ich das falsch ?
#632698
Lesenswert?

Johannes M. wrote:
> Peter Volkmer wrote:
>> Es gibt da einen unterschied zwischen f10 und f11.
> Right. Das sind zwei verschiedene Tasten...;-)

Und die haben auch unterschiedliche Funktion. Und zusätzlich gibt es 
noch ein paar Funktionen mehr, erreichbar mit diversen Umschalttasten. 
Interessant mit der F9-Taste wird dann auch die F5-Taste. Einfach mal im 
Menü rumblättern und die Tastenkombinationen lesen.

...
#633093
Lesenswert?

Wer solche Programme nutzt, der lernt nix dabei. Der vernünftige Umgang 
mit dem Simulator (oder Debugger, wenn die entsprechende Hardware 
angeschlossen ist) des AVR-Studios bringt da bedeutend mehr.

Volkers Fehler war die Bedienung des Simulators. Er hat statt wirklichem 
Einzelschritt (F11) den Einzelschritt gewählt, der Unterprogramme zwar 
ausführt, aber in der Anzeige überspringt (F10). Der Simulator/Debugger 
hat recht viele Möglichkeiten, also auch viel Potential zur 
Fehlbedienung.

...
#633107
Lesenswert?

ja so ist es, wenn nicht alles gesagt wird. Oben steht nichts von 
Simulation.  Aber dann wird er ja jetzt gemerkt haben, daß das nur 25 
Takte sind. Bei dem angegebenen Programm kann man genauso gut lernen. 
Sind doch nur Programmbeispiele, wie man sie hier zuhauf findet und auch 
im Tutorial. Wenn man natürlich nur die Befehle abschreibt, ohne lernen 
zu wollen, dann kann er das genauso gut auch im Tutorial finden. Nur mit 
diesem Programm hat er gleich die richtigen Werte und wenn er die 
Anweisungen in der Liste der Anweisungen nachsieht, dann weiß er auch, 
was die machen.

mfg

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren