Forum: Mikrocontroller und Digitale Elektronik Probleme mit Stack beim Mega128


von J. T. (chaoskind)


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

von Spess53 (Gast)


Lesenswert?

Hi

>Daher meine Vermutung es hat was mit dem Stack zu tun.

Richtig. Rate mal, was hier passiert:

>  ...
>  call  Warteschleife

>  Warteschleife:
>    ldi   r17,255
>    ....

MfG Spess

von Spess53 (Gast)


Lesenswert?

Hi

Ergänzung:

>  Warteschleife:
>    ldi   r17,255
>    ....
>    ret

MfG Spess

von Stefan E. (sternst)


Lesenswert?

Quizfrage: Was passiert nach dem "call  Warteschleife"?

von Patrick (Gast)


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

von J. T. (chaoskind)


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

von J. T. (chaoskind)


Lesenswert?

Wo fehlt denn da ein rjmp/jmp Schleife? 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?

von Peter II (Gast)


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?

von Stefan E. (sternst)


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?

Und jetzt geh das Programm weiter Schritt für Schritt durch. Was 
passiert beim "ret" und danach?

von J. T. (chaoskind)


Lesenswert?

AAAHHHH
in dem Moment wo ichs schrieb, fiel es mir wie Schuppen von den Augen! 
klar in der Schleife fehlt der rjmp schleife! ~an die Stirn hau, 
peinlich peinlich

Danke euch für die schnelle Klärung =)

von Patrick (Gast)


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.

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.