Začínáme s dsPICem

Miniseriál o procesorech dsPIC určený pro zájemce z řad úplných začátečníků.

Začínáme s dsPICem (1) - úvod

dsPIC je poměrně výkonný 16ti bitový Digitální Signální Procesor (DSP) firmy Microchip. Cílem této mojí minisérie článečků je předat zájemcům informace posbírané z různých zdrojů Internetu tak, aby se jim s těmito procesory začínalo co nejjednodušeji.

Podíváte-li se na stránky firmy Microchip, pak zjistíte, že vyrábí hned tři rodiny výkonných 16ti bitových procesorů až do výkonu 40MIPS (Mega Instructions per Second).

V těchto článečcích se zaměřím na procesory z rodiny PIC30, ale většina informací je velmi podobných i pro ostatní rodiny.

Který procesor tedy vybrat? Odpověď na tuto otázku záleží samozřejmě především na tom, kam směřuje naše snažení a co má nakonec procesor dělat. Pro prvotní pokusy a většinu jednoduchých aplikací ale doporučuji některý z typů vyráběných v pouzdru pro klasickou montáž (v tabulkách typů označeno PDIP). Není problém pro ně sehnal levné patice a je s nimi při ruční výrobě celkově daleko jednodušší manipulace než se součástkami pro povrchovou montáž.

Ovšem ani v případě, že je z jakýchkoliv důvodů nezbytné použít některý z typů pro povrchovou montáž nenastává při promyšleném návrhu hardwaru problém, protože všechny obvody PIC se dají programovat sériově a při zachování určitých podmínek i přímo na desce v cílové aplikaci (říká se tomu In Circuit Programing (ICP)).

Já osobně mám rád součástky s malým počtem nožiček, takže jsem pro své pokusy zvolil nejvýkonnějšího člena rodiny PIC30 v 18ti vývodovém pouzdru dsPIC30F3012.

Blokové schéme procesoru Prohlédneme-li si blokové schéma obvodu (převzato z datasheetu) vypadá díky tomu, že máme tu čest s DSPéčkem na první pohled strašně složitě, ale pokud máme nějakou představu o tom, co a jak digitální signální procesor dělá, brzy se v něm zorientujeme. V obrázku jsem pro lepší orientaci jednotlivé části podbarvil.

Modře podbarvené části jsou uživateli nejblíže, protože představují vývody (nožičky integrovaného obvodu) a jim přiřazené funkce. Je třeba si hned na začátku uvědomit, že možnosti a funkce obvodu jsou skutečně bohaté a bylo by značně neefektivní, kdyby měl mít pro každou funkci samostatnou nožičku. Proto je na většině vývodů řada funkcí sdružena a teprve nastavením v programu se určí, co který vývod má konkrétně dělat. Například hned první vývod na pravé straně může zastávat některou z těchto funkcí:

Žlutě podbarvený blok představuje hardwarové moduly jednotlivých vstupně/výstupních jednotek. Vidíme zde například modul A/D převodníku, sériové rozhraní UART atd.

Zeleně jsem podbarvil podpůrné obvody, se kterými se uživatel může programově dostat do přímého kontaktu. Patří sem například watchdog časovač, řadič přerušení atd.

Červeně jsou podbarvené dostupné typy pamětí. Patří sem paměť programu Flash, paměť dat EEPROM, datová paměť typu RAM ale i 256 registrů v šestnácti sadách.

Paměť programu může být u všech výše uvedených tří rodin procesorů PIC programována dvěma odlišnými způsoby.

Prvním z nich je osvědčená metoda ICSP In Circuit Serial Programming, která fungovala i u starších rodin procesorů PIC. Programování se provádí za pomoci pěti vodičů (Vcc, Vss, data, hodiny a Vpp) a pokud je zapojení aplikace navrženo vhodně, dá se provádět až přímo na desce osazené procesorem. Poslouží k tomu téměř libovolný sériový programátor jednočipových mikroprocesorů, ať už profesionální nebo postavený amatérsky podle některého z návodů na Internetu.

Druhou metodou je RTSP Real-Time Self-Programming. Tato metoda umožňuje zapisovat do paměti programu přímo samotným programem, který v procesoru běží. Program tedy například může klidně přepsat sám sebe. V praxi se toho využívá spíše tak, že se metodou ICSP do procesoru nahraje malý zavaděč, který je schopen zbytek programového vybavení sám zapsat metodou RTSP bez nutnosti mít programátor.

Fialově je podbarvené samotné jádro procesoru. Protože se jedná o DSP, musí toto jádro vedle běžné ALU obsahovat i výkonnou jednotku násobení a dělení a adresní generátory (AGU).

Zbylé moduly bez podbarvení jsou podpůrné bloky, se kterými uživatel nepřichází programátorskz téměř do styku.

Vzhledem k tomu, že jednotlivé vývody součástky mohou zastávat zpravidla jednu z několika funkcí, je třeba při návrhu schématu zapojení začít od nejméně standardních periférií, které mají vývody pevně dané (v našem případě například rozhraní I2C) přez periférie s možností volby (například u sériového portu UART je možno volit standardní nebo alternativní vývody). Obecnější periférie (například standardní digitální vstup/výstup nebo vstup A/D převodníku) pak umístíme na nožičky které zůstaly volné.

