PIC18XXX CSALÁD FELÉPÍTÉSE (ÖSSZEFOGLALÓ) A Microchip cég legújabb családjánál, a PIC18XXX-es sorozatnál, számos vonatkozásában továbbfejlesztették a PIC 17XXX-es családnál bevezetett felépítést. Mielőtt az ismertetést elkezdenénk, foglaljuk össze, mi nem volt igazán eddig jó a PIC mikrokontrollereknél, vagyis kritizáljunk egy kicsit Az egyik legnagyobb problémát a regiszterbankok okozzák. Mivel váltani kell, ezt könnyen el lehet téveszteni. Természetesen a szimulátorral az ilyen hibák felderíthet ők. A programmemóriában elhelyezett adatokat a RETLW utasításban kell tárolni, és a PCLATH regisztert kell mindig megfelelően állítani. Az ablakos tokokkal a fejlesztés kellemetlen, nehézkes. A 0 adatmemória címen kezdődő SFR regiszterek felett helyezkedtek el a felhasználói adatregiszterek, amelyeknek kezdőcíme típusról típusra változott. A verem mélysége mindössze nyolc ez sok rejtélyes hibának volt a forrása, A beprogramozott tokok tartalmának módosítása nehézkes volt. A 2 kszavas memóriaméret miatt lapozni kellett nagyobb programoknál a memóriát. Szegényes utasításkészlet, nincs szorzás stb. Kijelenthetjük, hogy a Mikrochip a PIC18XXX családban mindezeket a problémákat orvosolta! utasítások a teljes memóriát elérik (mivel ezek két szóból [= 32bit]) állnak. Ilyen kétszavas utasítás még két 12 bites című fájlregiszter tartalmának mozgatása (MOVFF), illetve az FSRx-et 12 bites címliterállal feltöltő utasítás (LFSR). Megjelent egy 8*8 bites hardver szorzó. Ilyen módon az aritmetikai műveletek gyorsasága jelentősen megnövelhető. A processzor órajelének frekvenciája működés közben átkapcsolható. Ha kell, két oszcillátort használhatunk, egy nagy sebességűt az aktív működéshez, és egy kis sebességűt az energiatakarékos üzemmódban. A család egy 40 lábú tagjának tokrajzán látható, hogy a tok működtetéséhez összesen öt kivezetés: a tápfeszültség két pontja és a tok belső regisztereit alaphelyzetbe hozó MCLR (Master CLeaR) pont és két oszcillátorkivezetés (OSC1, OSC2) szükséges. A tok többi kivezetése már az I/O funkciókat valósítja meg. A tok lábkiosztásánál megtartották a PIC16XXX családdal való kompatibilitást, és ez a 28 lábú tokokra is igaz. A következőkben hivatkozva az eddigiekben leírtakra bemutatjuk a család legfontosabb jellemz őit. A Microchipnél ezek az eszközök a jelen korszerű mikrokontroller családját képviselik. Az új, 16 bit hosszúságú utasításokkal dolgozó processzormag a szilícium lapkán mindössze 10%-kal több helyet foglal el, mint a széles körben elterjedt 14 bites architektúra processzormagja. Mivel az adatbusz maradt továbbra is 8 bites, ezért a lapka felülete az új családnál nem növekedett, hanem inkább csökkent, az új, finomabb rajzolatú, csökkentett vonalvastagságú technológiák következtében. Számos új változtatást hajtottak végre az architektúra és a lesz űrődött programozásialkalmazási tapasztalatok figyelembevételével. Mielőtt a család jellemzőit részletesebben bemutatnánk, egy gyors lista az újdonságokról: A programmemória címzésére 21 bites PC regiszter szolgál, amelynek részei: PCU<20:16>PCH<15:8>PCL<7:0> A PCL regiszterrel végzett műveleteknél a PCU, PCH regiszterek tartalmát a PCLATU és PCLATH regiszterekből kapjuk. Bár a belső memória mérete (21 bites cím!) igen nagy lehet, egyes típusoknál mégis kialakítottak a küls ő memóriát elérő lehetőséget. Megszűnt a memórialapozás! A maximum 4096 bájtos (4 kbájt) adatmemória kezelését három 12 bites FSR regiszterrel végezhetjük. Az indirekt címzést biztosító FSR regiszter fejl ődése jó példa a családok folyamatos fejlesztésére. A 12 bites családnál az FSR a bankkezelést és a bankon belüli címzést biztosította. A 14 bites (PIC16XXX) családnál az FSR egy önálló 8 bites regiszterré vált, amivel 256 bájtos RAM területet lehetett címezni. A 16 bites PIC17XXX családnál már figyelembe vették azt a gyakorlati tapasztalatot, hogy az FSR-rel általában sorban egymás utáni adatmemória-regisztereket címzünk, ezért az FSR kezelése három módon lehetséges: az FSR címzést használó művelet után az FSR tartalma nem változik, eggyel nő, illetve eggyel csökken. (Az ALUSTA regiszterben vannak a módválasztó bitek.) A címzéshez már két regisztert FSR0, FSR1 használhatunk, amivel könnyebben végezhetünk blokkmozgatást (forrás cél). A PIC18XXX-es családnál az FSR regiszterek száma három, és 12 bites hosszukkal a maximális 4096 bájtos adatterület bankválasztás nélkül címezhet ő. A PIC 17XXX családnál megismert három címkezeléshez további kettő társult: először növeljük FSR értékét, utána címzünk és végezzük a műveletet (auto pre increment), illetve az indexelt címzést lehetővé tévő mód: itt a W regiszter előjelesen kezelt tartalmát adjuk hozzá az FSRx (x =0,1,2) regiszterhez. A hardver verem 31 darab 21 bites regiszterből áll, az ötbites veremmutató és a verem alul-, illetve túlcsordulását jelző bitek egy írható/olvasható verem-státuszregiszterben találhatók. A PUSH és POP utasításokkal a verem tetején lévő tartalom és az utasításmutató (PC) cseréje kezelhető. Vagyis programból is lehetséges a verem kezelése: a verem tartalmának és mutatójának írása/olvasása. A megszakításkezelésben is újdonságot találunk: választható módon egy vagy kétszint ű megszakításkezelés használatára van lehetőség. Kétszintű megszakítás esetén a magasabb prioritású megszakításvektor a 08H címen, míg az alacsonyabb prioritású megszakításvektor a 18H címen kezdődik. A megszakításkezelésnél a megszakítás bekövetkezését jelz ő bit (IR), és a megszakítást engedélyező IE bit mellett a prioritást meghatározó bit (IP) is megjelent. Az előbbiek miatt szakítani kellett a minden utasítás egyszavas elvvel. A CALL, GOTO IDŐZÍTŐ ELEMEK
A család funkcionális felépítése a blokkvázlaton látható. Itt is igaz: az aritmetikai-logikai egység hajtja végre a programmemóriában lévő utasítások végrehajtásával az adatokon végzett műveleteket. A család négyfajta memóriatípust tartalmaz: A 21 bittel címezhető, 16 bit széles programmemóriát, ahol a végrehajtandó utasítások, illetve állandó adatok tárolódnak; a programmemória írás/olvasás ciklusainak száma kb. 100 000, 12 bittel címezhető, maximum 4096 bájtos fájlregisztertömb RAM adatmemóriát, az adatok tárolására, 31 visszatérésicímet tároló veremmemóriát, a megszakítások, és a szubrutinhívások kezelésére, a maximum 1024 bájtos, bájtonként írható/olvasható EEPROM adatmemóriát adatok kikapcsolás utáni tárolására; az EEPROM adatmemória írás/olvasás ciklusainak száma kb. 1 000 000. I/O PORTOK: be/kimeneti perifériaként az RA, RB, RC, RD valamint az RE portkivezetések szolgálnak. A port bitjeinek irányát (hogy melyik a bemenet, és melyik a kimenet), a TRISA TRISE elnevezés ű, a blokkvázlaton nem szereplő regiszterekbe írt 0-k (kimenetek) és 1-ek (bemenetek) határozzák meg. A perifériák részletesebb bemutatása a következő fejezetekben történik. Az aritmetikai-logikai egység (ALU) 8 bites operandusokkal dolgozik. Az alábbi aritmetikai műveletek elvégzésére képes: összeadás, kivonás, szorzás, illetve logikai műveletek, és eltolás (shift). A 8*8 bites szorzás egy utasításciklus alatt hajtódik végre, WREG*REG vagy WREG*KONST operandusú lehet, és az eredmény a PRODH:PRODL regiszterpárba kerül. Segítségével könnyen megvalósítható a 16*16 bites szorzás, illetve az előjeles 7*7, 15*15-os szorzás is. 8bitesállandó az utasításból WREG 8bit 8bit d=1, VAGYLITERAL-t TARTALMZÓ UTASÍTÁS 8bit ALU STATUS REGISZTER C bit d=0 8bitesregiszter tartalom, címe az utasításból N,OV,Z,DC éscbitek FÁJL REGISZTER TÖMB KÉT RÉSZBŐL ÁLL: Speciális Funkciójú Regiszterek SFR és átalános célú RAM (GPR) Az ALU működése A műveletek eredménye a STATUS regiszter bitjeit állítja be. Amint látható, a hagyományos, három C, DC, Z bit mellé az aritmetikai műveleteket segítő újabb két bit járult. STATUS REGISZTER Címe: 0XFD8 U 0 U 0 U 0 R/W x R/W x R/W x R/W x R/W x N OV Z DC C bit 7 bit 0 bit 7 5 Nem használt bit 4 N negatív bit, 2-es komplemens aritmetikánál használt, ha az eredmény negatív, akkor annak legnagyobb helyiértékű bitje 1. 1: eredmény negatív; 0: pozitív bit 3 OV túlcsordulás bit, 2-es komplemens aritmetikánál használt. Azt jelzi, hogy a 7-bites tartományt túlléptük. bit 2 Z zéró bit. 1 az értéke, ha az aritmetikai vagy logikai művelet eredménye nulla volt. bit 1 DC digit átvitel/kölcsön bit 1 = 4. bitre volt átvitel 0= 4. bitre nem volt átvitel bit 0 C átvitel/kölcsönvét bit 1 = 8. bitre volt átvitel 0 = 8. bitre nem volt átvitel TÁBLÁZATOK Mivel az információ tárolókat címezhető regiszterekből alakítjuk ki, ezért elméletileg ezeket az adatokat táblázatoknak tekinthetjük. A táblázat címezhető elemek rendezett halmaza. A táblázat elemeire egy mutatóval (pointer) hivatkozunk, ez lényegében egy cím, amely meghatározza a táblázat kiválasztott, aktuális elemét. A címzés legtöbbször lineáris és egyesével változik. A mutatóval kiválasztott (megcímzett) elemet vagy kiolvassuk, vagy tartalmát módosítjuk (írjuk). Mivel ezek az elemműveletek a legtöbbször szomszédos elemek egymásutánjára vonatkoznak, ezért célszer ű a mutatót módosító ún. mutatóműveletek bevezetése: INC a mutató tartalmának növelése 1-gyel, DEC a mutató tartalmának csökkentése 1-gyel.Az írás/olvasási elemműveletek, illetve a mutatóműveletek egymás utáni sorrendje is kétfajta lehet: PRE előbb a mutatóművelet, utána az elemművelet, POST előbb az elemművelet, utána a mutatóművelet.a PIC mikrovezérlők felépítése is jobban érthető a fentiek alapján, mivel a memóriák mind-mind táblázatoknak tekinthet ők: Utasítások a programmemóriában. Itt a mutató a programszámláló, a PC. Utasításlehívás után értéke növekszik. Az ugró utasítás valójában ennek a mutatónak (PC új értéke = ugrási cím) új értéket ad. Verem: a verem is tábla, egy elemét veremmutatóval jelöljük ki: STKPTR értékét a rutinhívás vagy megszakítás változtatja. Fix adatok tárolása a programmemóriában. TBLPTR táblapointer a mutató, amely egy adatot választ ki a progam memóriában. Adatmemória kezelése is az FSR mutatókkal történik. Programokban a mutató a paraméterek átadásánál nagyon hatékony: egy mutató értékének az átadása egy teljes adatstruktúrát azonosít! MEMÓRIASZERVEZÉS PROGRAMMEMÓRIA A memória szervezése továbbra is Harvard architektúrájú: ez a felépítés két külön tárolót: egy adat- és egy programtárolót használ, megszűnik a sorban állás a memóriáért. Ez eltérő bitszélességű adat- és programbusz használatát engedi meg. A PIC18-as családnál 16 bites programmemória és 8 bites adatmemória található. Külön tárolóként jelenik meg a visszatérési címeket tartalmazó, 31 rekeszb ől álló, 21 bites regiszterekből felépített veremmemória. A tokok működését és tesztelését segítő memóriarész a programmemória részének tekinthető eszközmemória. Számos családelemnél van egy 256 bájtos EEPROM adatmemória is. A programmemória címzését a 21 bites programszámláló végzi, ami 2 Mbájt címzését biztosítja. Mivel a programmemóriában elhelyezhetünk bájtos felépítésű adattáblákat is, de az utasítások mindig 16 bit (2 bájt) hosszúságúak, ezért a memóriakezelésnél erre mindig tekintettel kell lennünk. A programmemória egy folytonos blokknak tekinthet ő. Három jellegzetes pontja van: a 0000000h címen lévő RESET cím, és a két megszakítási cím: 000008h (magas prioritású), 000018h (alacsony prioritású). A prioritás fogalmával a megszakítások tárgyalásakor ismerkedtünk meg. Az utasítások a programmemóriában mindig 16 bites formában helyezkednek el. Az utasítás alsó 8 bitje (LSB) a páros címen (a legkisebb címbit = 0), míg a felső 8 bitje (MSB) a páratlan címen helyezkedik el. Ez azt is jelenti, hogy az utasítás számláló (PC=Program Counter) mindig kettesével növekszik, vagyis PC legkisebb helyiértéke mindig nulla. Ebből az is következik, hogy a címeket tartalmazó utasításokban csak 20 bites szócímek szerepelnek, mivel így 1 bitet (a cím legkisebb bitjét) nem kell szerepeltetni. PC<20:0> CALL, BSUB, RETURN, RETFIE, RETLW RESET LSB RESET MSB HI.PRI. IT. LSB HI.PRI. IT. MSB LO.PRI. IT. LSB LO.PRI. IT. MSB 00h 01h 08h 09h 18h 19h 1FFFFFh VEREM MEMÓRIA VEREM 1. SZINT VEREM 2. SZINT VEREM 31. SZINT FELHASZNÁLÓI MEMÓRIA ESZKÖZ MEMÓRIA PROGRAM MEMÓRIA FELÉPÍTÉSE FELHASZNÁLÓI AZONOSÍTÓ FENNTARTVA TESZT EPROM INNEN 0 -ÁT OLVASUNK KI KI KONFIG./KALIB. REGISZTEREK KONFIG./KALIB. REG.- EK MÓDOSÍTÁSAI TESZT MÓD REGISZTEREK ESZKÖZ AZONOSÍTÓ KÓD 200000h 200003h 200004h 200007h 200008h 2001FFh 200200h 2FFFFFh 300000h 370000h 380000h 3BFFFFh 3C0000h 3FFFFDh 3FFFFEh 3FFFFFh A 21 bites programszámláló (PC) három regiszterből áll: PCU=PC<20:16> PCH=PC<15:8> PCL=PC<7:0> A PCL regiszter az adatmemóriában helyezkedik el, írható/olvasható. A PCU, PCH regiszterek közvetlenül nem olvashatók, és nem írhatók. PCLATU PCLATH PCU PCH PCL 23 21 20 16 15 87 0 PCL AZ ADATMEMÓRIÁBAN HELYEZKEDIK EL -ÉRTÉKE PROGRAMBÓL VÁLTOZTATHATÓ! ILYENKOR PCU ÉS PCH REGISZ- TEREK A PCLATU ÉS PCLATH TARTALMÁVA TÖLTŐDNEK FEL!
Ezek elérése az adatmemóriában elhelyezkedő PCLATU és PCLATH regisztereken keresztül lehetséges. Bármikor, amikor a PCL tartalmát kiolvassuk, a PCU és a PCH aktuális tartalma a PCLATU és a PCLATH regiszterekbe másolódik. A PCL írásakor pedig a PCU és a PCH tartalma PCLATU és a PCLATH regiszterekbe töltődik át. Vajon miért alakították ki ezt a megoldást? Azért, mert a PCL regiszterrel történő műveletek segítségével a programmemóriában lévő állandókat tartalmazó táblázatok kiolvasását, kiszámított ugrásokat lehet végrehajtani. Mivel PCL 8 bites, ezért az előbb említett manipulációkat úgy tudjuk a teljes programmemóriatartományra kiterjeszteni, ha a memóriacím felsőbb bitjeit a programból tudjuk állítani. A PCLATH, PCLATU használatával egy táblázatot a programmemória tetszőleges helyén elhelyezhetünk. ADATMEMÓRIA FÁJL REGISZTER TÖMB A regisztercímeket tartalmazó utasításokban egy 8bites rész tartalmazza annak a regiszternek a címét, amivel az adott műveletet el kell végezni. Mivel a regisztertartomány 12 bittel címezhető, 4096 regiszterből áll, meg kell találni azt a megoldást, hogyan képezzük le az utasításban szereplő 8 bites logikai címet a létező 12 bites fizikai címre. BSR<3:0> 0000b 0001b 0010b 1110b 1111b BANK0 BANK1 BANK2 FSR BANK14 BANK15 000h 080h 100h FFFh FSR BSR = BANK SELECT REGISTER GPR ACCESS BANK GPR FSR 00h FFh ADATMEMÓRIA AZ OK: EGYSZERŰBB BANK KEZELÉS, HA A FELADAT EZT MEGENGEDI. HA A BANKELÉRÉST SZABÁLYOZÓ a ACCESS BIT =0, AKKOR NEM A BSR TARTALMA HATÁROZZA MEG A HASZNÁLT BANKOT, HANEM A LEKÉPEZETT ACCESS BANK--OT HASZNÁLJUK. ENNEK ALSÓ 128 BÁJTJA FELHASZNÁLÓI REGISZTER, A FELSŐ 128 BÁJTJA A PERIFÉRIÁKHOZ KAPCSOLÓDÓ SFR = SPECIÁLIS FUNKCIÓJÚ REGISZTER GPR = GENERAL PURPOSE REGISTER Egy kicsit fellengzősen azt is mondhatnánk, hogy meg kell oldani a memóriamenedzselést, azaz a fizikai-logikai memóriacímek kezelését, átalakítását. Ezért kétfajta adatmemória használatát tették lehet ővé: Az egyik megoldásként kialakítottak egy 4 bites bankválasztó regisztert (Bank Select Register - BSR). A 12 bites tényleges fizikai cím alsó 8 bitjét az utasításban lév ő címbitek, a maradék felső 4 bitjét a BSR tartalma adja. Így 16 darab, egyenként 256 bájtos memóriabank van kialakítva. A bankváltások elmaradása, illetve hibás használata sok rejtélyes hiba forrása lehet! Egyszerűbb esetekben a programozónak elegend ő lehet kevesebb regiszter is. Ilyenkor a bankváltásos regiszterfájl kezelésre nincs is szükség, és csupán a 0. bank els ő 128 bájtját használjuk. Ennek a modellnek a neve: ACCESS RAM. Ez az adatmemória első 128 bájtja (00H-7FH) az általános felhasználói regisztertömb, illetve a 4 kbájtos memória utolsó 128 bájtja, (címe: F80H-FFFH) amely az SFR regisztereket tartalmazza. Ez a tartomány (2*128=256) 8 bittel címezhető. Azért, hogy egy utasítás végrehajtásakor tudja az egység, hogy az adott regiszter melyik memóriamodell szerint (BSR alapján, vagy ACCESS RAM-ként használva) címződik, fel kellett használni az utasítás 16 bites kódjában egy bitet. Ennek a neve a (=access) bit, Ha az utasításban ennek az értéke a=0, akkor az ACCESS RAM, ha a=1, akkor a BSR határozza meg azt a bankot, aminek adott 8 bites cím ű regiszterét használjuk. Példa: legyen BSR tartalma: 6 (=0110b). MOVLB 6 ;ez az utasítás tölti fel a BSR-t 6-tal MOVWF 3,0 ;WREG tartalma a 003h-as című regiszterbe kerül MOVWF 3,1 ;WREG tartalma a 603h-as című regiszterbe kerül Mivel a regisztereket használó utasítások esetén mind az eredmény helyét (az utasítás d =destination bitje), mind a regisztercím értelmezését (az utasítás a=access bitje) meg kell adni, ezért az ilyen utasításoknál három jellemzőt kell szerepeltetni: f-a regiszter címét, valamint az a és d bitek értékét. Az assembler, amennyiben a regisztercím az ACCESS RAM területre vonatkozik, automatikusan a=0 állapotot állít be a lefordítandó utasításban. SFR REGISZTEREK A mikrovezérlő működése során regiszterekben tárol bizonyos jellemző értékeket. Ezeket a regisztereket hívjuk rendszer regisztereknek. Ilyen például az aritmetikai-logikai egység akkumulátor (WREG) regisztere, vagy a szorzóegység PRODH és PRODL regisztere. A perifériák működését az adatmemóriában elhelyezett perifériaregiszterek segítségével kezeljük. Mivel mindkét típusú regiszterből elég sok van, ezért egyszerűbb, ha ezeket a regisztereket összefoglaló néven Speciális Funkciójú Regisztereknek (SFR-eknek) nevezzük. SFR rendszerregiszterek és perifériaregiszterek Az SFR regiszterek neveit és az elhelyezkedési címeit a Microchip határozta meg, és ezek legtöbbje az adatmemória felső címtartományában <FFFh:F80h> találhatók. Ez az elhelyezés azt is biztosítja, hogy a meglév ők alá, csökkenő címeken újabb SFR regiszterek definiálhatók, esetleg megjelenő újabb perifériák (pl. CAN busz) és rendszerelemek támogatására. Mivel a meglévők helyzete nem változik, ezért a régi és az újabb fejlesztés ű mikrovezérlők között a kompatibilitás SFR regiszterek vonatkozásában fennmarad. A következő oldalon található táblázat az SFR regiszterek neveit és az adatmemóriában lév ő elhelyezkedési címeit foglalja össze. A továbbiakban elég sokszor fogunk hivatkozni az itt található regiszterekre. FFFH TOSU FDFh INDF2 (2) FBFh CCPR1H F9Fh IPR1 FFEh TOSH FDEh POSTINC2 (2) FBEh CCPR1L F9Eh PIR1 FFDh TOSL FDDh POSTDEC2 (2) FBDh CCP1CON F9Dh PIE1 FFCh STKPTR FDCh PREINC2 (2) FBCh CCPR2H F9Ch FFBh PCLATU FDBh PLUSW2 (2) FBBh CCPR2L F9Bh FFAh PCLATH FDAh FSR2H FBAh CCP2CON F9Ah FF9h TBLPTRU FD9h FSR2L FB9h F99h FF8h PCL FD8h STATUS FB8h F98h FF7h TBLPTRH FD7h TMR0H FB7h F97h FF6h TBLPTRL FD6h TMR0L FB6h F96h TRISE FF5h TABLAT FD5h T0CON FB5h F95h TRISD FF4h PRODH FD4h FB4h F94h TRISC FF3h PRODL FD3h OSCCON FB3h TMR3H F93h TRISB FF2h INTCON FD2h LVDCON FB2h TMR3L F92h TRISA FF1h INTCON2 FD1h WDTCON FB1h T3CON F91h FF0h INTCON3 FD0h RCON FB0h F90h FEFh INDF0 (2) FCFh TMR1H FAFh SPBRG F8Fh FEEh POSTINC0 (2) FCEh TMR1L FAEh RCREG F8Eh FEDh POSTDEC0 (2) FCDh T1CON FADh TXREG F8Dh LATE FECh PREINC0 (2) FCCh TMR2 FACh TXSTA F8Ch LATD FEBh PLUSW0 (2) FCBh PR2 FABh RCSTA F8Bh LATC FEAh FSR0H FCAh T2CON FAAh F8Ah LATB FE9h FSR0L FC9h SSPBUF FA9h F89h LATA FE8h WREG FC8h SSPADD FA8h F88h FE7h INDF1 (2) FC7h SSPSTAT FA7h F87h FE6h POSTINC1 (2) FC6h SSPCON1 FA6h F86h FE5h POSTDEC1 (2) FC5h SSPCON2 FA5h F85h FE4h PREINC1 (2) FC4h ADRESH FA4h F84h PORTE FE3h PLUSW1 (2) FC3h ADRESL FA3h F83h PORTD FE2h FSR1H FC2h ADCON0 FA2h IPR2 F82h PORTC FE1h FSR1L FC1h ADCON1 FA1h PIR2 F81h PORTB FE0h BSR FC0h FA0h PIE2 F80h PORTA INDIREKT CÍMZÉS Indirekt címzés esetén, annak a regiszternek a címét, amelynek tartalmával a műveletet akarjuk végrehajtani, nem az utasítás tartalmazza, hanem egy regiszter, amelynek a neve FSR (File Select Register). Azért, hogy az utasításkészlet egyöntetű maradjon, bevezettek egy álregiszter jelölést, aminek a neve INDF (INDirect File register). Ha egy utasításban erre hivatkozunk, akkor valójában az FSR regiszterben lévő cím által meghatározott regiszter tartalmával végezzük a műveletet. Ez azt is jelenti, hogy ennek a regiszternek nem érdekes, hogy mi a címe, a művelet során ezt nem használjuk fel, ezért ténylegesen nem is létezik! Ezt az eredeti elgondolást a Microchip a PIC18x családjában két irányban is kib ővítette: Mivel az indirekt címzés felhasználásával könnyen tudunk folytonos adatmemória területeket címezni, ezért adatblokkok mozgatására jól használható speciális utasításokat alakított ki.
A másik hatékony megoldás az, hogy három, egymástól függetlenül használható FSR regiszter létezik: FSR0, FSR1, FSR2. A hozzájuk tartozó indirekt címregiszter: INDF0, INDF1, INDF2. A sorszámukat (hogy melyik a három közül: 0,1, vagy 2 ) a továbbiakban x -szel jelöljük. Még egyszer: indirekt címzés esetén a tényleges műveletet a 12 bites FSRx regiszterben lévő tartalom által meghatározott című regiszterrel végezzük el. Melyek azok az utasítások, amivel az indirekt címzés használatának hatékonyságát megnövelik? Az előbbiekben megismert fizikailag nem létező INDFx regiszterek lényegében csupán a művelet definiálásához szükségesek. Ha más, indirekt címzéssel kapcsolatos m űveleteket szeretnénk megvalósítani, akkor ezek is ilyen, valójában álregiszterekre történő hivatkozás szerepeltetésével definiálhatók. Minden esetben az FSRx regiszter tartalma által meghatározott cím ű regiszterrel végezzük el a műveletet, azaz FSR tartalmát használjuk címként. Magában az utasításban az FSR címét szerepeltetjük, ami a művelet végrehajtása szempontjából érdektelen. Az indirekt címet használó utasítások: INDFx [FSRx] = [FSRx] FSRx tartalma nem változik POSTINCx [FSRx] = [FSRx+1] az utasítás végrehajtása után FSRx tartalma 1-gyel nő POSTDECx [FSRx] = [FSRx-1] az utasítás végrehajtása után FSRx tartalma 1-gyel csökken PREINCx [FSRx] = [FSRx-1] az utasítás végrehajtása előtt FSRx tartalma 1-gyel csökken PLUSWx [FSRx] = [FSRx+[WREG]] az utasítás végrehajtása előtt FSRx tartalmához a WREG tartalmát adjuk hozzá Pl. ha egy utasításban a POSTINCx regisztert szerepeltetjük, akkor miután az indirekt címzéssel kiolvastuk a megcímzett regiszter tartalmát és az utasításban szerepl ő műveletet elvégezzük, akkor utána a hozzá tartozó FSRx regiszter tartalmát 1-gyel megnöveljük (inkrementáljuk). LFSR 2,0X3AB ;FSR2 TARTALMA 3ABH LESZ MOVFW POSTINC,2 ;W TARTALMA=3AB CÍMŰ REGISZTER TARTALMA, ;FSR2 TARTALMA 3ACH LESZ TBLRD * ;PROGMEM(TBLPTR) -> TABLAT MOVFF TABLAT,REGI ;TABLAT TARTALMA REGI-BE Hasonlóan az adatmemória mutatóhoz, vannak műveletek, ahol a táblamutató változtatása is automatikus: TBLRD*,TBLWT* TBLPTR tartalma nem változik TBLRD*+,TBLWT*+ TBLPTR tartalma a művelet után eggyel nő TBLRD*-,TBLWT*- TBLPTR tartalma a művelet után eggyel csökken TBLRD+*,TBLWT+* TBLPTR tartalma a művelet előtt eggyel nő. FLASH PROGRAMMEMÓRIA KEZELÉSE A PIC18XXX család igazi használhatóságát a PIC18FXX jelölés ű, flash programmemóriát tartalmazó típusok biztosítják. A flash EEPROM memóriáknál egyszerűbbek a címző áramkörök: így a memóriakezelés összefüggő, címzés szerint egymás utáni bájtok csoportjaként, más néven blokkonként történik. Mivel általában a programmemóriába a programok egyszerre kerülnek be, ez a fajta korlátozás nem okoz problémát. A PIC18FXX családnál a flash programemória olvasását (READ) bájtonként, az írását (WRITE) 8 bájtonként, és a törlését (ERASE) 64 bájtonként végezhetjük. A memória programozása táblaműveletekkel történik: a táblamutató (TBLPTR) jelöli ki a memóriam űvelet kezdőcímét. A 8, illetve 64 bájtos blokk címzés miatt, a mutató alsó 3 bitje írásnál, illetve alsó 6 bitje törlésnél nem vesz részt a címzésben. ADATOK A PROGRAMMEMÓRIÁBAN: TÁBLAKEZELÉS A program- és adatmemória közötti adatcsere egyik módja a táblázatos adatkezelés. A programmemória egybájtos memóriahelyét a TBLPTR-nek nevezett 22 bit hosszúságú regiszter tartalma címezi. Innen a megcímzett memóriabájt olvasáskor a TABLAT elnevezésű regiszterbe kerül. Íráskor a TABLAT regiszter tartalma kerül a TBLPTR által megcímzett memóriahelyre. Fizikailag a TBLPTR regiszter három regiszterből épül fel: TBLPTRU=TBLPTR[21:16] TBLPTRH=TBLPTR[15:8] TBLPTRL=TBLPTR [7:0] Programmemória címzésnél TBLPTR legfelső bitje nulla! Írásnál mivel 8 bájtos blokkokban történik kialakítottak egy bels ő rendszerpuffert (holding [=tartó] regiszterek). Először a táblaműveletekkel a TABLAT regiszteren keresztül ezekbe a regiszterekbe írjuk be a programmemóriába kerülő 8 bájtot (ez az ún. rövid írás). Ez után lehet a blokk írásműveletet elindítani. Az adatmozgatás két utasítást igényel. Olvasáskor els őnek kiolvassuk az értéket a TABLAT regiszterbe, utána az eredményt valahová tároljuk. Például:
Ilyen módon, ha a programmemória akár csak egyetlen bájtját meg akarjuk változtatni, akkor a következ ő lépéseket kell megtennünk: 1. Az adott bájtot tartalmazó 64 bájtos programmemória blokk beolvasása adatmemóriába, és ott módosítása. 2. TBLPTR feltöltése a törlendő, az előzőleg kiolvasott blokkterület kezdőcímével. 3. A terület törlése (sor=64 bájt). 4. Első 8 bájt visszaírása a pufferbe, majd fizikai írás. 5. Az előző ismétlése nyolcszor (mert 8*8=64!) A következő programrészlet az előzőkben leírtak alapján értelmezhető: ;------[FLASH PROGRAM MEMÓRIA 1 SZAVÁNAK MÓDOSÍTÁSA]----------------------- MOVLW D'64 ;64 BÁJTOS A TÖRÖLHETŐ BLOKK MOVWF COUNTER MOVLW BUFFER_ADDR_HIGH ;RAM PUFFER KEZDETEFSR0 POINTER-BE MOVWF FSR0H ; MOVLW BUFFER_ADDR_LOW ; MOVWF FSR0L ;RAM_BUFFER_ADDR 12 BITES RAM CÍM MOVLW CODE_ADDR_UPPER ;TBLPTR-BE A MÓDOSÍTANDÓ TERÜLETET TARTALMAZÓ MOVWF TBLPTRU ;64 BÁJTOS MEMÓRIATERÜLET KEZDŐCÍME -> CODE_ADDR MOVLW CODE_ADDR_HIGH MOVWF TBLPTRH MOVLW CODE_ADDR_LOW MOVWF TBLPTRL ;---------[ BLOKK (64 BÁJT) OLVASÁS MEMÓRIÁBÓL PUFFERBE ]------------------ READ_BLOCK ;PROGMEM MÁSOLÁSA RAM-BA TBLRD *+ ;ÉRTÉK TABLAT REGISZTERBE, UTÁNA INC (CÍM+1) MOVFW TABLAT ;W-N KERESZTÜL MOVWF POSTINC0 ;TÁROLÁS RAM-BA, UTÁNA INC DECFSZ COUNTER ;KÉSZ? GOTO READ_BLOCK ;NEM, ÚJRA ;---------[ A PUFFER TARTALMÁNAK A MÓDOSÍTÁSA ]----------------------------- MODIFY_WORD ; MOVLW DATA_ADDR_HIGH ;A MÓDOSÍTANDÓ ADAT (ITT CSAK 1) A DATA_ADDR MOVWF FSR0H ;CÍMEN VAN MOVLW DATA_ADDR_LOW MOVWF FSR0L ;FSR0 -> DATA_ADDR MOVLW NEW_DATA_LOW ;16 BITES ADAT (NEW_DAT) FRISSÍTÉS A PUFFERBEN MOVWF POSTINC0 MOVLW NEW_DATA_HIGH MOVWF INDF0 ;A KÉT BÁJT TÁROLVA ;---------[ BLOKK TÖRLÉSE A PROGRAM MEMÓRIÁBAN ]---------------------------- ERASE_BLOCK MOVLW CODE_ADDR_UPPER ;TBLPTR -> CODE_ADDR MOVWF TBLPTRU MOVLW CODE_ADDR_HIGH MOVWF TBLPTRH MOVLW CODE_ADDR_LOW MOVWF TBLPTRL BSF EECON1,EEPGD ;FLASH PROGRAM MEMÓRIA VÁLASZTÁS BSF EECON1,WREN ;IDE ÍRÁS ENGEDÉLYEZÉSE BSF EECON1,FREE ;SOR TÖRLÉS (Row Erase) ENGEDÉLYEZÉSE BCF INTCON,GIE ;IT TILTÁS MOVLW 55h ;EZ A SZEKVENCIA KELL A MŰVELETHEZ MOVWF EECON2 ;55H ÍRÁS MOVLW AAh MOVWF EECON2 ;AAH ÍRÁS BSF EECON1,WR ;TÖRLÉS KEZDETE(CPU VÁR) NOP BSF INTCON,GIE ;IT ÚJRA ENGEDÉLYEZÉSE TBLRD*- ;EGY TÁBLAMŰVELET KELL ;---------[ 8*8 BÁJT VISSZAÍRÁSA PUFFERBŐL MEMÓRIÁBA ]---------------------- WRITE_BUFFER_BACK MOVLW 8 ;8 DARAB 8 BÁJTOS CSOPORT, EZ A CSOPORTOK SZÁMA MOVWF COUNTER_HI ;PUFFER KEZDŐCÍME (BUFFER_ADDR) -> FSR0-BA MOVLW BUFFER_ADDR_HIGH MOVWF FSR0H MOVLW BUFFER_ADDR_LOW MOVWF FSR0L PROGRAM_LOOP MOVLW 8 ;A (HOLDING)ÍRÁSTÁROLÓ REGISZTEREKBE KELL ÍRNI MOVWF COUNTER ;ELŐSZÖR A 8 BÁJTOT ;---------[ 8 BÁJT ÍRÁSA ATARTÓ REGISZTEREKBE ]--------------------------- WRITE_WORD_TO_HREGS MOVFW POSTINC0 ; MOVWF TABLAT ;ADAT A TABLAT-BA TBLWT+* ;ÍRÁS A HOLDING REG-BE + NÖVELÉS DECFSZ COUNTER ;EZT 8-SZOR GOTO WRITE_WORD_TO_HREGS ;---------[ FLASH PROGRAM MEMÓRIA ÍRÁSA ]----------------------------------- PROGRAM_MEMORY BSF EECON1,EEPGD ;FLASH PROGRAM MEMÓRIA VÁLASZTÁS BSF EECON1,WREN ;IDE ÍRÁS ENGEDÉLYEZÉSE BCF INTCON,GIE ;IT TILTÁS MOVLW 55h ;EZ A SZEKVENCIA KELL A MŰVELETHEZ MOVWF EECON2 ;55H ÍRÁS MOVLW AAh MOVWF EECON2 ;AAH ÍRÁS BSF EECON1,WR ;TÖRLÉS KEZDETE(CPU VÁR) NOP BSF INTCON,GIE ;IT ÚJRA ENGEDÉLYEZÉSE DECFSZ COUNTER_HI ;8 BLOKKOT KELL ÍRNI GOTO PROGRAM_LOOP ;KÖVETKEZŐ 8-AS BLOKK ÍRÁSA BCF EECON1,WREN ;ÍRÁS TILTÁSA ADAT EEPROM MEMÓRIA A kikapcsolás után is megőrzendő adatok tárolására belső 8 bites EEPROM memória szolgál. A memória kezelése, azaz írása és olvasása négy regiszter segítségével történik. Ezek a memóriaműveletek vezérlésére szolgáló EECON1, EECON2, a memória megcímzését végző EEADR és az írt vagy olvasott adatot tartalmazó EEDATA regiszterek. A későbbiekben az adat EEPROM memóriakezelését még áttekintjük. VEREMKEZELÉS A verem a szubrutinhíváskor (CALL) vagy a megszakításkor elmentett 21 bites memóriacímet tárolja: összesen 31 ilyen címet tud tárolni. PCU PCH PCL TOSU TOSH TOSL 31 x 21 BITES VEREM CALL,RCALL,PUSH,INT PCU PCH PCL TOSU TOSH TOSL 31 x 21 BITES VEREM RETURN,RETFIE,RETLW TOS=Top Of Stack - VEREM TETEJÉT JELÖLŐ MUTATÓ PCU PCH PCL TOSU TOSH TOSL 31 x 21 BITES VEREM Lényegében a verem egy 31 rekeszből álló 21 bit széles RAM, amelyben az aktuális rekesz címét egy 5 bites veremmutató (STKPTR) tartalma határozza meg. A veremmutató kezdeti értéke RESET után 00000b. Ehhez az értekhez verem rekesz nem tartozik! Az első szubrutinhívás, vagy megszakításkérés során STKPTR értéke 1-gyel nő, és a 00001b című memóriahelyre kerül a visszatérési cím. Azt mondjuk, hogy a verem tetejére belenyomtuk (angolul PUSH) a visszatérési címet. A rutin vagy megszakítás végén álló RETURN típusú utasítás az STKPTR által meghatározott veremcímről annak tartalmát az utasításszámlálóba tölti vissza. Kiemeli a veremből (angolul: POP). Az ábrán felsoroltuk azokat az utasításokat, amelyek a veremmutatót módosítják. Ebben a PC és TOS regiszterek vesznek részt. A POP utasítással csupán a veremmutatót módosítjuk. A verem tetején lévő rekesz, amire a veremmutató mutat a TOS (=Top Of Stack -a verem teteje). Ide helyeztünk el utoljára tartalmat, közvetlenül írható és olvasható három SFR regiszter segítségével, ezek: TOSU, TOSH, TOSL. Mivel ez hozzáférhető programból is, ezért a verem tetején lévő cím megváltoztatható. Például egy másik visszatérési címet írva a verem tetejére (a TOS regiszterbe), a RETURN hatására ez fog betöltődni a PC-be, és erről a címről fog folytatódni a program végrehajtása. FONTOS! Mivel a megszakítás is használja a vermet, ezért, ha a programunkban veremműveleteket végzünk, a megszakításokat le kell tiltani! POP
A veremmutató értéke a verembe történő írás előtt 1-gyel növekszik, és az így kijelölt helyre íródik be az érték. A veremből történő kiolvasáskor, a veremmutató által mutatott helyről olvassuk ki annak a tartalmát, majd utána a veremmutató értéke 1-gyel csökken. A veremkezeléssel kapcsolatosan két alapvető hiba jöhet létre: overflow = a verem túlcsordulása. A verem megtelik, azaz a veremmutató eléri az 11111b értéket, és újabb címet akarunk a verembe helyezni (PUSH). Ilyenkor az ezt jelz ő STKFUL bit értéke 1 lesz, az új cím felülírja a 31. helyen lév ő értéket, és a STKPTR értéke változatlanul 11111b marad. A következő PUSH hatása ugyanez lesz. underflow =a verem alulcsordulása. Akkor következik, be, ha az üres veremből (STRKPTR=00000b) akarunk kiolvasni a PC-be. Ilyenkor a STKPTR értéke változatlanul nulla marad, a PC-be a nulla cím (RESET) töltődik, és az eseményt jelző STKUNF bit értéke 1 lesz. Ez a hibajelzés lehetővé teszi, hogy a hibás programműködésből adódó veremcsordulásokat programból tudjuk kezelni, ha szükséges! Mivel a veremmutató (STKPTR), illetve a verem teteje TOS regiszterek tartalma elérhető, és programból módosítható (PUSH és POP műveletek), ezért a veremmanipulációk trükkös programok írására adnak lehetőséget.. GYORS REGISZTERMENTÉS A processzor egymás után képes különféle feladatokat GYORS elvégezni, akár egy szubrutin SFR MEGSZAKÍTÁS REGISZTER végrehajtásával, akár RAM egy külső vagy belső esemény okozta CALL SUBROUTINE, FAST VEREM megszakítás kiszolgálásával. Egy ilyen feladatváltás előtt meg kell őrizni a program WREG WREG állapotának jellemzőit, majd az új STATUS STATUS feladat végrehajtása után ismét folytatni kell az előzőleg BSR BSR végrehajtott feladatot, természetesen visszaállítva jellemzőit. RETI Ezen jellemzők közül a RETURN, FAST legfontosabb az a cím, hogy hol kell folytatni a félbehagyott programot. Ezt az ún. visszatérési címet a vezérlőegység automatikusan a verembe menti, majd visszatölti. A program állapotát meghatározó többi regiszternek a mentéséről, majd visszatöltéséről a programozónak kell gondoskodnia, ilyen adminisztratív feladatokra pazarolva az értékes processzorid őt. A PIC18-as családnál lehetővé tették a gyors regisztermentés kialakításával a STATUS, WREG, és a BSR regiszterek automatikus mentését, illetve automatikus visszatöltését. Ez a verem csupán egy ilyen regiszterhármas mentésére alkalmas, programból nem írható és nem olvasható. Megszakításkor a regiszterek értéke minden esetben elmentésre kerül, és a megszakítás végén -amikor a visszatérési cím a veremből a PC-be töltődik -a regiszterhármasba is a megszakítás elején elmentett érték töltődik vissza -ha ezt engedélyezzük (ez a RETFIE FAST utasítással lehetséges)! Ha nem használunk megszakítást (vagy egy szubrutin végrehajtása alatt letiltjuk), akkor szubrutin hívásakor is felhasználhatjuk ezt a mentési-visszaállítási tulajdonságot. A CALL utasítás 1 bitje határozza meg, hogy használjuk a gyors regisztermentést vagy nem. Ha mind az alacsony, mind a magas prioritású megszakítást használjuk, akkor az alacsony szint ű megszakításnál nem célszerű ezt a gyors regisztermentést használni. Fontos! A gyors regisztermentés megszakításkor automatikus! A visszatöltésről dönthetünk. Szubrutin hívása esetén is használhatjuk. AZ UTASÍTÁSOK TÍPUSAI ÉS FELÉPÍTÉSE Az utasításkészlet a már bemutatott 16XXX család utasításkészletének átgondolt kib ővítése. Az utasításkészlet négy csoportba sorolható: Bájtokra vonatkozó utasítások Ezeknek három operandusa van: f a fájlregiszter 8 bites címe, d a m űvelet eredményének a helye (d=0 WREG, d=1 fájlregiszter), a az adatmemória elérésének a módja (a=0 access ram, a=1 BSR által megcímzett bank). Biteket kezelő utasítások Ezeknek is három operandusa van: f a fájlregiszter, b a regiszter adott sorszámú bitje, a a regisztert tartalmazó adatmemória elérésének a módja. Konstanst (literalt) tartalmazó utasítások Itt a két használt operandus: k a literal, f a fájlregiszter. Vezérlő utasítások Operandusok: n a program memória címe, s a CALL és RETURN utasítások használják-e a gyors regiszter mentést, m a tábla olvasás/írás elérésének a módja. Minden utasítás egyszavas, kivéve négy kétszavas utasítást: ezek közül a GOTO és CALL a teljes memóriatartományt címzi (20 bites szavas cím!), míg a MOVFF utasítással két 12 bites című fájlregiszter közötti adatcsere valósítható meg, és az LFSR utasítással az FSRx regisztert töltjük fel 12 bites állandóval. A kétszavas utasítások második szava NOP-ként értelmez ődik, ha nem az első utasításszó folytatásaként hajtanánk végre. Az utasítások egy utasításciklus (négy órajel) alatt hajtódnak végre, kivéve az ugró, feltételeket tartalmazó elágazó utasításokat, amelyek végrehajtása két illetve három utasításciklust igényelhet, a feltétel teljesülésétől függően. UTASÍTÁSBAN SZÓ CÍM SZEREPEL! MOVLW 55h GOTO 000006h MOVFF 123h, 456h UTASÍTÁSOK ELHELYEZKEDÉSE A PROGRAM MEMÓRIÁBAN Felső bájt Alsó bájt Bájt cím 000000h 000002h 000004h 000006h 0Fh 55h 000008h EFh 03h 00000Ah F0h C1h F4h GOTO, MOVFF KÉTSZAVAS UTASÍTÁS 00h 23h 56h 00000Ch 00000Eh 000010h 000012h 000014h Az utasítások karakteres alakja (mnemonikja) könnyen megjegyezhető: általában az első rész az utasítás tevékenységére utaló angol ige, utána következnek az operandusok honnan-hova alakban. Például a MOVLW 55H utasítás az 55H literált (konstanst) a W regiszterbe tölti. Az utasítások bájtok formájában az ábrán látható módon helyezkednek el a programmemóriában. Látható, hogy a 16 bites utasításhossz és a memória bájtos szervezése miatt az ugró utasítások címrészében mindig utasításszó cím szerepel, ami mindig pontosan a fele az utasítás fels ő bájtjára mutató memória bájt címnek. Azok az utasítások, amelyek a fájlregisztereket használják a művelet végzéséhez (Byte oriented file register operations), tartalmazzák a regiszter operandus 8 bites címét: a d bit jelöli, hogy az eredmény a W regiszterbe, vagy a regiszterbe kerüljön. Az a bit értéke határozza meg, hogy a regiszter tényleges fizikai címét az access bank, vagy a BSR regiszter tartalma határozza-e meg. Byte-oriented File Register operations 15 10 9 8 7 0 OPCODE d a f(file#) ADDWF MYREG, W, B d = 0 for result destination to be WREG Register d = 1 for result destination to be File Register (f) a = 0 to force Access Bank a = 1 for BSR to select bank f = 8-bit File Register address Két tetszőleges fájlregiszter közötti adatcsere esetén, azok 12 bites címe miatt ez az utasítás két utasításszót igényel. A második utasításszó önmagában végrehajtva NOP utasításként értelmez ődik. Byte to Byte move operations (2-word) 15 12 11 0 OPCODE f (Source FILE #) MOVFF MYREG1, MYREG2 15 12 11 0
1111 f (Destination FILE #) f = 12-bit File Register address A PIC mikrovezérlők igen kellemes tulajdonsága, hogy minden regisztere bit címezhető. Ezért az ilyen utasítások címrésze két részből áll: 8 bit határozza meg a regiszter címét, az a bit alapján határozható meg a fizikai cím, és 3 bit jelöli ki a bitcímet a bájton belül. Újdonság a BTG (bit toggle = bit váltó) utasítás, amely a kijelölt bitet ellentétére változtatja. Bit-oriented File Register operations 15 12 11 9 8 7 0 OPCODE b (BIT #) a f(file#) BSF MYREG, bit b = 3-bit position of bit in File Register (f) a = 0 to force Access Bank a = 1 for BSR to select bank f = 8-bit File Register address Állandót (konstanst) vagy a Microchip szóhasználata szerint literalt tartalmazó utasítások alsó 8 bitje az állandó, a felső 8 bit a műveleti kód. Literal operations 15 8 7 0 OPCODE k (literal) MOVLW 0x7F k = 8-bit immediate value Vezérlésátadó utasításoknál az utasításban kell elhelyezni azt a címet, ahol a végrehajtás után a program folytatódik. A Microchip ennek megvalósítására több megoldást alkalmazott. A CALL és GOTO utasítások a teljes 20 bites memóriaszó-tartományban használhatók. Emiatt két utasításszót igényel a kódolásuk. Itt is igaz, hogy a második utasításszó utasításkód-része önmagában végrehajtva NOP utasításként értelmeződik. A RCALL, BRA utasítással a memóriaszó tartomány 10 bit + előjelbit címtartományba eső része érhető el. A tényleges cím úgy képződik, hogy a PC-hez hozzáadódik a 11 bites kettes komplemens formában ábrázolt szám. Vagyis az utasítás helyétől számított (-1024;1023) tartományban kell lennie a célcímnek. A BC utasítással a memóriaszó tartomány 7 bit + előjelbit címtartományba eső része érhető el. A tényleges cím úgy képződik, hogy a PC-hez hozzáadódik a 8 bites kettes komplemens formában ábrázolt szám. Vagyis az utasítás helyétől számított (-128;127) tartományban kell lennie a célcímnek. CALL, GOTO and Branch operations 15 8 7 0 OPCODE n<7:0> (literal) GOTO Label 15 12 11 0 1111 n<19:8> (literal) n = 20-bit immediate value 15 9 8 7 0 OPCODE S n<7:0> (literal) CALL MYFUNC S = fast bit 15 12 11 0 n<19:8> (literal) 15 11 10 0 OPCODE n<10:0> (literal) BRA MYFUNC RCALL MYFUNC 15 8 7 0 OPCODE n<7:0> (literal) BC MYFUNC A következő táblázatok az utasításkészletet foglalják össze, az el őbb ismertetettek szerint. BYTE-ORIENTED FILE REGISTER OPERATIONS Mnemonic, 16-Bit Instruction Word Status Description Cycles operands MSb LSb Affected Notes ADDWF f,d,a Add WREG and f 1 0010 01da ffff ffff C,DC,Z,OV,N 1,2 ADDWFC f,d,a Add WREG and Carry bit to f 1 0010 00da ffff ffff C,DC,Z,OV,N 1,2 ANDWF f,d,a AND WREG with f 1 0001 01da ffff ffff Z,N 1,2 CLRF f,a Clear f 1 0110 101a ffff ffff Z 2 COMF f,d,a Complement f 1 0001 11da ffff ffff Z,N 1,2 CPFSEQ f,a Compare f with WREG, skip = 1 (2 or 3) 0110 001a ffff ffff None 4 CPFSGT f,a Compare f with WREG, skip > 1 (2 or 3) 0110 010a ffff ffff None 4 CPFSLT f,a Compare f with WREG, skip < 1 (2 or 3) 0110 000a ffff ffff None 1,2 DECF f,d,a Decrement f 1 0000 01da ffff ffff C,DC,Z,OV,N 1,2,3,4 LITERAL OPERATIONS DECFSZ f,d,a Decrement f, skip if 0 1 (2 or 3) 0010 11da ffff ffff None 1,2,3,4 DCFSNZ f,d,a Decrement f, skip if not 0 1 (2 or 3) 0100 11da ffff ffff None 1,2 INCF f,d,a Increment f 1 0010 10da ffff ffff C,DC,Z,OV,N 1,2,3,4 INCFSZ f,d,a Increment f, skip if 0 1 (2 or 3) 0011 11da ffff ffff None 4 INFSNZ f,d,a Increment f, skip if not 0 1 (2 or 3) 0100 10da ffff ffff None 1,2 IORWF f,d,a Inclusive OR WREG with f 1 0001 00da ffff ffff Z,N 1,2 MOVF f,d,a Move f 1 0101 00da ffff ffff Z,N 1 MOVFF fs,fd Move fs (source) to 1 st word 2 1100 ffff ffff ffff None fd (destination) 2 nd word 1111 ffff ffff ffff MOVWF f,a Move WREG to f 1 0110 111a ffff ffff None MULWF f,a Multiply WREG with f 1 0000 001a ffff ffff None NEGF f,a Negate f 1 0110 110a ffff ffff C,DC,Z,OV,N 1,2 RLCF f,d,a Rotate left f through carry 1 0011 01da ffff ffff C,Z,N RLNCF f,d,a Rotate left f (no carry) 1 0100 01da ffff ffff Z,N 1,2 RRCF f,d,a Rotate right f through carry 1 0011 00da ffff ffff C,Z,N RRNCF f,d,a Rotate right f (no carry) 1 0100 00da ffff ffff Z,N SETF f,a Set f 1 0110 100a ffff ffff None SUBFWB f,d,a Subtract f from WREG with borrow 1 0101 01da ffff ffff C,DC,Z,OV,N 1,2 SUBWF f,d,a Subtract WREG from f 1 0101 11da ffff ffff C,DC,Z,OV,N SUBWFB f,d,a Subtract WREG from f with borrow 1 0101 10da ffff ffff C,DC,Z,OV,N 1,2 SWAPF f,d,a Swap nibbles in f 1 0011 10da ffff ffff None 4 TSTFSZ f,a Test f, skip if 0 1 (2 or 3) 0110 011a ffff ffff None 1,2 XORWF f,d,a Exclusive OR WREG with f 1 0001 10da ffff ffff Z,N Mnemonic, 16-Bit Instruction Word Status Description Cycles operands MSb LSb Affected ADDLW k Add literal and WREG 1 0000 1111 kkkk kkkk C,DC,Z,OV,N ANDLW k AND literal with WREG 1 0000 1011 kkkk kkkk Z,N IORLW k Inclusive OR literal with WREG 1 0000 1001 kkkk kkkk Z,N LFSR f,k Move literal (12-bit) 2 nd word 2 1110 1110 00ff kkkk None to FSRx 1 st word 1111 0000 kkkk kkkk MOVLB k Move literal to BSR <3:0> 1 0000 0001 0000 kkkk None MOVLW k Move literal to WREG 1 0000 1110 kkkk kkkk None MULLW k Multiply literal with WREG 1 0000 1101 kkkk kkkk None RETLW k Return with literal in WREG 2 0000 1100 kkkk kkkk None SUBLW k Subtract WREG from literal 1 0000 1000 kkkk kkkk C,DC,Z,OV,N XORLW k Exclusive OR literal with WREG 1 0000 1010 kkkk kkkk Z,N DATA MEMORY PROGRAM MEMORY OPERATIONS CONTROL OPERATIONS Mnemonic, 16-Bit Instruction Word Status Description Cycles operands MSb LSb Affected TBLRD* Table Read 2 0000 0000 0000 1000 None TBLRD*+ Table Read with post-increment 0000 0000 0000 1001 None TBLRD*- Table Read with post-decrement 0000 0000 0000 1010 None TBLRD+* Table Read with pre-increment 0000 0000 0000 1011 None TBLWT* Table Write 2(5) 0000 0000 0000 1100 None TBLWT*+ Table Write with post-increment 0000 0000 0000 1101 None TBLWT*- Table Write with post-decrement 0000 0000 0000 1110 None TBLWT+* Table Write with pre-increment 0000 0000 0000 1111 None Mnemonic, 16-Bit Instruction Word Status Description Cycles operands MSb LSb Affected BC n Branch if Carry 1(2) 1110 0010 nnnn nnnn None BN n Branch if Negative 1(2) 1110 0110 nnnn nnnn None BNC n Branch if Not Carry 1(2) 1110 0011 nnnn nnnn None BNN n Branch if Not Negative 1(2) 1110 0111 nnnn nnnn None BNOV n Branch if Not Overflow 1(2) 1110 0101 nnnn nnnn None BNZ n Branch if Not Zero 2 1110 0001 nnnn nnnn None BOV n Branch if Overflow 1(2) 1110 0100 nnnn nnnn None BRA n Branch Unconditionally 1(2) 1101 0nnn nnnn nnnn None BZ n Branch if Zero 1(2) 1110 0000 nnnn nnnn None CALL n,s Call subroutine 1 st word 2 1110 110s kkkk kkkk None 2 nd word 1111 kkkk kkkk kkkk CLRWDT Celar Watchdog Timer 1 0000 0000 0000 0100 TO, PD DAW Decimal Adjust WREG 1 0000 0000 0000 0111 C GOTO n Go to address 1 st word 2 1110 1111 kkkk kkkk None 2md word 1111 kkkk kkkk kkkk NOP No Operation 1 0000 0000 0000 0000 None NOP No Operation (note 4) 1 1111 xxxx xxxx xxxx None POP Pop top of return stack (TOS) 1 0000 0000 0000 0110 None PUSH Push top of return stack (TOS) 1 0000 0000 0000 0101 None RCALL n Relative call 2 1101 lnnn nnnn nnnn None RESET Software device reset 1 0000 0000 1111 1111 All RETFIE s Return from interrupt enable 2 0000 0000 0001 000s GIE/GIEH PEIE/GIEL RETLW k Return with literal in WREG 2 0000 1100 kkkk kkkk None RETURN s Return from subroutine 2 0000 0000 0001 001s None SLEEP Go into standby mode 1 0000 0000 0000 0011 TO, PD A táblázatokhoz tartozó megjegyzések:
1. Ha egy I/O regiszterre önmagát módosító utasítást alkalmazunk (pl. MOVF PORTC,1,0, akkor a lábakon lév ő érték kerül a lábra. Ha egy lábhoz tartozó tárolóba (latch-be) 1 van, de a láb bemenetnek van konfigurálva, és a külső áramkör ezt 0-ba húzza le, akkor 0 lesz a latch-be írva. 2. Ha az utasítást a TMR0 regiszterrel hajtjuk végre, akkor a hozzárendelt el őosztó törlődik. 3. Ha PC-t módosítja az utasítás, vagy a feltételes teszt eredménye igaz, akkor az utasítás végrehajtása két ciklust igényel. A második ciklus NOP-ként hajtódik végre. 4. Néhány utasítás kétszavas. Az ilyen utasítások második szava NOP-ként hajtódik végre, ha nem az első utasításszó végrehajtása előzte meg (pl. valahonnan ráugrunk). Így minden memóriahelyen érvényes utasítás van. 5. Ha a táblaírás (Table Write) megkezdi az írást a belső memóriába, az írás annak végéig fog tartani. OSZCILLÁTOR ÁTKAPCSOLÁS A PIC18-as eszközökben lehetséges a fő általában nagyfrekvenciájú órajel-forrás és egy kisfrekvenciás, a TMR1 időzítőhöz tartozó oszcillátor közötti átkapcsolás. Ennek alkalmazásával a tokok fogyasztása csökkenthet ő. Ha az alacsony, maximum 200kHz-es oszcillátort is használjuk, akkor lehetséges a rendszer-órajel forrásának az átkapcsolása programból. Az SCS (OSCCON<0>) System Clock Switch, rendszer órajel kapcsoló bit vezérli az órajel átkapcsolást. Ha ez a bit 0 értékű, akkor a tok konfigurálásakor beállított fő oszcillátor lesz a rendszer órajel forrása. Ha SCS=1, akkor a TMR1 modul oszcillátora lesz a rendszer órajel forrása. Fontos! RESET -kor az SCS bit értéke mindig 0 lesz! Ha a TMR1 oszcillátor működését nem engedélyeztük az átkapcsolást megel őzően, akkor az SCS bitet nem tudjuk átállítani. Ez biztosítja, hogy a programból órajel hiányában ne tudjuk leállítani a mikrovezérl őt. MEGSZAKÍTÁSOK A PIC18xxx család számos megszakítási lehetőséggel rendelkezik. Mivel két eltérő prioritású megszakítási vektor van, ezért a minden megszakításhoz az eddigi, az adott megszakítást egyedileg engedélyez ő IE (interrupt enable), és a megszakításhoz tartozó esemény bekövetkezését jelz ő IF (interrupt flag) bitek mellé egy újabb bit társult. Ez a megszakítás prioritását jelző IP (interrupt priority) bit. A megszakítások prioritásos kezelése csupán lehetőség, ha nem alkalmazzuk, akkor bármelyik megszakításkor a 0008h cím töltődik be az utasításszámlálóba. A prioritásos megszakításrendszer alkalmazásakor minden megszakításhoz a két prioritási szint valamelyikét rendeljük hozzá. Az alacsonyabb prioritású megszakítás bekövetkeztekor a 0018h cím íródik be az utasításmutatóba, míg a magasabb prioritású megszakítások bekövetkezésekor a 0008h cím töltődik. Úgy is fogalmazhatunk, hogy az IP bit értéke határozza meg azt, hogy melyik cím tölt ődik be az utasítás számlálóba. Hogy működik a prioritásos megszakítási rendszer? Ha egy alacsonyabb szintű megszakítás kiszolgálása közben egy magasabb prioritású megszakítás következik be, akkor az alacsonyabb szintű megszakítás kiszolgálása felfüggesztődik, és a magasabb szinten lévő kerül végrehajtásra. Ennek befejeződése után a felfüggesztett alacsonyabb szintű megszakítás kiszolgálása folytatódik. Azonos szinten lévő megszakítások egymást nem szakítják meg. A prioritásos megszakításrendszert az RCON<7> (IPEN) 1 értéke engedélyezi. Ilyenkor két globális prioritás engedélyező/tiltó bit működik. A GIEH - INTCON<7> a magasabb szintű prioritással rendelkező megszakítások közös engedélyezését/tiltását végzi, míg ugyanezt a feladatot alacsonyabb prioritású megszakításoknál GIEL - INTCON<6> bit látja el. Ha nem engedélyezzük a prioritásos megszakítási rendszert (IPEN=0), akkor GIE -INTCON<7> lesz a globális, és PEIE -INTCON<6> lesz a perifériákhoz tartozó megszakítások engedélyező bitje. Megszakítás kiszolgálásakor a GIE bit (illetve ha a prioritás be van kapcsolva, akkor a GIEH, vagy a GIEL bit) automatikusan nullára áll, tiltva az esetleg aktivizált megjelen ő többi (azonos szintű) megszakítás érvényre jutását. Ezek után a megszakítási rutin elején kell az egyedi IR bitek vizsgálatával meghatározni a megszakítást kiváltó eseményt. A megszakítás kiszolgálásának kezdetén végrehajtódik a gyors regisztermentés. A WREG, a STATUS és a BREG regiszterek tartalma elmentésre kerül a WREGS, a STATUSS és a BREGS árnyékregiszter hármasba. Vigyázat! Prioritásos megszakítás-rendszerben egy alacsonyabb szintű megszakítást egy magasabb szintű megszakíthat; ilyenkor a mentett értékek felülíródnak! Hasonlóan vigyázni kell, mert a gyors regisztermentés szubrutin híváshoz is hozzákapcsolható, és egy esetleg bekövetkező megszakítás ezeket a szubrutin elején mentett értékeket felülírja. A megszakítási rutin végén elhelyezett RETFIE vagy RETURN utasítás s paramétere határozza meg, hogy a gyors regiszter mentéssel elmentett regiszter értékek visszatöltődjenek-e a helyükre. s=0 esetén a gyorsvermet nem használjuk. Fontos! A gyors regiszter mentés megszakításkor automatikus! A visszatöltésről dönthetünk! KONFIGURÁCIÓS BITEK A tokba beírható ID kódot és a konfigurációs biteket tartalmazó konfigurációs regiszterek a programmemória részét képezik, programból a TBLPTR táblamutató regiszterbe írt 22 bites cím segítségével érhet ők el. Ilyenkor a cím legmagasabb helyiértékü bitje 1. A 2xxxxx és 3xxxxx című regiszterek programból csak táblázat írás/olvasás műveletekkel érhetők el, illetve a tokot programozó eszköz felhasználásával. A USERID1...USERID5 (címük: 200000h-200004h) azonosítójú regiszterek szolgálnak a felhasználói információ tárolására. Ide pl. sorozatszám, ellenőrző kód, vagy időpont írható. A regiszterek egy része a gyári adatokat (tok típusa, revíziója) tartalmazza (DEVID1-2). Ezek csak olvasható regiszterek. A 300000h regiszter a CONFIG1L, amely a RESET-kori brown-out működést beállító bitjeit tartalmazza. A 300001h címen lévö párja, a CONFIG1H bitjeihez az oszcillátortípus beállítások tartoznak. A további konfigurációs regiszterek (ami típusfüggő lehet!) vázlatos felosztása: NÉV CÍM TARTALOM CONFIG2H 300003H Watchdog paraméterek CONFIG2L 300002H BROWN-OUT paraméterek CONFIG3H 300005H CCP2 paraméterek CONFIG4L 300006H Veremkezelés paraméterek CONFIG5-6-7 300008H-tól Kódvédelmi bitek DEVICE ID 3FFFFE-3FFFFFH 11 BIT ID + 5 BIT REVISION KÓD- ÉS ADATVÉDELEM A kódvédelmet a blokkokra felosztott programmemóriára alkalmazhatjuk. Ezen (általában 8 Kbájt méret ű) blokkok közül méreténél és helyzeténél fogva eltér a külön elnevezett, nullás címen kezd ődő, 512 bájtos boot (=betöltő) blokk. Amint a neve is utal rá, itt célszerű elhelyezni a memóriatartalom programból történő módosítását lehetővé tévő, betöltő programot. A blokkok mellett külön kódvédelmi bitek szabályozzák a belső adat EEPROM, és konfigurációs memória terület elérhetőségét. Mivel a program memóriaprogramból, táblam űveletekkel módosítható, ezért a kódvédelmet nem csak a külső elérést lehetővé tévő programozó berendezéssel történő beavatkozásra, hanem a táblam űveletekre is ki kellett terjeszteni. MEMORY SIZE / DEVICE 64 Kbytes (PIC 18FX620) Boot Block 128 Kbytes (PIC 18FX720) Boot Block Block 0 Block 0 Block 1 Block 1 Block 2 Block 2 Block 3 Block 3 Unimplemented Read 0s Block 4 Block 5 Block 6 Block 7 Address Range 000000h 0001FFh 000200h 003FFFh 004000h 007FFFh 00800h 00BFFFh 00C000h 00FFFFh 010000h 013FFFh 014000h 017FFFh 018000h 01BFFFh 01C000h 01FFFFh Block Code Protection Controlled By: CPB, WRTB, EBTRB CP0, WRT0, EBTR0 CP1, WRT1, EBTR1 CP2, WRT2, EBTR2 CP3, WRT3, EBTR3 CP4, WRT4, EBTR4 CP5, WRT5, EBTR5 CP6, WRT6, EBTR6 CP7, WRT7, EBTR7 Ezért a területek védelme a területhez rendelt három védelmi bit segítségével valósul meg: CP (Code Protect) bit: ha 0, akkor a terület külső programozó berendezéssel nem írható/olvasható. WRT (WRTe) bit: ha 0, akkor a terület tábla írás művelettel nem változtatható meg, de korlátlanul olvasható. EBTR (External Block Table Read) ha 0, akkor az adott területről (blokkból) kiadott tábla olvasó utasítás végrehajtható, míg más blokkból kiadott hasonló m űvelet nem, ilyenkor 0 kerül a TABLAT regiszterbe. A kódvédelmi bitek csak az eredeti 1 állapotukról 0-ra írhatók át. A kódvédelmi bitek 1-re állítása csak a teljes tok, illetve az adott blokk törlésével lehetséges, programozó berendezés vagy az ICSP (In-Circuit Serial Programming) alkalmazásával. A belső adat EEPROM kódvédelmét a CPD és WRTD bitek végzik. A konfiguráció memória védelmét a külső programozással beállítható, és utána csak olvasható WRTC bit