Tabellavläsningsproblem 18F458

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
DragonOrb
Inlägg: 381
Blev medlem: 16 oktober 2003, 21:57:19
Ort: Flen

Tabellavläsningsproblem 18F458

Inlägg av DragonOrb »

Hej

Håller på och kodar min klocka, men jag har lite problem.

Kod: Markera allt

hdisplay
	addwf pcl                           ;  Lägger Work i programräknaren
	retlw 0xEB ; Etta
	retlw 0xA1 ; Tvåa
	retlw 0x91 ; Trea
	retlw 0xD2 ; Fyra
	retlw 0xA4 ; Femma               ; Men istället hoppar den hít
	retlw 0x84 ; Sexa
	retlw 0xC9 ; Sjua
	retlw 0x80 ; Åtta
	retlw 0xD0 ; Nio                     ; Hit ska den hoppa 
	retlw 0x88 ; Nolla
	
hdig
	addwf pcl        ; Lägger Work i programräknaren
	retlw 0x0C ; Siffra 1 <
	retlw 0x09 ; Siffra 2 I             ; Hit hoppar den istället
	retlw 0x06 ; Siffra 3 >             ; Hit ska den hoppa

;*************Initierar Portar***********************
start
	MOVLW 7h
	MOVWF ADCON1 ; Stänger av A/D-omvandlaren på PORTA
	
	CLRF PORTA
	MOVLW 0xF8
	MOVWF TRISA ; RA0 > RA2 = Utgångar RA3 > RA7 = Ingångar

	CLRF PORTB
	MOVLW 0x00  ; Vänster Display
	MOVWF TRISB ; Portb = Utgångar

	CLRF PORTC 
	MOVLW 0xF1  ; Höger siffror
	MOVWF TRISC ; RC1 > RC3 = Utgångar RC0:RC4 > RC7 = Ingångar

	CLRF PORTD
	MOVLW 07h   
	MOVWF CMCON ; Comparator på PortD = Av
	MOVLW 0x00  ; Höger Display 
	MOVWF TRISD ; RD0 > RD7 = Utgångar


;************Huvudprogramet Börjar*******************
main:		
	movlw 0x09   ; Ska hoppa till rad 9 i tabellen  "hdisplay"
	call hdisplay  
	movwf portd

	movlw 0x03    ; Ska hoppa till rad 3 i tabellen "hdig"
	call hdig
	movwf portc

	goto main 

	end 
*Har ej lagt in tabellen för vänstra displayen för det blir så mycket kod annars.


Problemet är alltså att den inte hoppar dit jag skriver.
I databladet står det

Kod: Markera allt

The ADDWF PCL instruction does not
update PCLATH/PCLATU. A read operation
on PCL must be performed to update
PCLATH and PCLATU.
Men vad jag har förstått så ska dom inte behövas updateras.

Vad är knas ?

Förövrigt så funkar allt, den använder en 4mhz kristall med 15pF avlastningskondningar, 7805 spänningsregulator.
Pic´en är en 18LF458 som programeras ICSP med en Wisp628.

Bild
Användarvisningsbild
Icecap
Inlägg: 26648
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Ska man inte skriva:
addlw PCL,F ; Utan F kommer det väl att sparas i W
Användarvisningsbild
klasg
Inlägg: 187
Blev medlem: 29 juni 2005, 21:12:24

Inlägg av klasg »

addwf pcl,f kan man skriva för att göra det extra tydligt.

Jag har inga idéer om koden i övrigt. Någon annan kanske...
DragonOrb
Inlägg: 381
Blev medlem: 16 oktober 2003, 21:57:19
Ort: Flen

Inlägg av DragonOrb »

samma sak med

Kod: Markera allt

addwf pcl,f
Får väll vänta tills sodjan kommer online :D
Användarvisningsbild
klasg
Inlägg: 187
Blev medlem: 29 juni 2005, 21:12:24

Inlägg av klasg »

Jag vet att det blir samma sak, men det blir tydligare.

Dessutom så kommer den väl hoppa till "noll" som det är nu? Börjar väl räkna från noll och inte ett? Samma sak med rad tre, som blir rad fyra...
DragonOrb
Inlägg: 381
Blev medlem: 16 oktober 2003, 21:57:19
Ort: Flen

