PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Limen
EF Sponsor
Inlägg: 1195 Blev medlem: 23 november 2006, 18:34:28
Ort: En bit utanför Karlstad
Inlägg
av Limen » 6 februari 2007, 22:50:48
Hur använder man subrutiner i AVR (asm)?
Försöker med en liten testsnutt:
Kod: Markera allt
RJMP main
main:
LDI R16,0xFF
OUT DDRB,R16
loop:
LDI R16,0x00
OUT PORTB,R16
RCALL delay
LDI R16,0xFF
OUT PORTB,R16
RCALL delay
RJMP loop
delay:
LDI R17,0xFF
delay_2:
SUBI R17,0x01
BRNE delay_2
RET
Men den återvänder inte från subrutinen utan hoppar istället tillbaka till "RJMP main". Vad har jag missat?
oJsan
EF Sponsor
Inlägg: 1541 Blev medlem: 11 november 2005, 21:36:51
Ort: Umeå
Kontakt:
Inlägg
av oJsan » 6 februari 2007, 23:19:43
Förmodligen så har du glömt att initiera stacken. Återhoppsadressen från subrutinen sparas nämligen där. Kan inte på rak arm svara på hur du initierar den men det finns nog i många färdiga asm/AVR-exempel
Edit:
Kod: Markera allt
*Följande kod placerar stackpekaren längst ner i RAM.
.include "m16def.inc" //Eller motsvarande...
ldi r16,low(RAMEND)
out SPL,r16
ldi r16,high(RAMEND)
out SPH,r16
Senast redigerad av
oJsan 6 februari 2007, 23:23:46, redigerad totalt 1 gång.
Limen
EF Sponsor
Inlägg: 1195 Blev medlem: 23 november 2006, 18:34:28
Ort: En bit utanför Karlstad
Inlägg
av Limen » 6 februari 2007, 23:21:49
Aha måste den initieras manuellt. Ska man dedikera ett register till detta är det tänkt?
Micke_s
EF Sponsor
Inlägg: 6741 Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö
Inlägg
av Micke_s » 7 februari 2007, 00:28:00
Vid push och pop så flyttas den.
R16 används bara som temp lagring.
SPH och SPL är redan dedikerad i hårdvaran.
Limen
EF Sponsor
Inlägg: 1195 Blev medlem: 23 november 2006, 18:34:28
Ort: En bit utanför Karlstad
Inlägg
av Limen » 7 februari 2007, 07:01:49
Måste man ange R16 eller funkar det med vilket som? (16-31)
oJsan
EF Sponsor
Inlägg: 1541 Blev medlem: 11 november 2005, 21:36:51
Ort: Umeå
Kontakt:
Inlägg
av oJsan » 7 februari 2007, 08:41:44
Det fungerar med vilken register som helst av samma typ. Operationen är ungefär samma som när du gör:
Först lägger man data (0xFF) till ett dataregister och sedan skriver man registret till ett specifikt hårdvaruregister (SPL/SPH/PORTB/DDRB/etc.).
Limen
EF Sponsor
Inlägg: 1195 Blev medlem: 23 november 2006, 18:34:28
Ort: En bit utanför Karlstad
Inlägg
av Limen » 7 februari 2007, 09:03:48
Aha då förstår jag. Tack för hjälpen!