PIC, Look-up table, utspridda värden

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

PIC, Look-up table, utspridda värden

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

Inlägg 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 ?
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

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

Inlägg 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.
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg 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..
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg 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 d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’1’
retlw d’15’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’2’
retlw d’14’
retlw d’13’
retlw d’12’
retlw d’11’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’3’
retlw d’4’
retlw d’0’
retlw d’0’
retlw d’10’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’6’
retlw d’7’
retlw d’8’
retlw d’9’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’5’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
retlw d’0’
Och en lite förenklad variant utan alla "retlw d'0'"

Kod: Markera allt

lookup_table
addwf PCL,f
...
retlw d’1’
retlw d’15’
...
retlw d’2’
retlw d’14’
retlw d’13’
retlw d’12’
retlw d’11’
...
retlw d’3’
retlw d’4’
...
retlw d’10’
...
retlw d’6’
retlw d’7’
retlw d’8’
retlw d’9’
...
retlw d’5’
...
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
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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...
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg 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..?

Kod: Markera allt

RLF var1
RLF var1
RLF var1
RLF var1
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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...
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg av squiz3r »

Tack sodjan!! Nu har jag lyckats med ett frammsteg idag också :D

>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 :wacko:

Nä.. Nu ska jag :sleepy:
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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... :-)
Användarvisningsbild
korp
Inlägg: 1216
Blev medlem: 30 maj 2006, 02:21:18
Ort: Strömstad

Inlägg 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. :)
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg av squiz3r »

Tack Korp!

Om jag har fattat rätt så gör:

Kod: Markera allt

movlw HIGH Table
movwf PCLATH
Samma som:

Kod: Markera allt

pagesel Table
korrekt?

Allting verkar fungera som det ska nu i alla fall :).
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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...
Skriv svar