Sida 1 av 1
PIC, Look-up table, utspridda värden
Postat: 19 juli 2008, 13:09:36
av squiz3r
Hej, Håller på att programmera lite nu, just nu är det en 16F877A men det kanske blir en 16F628A eller 12F629 senare. Det är asm som jag kodar i.
Mitt problem, jag har en variabel som kan ha (just nu) 15 olika värden. Dessa värdena är utsprida, och jag vill översätta den till värden som ligger i en linjär skala. Såhär:
Kod: Markera allt
Invärde Önskat utvärde
18 14
34 13
35 12
36 11
37 10
53 9
69 8
68 7
67 6
66 5
82 4
50 3
49 2
33 1
17 0
Min första tanke va att göra en vanlig lookup-table där man lägger på "invärdet" på PC latchen, men det är ju inte så optimalt eftersom jag har såmycket hålrum mellan värdena.. Det största är 82, så så hade man fått ha en tabel som är 82 rader lång med en massa nop'ar i..
Finns det något annat smidigare sätt att göra det på?
Mvh. Daniel
Postat: 19 juli 2008, 13:40:35
av sodjan
En "tabell" med båda värderna som du scannar sekvensiellt.
Tar dock något längre tid att "läsa".
Annars är väl inte en tabell med 82 "entries" något problem, har
du väldigt ont om minne ?
Postat: 19 juli 2008, 15:14:45
av squiz3r
>En "tabell" med båda värderna som du scannar sekvensiellt.
jag är inte riktigt med på vad du menar där, typ såhär eller?
Kod: Markera allt
If (var_In == 18)
var_ut = 14;
...
If (var_in == 17)
var_ut = 0;
(fast i ASM blir det lite längre kod..)
>Annars är väl inte en tabell med 82 "entries" något problem
Nja, kanske det inte är. Det känns som det är rätt onödigt att göra en 82 raders tabell för att rymma 16 värden

. Men det kanske det inte är..
Minnet har jag inte ont om en så länge, men om jag ska flytta den till en 12F629 är det inte säkert att jag har så gott om det längre.
Om jag ska göra en tabell, för att den inte ska ligga mitt imellan två pages (namn?), så ska man väll använda CODE xxx (Jepp, jag kör Relocateable mode)? Ska man kolla i LKR filen för att veta vilken adress då?
Postat: 19 juli 2008, 16:08:33
av sodjan
12F629 har bara en (halv) page.
För övrigt delas aldrig ett CODE segment över flera pages.
Om du bara anropar lookuptabellen på rätt sätt (med PCLATH korrekt)
så spelar det ingen roll var de ligger.
Postat: 19 juli 2008, 16:54:01
av squiz3r
>12F629 har bara en (halv) page.
Jepp, Så där slipper man tänka på det. (samma med 16F628A)
>Om du bara anropar lookuptabellen på rätt sätt (med PCLATH korrekt)
så spelar det ingen roll var de ligger.
Har du något länktipps till nåt ställe där man kan läsa mer av detta? Har ingen erfarenhet alls av sånthär..
Postat: 19 juli 2008, 19:07:18
av squiz3r
Då ska tabellen se ut såhär? (tog lite hjälp av word och excell för att göra den

)
Kod: Markera allt
lookup_table
addwf PCL,f
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d1
retlw d15
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d2
retlw d14
retlw d13
retlw d12
retlw d11
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d3
retlw d4
retlw d0
retlw d0
retlw d10
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d6
retlw d7
retlw d8
retlw d9
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d5
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
retlw d0
Och en lite förenklad variant utan alla "retlw d'0'"
Kod: Markera allt
lookup_table
addwf PCL,f
...
retlw d1
retlw d15
...
retlw d2
retlw d14
retlw d13
retlw d12
retlw d11
...
retlw d3
retlw d4
...
retlw d10
...
retlw d6
retlw d7
retlw d8
retlw d9
...
retlw d5
...
Då vet jag att om den returnerar 0 så är det något fel, så då kan jag försöka igen. Den innehåller 100 bytes, så den ska få platts i en "0x100 boundary" (255 bytes)
Då är bara frågan hur det ska se ut med CODE taggarna..
Mvh. Daniel
Postat: 19 juli 2008, 19:23:31
av sodjan
> "0x100 boundary" (255 bytes)
256 *WORDS*.
Hur många bytes det är är mindre intressant, men det är 14 bitar/word
så det går att räkna ut (men som sagt, inte så intressant...)
> Har du något länktipps...
AN556 är den klassiska beskrivningen av lookup-tables med RETLW :
http://ww1.microchip.com/downloads/en/A ... 00556e.pdf
Notera att du inte behöver ta med koden för att fixa tables
som passerar page-gränser (eftersom de inte kan göra
det när man kör rellocatable), bara det som fixar om
tabellen ligger i en annan page än den CALL sker till den...
Postat: 19 juli 2008, 19:50:59
av squiz3r
>256 *WORDS*.
Ahh, Man lär sig nytt hela tiden!
Ska läsa igenom den app-noten
Jag har ett annat fel i koden också, jag har en variabel som har ett värde mellan 0-10, sen vill jag multiplicera den med 16, då kan jag väll skriva..?
Postat: 19 juli 2008, 19:56:35
av sodjan
Kod: Markera allt
BCF STATUS, C
RLF var1, F
RLF var1, F
RLF var1, F
RLF var1, F
Annars finns det risk att du roterar in en skräpbit från "Carry".
Å så ", F" så att det är tydligt att resultatet ska tillbaka till var1...
Postat: 19 juli 2008, 20:34:15
av squiz3r
Tack sodjan!! Nu har jag lyckats med ett frammsteg idag också
>skräpbit från "Carry".
Aha, Det är första gången som jag har nollställt den manuellt, trode alldrig att man behövde/kunde det, men nu i efterhand är det ganska självklart.
>,F
Det trode jag bara man skulle ha om man hade fler än ett register inblandat, och här är ju bara F? Eller kan man spara det i W också? För tex, om man skriver:
Addlw d'xx', W
Så godkänner inte MPLAB det
Nä.. Nu ska jag

Postat: 19 juli 2008, 20:45:03
av sodjan
Japp, "RLF var1, W" roterar var1 och lägger resultatet i W, t.ex.
Alla instruktioner som har en "d" ("destination") parameter ska ha ett "W" eller "F".
"F" är i och för sig default om "d" saknas, men då ser det ju ut som om
man inte vet vad man håller på med...

Postat: 19 juli 2008, 20:56:22
av korp
Vi hade nyligen en diskussion om liknande saker i tråden
PCLATH problem med PIC16F886. Indikering?. Kanske kan den ge något.
Att sedan MPLAB inte godkänner fler än ett argument till ADDLW är ganska självklart om du kollar sid 226 i databladet för din kontroller.

Postat: 20 juli 2008, 11:32:50
av squiz3r
Tack Korp!
Om jag har fattat rätt så gör:
Samma som:
korrekt?
Allting verkar fungera som det ska nu i alla fall

.
Postat: 20 juli 2008, 12:15:38
av sodjan
De får samma resultat, men de gör det inte riktigt
på samma sätt. Se MPASM manualen under "pagesel".
En fördel med pagesel är att på modeller med 2 K word
eller mindre gör pagesel ingenting alls (eftersom det ine
behövs) och sparar alltså in lite kod...