A PIC24H kísérleti áramkör

A fejezet tartalma:

Fontos tudnivalók

Kísérleteinkhez szükségünk lesz egy mikrovezérlővel ellátott áramkörre, hogy programjainkat kiróbálhassuk. Többféle lehetőség közül választhatunk: gyári fejlesztői kártyát vehetünk, vagy építhetünk magunknak, esetleg egyszerűen, egy dugaszolós próbapanelon dobjuk össze az alkalmi kapcsolást. Mielőtt a lehetőségeket sorba vennénk, feltétlenül olvassuk el a PIC24H mikrovezérlők kezelésével kapcsolatos alábbi tudnivalókat!

Az alábbiakban ismertetett PIC-kwik kísérleti áramkörben a 28 lábú PIC24HJ128GP502-I/SP mikrovezérlőt fogjuk használni, melynek lábkiosztását az 1. ábra mutatja. Amint látjuk, szinte mindegyik kivezetés több funkció ellátására szolgál - természetesen nem egyidejűleg. A minimális működés biztosításához az ábrán színezéssel megjelölt lábakat kell bekötni. Ezek közül az MCLR (Master CLeaR)  az úgynevezett RESET bemenet, melynek alacsony szintre helyezése alaphelyzetbe viszi a mikrovezérlőt. A normális működéshez ezt a bemenetet magas szintre kell felhúzni (például egy 10 kOhmos ellenállással). A VSS bemeneteket a közös pontra (GND) kell kötni, a VDD bemeneteket pedig a tápfeszültségre, ami ennél a mikrovezérlőnél tipikusan 3,3 V.  A mikrovezérlő magja azonban ennél kisebb feszültségen, 2,5 V-on működik. Ezt a tápfeszültséget a mikrovezérlőbe integrált feszültségstabilizátor állítja elő, de a VCAP kimenete és a VSS láb közé egy 1-10 µF értékű, kis soros ellenállású (low ESR) kondenzátort kell tenni (az adatlap ajánlása a 27.1 fejezet 27-13. táblázatában található). AVDD és AVSS az analóg áramkörök tápfeszültsége és földje, melyeket a digitális áramkörök okozta elektronikus zajok kiküszöbölése érdekében külön kivezettek. Ezeket mi most az egyszerűség kedvéért a legrövidebb úton közösítjük VDD-vel és VSS-sel, de a tisztességesebb megoldás az volna, ha ez a közösítés a tápfeszültség bejövetelénél történne, hogy sem az AVSS-hez sem az AVDD-hez menő ágon ne folyhasson keresztül a digitális áramkörök tápárama. Mind AVDD és AVSS, mind VDD és VSS közé egy-egy 100 nF-os kondenzátort kell tenni. Polarizált kondenzátor (tantál ELKO) esetén  VDD-re, illetve AVDD-re kell kötni a pozitív pólust. 



1. ábra: A Microchip PIC24HJ128GP502-I/SP mikrovezérlő lábkiosztása

Amire ügyelni kell

A PIC24H mikrovezérlő család tagjai 3,3 V-os tápfeszültséggel, illetve logikai szinttel működnek, ne adjunk rá az adatlapi specifikációban szereplő max 3,6 V-nál magasabb feszültséget! Kizárólag az RB5-től  RB11-ig terjedő (14-18, és 21-22) lábak tolerálják a 3,6 V-nál magasabb de max. 5 V-ig terjedő feszültséget.

A PIC24H család tagjai csak 3,3 V-os programozó készülékkel programozhatók! A PICkit2 vagy PICkit3 programozó készülék automatikusan és intelligensen 3,3 V-ra vált, ha  PIC24H vagy más, alacsony feszültségű mikrovezérlő típus programozására állítjuk be.

A PIC24H128GP502 mikrovezérlő kimeneti terhelhetősége lábanként 4 mA. Ügyeljünk tehát, hogy LED vezérlésnél vagy más, külső áramkör csatlakoztatásnál ne terheljük túl a kimeneteket!

Támogatott hardver platformok

Tananyagunkat elsősorban a saját készítésű kísérleti áramkörhöz szántuk. A Mississippi Egyetem ECE3274 kurzusához kapcsolódó, projektünkhöz forrásmunkaként felhasznált Tankönyv szerzői eredetileg PIC24HJ32GP202 mikrovezérlővel építettek hasonló áramkört, az angol nyelvű építési útmutató itt található: Prototyping walk-through. A PIC-kwik projekt keretében ezt az áramkört mi a nagyobb tudású PIC24HJ128GP502 mikrovezérlővel építjük meg, a mikrovezérlő és a PC közötti kommunikációhoz pedig az FTDI USB-TTL soros kábel helyett (amely Magyarországon nehezen és drágán beszerhető) olcsóbb alternatívákat ismertetünk.

Természetesen lehetőség van arra is, hogy nyomtatott áramköri kártyán építsük meg az áramkört (PIC-ador), vagy gyári fejlesztői kártyák közül is válogathatunk. A letölthető támogatói programcsomag és példaprogram gyűjtemény az alább felsorolt fejlesztői kártyákat/áramköröket támogatja (a felsorolásban hátul állók nem mindenben kompatibilisek a példaprogramokkal ezért ezeknél a támogatás korlátozott mértékű). Az adott kártyára vonatkozó tudnivalókat külön oldalakon  részletezzük, Kattintson a kártya nevéhez a tudnivalók megtekintéséhez! Zárójelben az adott kártyához tartozó, a pic24_libconfig.h állományban beállítandó hardver platform azonosítót tüntettük fel.

A PIC-kwik kísérleti áramkör

A PIC-kwik projekt referencia áramkörének kapcsolási rajza az alábbi ábrán látható. Az IC1, C1 és C2-ből álló tápegység egy 3,3 V-os feszültségtabilizátor, melynek megépítése nem feltétlenül szükséges. A tápfeszültséget szolgáltathatja a PICkit2 programozó, vagy használhatunk telepes táplálást, esetleg a később ismertetendő USB-TTL soros átalakítóból is vehető. A névleges tápfeszültség 3,3 V, de két sorbakötött ceruzaelem 3 V-os feszültsége is megfelelő. A feszültségstabilizátor bemenetére dugasztáp köthető (nem kell nagy teljesítmányűnek lennie).  A rajzon jelezett 9 V nem előírás, 5 - 7 V is bőven elegendő!

