mikrocontroller.net

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


Autor: Bernd Roppelt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Benedikt (Gast)
Datum:

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

Autor: Bernd Roppelt (Gast)
Datum:

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

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ergänzung:

.def temp = r16

Autor: Bernd Roppelt (Gast)
Datum:

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

Autor: Simon K. (simon) Benutzerseite
Datum:

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

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

Autor: Bernd Roppelt (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.