Hur använder man $+ commandot?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
wolfheat
Inlägg: 202
Blev medlem: 14 oktober 2007, 20:42:51
Ort: Gävle

Hur använder man $+ commandot?

Inlägg av wolfheat »

Hej, ursäkta att jag tar upp denna fråga här, men jag har suttit i timmar nu utan att fatta hur kommandot fungerar. Eller för den delen hittat en bättre lösning på problemet.

Det jag vill göra är att läsa av ett register som har ett värde lagrat i sig. Mellan 0-23 ungefär tror jag det blir. Och utifrån detta värde skall PICen hoppa till ett utav 24 olika delprogram i min assemblerkod.

Jag har trott att man kan använda $+ samt $- kommandot för att hoppa i koden och att $ tecknet skulle betyda "befintlig plats" typ. Och att således $+3 skulle innebära ett hopp tre steg ned i koden (tre kommandon). Men när jag använder kommandot verkar det villa hoppa max två steg av någon anledning. Vad det beror på har jag ingen aning om. goto $+2 och goto $+6 ger samma resultat. Hade tänkt använda mig utav någonting liknande "goto $+reg" där reg är det register jag vill läsa av. Och sedan ha goto program1, goto program2 etc på raderna nedanför.

Har även försökt mig på kommandot "bra $+X" men ingen framgång.


Programmerar i MPLAB8.10, på en PIC18LF1330.
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Inlägg av vfr »

$ betyder normalt programräknarens position. Så långt riktigt.

På 16-serien av PIC så skriver man så här:

Kod: Markera allt

        addwf   pcl,f
        goto    rutin0
        goto    rutin1
        .
        .
        .
        goto    rutinn
för att göra en hopptabell. På 18-serien så har jag inte kollat men det kanske finns ett annat sätt?
Användarvisningsbild
wolfheat
Inlägg: 202
Blev medlem: 14 oktober 2007, 20:42:51
Ort: Gävle

Inlägg av wolfheat »

kollade på databladet för 16F677, enligt den:

ADDWF Add W and f
Syntax: [ label ] ADDWF f,d
Operands: 0 ≤ f ≤ 127
d ∈ [0,1]
Operation: (W) + (f) → (destination)
Status Affected: C, DC, Z
Description: Add the contents of the W register
with register ‘f’. If ‘d’ is ‘0’, the
result is stored in the W register. If
‘d’ is ‘1’, the result is stored back
in register ‘f’.


Nu fattar jag hur det funkar. Om man använder registret PCL och sparar resultatet tillbaks i den så kommer man hoppa i assemblerkoden. Samma sak gäller för 18varianten jag använder. Skall göra ett försök och se hur det går!

EDIT: Det funkade utmärkt tack för hjälpen. Jag hade nog inte kommit på PCL grejen själv. Ialla fall inte i år. :) Dock verkar det som om alla hopp sker i steg om två och två. dvs PCL+2 och PCL+3 ger samma förflyttning, ingen fara för min del, men det kan vara bra att veta om för andra som använder samma funktion.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

På en PIC18 räknar PCL i *bytes*. En instruktion kan vara 2 bytes (vanligats)
eller 4 bytes (ett par). D.v.s 1 eller 2 word.

MEN!

Varför använda $ alls ?
Det anses vanligtsvis som lite slarvig programmering.
Kanske vid väldigt korta hopp, men annars är det labels du *SKA* använda...
Nerre
Inlägg: 27257
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Inlägg av Nerre »

Om jag förstod honom rätt vill han göra nån form av indexbaserat hopp (hoppa i en vektortabell?).

Säg att man har en variabel A som kan vara 1-5. Då kan man göra en enkel "goto A" för att få ett villkorsbaserat hopp istället för

if A=1 goto Ais1
if A=2 goto Ais2
if A=3 goto Ais3
if A=4 goto Ais4
if A=5 goto Ais5

(Ok, den sista kan man optimera bort om man är säker på att A aldrig kan vara högre än 5.)

Men som sagt var, i och med att alla hoppdestinationerna kommer att ligga i en lång rad så kan de ju i sin tur bara innehålla hoppinstruktioner, och då blir det ändå två instruktioner och två hopp som måste göras, så jag tror inte man tjänar så mycket.
nanopile
Inlägg: 312
Blev medlem: 9 april 2006, 17:06:50
Ort: Stockholm

Inlägg av nanopile »

Jag avslutar varje subprogram med
Return
goto $
Då fastnar programmet om jag gjort något tokigt istället för att fortsätta rakt in i nästa rutin.
Det blir väldigt uppenbart att något är fel och var det är fel.
Känner mig lugnare med det. :)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Om jag förstod honom rätt vill han göra nån form av indexbaserat hopp

Kanske det, men det behover i alla fall inte "$"