Inlägg av DragonOrb »

Jag satt och funderate på det ett tag också, men då borde den hoppa till 8:an och inte 5:an
Användarvisningsbild
klasg
Inlägg: 187
Blev medlem: 29 juni 2005, 21:12:24

Inlägg av klasg »

Sant.
Kan du inte skita i "hdisplay"? Är det inte enklare att t ex. skriva:

movlw '9'
movwf portd

Fast vad vet jag...

EDIT: Jag kan inte stava...
DragonOrb
Inlägg: 381
Blev medlem: 16 oktober 2003, 21:57:19
Ort: Flen

Inlägg av DragonOrb »

Visst kan man göra så, men det blir lite jobbigare att hålla ordning.
Tabellen innehåller hex-koderna för att få fram rätt siffror på displayerna.

Vi har även gjort just såhär i skolan, men jag kommer inte ihåg exakt allt.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Pling ! Online... :-)

En skillnad från PIC16 är att du bara kan hoppa till *jämna* adresser.
Du kan alltså inte lägga till ett udda tal till PCL. Se 4.8.1 i databladet.
Det står tydligt där.

PCL adresserar programminnet i *BYTES*, men alla instruktioner ligger
på jämna *WORDS*.

Helt solklart för den som har läst rellevanta delar av databladet... :-)

Stämmer även överens med dina "hit hoppar den" kommenterar...

Du måste även vara helt säker på (med din kod) att din "tabell" inte
överbryggar en 256 bytes gräns, annars går det fel. Du kan antingen
hårdkoda din tabell på en lämlig adress, eller se till att PCLATH och
PCLATU är korrekt uppdaterade innan ADDWF PCL,F instruktionen.
Det finns app notes som beskriver detta.

PIC18 har dessutom speciella registrer och instruktionerna för
tabell-läsning. Se bl.a 6.1 och 6.3. Då lagras två värden ("bytes")
per programminnes word, så för stora tabeller är det effektivare.
Läsningen sker även helt utan problem med några "adressgränser".

I det läge du är, med en nästan fungerande kod, skulle jag behålla
ADDWF PCL och bara se till att det dels ligger inom samma 256 bytes block,
dels att du alltid lägger till ett jämt värde till PCL (gör bara en shift innan
ADDWF instruktionen...)
DragonOrb
Inlägg: 381
Blev medlem: 16 oktober 2003, 21:57:19
Ort: Flen

Inlägg av DragonOrb »

Tack så mycket.

Jag tar och kodar om så jag använder

Kod: Markera allt

 Table Read (TBLRD)
 Table Write (TBLWT)
istället.
Bättre att göra rätt från början :)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Rätt och rätt... :-)

RETLW är nog lite snabbare för små tabeller som ryms inom ett 256 byte
block (alltså med mindre en 128 RETLW instruktioner.

TBLxxx instruktionerna fungerar däremot för så stora tabeller som Flash minnet rymmer.

Som jag sa, eftersom det i princip bara saknas *en* enda instruktion
(RLNCF WREG) för att få befintlig kod att fungera, så skulle jag
prova det först.

Kod: Markera allt

hdisplay
   rlncf wreg, f                       ; mult wreg med 2
   addwf pcl                           ;  Lägger Work i programräknaren
   retlw 0xEB ; Etta
   ...
   ...

Kod: Markera allt

hdig
   rlncf wreg, f                       ; mult wreg med 2
   addwf pcl        ; Lägger Work i programräknaren
   retlw 0x0C ; Siffra 1 <
   retlw 0x09 ; Siffra 2 I             ; Hit hoppar den istället
   retlw 0x06 ; Siffra 3 >             ; Hit ska den hoppa
Det kan dock fortfarande krascha p.g.a 256 bytes problemet...
DragonOrb
Inlägg: 381
Blev medlem: 16 oktober 2003, 21:57:19
Ort: Flen

Inlägg av DragonOrb »

RLNCF WREG funkade väldigt fint :)

Kör på såhär då.
Slänger upp ett projekt också.
Skriv svar