Problem med assembler.... (16F690)

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
MrIzoard
Inlägg: 339
Blev medlem: 25 september 2011, 15:33:08
Ort: Göteborg

Problem med assembler.... (16F690)

Inlägg av MrIzoard »

Hejsan!

Efter att programmeringen har legat i dvala i några år så började jag damma av ett gammalt projekt som var skrivet för ännu fler år sedan.
Bl.a. så var det inte uppdelat i olika filer utan allt var skrivet i en lång.
Så nu har jag börjat stycka upp det utan problem men när jag kommer till att lägga look-up tabellerna i en separat fil så stöter jag på ett problem.
När jag flyttar program countern (ursäkta om jag svänger mig med fel ord) så hoppar jag iväg helt fel och jag har bara gjort en copy/paste från det stora.

Så här ser den nya filen ut (ursäkta att indragningen med tab'ar blir kasst här)
list p=16f690
#include <p16F690.inc>

GLOBAL Look_Sub_hi, Look_Sub_lo
EXTERN Tecken_variabel

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Look-up tabellerna kommer här
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

CODE


Look_Sub_hi: ; Här ligger värden för Sub_hi
decf Tecken_variabel, w ; Värdet på w behöver minskas med 1 då det hoppar ett för långt annars
addwf PCL, f ; Lägger värdet från w i PCL
retlw 0x27 ; Sub_hi = 27
retlw 0x03 ; Sub_hi = 03
retlw 0x00 ; Sub_hi = 00
retlw 0x00 ; Sub_hi = 00
retlw 0x00 ; Sub_hi = 00

Look_Sub_lo: ; Här ligger värden för Sub_lo
decf Tecken_variabel, w ; Värdet på w behöver minskas med 1 då det hoppar ett för långt annars
addwf PCL, f ; Lägger värdet från w i PCL
retlw 0x10 ; Sub_lo = 10
retlw 0xE8 ; Sub_lo = E8
retlw 0x64 ; Sub_lo = 64
retlw 0x0A ; Sub_lo = 0A
retlw 0x01 ; Sub_lo = 01

end


Kollar jag PCL och PCLATH så hoppar det ju inte in några konstiga värden när man stepar igenom.
Så om någon kan peka mig i någon riktning att rota vore jag tacksam.

M.v.h.
Ulf L.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43204
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Problem med assembler.... (16F690)

Inlägg av sodjan »

> (ursäkta att indragningen med tab'ar blir kasst här)

Använd code-taggarna. Jag har även ersatt tab med space...

Kod: Markera allt

    list      p=16f690
#include <p16F690.inc>
     
    GLOBAL	Look_Sub_hi, Look_Sub_lo
    EXTERN	Tecken_variabel

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Look-up tabellerna kommer här
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    CODE


Look_Sub_hi:                          ; Här ligger värden för Sub_hi
    decf     Tecken_variabel, w       ; Värdet på w behöver minskas med 1 då det hoppar ett för långt annars
    addwf    PCL, f                   ; Lägger värdet från w i PCL
    retlw    0x27                     ; Sub_hi = 27
    retlw    0x03                     ; Sub_hi = 03
    retlw    0x00                     ; Sub_hi = 00
    retlw    0x00                     ; Sub_hi = 00
    retlw    0x00                     ; Sub_hi = 00

Look_Sub_lo:                          ; Här ligger värden för Sub_lo
    decf     Tecken_variabel, w       ; Värdet på w behöver minskas med 1 då det hoppar ett för långt annars
    addwf    PCL, f                   ; Lägger värdet från w i PCL
    retlw    0x10                     ; Sub_lo = 10
    retlw    0xE8                     ; Sub_lo = E8
    retlw    0x64                     ; Sub_lo = 64
    retlw    0x0A                     ; Sub_lo = 0A
    retlw    0x01                     ; Sub_lo = 01

    end
Sen till problemet...

Har du kollat hur dina olika filer hamna i minnet?
MAP filen talar om det. Dina "addwf PCL" kommer
att gå fel om tabellen ligger över en 256 byte gräns
eftersom det är en 8-bit addition. Det finns flera sätt
att komma åt det:
- Lägga tabellerna man manuellt (via CODE med en adress) inom ett 256 byte block.
- Justera uppdateringen av PCL så att även PCLATH justeras innan "addwf PCL".

Se "2.3 PCL and PCLATH" i databladet där detta avhandlas.
Där hänvisas även till AN556, “Implementing a Table Read”:
http://www.microchip.com/wwwAppNotes/Ap ... e=en011102
http://ww1.microchip.com/downloads/en/A ... 00556e.pdf.

*Eller* så byter du till en modern 16F1xxx processor där detta (tabeller) är mycket
enklare att implementera... :-)
MrIzoard
Inlägg: 339
Blev medlem: 25 september 2011, 15:33:08
Ort: Göteborg

Re: Problem med assembler.... (16F690)

Inlägg av MrIzoard »

Man tackar och bockar, visst var det så som du skrev.
När jag kollade i map:en så låg den på 1xx, d.v.s. >= 256

Jag justerade PCLATH:en före uppdaterigen av PCL och då fungerar det ju fin-fint.

Jo jag borde uppgradera min lilla flotta av gamla PIC:ar :)
Synd att jag inte testade detta tidigare (och skrev här) då jag idag fick lite prylar från electrokit, det hade ju varit smutt att slängt med några ny PIC:ar i beställningen.

