Sida 6 av 6
Re: PIC16F886 lookup tables
Postat: 27 maj 2009, 03:12:41
av Scorpiion
Hehe just så var de ja..

Nu har jag precis gjort om hela tabellen så att den låg i flash men ska nog ta bort den helt istället..

Re: PIC16F886 lookup tables
Postat: 27 maj 2009, 09:49:44
av sodjan
Bara en liten detalj...
> ...Nu har jag precis gjort om hela tabellen så att den låg i flash...
Du menar bytt från en RETLW-tabell till en tabell med bara data som du läser via eeadr/eeadrh ?
I så fall ligger de båda "i flash", de ser bara lite annorlunda ut och används lite olika.
> Jag får inte till det att simulera med AD omvandling i MPLAB...
Om vi antar att just den delen fungerar (det kan du ju testa på annan sätt), så
finns det ingen anledning att simulera ADC'n ! Läg bara in fasta värden som
simulerar resultatat från ADC...
> Antar att den hamnat på en annan page kasnke? Eller i en annan bank?
> Jag har fortfarande inte riktigt fattat den biten till 100%...
När man använder RETLW-tabeller så är hanteringen av pages i flash lite extra trickigt.
Man måste se till att PCLATH är rätt satt enligt den där app.noten som vi talade om.
Om man använder rena data-tabeller som läses genom eeadr/eeadrh så hanteras hela
flash-minnet som en enda lång adress-rymd. Inget problem med pages.
Och banker har ingenting med tabeller i flash att göra...
Re: PIC16F886 lookup tables
Postat: 27 maj 2009, 23:28:41
av Scorpiion
Hallå igen.. nu så funkar allting som det ska!

Har även lagt till en till tabell av samma sort för en temperatursensor idag.. Så tack för all hjälp i den här tråden!

Re: PIC16F886 lookup tables
Postat: 27 maj 2009, 23:33:40
av sodjan
Trevligt...

Ändå trevligare skulle det vara med en liten kort beskrivning av hur
du till slut löste de olika problemen som uppkom i tråden. Det brukar
anses som "god ton" mot de som har kommit med förslag och ideer.
Det är alltid intressant om just ens egna bidrag till slut användes...

