Hoppa till dynamisk label PIC16f887

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Anders_Peter
Inlägg: 66
Blev medlem: 24 juli 2008, 00:40:30
Ort: Skövde

Hoppa till dynamisk label PIC16f887

Inlägg av Anders_Peter »

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...
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hoppa till dynamisk label PIC16f887

Inlägg av sodjan »

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.
Användarvisningsbild
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

Inlägg av Swech »

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

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
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
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Re: Hoppa till dynamisk label PIC16f887

Inlägg av vfr »

Du kan t.ex använda det här:

Kod: Markera allt

        addwf   PCL,f
        goto    Label1
        goto    Label2
        goto    Label3
        goto    Label4
        goto    Label5
        goto    Label6
        goto    Label7
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 :)
Anders_Peter
Inlägg: 66
Blev medlem: 24 juli 2008, 00:40:30
Ort: Skövde

Hoppa till dynamisk label PIC16f887 *LÖST*

Inlägg av Anders_Peter »

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!
Skriv svar