Začínáme s dsPICem (2) - hardware

V tomto článku najdete několik postřehů k návrhu jednoduché desky pro první pokusy s dsPICem.

Hodiny

Mikroprocesor je složitý sekvenční obvod, takže ke své činnosti potřebuje zdroj taktovacího signálu. Procesory dsPIC mají velmi propracovaný blok generování hodin s mnoha různými režimy činnosti. Každopádně instrukční cyklus procesoru trvá vždy čtyři takty hodinového signálu. Proto se také počet instrukcí za sekundu obvykle značí jako Fosc/4. Zdrojem kmitočtu pro taktování může být:

Je-li zdrojem kmitočtu primární oscilátor nebo vnitřní rychlý oscilátor, může být jeho kmitočet vynásoben PLL násobičkou 4x, 8x nebo 16x. Hodinový signál procesoru řady dsPIC30 může mít kmitočet maximálně 120 MHz (z čehož vychází maximální výkon procesoru 30 MIPS). Při použití PLL 16x na dosažení tohoto výkonu tedy stačí krystal o kmitočtu 7,5 MHz. V praxi se ovšem častěji používá krystal s kmitočtem 7,3728 MHz, se kterým procesor dosahuje maximálně 29,4912 MIPS. Výhodou tohoto zvláštního kmitočtu je jeho dělitelnost mocninami dvou (7372800 / 215 = 225) a z toho vyplývající snadné odvozování různých celočíselných kmitočtů vhodných například pro odvození přenosové rychlosti sériového rozhraní UART atd.

Proto doporučuji použít právě krystal 7,3728 MHz, který je běžně dostupný v obchodech se součástkami. Nezbytné dva kondenzátory mají mít podle datasheetu k tomuto krystalu hodnotu 22 pF.

Obvody resetování

Podobně jako obvody hodin i obvody resetování nabízí v procesoru dsPIC širokou škálu možností. Všechny možné zdroje resetu jsou v nich skombinovány do jediného signálu SYSRST, který pak vyvolá samotný reset součástky. Zdroje pro vyvolání SYSRST jsou následující:

To, který ze zdrojů reset fakticky způsobil, můžeme v programu zjistit podle obsahu registru RCON po vzniklém resetu. (První přečtení tento registr zároveň vynuluje, takže opakovaným čtením se už zdroj resetu nedozvíme.)

Z výše uvedeného je vidět, že pro běh procesoru není nutné se resetem příliš zabývat. Stačí vhodně nastavit konfigurační slovo tak, aby byla aktivní možnost POR a obvod se vždy po zapnutí zresetuje bez nutnosti dalších vnějších součástek. Druhým snadným řešením je připojit pin MCLR přímo na napájecí napětí a aktivace EXTR v konfiguračním slově. Ani jedna z těchto možností ovšem není příliš vhodná na desce určené pro hrátky s procesorem a ladění aplikací.

Přímým připojením MCLR na napájecí napětí si totiž zablokujeme možnost ICSP In Circuit Serial Programming, která tohoto pinu využívá pro vstup programovacího napětí Vpp = 13 V. Pokud je nutné použití MCLR a zároveň ICSP, musí se MCLR na napájecí napětí připojit přez vhodně zvolený rezistor nebo ještě o něco komplikovanějším obvodem viz doporučení v datasheetu.

Navíc na desce pro pokusy a ladění je velmi vhodné mít tlačítko umožňující pohodlný reset procesoru, kdykoliv je to potřeba. Navíc se externí reset dá využít v souvislosti s použitím zavaděče (bootloaderu) k ovládání resetu z počítače PC.

Sériový port

Na pokusné/vývojové desce s procesorem dsPIC je z několika důvodů velmi vhodné využít jeho sériový port (UART). Prvním důvodem je možnost využití bootloaderu. Ten umožňuje nahrávání programů do procesoru přímo z počítače PC aniž by musel být používán nějaký programátor. Cyklus překladu programu a jeho nahrání do součástky a spuštění se tak zkrátí na několik sekund. Dokonce se dá i zcela zautomatizovat (po odkliknutí překladu ve vývojovém prostředí se nejprve spustí kompilátor, pak linker a pak bootloader, který si sám procesor zresetuje (viz minulý odstavec), nahraje do něj novou verzi softwaru a provede jeho spuštění).

Druhým důvodem k použití sériového portu je možnost komunikace s počítačem PC přímo za běhu vyvíjeného programu. Tato možnost se nevylučuje se současným využitím portu pro bootloader a velmi zpříjemní ladění programů, protože si z nich můžeme do PC posílat například různé chybové hlášky atd.

Procesory dsPIC mají možnost volby vstupu a výstupu rozhraní UART mezi standardními a alternativními piny, takže pravděpodobnost konfliktu sériového portu s jiným specializovaným vstupem/výstupem je minimální.

Vstupně/výstupní piny procesoru dsPIC samozřejmě používají běžné logické úrovně TTL logiky. Proto je potřeba pro realizaci sériového rozhraní s PC desku osadit některým z běžně používaných převodníků úrovní RS232, například známý obvod MAX232.