Ahogy a fejezet elején már említettük, a mikrovezérlő VDD-VSS és AVDD-AVSS lábai közé kell egy-egy 100 nF-os hidegítő kondenzátor. A VCAP és a mellette levő VSS láb közé pedig egy 10 µF-os szűrőkondenzátort kell kötni. A VCAP láb a mikrovezérlő beépített feszülség-szabályozójának a kimenete. Itt 2,5 V-ot mérhetünk. Ez a kimenet nem terhelhető.

Fontos szabály: a mikrovezérlőknél minden VDD, VSS, AVDD és AVSS kivezetést be kell kötni! Nem dísznek vannak!

2. ábra: A kísérleti áramkör kapcsolási rajza.

Az MCLR lábra mindig közvetlenül kell rákötni a programozó (esetünkben PICkit2) VPP kivezetését. A PICkit2 esetében az a kivezetés a kis háromszöggel megjelölt pont. Az MCLR lábat egy 10 kOhmos ellenállással a tápfeszültségre kell kötni. Ez a felhúzás szükséges ahhoz, hogy a program elindulhasson. Az MCLR lábat egy RESET gombbal a földre lehet húzni (természetesen nem programozáskor, mert a föld felé zárnánk és túlterhelnénk a PICkit2 VPP kimenetét!). A RESET gomb lenyomásakor a futó program félbeszakad, s a mikrovezérlő újraindul.

A kapcsolási rajzon  megjelöltük a soros porti kommunikáció csatlakozási pontjait (21. és 22. láb), amiről a Kommunikáció a számítógéppel c. szakaszban lesz szó.

Az áramkörünk tartalmaz egy LED-et is, ami egy áramkorlátozó ellenálláson keresztül a tápfeszültségre van kötve. A tápfeszültség meglétekor tehát a LED világít. A LED és az R2 ellenállás közö pontja az RB15 kivezetésre is rá van kötve. Ez lehetőséget ad arra, hogy szükség esetén a LED-et lesöntöljük (az RB15 kimenet alacsony szintre húzásával). Ennek segítségével (a söntölés periodikus ki-bekapcsolásával) a LED villogtatható. Ezt "életjelző" funkcióként használjuk: a LED folymatos vollogása jelzi, hogy fut a program. Arra azonban ügyelnünk kell, hogy az RB15 kimenettel nem szabad a LED-et felhúzni, mivel ebben a körben nincs áramkorlátozás, s túlterhelnénk a PIC kimenetét. Ennek elkerülésére az RB15 kimenetet nyitott nyelőelektródás módba kell kapcsolni! 

Megjegyzés: A gyári fejlesztői kártyák esetén (kivéve a mini-Bully kártyát) az életjelző funkciót ellátó LED az itt ismertetett kísérleti áramkörtől eltérően van bekötve (azoknál mikrovezérlőtől kap tápellátást a LED), ezért azoknál a kimenetet nem nyitott nyelőelektródás, hanem ellenütemű ("totem-pole") üzemmódba kell kapcsolni. Haa pic24_libconfig.h állományban beállítottuk az adott kártyához tartozó HARWARE_PLATFORM makrót, akkor a támogatói programkönyvtárban elhelyezett feltételes fordítási direktívák gondoskodnak róla, hogy az életjelző LED beállítása megfeleően történjen. 

Építési tanácsok

A kísérleti áramkört dugaszolós próbapanelon egyszerűen megépíthetjük ahogyan az az alábbi ábrán látható. A 6 pólusú tüskesor lehetővé teszi, hogy programok letöltését és nyomkövetését egy PICkit2 programozó és nyomkövető készülékkel végezhessük. 

Annak sincs azonban akadálya, hogy az áramkört egy USB-TTL soros átalakítóval kiegészítve használjuk. Ez utóbbi esetben a tápfeszültséget vehetjük az USB-UART átalakítóból is, s a programok letöltését bootloaderrel végezhetjük, ami fölöslegessé teszi a programokzó készülék használatát. Az MSU bootloader beégetéséhez a PIC-ador kártya útmutatóját kövesse!

Célszerű először a tápegységet megépíteni (a rajzon a bekeretezett POWER szekció) és kipróbálni a hozzá kapcsolódó LED-del együtt. Utána a RESET áramkört és a mikrovezérlő tápellátását állítsuk össze, és lehetőleg voltmérővel, vagy LED-es feszültségvizsgálóval ellenőrizzük a helyes bekötést, mielőtt a PIC IC-t beültetnénk a helyére. Ne feledkezzünk meg a szűrőkondenzátorokról sem, és ügyeljünk a helyes polaritásra! Mindig a VSS ("föld") felé nézzen a polarizált kondenzátorok negatív jelzésű lába! 

Megjegyzés: A mintaáramkörben tantál elektrolit-kondenzátorokat használtunk, amelyek polarizáltak. Egyszerűbb és elektronikusan is jobb megoldás, ha a 100 nF-os tantálkondezátorok helyett alacsony ESR értékű kerámia kondenzátorokat használunk (ezek nem polarizáltak).


3. ábra: A próbapanelon megépített kísérleti áramkör vázlatos rajza és fényképe

Ügyeljünk arra, hogy a különböző gyártmányú és típusú feszültségstabilizátor IC-k bekötése eltérő lehet! A fenti ábra szerinti elrendezés a National Semiconductor gyártmányú LM1085IT-3.3 típusú IC-hez készült, melynek középső lába és  hűtőlemeze a kimeneti pont, ezt a lábat kell a piros színű tápvezeték sínhez kötni. Ettől eltérő bekötésű például az LM2937-3.3 típusú stabilizátor, melynek a középső kivezetése és a hűtőlemeze  a közös pontra (GND) kapcsolódik (lásd 4. ábra). 

4. ábra: Az LM1085-3.3 és az LM2937-3.3 stabilizátorok bekötése

A stabilizátor bejövő és kimenő pontját egy-egy 10 µF-os kondenzátorral szűrtük meg. Ügyeljünk rá, hogy a bemeneti pontra kötött kondenzátor legalább 16 V-os legyen!  A bejövő stabilizálatlan tápfeszültséget célszerűen egy 9 V-os hálózati adapterből vehetjük. Csatlakoztatás előtt ellenőrizzük a polaritását! A tápegység címkéjén általában jelzik a polaritást, s többnyire a belső hüvely a pozitív pólus. Hibátlan huzalozás esetén a hálózati adapter csatlakoztatása után a stabilizátor kimenetén 3.3 V-os feszültségnek kell megjelennie, s a LED-nek folyamatosan világítania kell.    

Kommunikáció a számítógéppel

