WebElektronika

A PIC18F mikrovezérlő programozása I.

person access_time 2013.12.23.
A PIC18F mikrovezérlők ma is népszerű a fejlesztők körében. Noha 8 bites architektúráról beszélünk, számos érdekes és hasznos alkalmazás megvalósítható vele. Elég csak az USB-re, vagy akár az Ethernetre gondolnunk. Ezért a Szerkesztőség egy sorozat keretén belül mutatja be -inkább példaprogramok segítségével- a PIC18F14K50-es mikrovezérlő használatát.


Nem véletlenül választottuk ezt a PIC18F családtagot, a PIC18F14K50-et. A Microchip 20 lábú DIP tokozással hozza forgalomba, ezáltal könnyebben tudunk házi körülmények között is tesztpanelt készíteni. Szerkesztőségünk elkészített egy alaptesztpanelt, amely egy másik cikkben kerül bemutatásra, de természetesen számos helyről szerezhetünk be profi fejlesztőpaneleket is.

A PIC18F14K50 a szokásos belső perifériákat tartalmazza, megtaláljuk benne az AD átalakítót, a különböző időzítőket/számlálókat (TIMER1,2,3,4), stb. De ezeken kívül a PIC18F-es mikrovezérlő tartalmaz még egy "USB"-t is. Ennek a modulnak a használatával kényelmesen alakíthatunk ki különböző USB-s alkalmazásokat, de ezekről egy külön cikksorozatot fog a WebElektronika közölni.

Nézzük most tehát meg azt, hogy a PIC18-as család tagjait milyen (könnyen elérhető) eszközökkel tudjuk programozni.
 

Programozókészülékek

Ilyen lehet például a PICKIT2, PICKIT3, IDC2 vagy akár az ICD3, de kapható más programozókészülék is. De vajon van más lehetőségünk is a fejlesztésre, ha nincs programozókészülékünk? Természetesen igen, és ezt a lehetőséget nevezzük "Bootloader"-nek. Ennek a cikknek az a feladata, hogy ezt a módszert bemutassa.
 

Bootloader

Ha bootloader-t használunk, akkor nem kell igénybe vennünk programozókészüléket. Illetve..... Na igen, egyszer igen, amikor egy programrészletet elhelyezünk a PIC mikrovezérlő programmemóriájába. Nézzük meg az USB-s bootloader használatát.

Noha a cél az, hogy ne használjunk programozókészüléket, felmerül egy gond. Hogyan tud kommunikálni a számítógépünk a felprogramozás során a mikrovezérlővel? Csak úgy, ha a mikrovezérlőnket erre a feladatra "felkészítjük". Erre szolgál egy speciális program, amelyet "bootloader"-nek nevezünk. Ezt a programrészletet (amelyet nem nekünk kell megírni, hanem a Microchip oldaláról tudunk letölteni) kell nekünk egy programozókészülékkel (pl.: PicKit2) betölteni a mikrovezérlő programmemóriájába. Ennek a mérete kb 800 - 1K. Tehát ennyi byte-ot foglalunk le a mikrovezérlőnk programmemóriájából.
Na de mi történik a speciális memóriacímekkel, például a resetvektorral (0H) vagy az IT vektorokkal (8H, 18H)?

Tekintettel arra, hogy a bootloader a programmemória elején foglal helyet, ezért ezek a speciális címek (0H, 8H, 18H) "elfedésre" kerülnek a bootloader miatt. A megoldás az, hogy a botloader méretével "eltoljuk" ezeket a címeket. Ha a bootloader-ünk mérete 1K, akkor az új sepciális címek a következők lesznek : 1000H, 1008, 1018H.

És most nézzük meg a részleteket, vizsgáljuk meg a konkrét fejlesztés menetét.

A bootloader innen tölthető le, amelyet be kell programoznunk a PIC18F14K50-es (vagy bármely 18F család) mikrovezérlőbe.

Ezután nincs más dolgunk, mint a következő programrészletet kell a main() függvényünk elé tenni.

#define PROGRAMMABLE_WITH_USB_HID_BOOTLOADER
#define REMAPPED_RESET_VECTOR_ADDRESS            0x1000
#define REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS    0x1008
#define REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS    0x1018
    
extern void _startup (void);        // See c018i.c in your C18 compiler dir
#pragma code REMAPPED_RESET_VECTOR = REMAPPED_RESET_VECTOR_ADDRESS
void _reset (void)
{
    _asm goto _startup _endasm
}

 

Ezzel még nem oldottuk meg a feladatunkat, kell még az adott mikrovezérlőnek a speciális linker file-ja (pl.: rm18f14k50.lkr). Az "rm" részlet utal a bootloader-re.

A programozásról szóló cikksorozatunk következő részében egy konkrét példát nézünk meg a bootloader használatáról.