Problem mit Stackpointer ATMEGA851516PU0840

Gast #1355718
Lesenswert?

Hallo zusammen.
Ich bin ein uC-Neuling und habe mal ein kleines Programm ausprobiert und 
will nur mal Anfangs was Blinken lassen, dann bin ich schon mal 
zufrieden.

Ich nutze AVR STudio und eine STK500

Wenn ich mein Programm im AVR Studio simuliere, geht alles wunderbar.
Wenn ich das gleiche aber auf den uC lade, dann läuft das Programm aber 
nicht nach dem Return an die letzte Stelle, sondern fängt wieder von 
vorne an.
Ich vermute dass es am Stack-Pointer liegt. Ich bekomm es aber nicht 
gebacken weil ich einfach ein hilfloser Anfänger bin.

/* ******************************************************** */

.include "m8def.inc"         ; Definitionsdatei für den Prozessortyp 
einbinden


; Stackpointer initialisieren
.def tmp=r17
ldi tmp,low(ramend)
out SPH,tmp
ldi tmp,high(ramend)
out SPL,tmp

; I/Os Definieren (A-C=OUT, D=IN)
ldi r16, 0xFF       ; lade Arbeitsregister r16 mit der Konstanten 0xFF
out DDRA, r16       ; Inhalt von r16 ins IO-Register DDRB ausgeben
ldi r16, 0x00       ; lade Arbeitsregister r16 mit der Konstanten 0x00
out DDRD, r16       ; Inhalt von r16 ins IO-Register DDRB ausgeben

loop:

; 10101010 und 01010101 im Wechsel, jedes Register gleichzeitig
      ldi r16, 0b01010101 ; in r16 laden
      out PORTA, r16

      rcall Zeit

      ldi r16, 0b10101010 ; in r16 laden
      out PORTA, r16

      rcall Zeit

      rjmp loop      ; zurück zu loop

/* *************************** */


Zeit:
/**** ZEIT *******/
      ldi r20, 0xf0
      ldi r21, 0xff
      ldi r22, 0x00
Zeit_21_m:   dec r20
      cp r20,r22    ; Vergleiche Register
      BRNE Zeit_21_m  ; Wenn ungleich, Springe zu Zeit_21_m

       ldi r20, 0xff
      dec r21
      cp r21,r22    ; Vergleiche Register

      BRNE Zeit_21_m  ; Wenn ungleich, Springe zu Zeit_21_m
      RET

/* ******************************************************** */

Kann mir jemand helfen und sagen was ich vergessen habe? Wäre klasse!
#1355770
Lesenswert?

Ohne deinen Code ganz gelesen zu haben... Hab beim ersten Fehler 
aufgehört:

ldi tmp,low(ramend)
out SPH,tmp
ldi tmp,high(ramend)
out SPL,tmp

Du lädst in das High-byte des Stackpointers (SPH) den low-wert von 
Ramend und umgekehrt. So muss es eigentlich sein:

ldi tmp,high(ramend)
out SPH,tmp
ldi tmp,low(ramend)
out SPL,tmp

Ich hab jetzt die Ram-Grenzen vom 8515 nicht genau nachgeschaut, aber 
damit dürftest du wohl irgendwo im IO-bereich rumschreiben.
Schau einfach mal ob's läuft, wenn du das richtest.
Gast #1355885
Lesenswert?

@ sebastian:

Leider brachte das tauschen keinen Erfolg. Hatte da schon einige 
möglichkeiten versucht

@ Magnus Müller:
Warum in Gottes Namen kräuseln sich dir da die Fußnägel? Sag doch bitte 
was
da falsch ist. Wie gesagt, bin blutiger Anfänger...

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