A példaprogramok többsége feltételezi, hogy a kísérleti áramkör az univerzális soros portján (USART) keresztül kommunikálni tud egy számítógéppel, ennek segítségével ír ki fontos információkat, hibaüzeneteket vagy eredményeket. Némely esetben interaktív a kapcsolat, azaz a számítógépen keresztül beadott parancsokkal vagy adatokkal befolyásolhatjuk a mikrovezérlőn futó program működését. 

A PIC-ador, a 16-bit 28-pin Starter Board, a Web Platform és a Microstick Plus kártyák már tartalmaznak egy-egy USB-TTL átalakítót, ezek tehát közvetlenül csatlakoztathatók a számítógéphez. Az Explorer 16 kártya pedig RS-232 soros portra csatlakoztatható. A többi kártya vagy kísérleti áramkör esetében gondoskodnunk kell a kommunikáció lehetőségének biztosításáról. 

A Mississippi Egyetem ECE3274 kurzusához kapcsolódó tananyag útmutatójában ehhez az FTDI USB-TTL soros kábelt (TTL-232R-3V3) ajánlják, ami egyúttal +5V-os tápfeszültséggel is ellátja a kísérleti áramkör 3,3 V-os feszültségstabilizátorát. Ez a kábel azonban Magyarországon nehezen szerezhető be, és elég drága.  Sokkal kedvezőbb árú egy CP2102 vagy PL2303HX IC-vel szerelt átalakító az E-bay kínálatában, vagy egy CA-42 típusú utángyártott USB kábel (Nokia telefonokhoz árulják)  átalakítása. Az átalakítás legegyszerűbb esetben azt jelenti, hogy levágjuk a telefon oldali csatlakozót, és megkeressük a GND, TX, és RX vezetékeket. 

Egy további lehetőség az, hogy magunk építünk USB-TTL soros átalakítót a Microchip MCP2200 protokol-konverterének vagy a PIC18F14K50 mikrovezérlőjének segítségével. A kettő között csupán annyi a különbség, hogy a PIC18F14K50 esetében nekünk kell gondoskodnunk az IC felprogramozásáról, az MCP2200 pedig már gyárilag tartalmazza a működtető programot.

Ennek a lehetőségnek a kipróbálásához először egy PIC18F14K50 mikrovezérlőre épülő USB-UART átalakító építettünk a PICkit2 Starter Kit LPC demókártyájának felhasználásával. Az USB-UART átalakító kapcsolási rajza és megépítési útmutatója itt található. Amint az alábbi fényképen is látható, a 3,3 V-os tápfeszültséget is az USB-UART átalakítóról vettük (a fekete és piros vezetékek), így a PIC24 kísérleti áramkörből elhagyható a tápegység rész.

 

5. ábra: Az USB-UART átalakítón keresztül a számítógéphez kapcsolható kísérleti áramkör.

Hasonló módon használhatók a készen kapható FTDI, CP2102 vagy PL2303HX IC-n alapuló gyári átalakítók is, amelyek a tápellátást szintén a számítógép USB csatlakozójából veszik.

6. ábra: USB-TTL átalakítók (a: FTDI TTL-232R-3V3 kábel, b: egy megbarkácsolt CA-42 telefonkábel PL2303HX IC-vel, c: CP2102 IC-vel működö USB-TTL konverter modul)

A PIC-ador kártya

Hosszú távon megbízhatóbb, stabilabb működést biztosít az, ha a dugaszolós próbapanel helyett nyomtatott áramköri lapon építjük meg a kísérleti áramkört. A PIC-ador kártya (építési leírása itt olvasható) tulajdonképpen a PIC-kwik kísérleti áramkör nyomtatott áramköri kártyán megépített változata, amelyet egy PIC18F14K50-nel megvalósítot USB-TTL soros átalakítóval is kiegészítettünk. 

7. ábra: A megépített PIC-ador kártya

A kártya tehát mindent tartalmaz, ami az egyszerű programok (ledflash.c, echo.c, reset.c) futtatásához kell. Ezen a kártyán nincs ICSP csatlakozó, kifejezetten bootloaderes használathoz készült. Azonban a két 14 pólusú hüvelysoron a PIC összes lába ki van vezetve, tehát szükség esetén átkötő vezetékekkel csatlakoztathatjuk hozzá a PICkit2 programozót. Valamivel komplikáltabb az USB-TTL soros átalakítónak használt PIC18F14K50 felprogramozása, ennek lábai ugyanis nincsenek kivezetve a kártyáról. Javasoljuk, hogy még beépítés előtt programozzuk fel ezt az IC-t egy dugaszolós próbapanel, vagy speciális programozói kártya segítségével!  

A kártya egy USB nyomtatókhoz való kábellel csatlakozik a számítógéphez, ezen keresztül a kártya tápellátása is megoldott. Ügyeljünk rá, hogy ha kártyához külső áramköri kiegészítéseket csatlakoztatunk, akkor ne haladjuk meg a számítógép USB csatlakozójából kivehető áram felső határértékét (max. 0,5 A)!

Lehetőség van arra is, hogy egy 5-9 V-os fali dugasztápról kapja a kártya a tápellátást. Egy Schottky védődióda gondoskodik róla, nehogy "megtápláljuk" a számítógép USB tápvonalát az USB kábel és a dugasztáp egyidejú csatlakoztatása esetén. Vigyázzunk, hogy dugasztáp használata esetén se terheljük túl a tápegység részt, mert a 3,3, V-os feszültségstabilizátor túlemelegedhet (csak a panel hűti...)! 

Bootloader és letöltő program

