Hej
Använder en PIC16f887 och MPLAB IDE Assembler
Någon som vet om det går (och isåfall hur) att hoppa till en label som består av en fast text och en siffra efter. Det ska alltså finnas flera labels som heter samma namn men olika siffror efter. Siffran att hoppa till kommer från en variabel. Helst ska det inte vara någon begränsning av hur långt man kan hoppa.
Ett exempel:
HoppaTillLabel - innehåller i detta exempel 1, 2 eller 25
GOTO HoppaTillLabel
Label_1
KOD HÄR...
Label_2
KOD HÄR...
Label_25
KOD HÄR...
Hoppa till dynamisk label PIC16f887
-
- Inlägg: 66
- Blev medlem: 24 juli 2008, 00:40:30
- Ort: Skövde
Re: Hoppa till dynamisk label PIC16f887
Nej.
Processorn har inte en aning om vad en "label" är så självklart
kan den inte göra det "dynanmiskt" vid runtime. En GOTO instruktion
måste veta vart den ska, så att säga.
Jag utgår från att din " variabel" kan få olika värden under körning. Om
det är givet redan vid assembleringen så är det en lite annan sak.
Det jag *gissar* att du vill göra får göras med "computed GOTO".
Leta lite efter det i databladet.
> Helst ska det inte vara någon begränsning av hur långt man kan hoppa.
GOTO har de begränsningar som är specificerade i databladet, d.v.s inom
aktuell "page". För längre hopp (eller CALL) så får PCLATH justeras först.
Även det finns väl beskrivet i databladet.
Processorn har inte en aning om vad en "label" är så självklart
kan den inte göra det "dynanmiskt" vid runtime. En GOTO instruktion
måste veta vart den ska, så att säga.
Jag utgår från att din " variabel" kan få olika värden under körning. Om
det är givet redan vid assembleringen så är det en lite annan sak.
Det jag *gissar* att du vill göra får göras med "computed GOTO".
Leta lite efter det i databladet.
> Helst ska det inte vara någon begränsning av hur långt man kan hoppa.
GOTO har de begränsningar som är specificerade i databladet, d.v.s inom
aktuell "page". För längre hopp (eller CALL) så får PCLATH justeras först.
Även det finns väl beskrivet i databladet.
- Swech
- EF Sponsor
- Inlägg: 4750
- Blev medlem: 6 november 2006, 21:43:35
- Ort: Munkedal, Sverige (Sweden)
- Kontakt:
Re: Hoppa till dynamisk label PIC16f887
Förstår vad du vill göra men det har blivit helt fel tänkt. Du vill göra ett CASE hopp...
En label i assembler är bara en adress som översätts då man kompilerar.
Om labeln består av bokstäver och siffror spelar ingen roll eftersom den informationen försvinner vid kompileringen.
Du kan alltså inte få tillbaks sifferkombinationen inne ifrån assemblerprogrammet.
På PIC kan man istället addera W till programräknaren, detta innebär att programmet hoppar framåt x antal rader
Reserverar mig för att min PIC kodning är lite rostig och att det kan finnas nyare sätt att göra det på.
(vet bättre hur det görs på AVR)
Swech
En label i assembler är bara en adress som översätts då man kompilerar.
Om labeln består av bokstäver och siffror spelar ingen roll eftersom den informationen försvinner vid kompileringen.
Du kan alltså inte få tillbaks sifferkombinationen inne ifrån assemblerprogrammet.
På PIC kan man istället addera W till programräknaren, detta innebär att programmet hoppar framåt x antal rader
Kod: Markera allt
movlw 3 ;vi vill till label 3
call my_jump ;hoppa dit
.
.
.
.
my_jump
addwf pcl
goto Label0
goto Label1
goto Label2
goto Label3
Label0:
return
Label1:
return
Label2:
return
Label3:
return
(vet bättre hur det görs på AVR)
Swech
Re: Hoppa till dynamisk label PIC16f887
Du kan t.ex använda det här:
Se bara till att tabellen inte sträcker sig över en pagegräns. Annars kommer PCH också att påverkas. Plus att det behövs lite koll på att W är inom rimliga värden innan anrop.
Edit: same same
Kod: Markera allt
addwf PCL,f
goto Label1
goto Label2
goto Label3
goto Label4
goto Label5
goto Label6
goto Label7
Edit: same same

-
- Inlägg: 66
- Blev medlem: 24 juli 2008, 00:40:30
- Ort: Skövde
Hoppa till dynamisk label PIC16f887 *LÖST*
Tack för hjälpen, nu har jag läst i databladet om detta och förstått betydligt mer.
Att addera programpekaren och sedan hoppa som ni skrev löste mina problem!
Att addera programpekaren och sedan hoppa som ni skrev löste mina problem!