A PIC24H kísérleti áramkör
A fejezet tartalma:- Fontos tudnivalók
- Támogatott hardver platformok
- A kísérleti áramkör
- Építési tanácsok
- Kommunikáció a számítógéppel
- A PIC-ador kártya
- Bootloader és letöltő program
- MPLAB IDE és a C30 fordító
- LED villogtató program - I. változat (loop1.c)
- A program beégetése és futtatása
- LED villogtató program - II. változat (loop2.c)
- PIC24 perifériakezelő programkönyvtár és mintaprogram gyűjtemény
- Port konfiguráló makrók
- Újabb LED villogtatás - használjuk a makrókat (ledflash.c)
- LED villogtatás - makrók nélkül (ledflash_nomacros.c)
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 lentebb ismertetett PIC-kwik kísérleti áramkör (HARDWARE_PLATFORM = DEFAULT_DESIGN)
- PIC-ador kártya (HARDWARE_PLATFORM = DEFAULT_DESIGN)
- mini-Bully kártya (HARDWARE_PLATFORM = DEFAULT_DESIGN)
- Microstick kártya (HARDWARE_PLATFORM = MICROSTICK)
- Microstick Plus kiegészítő kártya (HARDWARE_PLATFORM = MICROSTICK_PLUS)
- 16-pin 28-pin Starter Board fejlesztői kártya (HARDWARE_PLATFORM = STARTER_BOARD_28P)
- Explorer 16 kártya (HARDWARE_PLATFORM = EXPLORER16_100P)
- Dangerous Prototypes Web Platform (HARDWARE_PLATFORM = DANGEROUS_WEB)
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).
![]() |
![]() |
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.

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.

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:
- 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.
- 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
- A 2. ábrán bemutatott kísérleti áramkör PICkit2 programozóval, vagy Microstick
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 Project menüben válasszuk a Project Wizard-ot, majd a felbukkanó ablakban kattintsunk a Tovább gombra!
- A Device mezőben válasszuk ki a PIC24HJ128GP502 mikrovezérlőt (vagy amilyen kikrovezérlőt használunk: pl. Microstick esetén PIC24HJ64GP502), majd kattintsunk a Tovább gombra!
- Az Active Toolsuite mezőben válasszuk a "Microchip C30 Toolsuite"-ot, majd Tovább!
- A Create New project lapon kattintsunk a Browse (tallózás) gombra, majd keressünk egy alkalmas helyet az új projektnek (pl. C:\PIC24) és adjunk nevet az új projektnek (pl. loop1)! Tovább...
- Nem adunk hozzá forrásállományokat! Tovább...
- Kattintsunk a Befejezés gombra!
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:
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:
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
- A 2. ábrán bemutatott kísérleti áramkör PICkit2 programozóval, vagy Microstick
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:
- Ha például a mintaprogramokat az MPLAB szimulátorában akarjuk futtatni, akkor definiálni kell a SIM szimbólumot, ellenkező esetben a program végtelen ciklusba kerül az óra beállításánál!
- Ha nem akarunk bootloadert használni, hanem pl. a PICkit2 programozóval égetjük be a programot, akkor csak annyi a teendő, hogy a mintaprogram projektjéből ki kell venni a letöltő programhoz való linker állományt! (Jobb egérgombbal kattintás a .gld állomány nevére, majd Remove menüpont választása a felbukkanó menüben)
Mit nyújt nekünk a támogatói programkönyvtár?
- Konfigurációs bitek beállítását
- Órajel generátor konfigurálását (alapértelmezetten a belső oszcillátor és PLL használatával)
- Életjelző LED konfigurálását és kezelését
- Soros port konfigurálását a számítógéppel való kommunikációhoz
- Fejlesztői támogatást (késleltető rutinok, általános adattípusok, I/O port konfiguráló makrók, hibavizsgálat és hibajelző modul, MCU-PC bináris adatforgalmi protokol hibakereséshez)
- A perifériák kezelését támogató függvényeket és makrókat (ADC, DMA, CAN, flash memória, timer, UART, I2C, SPI)
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_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".
- A támogatott fejlesztői áramkörök többségénél az RB15 kimenetre csatlakozik az "életjelző LED". Az alapértelmezett áramkörök esetében ezt a kimenetet nyitott nyelőelektródás üzemmódba kapcsoljuk, s a tápfeszültség-jelző LED1 és az áramkorlátozó ellenállás közös pontjára csatlakoztatjuk (lásd a 2. ábrán bemutatott kapcsolási rajzon). Amikor a B regiszter 15. bitjébe nullát írunk, akkor az RB15 kimenet lehúzza LED1 anódját alacsony szintre (a LED nem világít). Amikor a B regiszter 15. bitjébe '1'-et írunk, akkor az RB15 kimenet lebegő (magas impedanciájú) állapotba kerül a nyitott nyelőelektródás üzemmód miatt, s a LED bekapcsol a VDD-re csatlakozó felhúzó ellenállás révén. Az RB15 kimenettel tehát villogtathatjuk a LED-et.
- A 16-bit 28-pin Starter Board esetében mindegy, hogy az RB15 kimenet nyitott nyelőelektródás, vagy nem, ugyanis a LED az aktív lehúzáskor gyullad ki. Ezért az egyszerűség kedvéért ugyanúgy kezeljük az életjelző LED-et ezen a kártyán, mint az alapértelmezett kísérleti áramköröknél.
- A Microstick és a Microstick Plus esetében azonban az eltérő áramköri kialakítás miatt nem nyitott nyelőelektródás, hanem ellenütemű üzemmódot kell használnunk (aktív felhúzás kell a LED kigyújtásához).
- Hasonló a helyzet az Explorer 16 és a Dangerous Prototypes Web Platform esetében is (ezeknél is ellenütemű kimeneti módot használunk), viszont ezeknél a LED nem az RB15 kimentre csatlakozik.
| 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 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:
_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:
_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:
- Támogatott hardver platform. Ilyen a PIC-kwik kísérleti áramkör, PIC-ador, mini-Bully, Microstick, Microstick Plus és a 16-pin 28-pin Starter Board, Explorer16, Dangerous Web Platform.
- Ha másképp nem rendelkezünk, az alapértelmezett órajel PIC24H és dsPIC33 mikrovezérlők esetén a belső órajelgenerátorból származtatott Fosc = 80 MHz lesz (az utasításfrekvencia FCY = Fosc/2 = 40 MHz), a PIC24F mikrovezérlők esetén pedig Fosc = 32 MHz, FCY = 16 MHz. A PIC24 támogatói programkönyvtár késleltető eljárása automatikusan figyelembe veszi az órajel frekvencia különbségeit, a PIC24F mikrovezérlőkön sem lesz lassabb lesz a villogás üteme.
- Ez a program PICkit2 (vagy más, hasonló) programozóval közvetlenül is beégethető. Ebben az esetben fordítás előtt vegyük ki a projektből a linker (.gld kiterjesztésű) állományt. Ha pedig bootloaderrel ellátott fejlesztői kártyát használunk, akkor fordítás előtt vegyük fel a projektbe a mikrovezérlőnköz illeszkedő linker (.gld kiterjesztésű) állományt, a PIC-kwik projekt lib/lkr mappájából!
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
- A program a közzétett formában csak a PIC-kwik kísérleti áramkörön (lásd 2. ábra), vagy a PIC-ador, mini-Bully, és 16-bit 28_pin Starter Board fejlesztői kártyákon fut.
- Microstick vagy Microstick Plus kártya esetén hagyjuk ki, vagy tegyük megjegyzésbe az RB15 kimenetet nyitott nyelőelektródás módba kapcsoló programrészt (lásd 5. lista)!
- Az Explorer 16 vagy a Dangerous Prototypes Web Platform esetében is ki kell hagyni az 5. llistán látható programrészt, s az összes _TRISB15, _LATB15 hivatkozást ki kell cserélni a fenti táblázat szerint (pl. az Explorer 16 kártya esetén _TRISA7-re és _LATA7-re, a Web Platform kártya esetén pedig _TRISA8-ra, illetve _LATA8-ra). Ez a bonyodalom jól mutatja a hardverkülönbségeket kiegyenlító makrók hasznosságát!
- Ha másképp nem rendelkezünk, az alapértelmezett órajel PIC24H és dsPIC33 mikrovezérlők esetén a belső órajelgenerátorból származtatott Fosc = 80 MHz lesz (az utasításfrekvencia FCY = Fosc/2 = 40 MHz), a PIC24F mikrovezérlők esetén pedig Fosc = 32 MHz, FCY = 16 MHz. Mivel a késleltető ciklusoknál nem vettük figyelembe az órajel frekvencia esetleges különbségét, a PIC24F mikrovezérlőkön 2,5-szer lassabb lesz a villogás üteme.
- Ez a program PICkit2 (vagy más, hasonló) programozóval közvetlenül is beégethető. Ebben az esetben fordítás előtt vegyük ki a projektből a bootloaderhez illeszkedő linker (.gld kiterjesztésű) állományt. Ha pedig bootloaderrel ellátott fejlesztői kártyát használunk, akkor fordítás előtt vegyük fel a projektbe a mikrovezérlőnköz illeszkedő linker (.gld kiterjesztésű) állományt, a PIC-kwik projekt lib/lkr mappájából!
#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
}


