Ik ben met een stukje asm code bezig voor mijn 2313, en ik vroeg me af hoe ik rcall kan gebruiken. Ik heb in AVR studio wat zitten proberen, maar het werkt niet. Als ik na de rcall de ret code gebruik, gaat ie weer terug naar de label main, terwijl ie naar de code regel na rcall terug moet gaan. In de instruction set stond dat je de stack moest instellen, bij avrbeginners.net deden ze dit zo:


ldi r16, low(RAMEND)
out SPL, r16
ldi r16, high(RAMEND)
out SPH, r16

Nou is mijn vraag, wat doet die code, want bij mij werkt ie niet. En hoe kan ik met ret terug gaan naar de regel na rcall?

Berend

Welke AVR gebruik je? Eén van de twee stackpointer regels is bij een aantal AVRs niet nodig. Heeft je AVR geen RAM dan zijn beide regels overbodig.

rcall en ret doen het altijd goed als je RAM is geïnitialiseerd.

Ik gebruik een at90s2313, die heeft dacht ik 256 bytes sram... Hoe kun je dat dan initialiseren?

Op 19 februari 2005 19:21:05 schreef Berend:
Ik gebruik een at90s2313, die heeft dacht ik 256 bytes sram... Hoe kun je dat dan initialiseren?

ldi r16, RAMEND
out SPL, r16

AT90S2313 heeft 128 bytes SRAM.

En hoe kan ik met ret terug gaan naar de regel na rcall?

Ja. (ret = return)

test:
<routine>
ret

loop:
rcall test
<programma vervolgen>
rjmp loop

[Bericht gewijzigd door RES op ]

hmm... geprobeerd, maar als ik hem stap voor stap het programma uit laat voeren, gaat ie nog steeds terug naar het eerste label (main):(. Ik heb nu als testcode:


.include "2313def.inc"

.org 0x0000
rjmp main

main:
ldi r16, RAMEND
out SPL, r16
rjmp main2

main2:
ldi r16, 0xFF
rcall test
rjmp main2

Test:
ldi r16, 0x00
ret

Doe ik iets fout?

// EDIT

Raadsel opgelost:P ik had perongeluk de def file van de 8515 laten staan en toen deed ie het niet, nu dus wel:D.

[Bericht gewijzigd door Berend op ]