A számítógép és a kísérleti áramkör közötti soros kommunikáció azt is lehetővé teszi, hogy programozó készülék használata helyett ezen a soros kommunikációs csatornán keresztül töltsük be a kipróbálni kívánt programjainkat a PIC24H mikrovezérlőbe, függetlenül attól, hogy a soros kommunikációt a fentebb említett eszközök közül melyikkel valósítjuk meg. Ha úgy döntünk, hogy ezt a programbetöltési módot használjuk, akkor ennek gyakorlati megvalósításához két szoftver komponensre lesz szükségünk:

  1. Betöltő program (bootloader), ami a mikrovezérlőn fut, s egyrészt képes kommunikálni a PC-vel, másrészt tartalmazza azokat az eljárásokat, amellyel a PIC24 mikrovezérlő képes átprogramozni a saját programtároló memóriáját. Az általunk használt MSU bootloadert a Mississipi State University oktatói a Microchip AN1094 alkalmazási mintapéldájából kiindulva fejlesztették ki, s ez az a betöltőprogram, amelyik maximálisan kihasználja az általuk összeállított PIC24 támogatói programkönyvtár nyújtotta kommunkációs és hibakeresési lehetőségeket. Az MSU bootloader használata lehetővé teszi, hogy a kísérleti áramkört a mikrovezérlő első felprogramozása után programozó készülék nélkül használhassuk. A betöltő program a PIC24 mikrovezérlő memóriájának a legelején (a legalacsonyabb memóriacímektől kezdődően) helyezkedik el. Némi komplikációt jelent, hogy itt helyezkednek el a megszakítási vektorok, amelyet az aktualis alkalmazás igényeinek megfelelően kell feltölteni. A régebbi bootloader (az általunk forrásként használt angol nyelvű szoftver segédlet 2010. július előtti változataiban, illetve a PIC-kwik 2012 előtti kiadásaiban) minden programletöltéskor felülírta az megszakítási vektorokat, ami azzal a veszéllyel járt, hogy a programletöltés megszakadása vagy elakadása esetén működőképtelenné tehette a bootloadert is. A bootloader újabb (mostani) változatánál a megszakítási vektorok tábláját sohasem módosítjuk, mivel olyan címekkel vannak feltöltve, amelyek a bootloader után, a szabad címterület elején elhelyezendő ugrótáblára irányítja át a megszakításokat. Ennek az az ára, hogy 512 bájt programmemóriát elhasználunk az áthelyezett megszakítási vektor táblára, s néhány utasításciklussal hosszabb lesz az interrupt késedelem minden kiszolgálásnál.
  2. Letöltő program ami a PC-n futó alkalmazás. Ennek segítségével választhatjuk ki a letöltenő HEX állományt (az MPLAB környzeteben lefordított alkalmazást) és tölthetjük le a soros kommunikációs csatonán keresztül a bootloder számára. A letöltő program esetünkben egy .NET alkamazás. A letöltött és kibontott szoftver segédlet (code_examples.zip) bin mappájában található. A winbootldr.exe program közvetlenül is futtatható, de a bully.msi felhasználásával regisztrált Windows alkalmazásként telepíthetjük is.

A programletöltés előfeltétele tehát az, hogy a PIC24H mikrovezérlőbe bele legyen égetve az MSU bootloader program, amelynek a forráskódja is és a közvetlenül beégethető HEX formátumú változata is megtalálható a letölthető szoftver segédletben (code_examples.zip). A támogatott hardver platformokhoz (elsősorban PIC-kwik, PIC-ador, mini-Bully) használható bootloader változatok a kibontott szoftver segédlet hex mappájában találhatók. Az állomány neve tartalmazza a mikrovezérlő típusát (amihez a HEX állomány használható), s a beállított adatsebességet (tipikusan 57600 bit/s). 

Az alapértelemezett hardver platformtól különböző kártyákhoz a bootlader speciális változatát kell használni (más a lábkiosztás, stb). Ezen speciális bootloaderek állományneve a kártya nevét is tartalmazza. Ezek értelemszerűen csak a megnevezett kártyákkal működnek (28-pin Starter Board, Explorer 16 kártya). Ezen kártyák esetén csak 2-3 mikrovezérlő típusra találunk kész, lefordított bootloadert: a 28-pin Starter Board esetén PIC24FJ64GA002, PIC24HJ128GP502 és PIC24HJ128GP502 mikrrovezérlőkhöz az Explorer 16 kártya esetén pedig a PIC4FJ128GA010 és PIC24HJ256GP610 típusokhoz. 

Megjegyzés: A kényelmesebb kezdéshez a PIC-ador és a 28-pin Starter Board kártyákhoz egy mintaalkalmazással (reset.c) kiegészített bootloader változatot is készítettünk. Ezeket a A letöltött és kibontott szoftver segédlet (code_examples.zip) firmware nevű mappában találja meg. Javasoljuk, hogy ezt égesse be a hex mappában található bootloader helyett, s így egy lépést (a reset.hex alkalmazás betöltését a bootloaderrel) megtakaríthat!  Az ötletet onnan vettük, hogy a mini-Bully kártya mikrovezérlője ugyanígy, bootloaderrel és egy mintaalkalmazással előre programozva kerül forgalomba.

MPLAB IDE és C30 fordító

A mintaprogramokat a Microchip honlapjáról szabadon letölthető MPLAB IDE fejlesztői környezet és a C30 fordító használatával szerkeszthetjük, és fordíthatjuk le, ugyanúgy, mint a korábbi fejezetek esetében. A különbség csupán annyi, hogy most nem a szimulátorban futtatjuk a programot.

Megjegyzés: A támogatói programkönyvtár és a mintapéldák az MPLAB IDE 8.x környezethez készültek. Az újabb MPLAB X környezettel való kompatibilitás nem garantált!

LED villogtató program - I. változat

A megépített áramkör program nélkül legfeljebb levélnehezéknek használható. Keltsük hát életre a 2. ábrán bemutatott áramkört egy LED villogtató programmal! Ezt a funkciót későbbi programjainkba is érdemes beépíteni, mert a LED villogása jelzi, hogy fut a program. A programot C nyelven írjuk meg, és a Microchip C30 fordítójával fordítjuk le. A cél most elsősorban nem a program megértése, hanem a kapcsolás működésének demonstrálása.

Hardver követelmények

Megjegyzés: Ez a program PICkit2 (vagy más, hasonló) programozó készülékkel történő beégetéshez készült. Ha bootloaderrel ellátott fejlesztői kártyát használunk, akkor hagyjuk ki ezt a programot és görgessünk tovább a a PIC24 perifériakezelő programkönyvtár leírásához, majd próbálkozzunk a ledflash.c programmal! 

A projekt létrehozásának lépései

A program és a keretéül szolgáló MPLAB projekt létrehozásának lépéseit az MPLAB IDE v8.15a változatával az alábbiak szerint hajtottam végre (valószínűleg az MPLAB 8.x újabb verziói esetén is hasonlóan kell eljárni):

A program beírásához a Project menüben válasszuk ki az "Add New File to Project" (új állomány hozzáadása a projekthez) menüpontot, és a felbukkanó ablakban adjuk meg az elérési útvonalat, valamint az új forrásfájl nevét (például legyen a neve loop1.c a C:\PIC24 mappában). Írjuk be (vagy másoljuk be) az alábbi programot!

1. lista: LED villogtató program I. változat (loop1.c)
#include <p24hxxxx.h>
#define DELAY 3900 //3900 óraütés kb. 0,27 s késleltetés
//-- A legszükségesebb konfigurációs bitek beállítása
_FOSCSEL(FNOSC_FRC); // Belső órajelet használunk
_FOSC(FCKSM_CSECMD & OSCIOFNC_OFF);