Vstupy a výstupy

Pokusnou desku je vhodné osadit nějakými vstupními a výstupními periferními zařízeními. Zde již samozřejmě hodně záleží na vyvíjené aplikaci. Pokud se jedná o desku čistě na hraní si s procesorem, doporučuji alespoň jeden vstup opatřit tlačítkem a alespoň jeden výstup LED diodou. Vzhledem k tomu, že se jedná o digitální signální procesor, je velmi pravděpodobné, že se budete zabývat vývojem nějaké DSP aplikace. V takovém případě je samozřejmě vhodné využít i A/D převodníků a případně desku doplnit některým sériovým D/A převodníkem s rozhraním SPI nebo I2C.

Na mojí vývojové desce je vstup RD0 opatřen tlačítkem (pozor RD0 nemá vnitřní pull-up rezistor a je tedy potřeba ho zrealizovat externí součástkou). Dvoubarevná LED dioda je pripojena na výstupy RB6 a RB7.

Příklad pokusné desky

Schéma nejjednodušší pokusné desky

Na tomto schématu (po kliknutí se zobrazí velký obrázek) je příklad jednoduché pokusné desky s procesorem dsPIC30f3012. Pro zpřehlednění jsou jednotlivé oblasti podbarveny:

Začínáme s dsPICem (3) - bootloader

V tomto článku se podíváme na to, jak funguje bootloader (zavaděč programu) a co vše je potřeba udělat pro jeho zprovoznění na procesorech dsPIC.

Pokud nějaké zařízení obsahuje jednočipový mikroprocesor, musí tento procesor být také vybaven softwarem, aby mohl vůbec vykazovat nějakou činnost. Takovému specializovanému softwaru obvykle říkáme firmware. Je to proto, že ho zpravidla vyvíjí a do procesoru instaluje přímo firma vyrábějící dané zařízení a samotný uživatel s tím nemá nic společného. Dříve tomu tak skutečně bylo a změna firmwaru uloženého zpravidla v paměti EPROM se dala realizovat jen ve specializovaných servisech takových elektronických zařízení.

V době rozvinutého Internetu a stále výkonnější elektroniky jsme si už ale zvykli na to, že čím dál větší počet zařízení (základní desky počítačů, PDAčka, digitální fotoaparáty, mobilní telefony atd.) nabízí možnost si z Internetu stáhnout nejnovější verzi firmwaru a bez nutnosti navštěvovat servisní středisko si ho do zařízení jednoduše nahrát.

Jak takový upgrade firmwaru funguje? Především musí být firmware v nějaké čistě elektricky přeprogramovatelné paměti (paměť typu EPROM bylo nutné před programováním mazat UV světlem). Další podmínkou je, že zařízení musí mít někde uložený jednoduchý program, který dokáže nový firmware odněkud natáhnout a nahrát na správné místo paměti. Způsobů, jak se toto řeší existuje více. Například nový BIOS pro motherboardy počítačů se zpravidla nahrává pomocí malého programu zavedeného z diskety, různé síťové prvky jako routery atd. mívají nahrávání řešeno pomocí ovládacího webového rozhraní prostřednictvím sítě, USB zařízení bývají řešena tak, že se někam na USB disk uloží příslušný soubor a na zařízení se jen aktivuje update a podobně to mívají zařízení, do kterých se vkládá nějaká paměťová karta.

Řešení u procesorů PIC

U procesoru dsPIC lze update firmwaru řešit například napsáním malého prográmku, tzv. bootloaderu, kterému je schopna nový firmware poslat po sériovém portu odpovídající aplikace z počítače PC. Prohledáme-li Internet, zjistíme, že bootloaderů pro procesor dsPIC existuje hned několik a dokonce jsou k dispozici zdarma, takže takovou dvojici programů (PIC - počítač PC) nemusíme vymýšlet, stačí jen do procesoru nahrát PICovou část a na počítači spustit tu počítačovou. Samozřejmě bootloader sám sebe do procesoru dostat neumí, takže nezbývá než ho tam nahrát klasickým programátorem.

Některé dostupné bootloadery

Microchip

První bootloader najdeme přímo na stránkách výrobce dsPICu firmy Microchip. Je popsaný v Application Note AN1094 a můžete si ho odtamtud stáhnout samozřejmě včetně zdrojových kódů. Bootloader je určen pro všechny procesory PIC, které umí přepisovat paměť programu, tedy všechny členy rodiny PIC24, PIC30 a PIC33. Data se posílají sériovým portem.

Pro zajímavost firma Microchip má také verzi bootloaderu pro procesory, vybavené sběrnicí CAN (popisuje to AN247 a AN851). Tato sběrnice se používá zejména v moderních automobilech pro propojení jednotlivých elektronických zařízení, takže je pak možné nahrávat firmware nějakého zařízení zabudovaného v autě, aniž by bylo potřeba ho vymontovávat.

Ingenia

