Sida 1 av 1

Hoppa till dynamisk label PIC16f887

Postat: 15 juli 2009, 22:35:23
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...

Re: Hoppa till dynamisk label PIC16f887

Postat: 15 juli 2009, 22:51:04
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.

Re: Hoppa till dynamisk label PIC16f887

Postat: 15 juli 2009, 22:55:47
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

Re: Hoppa till dynamisk label PIC16f887

Postat: 15 juli 2009, 23:11:00
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 :)

Hoppa till dynamisk label PIC16f887 *LÖST*

Postat: 15 juli 2009, 23:17:00
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!