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.
Problem med assembler.... (16F690)
Re: Problem med assembler.... (16F690)
> (ursäkta att indragningen med tab'ar blir kasst här)
Använd code-taggarna. Jag har även ersatt tab med space...
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...
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
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...

Re: Problem med assembler.... (16F690)
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.
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.
Re: Problem med assembler.... (16F690)
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.
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.
Re: Problem med assembler.... (16F690)
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...
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...

Re: Problem med assembler.... (16F690)
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