//Ulf L.
MrIzoard
Inlägg: 339
Blev medlem: 25 september 2011, 15:33:08
Ort: Göteborg

Re: Problem med assembler.... (16F690)

Inlägg av MrIzoard »

Efter mer omstrukturering av koden så blev det nya problem och lite mullemeckigare att lösa (klart lösbart men nu slog det över från FF till 100 mitt i min look-up tabell.
Jag kollade igenom det du länkade och använder numera CODE och sätter adressen, känns ju mycket smidigare med den lösningen.
Så då får jag tacka igen :)

//Ulf L.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43204
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Problem med assembler.... (16F690)

Inlägg av sodjan »

Ja, det är ju två olika problem, att tabellen ligger i en annan 256 area än
där anropet sker, och att tabellen i sig ligger tvärs över två 256 bytes areor.
Jag tror att App noten beskriver hur man löser båda problemen. Men den
hårdkodade adressen löser ju det ena (senare) problemet i alla fall... :-)
PW2000
Inlägg: 38
Blev medlem: 25 mars 2012, 05:46:32

Re: Problem med assembler.... (16F690)

Inlägg av PW2000 »

En enkel tabell som klarar "sid-byte"

Kod: Markera allt

;**************** Lockup table 0-9 A-F för dec->hex *********************
;
lock	
	ANDLW	0Fh				; Nollar övre nibbeln.
    	MOVWF    tmp3        			; Spara W i tmp3
     	MOVLW    high(tableLO)			; Hämta adress till tabellen
     	MOVWF    PCLATH      			; Sätt de övre adressbitarna
     	MOVFW    tmp3		     		; Hämta tillbaka W
     	ADDLW    low(tableLO)  		; Offset i tabellen
     	SKPNC                			; Overflow ?
     	INCF     PCLATH, F   			; Ja, Hoppa till nästa 'page'
     	MOVWF    PCL         			; Utför hoppet

tableLO:
		RETLW	chr0
		RETLW	chr1
		RETLW	chr2
		RETLW	chr3
		RETLW	chr4
		RETLW	chr5
		RETLW	chr6
		RETLW	chr7
		RETLW	chr8
		RETLW	chr9
		RETLW	chrA
		RETLW	chrB
		RETLW	chrC
		RETLW	chrD
		RETLW	chrE
		RETLW	chrF
Skriv svar