> Måste vara så för "goto isr_routine" i exemplet oxå
Det där är igentligen lite trixigt...
Just när ett interrupt inträffar så vet man ju faktiskt inte
på vilken page man befinner sig, och alltså inte heller hur PCLATH
är inställt. Så igentligen så kan man inte bara sätta ett "goto isr_routine"
direkt vid interrupt vektorn utamn att komplettera med ett
"pagesel isr_routine" också. Dessutom så kan man inte bara sätta om
PCLATH hur som helst utan att spara undan det gamla PCLATH (som användes
i den rutin som blev avbruten av interruptet) först. D.v.s den vanliga koden
för att spara unden W, STATUS och PCLATH, det brukar vara dokumenterat
i kapitlet kring interrupt i varje datablad.
Jag har nog fuskat lite med detta i mina exempel eftersom det ändå
var så lite kod och allt hamnade i page0...
Ett sätt att helt slippa ifrån denna page-hantering är att köra med PIC18
istället, men det är ju lite fusk...
> ...att länka in biblioteks rutiner eller klipp o klistra in och ha allt i samma asm-fil ?
Fördelen med att behålla det i olika delar är att varje fil är sitt
eget "name-space". D.v.a att man kan ha labels som "loop" eller
liknande i varje fil utan att de "krockar". Men kan dessutom ha variabler
som tmp, count eller så i varje fil. Om man lägger ihop allt i
samma fil (antingen genom att klippa ihop filerna eller med #INCLUDE)
så blir allt ett enda name-spece och alla symboler och labels måste vara
unika.
Notera också att man kan styra vilken page ett visst code segement ska
hamna på genom att ge det samma namn som ett "SECTION" i LKR filen.
Man kan lägga dit egna SECTIONS's som i detta exempel (från en
kod för en 16F886):
Kod: Markera allt
// Sample linker command file for 16F886
LIBPATH .
CODEPAGE NAME=page0 START=0x0 END=0x7FF
CODEPAGE NAME=page1 START=0x800 END=0xFFF
CODEPAGE NAME=page2 START=0x1000 END=0x17FF
CODEPAGE NAME=page3 START=0x1800 END=0x1FFF
CODEPAGE NAME=.idlocs START=0x2000 END=0x2003 PROTECTED
CODEPAGE NAME=.config START=0x2007 END=0x2008 PROTECTED
CODEPAGE NAME=eedata START=0x2100 END=0x21FF PROTECTED
DATABANK NAME=sfr0 START=0x0 END=0x1F PROTECTED
DATABANK NAME=sfr1 START=0x80 END=0x9F PROTECTED
DATABANK NAME=sfr2 START=0x100 END=0x10F PROTECTED
DATABANK NAME=sfr3 START=0x180 END=0x18F PROTECTED
DATABANK NAME=gpr0 START=0x20 END=0x6F
DATABANK NAME=gpr1 START=0xA0 END=0xEF
DATABANK NAME=gpr2 START=0x110 END=0x16F
DATABANK NAME=gpr3 START=0x190 END=0x1EF
SHAREBANK NAME=gprnobnk START=0x70 END=0x7F
SHAREBANK NAME=gprnobnk START=0xF0 END=0xFF PROTECTED
SHAREBANK NAME=gprnobnk START=0x170 END=0x17F PROTECTED
SHAREBANK NAME=gprnobnk START=0x1F0 END=0x1FF PROTECTED
SECTION NAME=PROG1 ROM=page0 // ROM code space - page0
SECTION NAME=PROG2 ROM=page1 // ROM code space - page1
SECTION NAME=PROG3 ROM=page2 // ROM code space - page2
SECTION NAME=LCDSECT ROM=page2 // ROM code space - page2
SECTION NAME=PROG4 ROM=page3 // ROM code space - page3
SECTION NAME=IDLOCS ROM=.idlocs // ID locations
SECTION NAME=DEEPROM ROM=eedata // Data EEPROM
Notera redan med "LCDSECT" 4 rader från slutet.
Sedan kan man ge ett CODE segment detta namn:
Kod: Markera allt
;**********************************************************************
; Subs för HD44780
;
; Nägra temp variabler som används av LCD rutinerna.
; Lägger dom i "shared memory" så slipper vi banksel...
;
LCD_VARS UDATA_SHR
LCD_TMP1 RES 1
LCD_TMP2 RES 1
;
; Slut på variabler, här kommer koden flr LCD rutinerna.
; Hamnar i SECTION = "LCDSEG"...
;
LCDSECT CODE
;
lcd_init_hd44780
...
...
Detta gör att LCD-rutinerna styrs till PAGE2...
Så man kan ha en generell/gemensam fil med LCD rutinerna som
styrs mot en SECTION som heter LCDSECT. Sedan får man göra en
lokal kopia av LKR filen för det aktuella projektet och lägga till en
LCDSECT section där man vill ha den. Fördelen är naturligstvis att man
inte behöver ändra den gemensama ASM filen för at flytta koden, bara
den projekt-specifika LKR filen. Före större projekt är det nog vanligt
att man har en speciell variant av LKR filen i alla fall. Man vill kanske
styra lite var man lägger lookup-tabeller och text-strängar o.s.v...
Ja ja, det är en liten vetanskap detta om man börjar gräva i det...
