Forum: Mikrocontroller und Digitale Elektronik rcall im programm funktioniert nicht


von Peter V. (peter65)


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

von Otto (Gast)


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....

von Peter V. (peter65)


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 ?

von Bastler (Gast)


Lesenswert?

fehlt da vor dem brne nicht ein cp / cpi?

z.b.:
dec r21
cpi r21, 0x(irgendwas)
brne warte

von Johannes M. (johnny-m)


Lesenswert?

Habs grad mal bei mir durchlaufen lassen (auch AVRStudio 4.13). Läuft 
problemlos, auch der rcall wird ausgeführt.

von Peter V. (peter65)


Lesenswert?

aber woran kann es dann liegen, das es bei mir nicht läuft ??

von Peter V. (peter65)


Lesenswert?

Danke noch mal an alle,
hab den Fehler grade gefunden

Es gibt da einen unterschied zwischen f10 und f11.

sorry

von Johannes M. (johnny-m)


Lesenswert?

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

von Hannes L. (hannes)


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.

...

von Wolfram Q. (quehl)


Lesenswert?

die Wartefunktion hat 25 Takte. Soll das so sein? Da kann man natürlich 
nichts mehr sehen. Versuch mal das Programm AVRDelayloop zu finden. Da 
wird der Code für bestimmte Wartezeiten angegeben.

mfg

von Hannes L. (hannes)


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.

...

von Wolfram Q. (quehl)


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

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