int main() {
//-- I/O portok inicializálása
AD1PCFGL = 0x1fff; // Analóg bemenetek tiltása
TRISB = 0x7fff; // RB15 legyen kimenet
//-- Microstick esetén a következő sort hagyja ki, vagy tegye megjegyzésbe!
ODCB = 0x8000; // RB15 legyen nyitott nyelőelektródás
LATB = 0x0000; // PORTB kezdőállapot = 0x0000
//-- Timer1 inicializálása
T1CON = 0x8030; // TMR1 bekapcsolás, előszámláló = 1:256
while( 1) {
while ( TMR1 < DELAY); // Várunk, amíg a késleltetés le nem telik
TMR1 = 0; // Időzítő nullázása (megfordítjuk a homokórát)
_LATB15 = !_LATB15; // A LED állapotát ellenkezőjére váltjuk
}
}

A program működését itt csak vázlatosan ismertetjük, a perifériák működésével kapcsolatos részletekre majd később visszatérünk még.

A program elején az #include direktívával beolvastatjuk a mikrovezérlőt leíró definíciós állományt. Ezt az egyszerűség kedvéért tekintsük a mikrovezérlő adatlapja géppel olvasható kiadásának...  Ennek hatására tud majd pl. a fordító konkrét regisztereket rendelni az ADPCFGL, TRISB, TMR1, stb. nevekhez. Az általunk becsatolt p24hxxxx.h fejléc állomány azonban csak egy burkoló, amely feltételes fordítási direktívák segítségével annak a mikrovezérlőnek a specifikus adatlapját csatolja be, amelyet az MPLAB főmenüjének Configuration/Select Device pontjában kiválasztottunk. Ebben a megoldásban az a kénylemes, hogy más típusra történő átálláskor elég egyetlen pontban (a menüben) változtatni, nem kell még a forráskód elején is átírni a típusszámot. 

A #define direktívával egy DELAY (késleltetés) nevű számkonstanst definiálunk. Ennyi "óraütést" fogunk majd leszámláltatni a LED állapotváltozása  között. Az óraütések gyakoriságát a mikrovezérlő órajele (esetünkben 7.37 MHz) és az időzítő (Timer1) előosztójának osztási arány szabja meg. Az időzítés kiszámításának módját néhány sorral lentebb ismertetjük.

A főprogram első részében inicializáljuk a mikrovezérlőt: Először is az RB15 kimenethez tartozó AN9 analóg bemenetet letiltunk. Ha az AD1PCFGL regiszter valamelyik bitje nulla, akkor az adott bithez rendelt analóg bemenet a megfelelő lábra kapcsolódik. Ha a bit értéke 1, akkor a hozzá rendelt analóg bemenet AVSS-re kapcsolódik (analóg föld), a mikrovezérlő megfelelő lába pedig digitális ki/bemenetként használható, lásd az adatlap Register 19-8 nevű táblázatát!  Ha  az RB15 kimenethez tartozó AN9 analóg bemenetet akarjuk letiltani, akkor az AD1PCFGL regiszter 9. bitjét kell '1'-be állítani (ennek helyiértéke hexadecimálisan 0x0200).

A TRISB regiszterrel a B port bitjeinek adatáramlási irányát állíthatjuk be. Ha TRISB valamelyik bitje 0, akkor a hozzá rendelt láb kimenetként viselkedik. Ha pedig 1, akkor bemenetként. Itt most csak az RB15 lábat állítjuk kimenetnek (helyiértéke 0x8000), a B port többi bitje tehát bementként viselkedik.  

A 2. ábrán látható áramkör LED-jének helyes működéséhez elengedhetetlen, hogy az RB15 kimenetet nyitott nyelőelektródás (ez a TTL logikai áramköröknél megszokott nyitott kollektoros kimenet MOS FET-es megfelelője) üzemmódba állítsuk! Ehhez az ODCB regiszter 15. bitjét 1-be kell állítani. Microstick esetén azonban más a LED bekötése, tehát Microstick használata esetén hagyjuk ki ezt a sort, vagy tegyük kommentté!

Ahhoz, hogy a LED villogását észlelni tudjuk, a LED ki- és bekapcsolásai között szünetet kell tartani. Az ehhez szükséges várakozási időket a mikrovezérlő beépített, 16 bites Timer1 számlálója segítségével fogjuk mérni úgy, hogy az utasításciklusokat számláltatjuk vele, amíg a DELAY konstansban előírt felső határt el nem érjük. Gyakorlatilag úgy használjuk a számlálót, mint a tojásfőzésnél a homokórát: elindítjuk, és nézzük, hogy leperegtek-e már a homokszemek. Esetünkben a DELAY konstans értéke szabja meg, hogy hány virtuális homokszem lepergésénél mondjuk azt, hogy letelt az idő.

A mikrovezérlő órajelgenerátora a beépített RC oszcillátorról fog működni, nagyjából Fosc = 7.37 MHz-es frekvencián. Az utasítások ütemezéséhez ennek a frekvenciának a felét (Fcy = Fosc/2) használja a mikrovezérlő, s ezeket az utasításciklusokat számlálja majd Timer1 is.

A programlistában látható, hogy a T1CON vezérlő regiszterbe 0x8030 hexadecimális érték írunk, ami azt jelenti, hogy bekapcsoljuk Timer1-et (bit15=1, azaz TON=1) és 1:256 arányú előosztást állítunk be (bit5 és bit4 = 1, azaz TCKPS=11). Így a számláló minden 256. utasításra, illetve minden 512. oszcillátor rezgésre számlál egyet. Ezekkel az adatokkal számolva:

  a várakozási idő = DELAY*256/Fcy = DELAY*256*2/Fosc = 3900*256*2/7370000 =  0,27 s

A főprogram második része végtelen ciklusban fut. Ha letelt a késleltetés, akkor PORTB 15. bitjét ellenkező állapotba váltjuk (logikai negáció) és nullázzuk az órát (töröljük Timer1 számláló regiszterét). A LATB regiszter a B port kimenő adatregisztere, tehát _LATB15 írása a B port kimenetnek állított RB15 bitjének kimenő jelszintjét állítja be. Mivel RB15 most nyitott nyelőelektródás üzemmódba van állítva, a logikai nulla lehúzást, a logikai magas szint elengedést (tri state) jelent. A felhúzást a 2. ábrán bemutatott kapcsolásban az R2 ellenállás végzi. 

