Forum: Mikrocontroller und Digitale Elektronik Problem bei AtMega128 mit RET-Befehl


von Bernd Roppelt (Gast)


Lesenswert?

Ich versuche zur Zeit einen ATMEGA128 zu programmieren. Doch Leider
komme ich mit den Befehlen "rcall" und "ret" nicht klar.
Hab jetzt erstmal Testweise nur ein kleines Programm geschrieben.
Es soll eigentlich am PortB zwischen 0xAA und 0x55 hin- und
hergesprungen werden.
Hierzu wird das Unterprogramm "wait" benötigt, welches eine
Zeitschleife beeinhaltet:


  .DEVICE ATmega128
  .EQU var1=$AA
  .EQU var2=$55


LA:  ldi r17,var1
  out $18,r17

rcall wait

  ldi r17,var2
  out $18,r17

rcall wait

  rjmp LA



wait:  clr  r19
  ldi  r21,$FF
next2:  ldi   r20,$FF
next1:  cp    r19, r20
  breq   equal1
  dec  r20
  rjmp   next1
equal1: cp   r19,r21
  breq   equal2
  dec   r21
  rjmp   next2
equal2: ret




Leider Funktioniert es nicht.
Ich hab jetzt schon in verschiedenen Foren gelesen das dies mit dem
"M103C" Fuse-Bit zusammenhängt. Aber egal wie ich es setze bleibt
mein Problem.
Bei der Simulation mit AVR-Studio4 sieht man, dass beim Befehl
"rcall" der Stackpointer von 0x0000
auf 0xFFFE springt?!? Beim Anschließenden RET-Befehl bleibt er dann
hängen.
Weis jemand, wie ich die Fuse-Bits setzen muss, damit es Funktioniert?

von Benedikt (Gast)


Lesenswert?

Ich würde er sagen, es hängt mit dem nicht initialisierten Stackpointer
zusammen...

von Bernd Roppelt (Gast)


Lesenswert?

Klingt logisch. Und wie mach ich das? Auf welche Adresse muss der
Pointer am Anfang stehen?

von Thomas (Gast)


Lesenswert?

ldi temp, LOW(RAMEND)    ; LOW-Byte der obersten RAM-Adresse
out SPL, temp
ldi temp, HIGH(RAMEND)   ; HIGH-Byte der obersten RAM-Adresse
out SPH, temp

Quelle: http://www.mikrocontroller.net/tutorial/stack

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Hi

und dann setz auch gleich die M103C-Fuse noch so das der Mega128 auch
im Mega128 Modus läuft. Sonst wirds auch nix mit dem RET.

Matthias

von Thomas (Gast)


Lesenswert?

Ergänzung:

.def temp = r16

von Bernd Roppelt (Gast)


Lesenswert?

Danke, es war echt nur der Stack-pointer.
Ist mein erster AtMega128. Bei meinen bisherigen MC's war das
initialisieren nicht nötig...

von Simon K. (simon) Benutzerseite


Lesenswert?

Bei meinen bisherigen MC's war das
initialisieren nicht nötig...

Bei AVRs eigentlich schon, außer man nimmt solche mit Hardwarestack.

von Bernd Roppelt (Gast)


Lesenswert?

Das waren bis jetzt 80x51-Derivate. Bei denen wurde der Stackpointer
nach restart initialisiert.

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.