Další bootloader nabízí španělská firma Ingenia, která se zabývá výrobou zařízení pro řízení motorů. Také jejich bootloader se dá stáhnout se zdrojovým kódem části pro procesor dsPIC. Část pro Windows se dá také stáhnout, ale již jen bez zdrojových kódů. Tento bootloader má velmi pěkně propracovanou Windowsovou část, automatickou detekci rychlosti sériového portu a přehlednou dokumentaci. Nicméně část pro porcesor dsPIC je zbytečně velká.

Tiny bootloader

Třetím a dle mého soudu nejlepším bootloaderem je Tiny Bootloader jakéhosi rumunského amatérského autora. Je velmi jednoduchý, dobře promyšlený a jak jeho název napovídá opravdu velmi malý. V paměti procesoru PIC totiž zabírá pouhých 100 instrukcí! Rozhraní pro počítač je sice na pohled jednodušší, ale skýtá všechny potřebné funkce, a je pro uživatele velmi příjemné.

Jak bootloader funguje?

Poslední výkonné rodiny procesorů PIC mají možnost programování RTSP (Run-Time Self-Programming), a proto bootloader může být normální spustitelný program sídlící v části paměti programu, kterou sám přepisuje metodou RTSP. Samozřejmě si nesmí "pod sebou podřezat větev" tím, že by se sám přepsal.

Nejjednodušší způsob, jak toto ošetřit je umístit bootloader až na úplný konec paměti programu. V případě Tiny bootloaderu tam tedy zabírá posledních 100 instrukcí a proto maximální velikost našeho uživatelského programu, který budeme do procesoru chtít nahrávat bude muset být o těchto 100 instrukcí kratší, než kolik maximálně umožňuje daný typ procesoru. Toto je vpodstatě jediná nevýhoda použití bootloaderu. Ovšem vzhledem k tomu, že procesory dsPIC mají paměť pro cca 4000 nebo 8000 instrukcí, není toto omezení nikterak závažné.

Dobrá, bootloader tedy leží na konci paměti programu. Ale jak ho tam spustit? Jedinou možností, jak v procesorech dsPIC spustit po resetu program je umístit na adresu 0x000000 instrukci GOTO <adresa jeho začátku>. Tím tedy máme zajištěno spuštění bootloaderu po resetu procesoru PIC.

Organizace paměti s bootloaderem Problém je ovšem v tom, že jakmile bootloaderem nahrajeme do procesoru svůj vlastní program, budeme chtít aby se po resetu spustil právě on. Pokud přepíšeme pozici 0x000000 vlastní instrukcí GOTO, spustíme sice hravě náš program, ale už se nám těžko podaří někdy v budoucnu znovu spustit bootloader.