A LED minden második ciklusban kerül azonos állapotba, így tehát ~0.54 másodpercenként villan fel (nagyjából 2 Hz frekvenciával villog).

A program lefordítása, beégetése és futtatása

A program fordítása előtt az MPLAB Toolbar sorában a legördülő listáról válasszuk ki a Release (kiadás) módot, majd kattintsunk a Build All gombra! Az esetleges figyelmeztetéseket (Warning) hagyjuk figyelmen kívül! Ha a fordítás végén a BUILD SUCCEEDED felirat jelenik meg, akkor sikeres volt a fordítás, letölthetjük a programot.

A PICkit2 kezelése nem igényel különösebb magyarázatot. A 9V-os külső tápellátást most hagyjuk ki, az áramkörünket a PICkit2 is el tudja látni tápfeszültséggel (a számítógép USB kimenetéről...). Csatlakoztassuk a PICkit2 programozót az áramkörünkhöz. Az 1-es lábat kis háromszög jelzi a fenti rajzokon és a PICkit2 házán is, így könnyű elkerülni, hogy fordítva dugjuk rá a tüskesorra. Csatlakoztassuk a PICkit2-t a számítógép USB portjára is. Az MPLAB program Programmer menüjében válasszuk a PICkit2-t, majd visszafojtott lélegzettel figyeljük, hogy sikerül-e a mikrovezérlő felismerése... Szerencsés esetben egy ehhez hasonló üzenet jelenik meg a képernyőn:

 Initializing PICkit2 version 0.0.3.51

 Found PICkit2 - Operating System Version 2.32.0
 Target Power not detected - Powering from PICkit2 (3.25V)
 PIC24HJ128GP502 found (Rev 0x3002)
 PICkit2 Ready

A PICkit2 kész a programozásra. Csupán a Programmer menü "Program" pontjára kell kattintani. A programtároló memória törlése, a program beégetése és ellenőrzése után a PICkit2 Ready üzenet jelzi, ha befejeződött a kért művelet.

A program futtatásához már csak az kell, hogy a PICkit2 ne tartsa tovább RESET állapotban a mikrovezérlőt. Ehhez az MPLAB Programmer menüjében a "Release from Reset" (Reset elengedése) pontra kattintsunk. Ha az eddig folyamatosan világító LED-ünk elkezd barátságosan pislogni, akkor minden rendben, működik a program.

Figyelem! Ha a program futásakor a LED fényesebben világít, mint az előbbi, folyamatos módban, akkor elszúrtuk vagy kifelejtettük a nyitott nyelőelektródás üzemmódba kapcsolást (ODCB=0x8000;). Sürgősen javítsuk ki a programot, mert így túlterheljük a mikrovezérlő kimenetét!  

Microstick használata esetén csatlakoztassuk az eszközt a PC-hez, majd a fordítás után az MPLAB Programmer/Select Programmer menüpontban a Starter Kits eszközt  válasszuk ki. Sikeres kapcsolódás esetén az alábbi felirat jelenik meg:

Starter Kit board connected
Firmware version: 00.00.03

A program letöltése ugyanúgy történik, mint a PICkit2 esetében: a Programmer menü "Program" pontjára kell kattintani. Sikeres programletöltés után a Starter Kit Programmer ablakban az alábbi felirat jelenik meg:

Programming and verifying...done

A programfutás automatikusan elindul. Ha az RB15-re kötött LED nem világít, akkor ellenőrizzük, hogy nem felejtettük-e el kivenni vagy hatástalanítani az alábbi utasítást!
//-- Microstick esetén a következő sort hagyja ki, vagy tegye megjegyzésbe! 
// ODCB = 0x8000; // RB15 legyen nyitott nyelőelektródás
Ha a LED ütemesen villog, akkor lépjünk tovább a következő példához!

LED villogtató program - II. változat

Módosítsuk a programunkat úgy, hogy a mikrovezérlő ne 7.37 MHz-en poroszkáljon, hanem 80 MHz-en nyargaljon (ez az elérhető maximális sebességet jelenti)! Ehhez az órajel generátort egy másik üzemmódba kell kapcsolni úgy, hogy a 7.37 MHz-es alapjelből egy fáziscsatolt hurok (PLL) segítségével Fosc = 80 MHz jelet állítson elő. Az órajel generátor konfigurálását a  PIC24H Family Reference 39-2. számú mintaprogramjának beillesztésével egyszerűen elintézhetjük.

Amint az adatlapból vagy fentebb említett referencia kézikönyvből láthatjuk, PLL használata esetén az Fosc órajel frekvencia az Fin alapfrekvenciából egy M szorzóval valamint egy N1 előosztó és egy N2 utóosztó tényezővel számolható ki. A mintaprogram szerinti értékekkel:

Fosc = Fin * M/(N1*N2) = 7,37 MHz * 43 /(2*2) = 79,22 MHz valamint Fcy = Fosc/2 = 39,61 MHz

Az Fosc = 7,37 MHz-es alapfrekvenciából kiindulva ennél jobban most nem tudjuk megközelíteni a 80 MHz-et, mert M = 44 szorzóval már 80 MHz-et meghaladó érték jönne ki. Az alapfrekvencia egyébként hangolható az OSCTUN regiszter módosításával, de ennek részleteibe most nem megyünk bele.

Hardver követelmények

Megjegyzés: Ez a program PICkit2 (vagy más, hasonló) programozóval történő beégetéshez készült. Ha bootloaderrel ellátott fejlesztői kártyát használunk, akkor hagyjuk ki ezt a programot és görgessünk továbba a támogatói programkönyvtár leírásához, majd próbálkozzunk a ledflash.c programmal! 


2. lista: LED villogtató program II. változat (loop2.c)
#include <p24hxxxx.h>
#define DELAY 39062 // 0,25 s késleltetés
//-- A legszükségesebb konfigurációs bitek beállítása
_FOSCSEL(FNOSC_FRC); // Belső órajel
_FOSC(FCKSM_CSECMD & OSCIOFNC_OFF);