Re: PIC16F886 lookup tables
Postat: 28 maj 2009, 09:31:50
av vfr
Dessutom kanske hjälp åt dom som råkar ut för samma problem vid ett annat tillfälle!
Re: PIC16F886 lookup tables
Postat: 28 maj 2009, 20:03:41
av Scorpiion
Jo självklart kan jag ge en litet sammandrag om hur det vart...
"Dykdatorn" läser in värden från en NTC temperatursensor och en trycksensor, sedan görs dom om i AD omvandlaren. För att kunna visa trycket så vart det en formel medan temperatursensorn använde sig av en "riktig" eller "rätt" tabell (dvs inte "retlw tabell") som jag lärt mig göra nu! För utom att visa det ovan så vart det en klocka också som räknar hur länge man har dykt och en lite mätare där det står hur långt under ytan man befinner sig, också denna gjord med tidigare nämd tabell.
Som lite avslutning på tråden kan jag lämna ett kodexempel från min kod för att göra en sån här tabell som inte har de begränsningar som en retlw tabell kan ha...
Subrutin för att läsa från minnet, anropas från huvudprogramet med ett värde tidigare lagt i PRESSURE_M, efter subrutinens slut finns resultatet i W-reg: (i det här fallet sattes PRESSURE_M tidigare i programmet, man kan enkelt skriva om rutinen för att använda skicka ett värde till den i W-reg, "meter0 är alltså första värdet i tabellen nedan)
Kod: Markera allt
calc_m
banksel eeadr ; Change to right bank
;
movlw high meter0 ; Bit 8-15 of address to the start of the table
movwf eeadrh
movlw low meter0 ; Bit 0-7 of address to the start of the table
movwf eeadr
movfw PRESSURE_M
addwf eeadr, f
btfsc status,c
incf eeadrh, f
call get_value ; Get "meters under surface" value from table
banksel porta ; Change bank
;
return
get_value
banksel eecon1
bsf eecon1, eepgd ; Read flash
bsf eecon1, rd ; Set readflag
nop ; Wait for reading to finish up
nop
banksel eedat
movf eedat, w ; Put value into W-reg
return
Tabelldata:
Kod: Markera allt
METER_TABLE CODE
; Table with the "meter under surface" values
meter0 data d'0'
data d'0'
data d'0'
data d'0'
....
...
That's all folks!

Re: PIC16F886 lookup tables
Postat: 10 november 2010, 19:39:20
av Stewal
Tar och använder denna tråd, då jag håller på lära mig att skapa en "lookup table" genom att hämta värden ur flash minnet.
Skall som sagt skapa en "lookup table" var inne på att köra med "Retlw", men så sökte jag här på forumet och hitta denna tråd.
Så nu har jag läst igenom databladet om flash minnet, samt denna tråd och skapat en tabell och kod för att läsa ut värden.
Tabellen är gjord för att konvertera ascii tecken till 7-segment display.
Nu vissar det sig att jag stött på problem då det värde som jag kopierar från en minnes plats till W-reg retuneras som h'FF'
Om jag lägger in ett "Litural value" i W-reg, så retuneras rätt värde.
Nu undrar jag själv klart vad jag gör för fel då den inte lyckas retunera rätt värde från en minnes plats.
Det gäller en PIC16F886 precis som i denna tråd.
EDIT: Har testat köra koden med "MPLAB SIM" och där fungerar det med med ett värde från en minnes plats.
Här är koden.
Kod: Markera allt
CALL Check_ascii ; Anropa Check_ascii
movwf portb ; Lägg retunerat värde på PortB
CALL send_to_display ;Skicka till display
;****************************************************
;Rutin för att konvertera ascii till 7 segment
;****************************************************
Check_ascii
;
banksel eeadr ; Byt till rätt bank
;
movlw high ascii0 ; Bit 8-15 av adressen att starta i tabellen.
movwf eeadrh
movlw low ascii0 ; Bit 0-7 av adressen att starta i tabellen.
movwf eeadr
;
movf chk_ascii, w ; Hämta ascii värdet från chk_ascii
addwf eeadr, f
btfsc status,c
incf eeadrh, f
;
call Get_value ; Hämta värde
;
banksel portb ; Byt till rätt bank
return
;
Get_value
banksel eecon1
bsf eecon1, eepgd ; Läs från flash
bsf eecon1, rd ; Sätt läs-flagga
nop ; Vänta
nop
banksel eedat
movf eedat, w ; Lägg värdet i "w" registret
return
Här är tabellen.
Kod: Markera allt
ASCII_TABLE CODE ; Table med ASCII värden
ascii0
data h'00' ;0
data h'00' ;1
data h'00' ;2
data h'00' ;3
data h'00' ;4
data h'00' ;5
data h'00' ;6
data h'00' ;7
data h'00' ;8
data h'00' ;9
data h'00' ;10
data h'00' ;11
data h'00' ;12
data h'00' ;13
data h'00' ;14
data h'00' ;15
data h'00' ;16
data h'00' ;17
data h'00' ;18
data h'00' ;19
data h'00' ;20
data h'00' ;21
data h'00' ;22
data h'00' ;23
data h'00' ;24
data h'00' ;25
data h'00' ;26
data h'00' ;27
data h'00' ;28
data h'00' ;29
data h'00' ;30
data h'00' ;31
data h'00' ;32
data h'00' ;33
data h'00' ;34
data h'00' ;35
data h'00' ;36
data h'00' ;37
data h'00' ;38
data h'00' ;39
data h'00' ;40
data h'00' ;41
data h'00' ;42
data h'00' ;43
data h'00' ;44
data h'00' ;45
data h'00' ;46
data h'00' ;47
data h'3f' ;48
data h'06' ;49
data h'5b' ;50
data h'4f' ;51
data h'66' ;52
data h'6d' ;52
data h'7d' ;54
data h'07' ;55
data h'7f' ;56
data h'6f' ;57
Re: PIC16F886 lookup tables
Postat: 10 november 2010, 22:31:31
av sodjan
> Om jag lägger in ett "Litural value" i W-reg, så retuneras rätt värde.
Var gör du det ?
Ha gärna med all kod som du talar om i själva koden också
och markera med kommenterar vad som är vad...
Och posta gärna ett komplett test-case som kan köras direkt
i MPLAB utan att man ska behöva komplettera med resten själv.
För övrigt fungerar det helt OK när jag testar i MPSIM.
Q: Har du lagt chk_ascii i UDATA_SHR ?
Om inte behöver du banksel när du använder chk_ascii.
Sen så skulle jag skippa de "tomma" platserna i tabellen och minsta
chk_ascii med 48 (dec) innan det addreras till EEADR/EEADRH.
Re: PIC16F886 lookup tables
Postat: 10 november 2010, 22:39:34
av sodjan
Alltså byt:
Kod: Markera allt
movf chk_ascii, w ; Hämta ascii värdet från chk_ascii
addwf eeadr, f
btfsc status,c
incf eeadrh, f
mot
Kod: Markera allt
movlw d'48'
subwf chk_ascii, w ; Hämta ascii värdet från chk_ascii, och minska med 48.
addwf eeadr, f
btfsc status,c
incf eeadrh, f
och plocka bort de tomma raderna ur tabellen så att det blir :
Kod: Markera allt
ASCII_TABLE CODE ; Table med ASCII värden
ascii0
data h'3f' ; "0"
data h'06' ; "1"
data h'5b' ; "2"
data h'4f' ; "3"
data h'66' ; "4"
data h'6d' ; "5"
data h'7d' ; "6"
data h'07' ; "7"
data h'7f' ; "8"
data h'6f' ; "9"
Re: PIC16F886 lookup tables
Postat: 11 november 2010, 15:58:26
av Stewal
Ursäkta att jag inte svarat innan, kom precis hem från jobbet.
>> Om jag lägger in ett "Litural value" i W-reg, så retuneras rätt värde.
>Var gör du det ?
Jag byte ut.
Kod: Markera allt
movf chk_ascii, w ; Hämta ascii värdet från chk_ascii
mot
>Ha gärna med all kod som du talar om i själva koden också och markera med kommenterar vad som är vad...
>Och posta gärna ett komplett test-case som kan köras direkt
i MPLAB utan att man ska behöva komplettera med resten själv.
Skall tänka på det till nästa inlägg.
För övrigt fungerar det helt OK när jag testar i MPSIM.
För mig med. Dock ej i när koden låg i PIC´n.
>Q: Har du lagt chk_ascii i UDATA_SHR ?
>Om inte behöver du banksel när du använder chk_ascii.
Testade just detta att flytta chk_ascii till UDATA_SHR och vips så fungera det.
Sen så skulle jag skippa de "tomma" platserna i tabellen och minsta
chk_ascii med 48 (dec) innan det addreras till EEADR/EEADRH.
Skall testa det med.
Re: PIC16F886 lookup tables
Postat: 11 november 2010, 16:17:10
av sodjan
> Testade just detta att flytta chk_ascii till UDATA_SHR och vips så fungera det.
OK. Förväntat...
Så då var alltså problemet att du inte "bankade" korrekt för chk_ascii.
En annan lösning som också hade hjälp hade varit att lägga till en
BANKSEL innan access av chk_ascii...
Re: PIC16F886 lookup tables
Postat: 11 november 2010, 19:08:38
av Stewal
Jag trodde inte man behövde banksel innan men nu vet jag att det behövs innan de tilllagda UDATA registrer.
Kan förklara varför man haft en del problem med hämta data ur dessa register.
Tack för hjälpen, nu har man lärt sig något nytt idag med.

Re: PIC16F886 lookup tables
Postat: 11 november 2010, 19:48:29
av sodjan
För access av bankade register (antingen SFR eller RAM) så måste rätt
bank vara satt. Undantaget är de SFR som är mappade över alla banker
(STATUS och några till) samt de sista 16 bytes i RAM (unbanked memory).
För en liten applikation, där kanske 16 bytes räcker till allt, så finns det
ingen anledning att *inte* allokera dom från UDATA_SHR.