Probleme mit Stack beim Mega128

OP #3121675
Lesenswert?

MoinMoin
ich hab mal wieder ein kleines Problem. Ich hab nen Mega128 und wollte 
dort testhalber erstmal nur ne LED blinken lassen, da ich mir dafür n 
Adapterboard zusammengestrickt hab (siehe mein Beitrag im Zeigt her eure 
Kunstwerke2 thread). Der folgende Code funktioniert weder im AVR-Studio 
Simulator, noch per Dragon im Debug-Modus. Im Simulator springt er beim 
ret wieder an den Anfang der Warteschleife, im Debug-Modus hängt er sich 
auf, und ich muss reset klicken. Wenn ich das ganze mit jmps statt mit 
calls mache, klappt es. Daher meine Vermutung es hat was mit dem Stack 
zu tun. Bei der Suche im Forum bin auf die M103 Fuse gestoßen, die hab 
ich dann deaktiviert, was jedoch keine Verbesserung brachte...
Für klärende Hinweise wäre ich wirklich dankbar=)(Ich benutze das 
AVRStudio 4.19, und wie gesagt nen Mega128)
1
.include "m128def.inc"
2

3
.org 0x0000
4
    jmp  start
5

6

7
start:
8

9
;Stackpointer initialisieren
10

11
  ldi    r16,HIGH(RAMEND)      ;Stackpointer (high) auf
12
  out    sph,r16            ;RAM-Ende setzen
13
  ldi    r16,LOW(RAMEND)        ;Stackpointer (low) auf
14
  out    spl,r16            ;RAM-Ende setzen
15

16

17

18
  ldi    r16,0xff
19
  out    DDRA,r16
20
  ldi    r16,0  
21

22

23
schleife:
24

25
  inc   r16
26
  out    PORTA,r16
27

28
  call  Warteschleife
29

30

31
  Warteschleife:
32

33
    ldi   r17,255
34
    ldi  r18,255
35

36
    W1:
37
      dec    r17
38
      brne  W1
39
      dec    r18
40
      brne  W1
41
      ret
MfG Chaos

P.S. beim Zweiten durchlauf im Simulator springt er nicht an den 
Schleifenanfang, sondern zum Programmanfang und gibt folgende 
Fehlermeldung aus: AVR Simulator: Invalid opcode 0xffff at address 
0x00ffff
Gast #3121684
Lesenswert?

j. t. schrieb:
> Im Simulator springt er beim
> ret wieder an den Anfang der Warteschleife

Naja, wohin soll er denn sonst auch beim geposteten Code springen... 
Logisch wieder an den Anfang der Warteschleife!

Es fehlt ein "rjmp schleife" nach dem "call warteschleife".
OP #3121685
Lesenswert?

Also so wie ich das verstanden hab, wird beim call die Rücksprungadresse 
auf dem Stack abgelegt. Das ich danach das Register belade, sollte doch 
auf den Stack keinen Einfluss haben? Bisher hab ich meine Warteschleifen 
auf nem Mega32 genauso gemacht, und da haben sie funktioniert...
Gast #3121692
Lesenswert?

j. t. schrieb:
> Also so wie ich das verstanden hab, wird beim call die Rücksprungadresse
> auf dem Stack abgelegt. Das ich danach das Register belade, sollte doch
> auf den Stack keinen Einfluss haben? Bisher hab ich meine Warteschleifen
> auf nem Mega32 genauso gemacht, und da haben sie funktioniert...

das Problem lieg wo anders. Was soll nach dem du

an welche stelle soll denn deiner meinung nach das Progrann nach ret 
hinspringen?
Gast #3121703
Lesenswert?

j. t. schrieb:
> Gerade dafür ist doch das call
> da, das ich mit nem ret und nicht mit nem jmp dahin zurück komme, wo ich
> hingesprungen bin?

Mit "ret" landest Du wieder an der Stelle, an der der "call" steht - wo 
auch sonst? Hellsehen kann der Assembler nicht; nur bekannte Adressen 
auf den Stack schaufeln bzw. von dort laden.

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