int main()
{
//-- PLL elő- és utószámláló és osztó beállítása
PLLFBD = 41; // M = 43
CLKDIVbits.PLLPOST=0; // N1 = 2
CLKDIVbits.PLLPRE=0; // N2 = 2
//-- Órajelgenerátor átkapcsolása: belső FRC és PLL
__builtin_write_OSCCONH(0x01);
__builtin_write_OSCCONL(0x01);
//-- Megvárjuk az átkapcsolást
while (OSCCONbits.COSC != 0b001) {};
//-- Megvárjuk a PLL beállását
while(OSCCONbits.LOCK!=1) {};

//-- I/O portok inicializálása
AD1PCFGL = 0x0200; // Analóg bemenetek tiltása
TRISB = 0x7fff; // RB15 legyen kimenet
//-- Microstick esetén a következő sort hagyja ki, vagy tegye megjegyzésbe!
ODCB = 0x8000; // RB15 legyen nyitott nyelőelektródás
LATB = 0x0000; // PORTB kezdőállapot = 0x0000
//-- Timer1 inicializálása
T1CON = 0x8030; // TMR1 bekapcsolás, előszámláló = 1:256
while( 1) {
while ( TMR1 < DELAY); // Várunk, amíg a késleltetés le nem telik
TMR1 = 0; // Időzítő nullázása (megfordítjuk a homokórát)
_LATB15 = !_LATB15; // A LED állapotát ellenkezőjére váltjuk
}
}
A program többi részén csupán annyit változtatunk, hogy DELAY értékét megnöveljük (gyorsabban peregnek a virtuális homokszemek, ezért többet kell raknunk a homokóra tartályába, ha azt akarjuk, hogy nagyjából ugyanannyi idő alatt peregjenek le). A programban szereplő értékkel számolva most:

a várakozási idő = DELAY*256/Fcy = DELAY*256*2/Fosc = 39062*256*2/79220000 = 0,25 s

Tehát a ciklusonkénti két késleltetési periódust figyelembe véve, kb. félmásodpercenként villan fel a LED. Végeredményben a külső szemlélő nem tudja megkülönboztetni a két program futási eredméynét. Egyelőre csak mi tudjuk, hogy ezalatt a PIC jóval gyorsabban fut (sokkal több mindent tudna csinálni a várakozási időben - ha olyan programot írnánk, ami hasznos tevékenységgel tölti ki a várakozási időt).

PIC24 perifériakezelő programkönyvtár és mintaprogram gyűjtemény

Ahogy a bevezetőben már említettük, a Mississippi Állami egyetem ECE3274 kurzusának honlapján valamint a www.reesemicro.com oldalon egy jól dokumentált PIC24 perifériakezelő programkönyvtár is elérhető és az R. B. Reese, J. W. Bruce and B. A. Jones: Microcontrollers: From Assembly Language to C Using the PIC24 Family című tankönyv mintaprogramjainak gyűjteménye is letölthető. A szerzői jogi nyilatkozat itt olvasható.

A PIC-kwik projekt keretében a fenti programkönyvtár dokumentációjának legfontosabb oldalait és a mintaprogramok magyarázó megjegyzéseit magyarra fordítottuk, s a némileg átdolgozott és kibővített mintaprogram gyűjteményt a támogatói programkönyvtárral együtt közzétettünk. A  tájékozódást a nyitólapon érdemes kezdeni. Ugyanott találjuk meg a letöltési linket az összecsomagolt magyar kiadás aktuális változatához (code_examples.zip). Az első használat előtt feltétlenül olvassa el  "A kezdeti lépések" című oldalt, ami ismerteti a programkönyvtár használatának szoftver és hardver feltételeit, s átvezeti az újoncokat a kezdeti lépések nehézségein. A mintaprogramok többsége azt feltételezi, hogy a fent említett könyvben, illetve a kurzus segédletében ismertetett (USB-UART átalakítóval és bootloaderrel ellátott PIC24HJ128GP502) áramkörön fut a program. Más hardver használata is lehetséges, de a mintaprogramokon esetleg változtatni kell:

Mit nyújt nekünk a támogatói programkönyvtár?

Port konfiguráló makrók

Kényelmi okokból a támogatói programkönyvtár számos, az alábbiakhoz hasonló makrót definiál, amelyek elrejtik a felhasználó elől az I/O port lábak beállításának technikai részleteit:
 
CONFIG_RB15_AS_DIG_OUTPUT();
CONFIG_RB15_AS_DIG_INPUT();

Ehhez hasonló makrók minden ki/bemenethez rendelkezésre állnak. Mivel a makrodefiníciók függenek a használt mikrovezérlő típusától, ezért a programkönyvtár include\devices alkönyvtárában minden mikrovezérlőhöz tartozik egy-egy konfigurációs állomány, amelyek közül a megfelelőt az include\pic24_ports.h fájl automatikusan becsatolja - annak függvényében, hogy melyik mikrovezérlőt választottuk az MPLAB menüjében.

További makrók állnak rendelkezésre a következő fejezetben ismertetett "belső felhúzások" vagy a korábban már említett "nyitott nyelőelektródás" kimenet beállításához:

ENABLE_RB15_PULLUP();                  //Belső felhúzás engedélyezése az RB15 bemeneten
DISABLE_RB15_PULLUP();                 //Belső felhúzás letiltása az RB15 bemeneten
ENABLE_RB15_OPENDRAIN();            //RB15 nyitott nyelőelektródás üzemmód bekapcsolása  
DISABLE_RB15_OPENDRAIN();           //RB15 nyitott nyelőelektródás üzemmód kikapcsolása
CONFIG_RB15_AS_DIG_OD_OUTPUT;  //Digitális kimenet és OD üzemmód egy makróba összevonva

Természetesen a fentiekhez hasonlóan bármelyik Rx regiszter n. bitje megnevezhető Rxn formában. Azonban azok a bemenetek nem konfigurálhatók belső felhúzással, amelyekhez nem tartozik bemeneti szint megváltozását jelző (CN) funkció. Ha ilyesmivel próbálkoznánk, a fordítóprogram hibajelzést adna, mivel a CN funkcióval nem rendelkező bemenetekhez nincs definiálva felhúzást beállító makró.

Újabb LED villogtatás - használjuk a makrókat

Mivel is kezdhetnénk mással a PIC24 támogatói programkönyvtár kipróbálását, ha nem egy LED villogtató programmal? A ledflash.c program, ami a Tankönyv 8. fejezetének mintapéldái között található, az RB15-re kötött LED1-et villogtatja 2 Hz-es frekvenciával, s használja a fentebb ismertetett I/O makrókat. Az eredeti programot azonban módosítottuk, hogy a támogatott hardver platformok mindegyikén fusson, módosítás nélkül.

