Sida 6 av 6

Re: PIC16F886 lookup tables

Postat: 27 maj 2009, 03:12:41
av Scorpiion
Hehe just så var de ja.. :P 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

Kod: Markera allt

movlw h'35'  ; Test att konvertera en 5:a
>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.