> Jag avslutar varje subprogram med
> Return
> goto $

Du menar om du råkar hoppa över "return" ?
Det enda fallet skulle vara om man har en skip-instruktion
direkt före, och det kan man ju ganska lätt undvika...

> och var det är fel.

Har du många "goto $" så är det inte så självklart var det fastnar... :-)
nanopile
Inlägg: 312
Blev medlem: 9 april 2006, 17:06:50
Ort: Stockholm

Inlägg av nanopile »

> Du menar om du råkar hoppa över "return" ?
> Det enda fallet skulle vara om man har en skip-instruktion
> direkt före, och det kan man ju ganska lätt undvika...

Jo det är ju korrekt men att något sådant skulle kunna inträffa tycker jag inte alls är osannolikt.
Speciellt när man i början programmerar ihop något och bara testar hastigheter på olika kod och klippochklistrar hit och dit

> Har du många "goto $" så är det inte så självklart var det fastnar...

Näe det är sant, men oftast upptäcker man det så fort man kör i simulatorn och då ser man det direkt.
Man kan ju alltid lägga ut ett värde på en port precis innan goto $ som refererar till ett unikt subprogram.
Fast man får ju fort slut på värden iofs fast då får man väl ta några pinnar till.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

OK, vi har olika syn på det. :-)
För mig vore det väldigt märkligt om man hade ett villkorat hopp (d.v.s
en skip instruktion) direkt före RETURN. Man kan också göra det till
en vana att alltid lägga en NOP före varje RETURN... :-)
nanopile
Inlägg: 312
Blev medlem: 9 april 2006, 17:06:50
Ort: Stockholm

Inlägg av nanopile »

Jo det har du rätt i.
Min vilja att göra så är mer att det känns säkrare och då slipper jag avdela uppmärksamhet till det och som jag är person så avdelar jag rätt mycket till saker jag vet är osäkert.
Programmerandet tycker iaf jag känns mycket bättre när man vet att man har solida program men det är de ju sällan för mig medans jag experimenterar fram något.
Skipinstruktioner före return händer ibland när man klippochklistrar för min del.

Nop är en möjlighet men tar en extra maskincykel.
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Jag har faktisk använd $ en enda gång under alla år jag har programmerat PIC. Jag hade en mycket stor indexeringstabell och jag adderade lite värden som indexering och för att vara säker på att bankningen blev rätt tog jag high $ för att ta MSB med i uträkningen.

Att "låsa" programsnuddar med 'goto $' är det samma som att inte vilja veta VAR det skiter sig, man ser självklart till att den hoppar till en rutin som meddelar ATT det har gått fel och VAR det hände.
nanopile
Inlägg: 312
Blev medlem: 9 april 2006, 17:06:50
Ort: Stockholm

Inlägg av nanopile »

Tänkte det var det man kunde göra genom att lägga ett värde på någon port för i simulatorn så ser man ju var det blir fel ändå.
Användarvisningsbild
wolfheat
Inlägg: 202
Blev medlem: 14 oktober 2007, 20:42:51
Ort: Gävle

Inlägg av wolfheat »

JO, jag ville göra indexerat hopp. Precis som Nerre säger.

Använde "addwf pcl,f" funktionen som vfr förslog. Dock så multiplicerade jag det avlästa värdet för att få plats med fler kommandon per alternativ. Det funkar utmärkt. Inga $ används över huvud taget. Jag har aldrig riktigt gillat dem så jag är bara glad.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> och för att vara säker på att bankningen blev rätt tog jag high $

Fungerar också (och kanske lite tydligare) att sätta en label där
och göra "HIGH label". Då kan man även göra det några
instruktioner innan, om det behövs...
Användarvisningsbild
wolfheat
Inlägg: 202
Blev medlem: 14 oktober 2007, 20:42:51
Ort: Gävle

Inlägg av wolfheat »

Hmm, verkar som jag inte har riktigt bra koll på PCL funktionen ändå. Beroende på om jag använder "hoppfunktionen" tidigt i kodstrukturen eller sent så får jag olika resultat med samma kod.


första stället så är PCL=0x28 på rad 64 och W=00
(efter addwf PCL,F hamnar vi på)
PCL=0x2A och på rad 65

andra stället så är PCL=0x3C på rad 74 och W=00
(efter addwf PCL,F hamnar vi på)
PCL=0x3E och på rad 75


tredje stället så är PCL=0x84 på rad 221 och W=00
(efter addwf PCL,F hamnar vi på)
PCL=0x86 och på rad 102 (förväntat PCL=0x86 och på rad 222 )


Varför blir det så och hur löser jag det?

EDIT: Användandet utav PCL kommandot finns beskrivet på sidan 48 i databladet!
Senast redigerad av wolfheat 25 september 2008, 16:19:50, redigerad totalt 1 gång.
Skriv svar