A programban az "életjelző funkciót" ellátó LED-et villogtatjuk, kihasználva azt a tényt, hogy a pic24_all.h becsatolása és a HARDVER_PLATFORM makró beállítása (a pic24_libconfig.h állományban, vagy a projekt opciók között) után a HB_LED és az azt inicializáló CONFIG_HB_LED() makrók automatikusan beállításra kerülnek, a választott hardverhez illeszkedően. Magyarázat: A HB jelentése itt "heartbeat", azaz "szívdobbanás".
Fentiek alapján így foglalhatjuk össze, hogy a HB_LED és az azt konfiguráló CONFIG_HB_LED() makrók milyen értékkel kerülnek definiálásra a támogatott fejlesztői áramkörök esetében:
Fejlesztői áramkör HB_LED CONFIG_HB_LED()
PIC-kwik, PIC-ador,
mini-Bully,
16-bit 28-pin Starter Board
_LATB15 CONFIG_RB15_AS_DIG_OD_OUTPUT()
Microstick,  Microstick Plus _LATB15 CONFIG_RB15_AS_DIG_OUTPUT()
Explorer16 + PIC24F128GA010 _LATA7 CONFIG_RA7_AS_DIG_OUTPUT()
Dangerous Web Platform _LATA8 CONFIG_RA8_AS_DIG_OUTPUT()
A program elején hivatkozni kell a pic24_all.h állományra, ami az MPLAB-ban kiválasztott mikrovezérlő típusához illő definíciós állomány becsatolásáról gondoskodik.

HB_LED és CONFIG_HB_LED() makrók definiálása a pic24_libconfig.h állomány végén található. A HARDVER_PLATFORM makró értékét vizsgáló feltételes fordítási direktívák segítségével állítjuk be a fenti táblázat szerinti értékekeket. Az ilyen típusú definícióknak az a szerepe, hogy a program további részeit függetlenítse a hardver részleteitől (ne kelljen az egész programot átírni, ha például LED1-et egy másik I/O lábra kötjük át).

Az I/O portok felépítésének és kezelésének részleteivel a következő fejezetben fogunk foglalkozni. Most tehát csak felsoroljuk, hogy a CONFIG_RB15_AS_DIG_OD_OUTPUT() makró a következó beállításokat tartalmazza:

_CN11PUE = 0;    //RB15 belső felhúzás letiltása
_OCDB15=1;       //Nyitott nyelőelektródás mód beállítása
_TRISB15=0;       //RB15 kimenet legyen
 _PCFG9 = 1;       //RB15 analóg funkció tiltása

A CONFIG_RB15_AS_DIG_OUTPUT() makró nagyon hasonló, csak a nyitott nyelőelektródás kimeneti mód letiltásával különbözik. A makró a következó beállításokat tartalmazza:

_CN11PUE = 0;    //RB15 belső felhúzás letiltása
_OCDB15=0;       //Nyitott nyelőelektródás mód letiltása
_TRISB15=0;       //RB15 kimenet legyen
 _PCFG9 = 1;       //RB15 analóg funkció tiltása


Hardver követelmények:
Megjegyzések:
A program listája az alábbi ábrán látható. A szerzői jogi nyilatkozat a ledflash.c program fejlécében található.

3. lista: A ledflash.c program listája
#include "pic24_all.h"

int main(void) {
  configClock();         //Az órajel generátor beállítása
  CONFIG_HB_LED();       //Az "életjelző" LED  konfigurálása
  HB_LED = 0;            //Kezdetben a LED legyen kikapcsolva
  while (1) {
    DELAY_MS(250);       //elegendő hosszúságú késleletés, hogy lássuk a villogást
    HB_LED = !HB_LED;    // Átbillenti LED1 állapotát
  }
}

A főprogram elején a mikrovezérlő oszcillátorának inicializálása és az életjelző LED-et meghajtó kimenet beállítása történik. A while(1) végtelen ciklusban egy 250 milliszekundumos késleltetés (a DELAY_MS() késleltető eljárás definíciója az include/pic24_delay.h állományban található) és a LED-et vezérlő kimenet állapotának átbillentése található.

LED villogtatás - makrók nélkül

A mintaprogramok között található a LED villogtató programnak egy másik, "fapados" változata is, amelyik nem használja a port konfiguráló makrókat. A ledflash_nomacros.c program a DELAY_MS() eljárást sem használja, hanem egy kétszeresen egymásba ágyazott ciklussal "múlatja az időt".

4. lista: Késletetés for ciklusokkal
//Egy naív szoftveres késleltető eljárás
void a_delay(void) {
  uint16 u16_i,u16_k;
// A számok módosításával változtathatjuk a késleltetés mértékét
  for (u16_k=1800; --u16_k;) {
    for (u16_i = 1200; --u16_i;);
  }
}

A főprogram inicializáló részében az alábbi néhány sor magyarázatra szorul:

5. lista: Az RB15 kimenet nyitott nyelőelektródás módba történő kapcsolása
#ifdef _ODB15         //PIC2F mikrovezérlők esetében
  _ODB15 = 1; 
#else                 //PIC2H és dsPIC33 mikrovezérlők esetében
  _ODCB15 = 1; 
#endif
Az #ifdef, #else és #endif szerkezet a fordítónak szól, és feltételes fordítást ír elő. Hatására ha az _ODB15 szimbólum definiálva van (a PIC24F mikrovezérlőknél így hívják az RB15 kimenet nyitott nyelőelektródás üzemmódját engedélyező bitet), akkor az _ODB15 = 1; utasítás fordul be a programunkba, ha pedig nincs definiálva (PIC24H, vagy dsPIC33 esetén), akkor pedig az _ODCB15 = 1; utasítás.

Hardver követelmények

Megjegyzések:
6. lista: A ledflash_nomacros.h program listája
#include "pic24_all.h"
///--- Egy naív késleltető eljárás ------
void a_delay(void) {
    uint16_t u16_i,u16_k;
// --- Módosítsa az alábbi számokat a késleltetés megváltoztatásához
    for (u16_k=1800; --u16_k;)
    {
        for (u16_i = 1200 ; --u16_i ;);
    }
}

int main(void) {
    configClock();          //az oszcillátor konfigurálása
/********** GPIO konfigurálás **********/
#ifdef _ODB15               //PIC24F vezérlőknél így nevezik (ODCB15 helyett)
    _ODB15 = 1;             //nyitott nyelőelektródás üzemmód beállítása
#else
    _ODCB15 = 1;            //PIC24H esetében pedig ODCB15 a neve...
#endif
    _TRISB15 = 0;           //RB15 legyen kimenet
    _LATB15 = 0;            //RB15 kezdetben legyen alacsony
    while (1) {             //végtelen ciklus
      a_delay();            //a késleltető eljárás hívása
      _LATB15 = !_LATB15;   //az RB15 állapotának átbillentése
    } // a while (1) ciklus vége
}