Naštěstí tento problém, jak ilustruje obrázek, Tiny bootloader řeší elegantním způsobem. Pro "uživatelskou" instrukci GOTO má vyhraženu poslední paměťovou pozici před svým začátkem. Instrukce na adrese 0x000000 tedy vždy skáče na bootloader. A teprve bootloader po uplynutí nějakého časového intervalu, kdy se nic neděje, skočí na adresu těsně před svým začátkem, kde je instrukce GOTO <uživatelský program>. O to, aby se adresa startu správně přesunula (z pozice 0x000000 na pozici těsně před bootloader) se navíc stará windowsovská část bootloaderu, takže při vývoji naší aplikace na to vůbec nemusíme myslet a kompilujeme jí tak, jako by v procesoru žádný bootloader nebyl (pouze s omezením velikosti viz výše. Také pokud se třeba po vlastním vývoji rozhodneme aplikaci do procesoru nahrát klasickým programátorem již bez bootloaderu, bude bez nutnosti jakéhokoliv zásahu nebo překompilace ihned fungovat.

Příprava bootloaderu

Bootloadery jsou na Internetu k dispozici ve zdrojovém kódu nejen proto, aby uživatel věděl, co si vlastně do procesoru nahrává, ale i proto, že je zpravidla potřeba je před nahráním přizpůsobit použitému typu procesoru a cílové aplikaci, a teprve takto upravené zkompilovat a do PICa programátorem naprogramovat.

Parametry, které je třeba upravit u Tiny bootloaderu jsou následující:

Kmitočet krystalu, režim hodin a další konfigurační registry

Procesory dsPIC umožňují v režimu RTSP i zápis do konfiguračních registrů procesoru. Není to ale úplně triviální postup a kód bootloaderu by se jeho umožněním zbytečně prodlužoval. Navíc by to byla operace dost nebezpečná, protože například právě přepsání hodnot režimu činnosti oscilátoru (ale i jiných nastavení konfiguračních registrů) by mohlo bootloader zcela znefunkčnit. Z těchto důvodů Tiny bootloader možnost pozdější změny konfiguračních registrů v rámci uživatelského programu nemá implementovanou.

Proto je třeba nejdříve rozmyslet jak budou konfigurační registry nastaveny v cílové aplikaci, a právě tak je nastavit přímo ve zdrojovém kódu bootloaderu.

Pozn.: Přenastavení konfiguračních registrů v uživatelské aplikaci je bootloaderem prostě ignorováno, takže žádné pozdější nebezpečí nehrozí.

Přenosová rychlost sériového portu a použité piny

Varianty propojovacích kabelů Je vhodné nastavit dostatečně rychlý přenos, aby programování procesoru netrvalo dlouho. Na druhé straně příliš rychlý přenos má větší nároky na kvalitu použitého kabelu, jeho délka nesmí být velká a přenos může snadněji podlehnout vnějšímu rušení. Jako rozumný kompromis volím obvykle přenosovou rychlost 38 400 Bd.

Je třeba si také uvědomit, že přenosová rychlost je odvozena z kmitočtu hodinového signálu, Proto konstanty na začátku zdrojového kódu týkající se kmitočtu musí být nastaveny skutečně podle reality.

Alternativní piny sériového portu se, pokud je to potřeba, přepnou odkomentováním (odstraněním středníku na začátku) jediné instrukce ve zdrojovém kódu:

;    bset    U1MODE, #ALTIO    ;use alternate Tx/Rx lines

Na obrázku vlevo jsou dvě varianty sériového kabelu. Na straně počítače je na kabelu vždy samice, na straně desky je logičtější samec (spodní obrázek). V takovém případě kabel propojuje pouze zem (pin 5) a piny TX a RX (piny 2 a 3). Chcete-li použít možnost resetu prostřednictvím bootloaderu, je třeba navíc připojit pin 7 (RTS). Na obrázcích je toto propojení znázorněno čárkovanou čarou.

Na straně PC nezapomeňte na konektoru propojit piny 1, 6 a 4 a také piny 7 a 8.

Timeout bootloaderu

Timeout bootloaderu je čas, který uplyne od doby resetu procesoru do doby, kdy bootloader skočí do uživatelského programu. Během tohoto času musíme aktivovat windowsovskou část bootloaderu, aby došlo k přenosu nového souboru do procesoru. Pokud zvolíme dlouhý timeout, budeme mít sice hodně času na "kliknutí ve windowsech", ale na druhou stranu po každém resetu dsPICa budeme zbytečně čekat na spuštění našeho programu.

Timeout můžeme výrazně zkrátit díky tomu, že i windowsovská část bootloaderu má svůj timeout, po který se snažií skontaktovat s bootloaderem v procesoru. Nahrávání nového firmwaru se pak provádí tak, že se nejprve klikne ve windowsech a teprve pak se zresetuje PIC, který okamžitě skočí do bootloaderu a s windowsy se skontaktuje téměř ihned. Proto timeout může být velmi krátký.

Ještě lepší možností je využití signálu RST k resetu procesoru přímo z bootloaderu ve windows těsně po kliknutí na jeho nahrávací tlačítko.

 

Celý bootloader si nahrajte ze stránek autora upravte podle potřeb a zkompilujte. Pokud jste úplní začátečníci a nevíte si s úpravou a překladem příliš rady, můžete navíc použít níže vystavený soubor obsahující pouze zdrojový kód a přeložený hex soubor pro následující konfiguraci:

 

PřílohaVelikost
bootloader.zip9.05 KB

Začínáme s dsPICem (4) - pojďme si zablikat - Assembler

Pokud se učíme nějaký programovací jazyk, v jedné z prvních lekcí zpravidla narazíme na aplikaci "Hello, World". Ta pochází z dílny jednoho z autorů programovacího jazyka C Briana Kernighana a prostě na obrazovku vypíše nápis přeložitelný do češtiny jako "Ahoj světe". U jednočipových procesorů zpravidla nemáme displej umožňující vypsání takového textu a i pokud ho tam máme, jeho zprovoznění rozhodně nepatří k triviálním úlohám vhodným pro úplné začátečníky. V oblasti jednočipů se proto místo aplikace "Hello, World" obvykle používá jako první programátorský pokus obyčejné blikání LED diodou. A přesně to je předmětem tohoto článku.

Zadání

Máme-li zprovozněnou pokusnou desku s bootloaderem, nic nám nebrání se vrhnout na skutečné programování a dělání pokusů s procesorem dsPIC. V tomto článku popíši program jednoduše blikající jednou ze dvou LED diod podle toho zda je či není zmáčknuté tlačítko. Pokud nemáte na své desce tak "bohatý" hardware, nezoufejte. Program bude fungovat i na desce, kde k procesoru není připojeno z periférií nic mimo jediné LED diody. Samozřejmě pak ale nebude možné žádné přepínání diod.

Diodami si zablikáme jak pomocí assembleru tak i jazyka C, abychom si ukázali, kde jsou odlišnosti respektive spíše, jak velmi podobné oba programy jsou. Než se dostaneme k vlastním programům, nejprve si řekneme jak nainstalovat potřebné vývojové prostředí a vytvořit v něm první projekt.

Instalace produktů MPLAB

Naštěstí nástroje pro vývoj aplikací pro procesory PIC (včetně našeho dsPIC) nabízí přímo firma Microchip. Assembler a celé integrované vývojové prostředí je zcela zdarma a kompilátor jazyka C je zdarma ve studentské verzi. Ta funguje neomezeně dlouho, pouze po 30 dnech činnosti přestane překládaný kód optimalizovat, což nám při našich pokusech ve většině případů opravdu nebude vadit. Vše potřebné nejprve stáhneme z Internetu ze stránek Microchipu. Odkaz na stránku s downloadem IDE (Integrated Development Environment) je hned na hlavní stránce Microchipu pod názvem MPLAB IDE. V době psaní tohoto článku je tam stabilní verze 7.60A a verze ve vývoji 7.62. Obě jsou zabaleny v zip souboru o velikosti cca 50MB a je celkem jedno, ketrou z nich si stáhneme.

Studentská edice kompilátoru jazyka C30 se musí stáhnout zvlášť. Procházením stránek Microchipu se hledá velmi těžko, ale pokud zadáte do okénka search: C30 Student Edition, najdete ji během několika sekund. V době psaní článku tam je verze 2.30 v zapakovaném exe souboru majícím cca 12MB.

Po stažení všeho potřebného nainstalujeme nejprve MPLAB IDE (doporučuji v instalaci jen odklikávat přednastavené hodnoty) a potom podobným způsobem doinstalujeme kompilátor C30. Pokud necháte během instalace všechny cesty tak, jak jsou Vám nabídnuty instalátorem, kompilátor C30 bude do MPLABu vinstalován na správné místo.

Blikáme assemblerem

Zde si tedy vyzkoušíme zablikat z jazyka assembler, v dalším článku pak z jazyka C. V souboru ZIP přibaleném na konci článku najdete soubor blikame.s to je zdrojový kód programu pro blikání napsaný v assembleru pro dsPIC. Převzal jsem ho ze stránek Microchipu a provedl v něm pouze minimální změny. Přeložil a doplnil jsem komentáře, aby byl soubor pro začátečníka co nejpřehlednější.

Na vhodném místě na disku si vytvořte složku, do které budete ukládat veškeré programy pro dsPICa a do ní vytvořte složku s názvem třeba BlikAsm. Do této složky ze zipu vybalte soubor blikasm.s.

Poznámka: Soubory s assemblerem mají u kompilátoru MPLAB standardně příponu .s (od slova Source).

Než kód poprvé zkompilujeme, je potřeba v prostředí MPLAB vytvořit takzvaný projekt. Účelem projektu je sdružit všechny potřebné zdrojové soubory, přiřadit k nim konkrétní typ procesoru, použité jazykové nástroje (některé projekty například mohou obsahovat části kódu psané v jazyku C a části v assembleru) a nastavit konfigurační registry procesoru atd.

Protože základní vytvoření projektu je mechanická opakující se činnost, s výhodou ji můžeme realizovat průvodcem. Případné jemné nuance, které není možno průvodcem nastavit, můžeme potom kdykoliv doladit ručně, ale ve velké většině případů to vůbec nebude nutné.

Spustíme MPLAB IDE a v menu Project vybereme Project Wizard... Objeví se uvítací stránka a my pokračujeme tlačítkem Další>.

Na další stránce vybereme požadovanou součástku, pro kterou budeme program kompilovat. Procesory jsou v seznamu dvakrát. Jednou pouze název a podruhé název s e na konci. Vybíráme název bez e, varianta s e je určena pro práci s emulátorem ICE4000 a pro umožnění jeho činnosti přesouvá některé části paměti (ovlivňuje funkci linkeru) a na reálném neemulovaném procesoru by program nefungoval. Pokračujeme tlačítkem Další>.

Na další stránce volíme balík jazykových nástrojů (kompilátor, linker a případně další nástroje). V našem případě zvolíme jako aktivní toolsuite Microchip ASM30 Toolsuite. Pak proklikáním nástrojů v seznamu Toolsuite Contents překontrolujeme zda jsou nastaveny správné cesty k nástrojům.

Poznámka: Pokud jsme při instalaci MPLAB neměnili žádné parametry, mělo by vše být nastaveno správně.

V dalším okně určíme pomocí tlačítka Browse... u Create project, kde bude náš projekt uložen (složka BlikAsm kterou jsme vytvořili dříve) a pojmenujem ho tím, že zvolíme název souboru třeba zase BlikAsm a necháme ho uložit. Tím se vrátíme na stránku Step Three a zde pokračujeme tlačítkem Další>.

Na stránce Step Four můžeme najít a do projektu přidat všechny soubory se zdrojovým kódem (v našem případe dříve uložený Blikame.s).

Poznámka: Pokud ve chvíli tvorbu projektu ještě žádný zdrojový kód nemáme napsaný, nic se neděje, jen pokračujeme tlačítkem Další>. Zdrojové soubory lze totiž přidávat kdykoliv v průběhu naší práce.

Okno vytvořeného projektu Nakonec nám MPLAB pouze oznámí, že bude vytvořen projekt a zároveň Workspace (pracovní prostor), do kterého bude projekt vložen. Průvodce ukončíme tlačítkem Dokončit.

Kupodivu pracovní plocha MPLABu pravděpodobně zůstane prázdná a šedivá. Ale stačí jít do menu View a kliknout tam na Project a uvidíme okno s naším novým projektem.

Všimněte si, kolik typů souborů může projekt zahrnovat a že pod zdrojovými soubory (Source Files) již je náš zdrojový soubor, který jsme vybrali v jednom z kroků průvodce. Pokud chceme některý ze souborů smazat, stačí ho označit myší a stisknout Delete. Pokud chceme naopak jakýkoliv soubor přidat, klikneme pravým tlačítkem na kontejner daného typu souboru (třeba Source Files) a zvolíme Add Files...

Kliknutím na záložku Symbols dole v okně projektu si můžeme přehledně zobrazit všechny námi definované symboly ve zdrojovém kódu. Pravděpodobně tam nyní nebude nic vidět, ale stačí pravým tlačítkem kliknout na BlikAsm.mcp v tomto okně, zvolit Update Tags Now a symboly se objeví.

Úprava zdrojového kódu

Vraťme se na záložku Files a dvojklikněme na název blikame.s. Otevře se okno editoru, ve kterém můžeme psát nebo upravovat naše programy. Vidíme, že editor příjemně barví různé části zdrojového textu, takže se v něm velmi pěkně orientujeme. Všimněte si, že řádky zdrojového programu týkající se hardwaru, tedy zapojení LED diod a tlačítka jsem v komentářích opatřil třemi hvězdičkami. Pokud máte hardware zapojený jinak než LED diody na pinu B6 a B7 a tlačítko na pinu D0, změňte tyto řádky podle Vašeho zapojení.

Je velmi vhodné (zejména pro začátečníka) si v sekci projektu Header Files otevřít příslušný include soubor použitého procesoru. Najdeme ho (pomocí Add Files...) ve složce c:\Program Files\Microchip\MPLAB ASM30 Suite\Support\inc a nese název podle použitého procesoru. Dvojkliknutím si ho otevřeme v editoru a můžeme se do něj při práci dívat na přesné názvy jednotlivých speciálních registrů procesoru a jednotlivých jejich bitů.

Po skončení práce na úpravách podle zapojení hardwaru je dobré z menu File/Save zdrojový soubor uložit.

Projekt je vytvořen, zdrojový kód upraven, ale než přistoupíme ke kompilaci, je třeba provést ještě další nastavení. Vybereme menu Project a v něm položku Build Options... a dále Project.

Na záložce Directories jen zkontrolujeme, že je zaškrtnuta úplně poslední volba dole Assemble/Compile/Link in project directory, která nám zajistí, že všechny soubory vznikající při překladu se budou ukládat do stejné složky, kde máme celý náš projekt. Ještě pro jistotu stiskneme tlačítko Suite defaults, které zajistí, že cesta pro hledání souborů include a library se nastaví na přednastavenou hodnotu prostředí MPLAB. Dialog uzavřeme tlačítkem OK a můžeme konečně zkusit projekt zkompilovat.

Překlad programu

Kompilace, respektive správně řečeno vybudování celého projektu se provede z menu Project pomocí volby Build All (klávesová zkratka Ctrl F10). Pokud jsme nikde neudělali chybu, měla by kompilace proběhnout (vytvoří se výstupní soubor s příponou .o, ale linkování zkolabuje chybovou hláškou podobnou této:

Skipping link step. The project contains no linker script. BUILD FAILED: Tue Oct 09 21:36:19 2007

To je způsobeno tím, že linker potřebuje vědět, jakými typy a velikostmi pamětí vybraný procesor disponuje, aby tam mohl kód a data správně rozmístit. Informujeme ho o tom prostřednictvím skriptu, který je pro každý procesor jiný.

V okně projektu klikněte pravým tlačítkem na Linker Script a zvolte Add Files... Skripty mají příponu .gld a pokud jsme při instalaci MPLABu nic neměnili, najdeme je ve složce c:\Program Files\Microchip\MPLAB ASM30 Suite\Support\gld. Skripty mají názvy totožné s názvy součástek a volíme opět variantu bez e na konci. Po stisku Ctrl F10 nebo menu Project/Build All... by již budování projektu mělo skončit úspěšně. V modré tabulce si můžete všimnout například velikostí, které program a data v procesoru zabírají. Ve složce projektu by měl vzniknout mimo jiné kýžený soubor s příponou .hex, což je přeložený program připravený k nahrání do procesoru.

Nahrátí do procesoru

Nahrávání pomocí bootloaderu Existují dvě cesty jak program do procesoru dostat. První možností je použití některého programátoru procesorů PIC. Druhou a daleko příjemnější cestou je nahrání pomocí bootloaderu (viz samostatný článek).

Používáme-li Tiny bootloader, je postup jednoduchý. Testovací desku připojíme k sériovému portu počítače kabelem. Zapneme její napájení a na počítači spustíme bootloader.

Vybereme v něm použitý sériový port. Jeho rychlost se musí shodovat s tou, pro kterou jsme samotný bootloader překládali. Provedeme reset procesoru na desce a ihned po tom klikneme na CheckPIC. Měl by se objevit nápis o nalezeném procesoru (viz obrázek vlevo).

Pomocí tlačítka Browse pak vybereme přeložený hex soubor. Zresetujeme procesor a ihned klikneme na Write Flash. Program se nahraje do procesoru a pokud jsme nikde neudělali chybu, hned se spustí, což poznáme podle blikající LED diody.

Pokud na vás dioda mrká svým okem, zkuste ještě stisknout tlačítko a měla by se rozmrkat druhá LEDka.

Nezbývá než si pogratulovat. Nejtěžší začátek máme za sebou. Teď už půjde práce jak na drátkách. Stačí nechat otevřený bootloader, Překliknout se do MPLABu, upravit zdrojový kód, stisknout F10 (případně Ctrl F10), přepnout se do bootloaderu, zresetovat procesor a kliknout na Write Flash. (Bootloader pozná, že má skompilovanou novou verzi hex souboru a nahraje automaticky právě ji).

Poznámka: Využijeme-li možnosti signálu sériového portu RST pro reset procesoru na desce (viz článek o bootloaderu), nemusíme pochopitelně před nahráváním programů procesor resetovat ručně, postará se o to samotný bootloader.

Náměty na procvičení

Zkuste program upravit tak, aby:

PřílohaVelikost
blikame.zip2.75 KB

Začínáme s dsPICem (5) - pojďme si zablikat - Céčko

Stejný úkol - jiné prostředky. V tomto článku si ukážeme, jak jednoduché blikání LED diodami pomocí procesoru dsPIC naprogramovat v jazyku C. Článek je výrazně stručnější než předchozí Pojďme si zablikat - Assembler, protože mnohé postupy jsou při práci v obou jazycích totožné.

Pro procesory dsPIC existuje několik překladačů jazyka C. V tomto a následujících článcích budu používat překladač C30 přímo od firmy Microchip. Překladač se dá ve studentské verzi stáhnout zdarma. Studentská verze funguje 30 dní plnohodnotně a pak přestane programy při překladu optimalizovat, takže mohou být poněkud méně efektivní než ty, které se přeloží ostrou verzí kompilátoru.

Instalace prostředí MPLAB a kompilátoru C30 je popsána ve výše uvedeném předchozím článku.

Vytvoření projektu

Pusťme se tedy rovnou do vytvoření potřebného projektu. I to je velmi podobné jako v případě assembleru. Vezmu ho tedy výrazně zkráceně. POkud někdo potřebuje detailnější popis, najde ho opět v předchozím článku.

Dokončíme průvodce a měli bychom vidět okno projektu velmi podobné tomu, které jsme viděli v příkladu s assemblerem. Samozřejmě i v tomto případě můžeme kdykoliv přidávat nebo odebírat libovolné zdrojové nebo hlavičkové soubory i soubory jiných typů.

Úprava kódu a překlad

Pokusíme-li se nyní zdrojový kód přeložit, dospějeme ke stejné chybě, jako v případě assembleru. Linker totiž musí přeložený kód umístit na správná místa správných paměti a k tomu potřebuje návod ve formě Linker Scriptu. Ten má opět příponu .gld, ale najdeme ho tentokrát ve složce c:\Program Files\Microchip\MPLAB C30\support\gld\. Název souboru se shoduje s názvem použité součástky a je bez písmena e na konci (ze stejných důvodů jako v minulém článku).

Než však kompilaci spustíte, upravte nejprve zdrojový kód podle konkrétního zapojení vašeho hardwaru. Místa kódu, které mají s umístěním hardwaru něco společného jsem pro větší přehlednost opět v komentářích opatřil třemi hvězdičkami ***.

Jak překlad vlastně funguje?

Disassembly listingMáme-li kód upravený, můžeme standardním způsobem pomocí menu Project/Build All spustit překlad. Jestliže jsme nikde neudělali chybu, měl by překlad proběhnout a výsledkem by měl být mimo jiné i kýžený HEX soubor pro nahrání do procesoru. Než ho tam nahrajeme, pojďme se ale nejprve podívat, jak vlastně kompilátor C30 funguje. Pokud si prohlédněme složku našeho projektu, zjistíme, že se v ní nenachází nic závratně zajímavého. Je tam soubor se zdrojovým kódem blikame-c.c, dále překladem vygenerovaný object soubor blikame-c.o, výsledný soubor s příponou *.hex a soubor s příponou *.cof poskytující informace potřebné pro debuging v prostředi MIcrochip ICE 4000.

Celé tajemství překladu totiž musíme hledat někde jinde a za normálních okolností se do souboru neukládá. Najdeme ho v menu MPLABu v položce View/Disassembly listing.

Z okna, které se nám otevře je jasně vidět, že překladač C30 zdrojový program přeloží pouze do jazyka assembler a odtud je kód již přeložen standardním způsobem.

Jak je vidět z přiloženého obrázku, překladač zachovává ve výpisu jak naše původní komentáře, tak i původní řádky zdrojového kódu v jazyce C (včetně jejich čísel), takže výpis je krásně čitelný. Může posloužit například v situaci, kdy potřebujeme některou kritickou část kódu optimalizovat až na úrovni jednotlivých instrukcí assembleru.

Pokud jste po nahrání hex souboru do procesoru obvyklým způsobem LEDky úspěšně rozblikali, nezbývá než si zadat pár úkolů k procvičení. A nebojte :^)), budou úplně shodné s úkoly z minulého článku, jen je teď budeme řešit v jiném programovacím jazyku.

Náměty na procvičení

Zkuste program upravit tak, aby:

P.S.

Tak ve kterém jazyce je programování dsPICa snazší? :-)))

 

 

 

 

 

PřílohaVelikost
blikame-c.zip2.23 KB