Chtěl bych se zde zmínit o dvou věcech, které jsem v předchozích prezentacích o procesorech PIC nenalezl. První věcí by bylo adresování pamětí a s ním spojené povinnosti programátora a za druhé popsat hardware programátoru a program na programování procesorů PIC.

Předcházející prezentace o procesorech PIC16F62X, PIC12C5XX, PIC16C5X, PIC16C71, Na těchto stránkách naleznete popis procesorů, jejich periférií.

Paměti

Paměť procesoru je rozdělena na dvě části, programovou a datovou paměť. Programovou paměť tvoří vnitřní paměť type EEPROM. Datová paměť je tvořena pamětí RAM a blokem datové paměti EEPROM.

Programová paměť

Programová paměť je organizována do bloků o velikosti 2k slov. Slovo programové paměti je u těchto typů procesorů 14bitů. Celková velikost paměti je buď 4k nebo 8k podle typu procesoru. Program automaticky začíná na adrese 0x0000 a vektor přerušení je na adrese 0x0004. Do programové paměti lze ovšem také speciálním způsobem zapisovat. Můžeme tak použít programovou paměť pro trvalejší uschování většího množství dat. Nebo můžeme napsat krátký obslužný program, který dovolí nahrát do programové paměti jiný program např. ze sériového portu nebo jiným způsobem.

Datová paměť RAM

Paměť dat je organizována do bloků o velikosti 128 bytů. Bloku 128 bytů dat říkáme banky. Procesor obsahuje vždy 4 banky. Spodní část každé banky je použita pro speciální funkční registry, které nastavují a řídí činnost procesoru a periférií. Zbytek banky je použit jako uživatelská paměť RAM. Velikost uživatelské paměti RAM je podle typu buď 192 nebo 368 bytů. U procesorů 876/877 je posledních 16 bytů každé banky společný všem bankám. To znamená, že můžeme k těmto 16 bytům přistupovat vždy a nezáleží na tom, ve které bance se právě nacházíme. Procesory typu 873/874 mají uživatelskou část banky 2 mapovanou na banku 0 a uživatelskou část banky 3 mapovanou na banku 1.

Datová paměť EEPROM

Velikost datové paměti EEPROM je 128 nebo 256 bytů. Zapisuje a čte se z ní pomocí zvláštních registrů.

Adresování programové paměti

Jak již bylo uvedeno programová paměť je rozdělena do bloků po 2k slovech a to určuje jistá pravidla pro volání programů a skoky mezi částmi kódu v různých 2k blocích paměti. Tyto pravidla se uplatní zejména při psaní rozsáhlejších programů. Způsoby správného adresování budou uvedeny dále. Programový čítač je 13bitový a to umožňuje adresovat programovou paměť velikosti 8k. Programový čítač je rozdělen do dvou registrů PCL a PCH. Registr PCL je jeden ze speciálních funkčních registrů a lze do něj přímo zapisovat a číst z něj. Registr PCH není paměťově mapovaný registr a nelze k němu přímo přistupovat. Všechny změny registru PCH ze dějí přes registr PCLATH, ovšem jen za určitých podmínek.

Volání podprogramu a skoky

Instrukce CALL volá podprogram a instrukce GOTO skáče na určitou adresu. Adresa na kterou procesor přejde je určena následujícím způsobem. V instrukci CALL a GOTO je uvedena adresa, kam má procesor skočit. Tato adresa je pouze 11bitová. To znamená, že pomocí této instrukce můžeme určit pouze relativní adresu uvnitř bloku 2k. Zbývající 2 nejvýznamnější bity jsou před skokem převzaty z registru PCLATH, konkrétně 4 a 3 bit. To znamená, že před zavoláním podprogramu v jiném 2k bloku musíme naplnit registr PCLATH, resp. jeho 4 a 3 bit správnou hodnotou, která určuje 2k blok ve kterém se má provádět následující instrukce. Pokud se např. podprogram ZjistiHodnotu nachází v jiném 2k bloku než odkud ho voláme, musíme před instrukci CALL ZjistiHodnotu zařadit naplnění registru PCLATH. To zařídíme např. takto:

MOVLW HIGH ZjistiHodnotu ;naplní pracovní registr W horním bytem adresy ZjistiHodnotu
MOVWF PCLATH ;zapíše horní byte adresy ZjistiHodnotu do PCLATH

Po návratu z podprogramu je třeba zajistit opětovné správné nastavení registru PCLATH pro skoky nebo volání podprogramů. To zařídíme např. takto:

SoucasnaAdresa ;návěští pro zjištění aktuální adresy
MOVLW HIGH SoucasnaAdresa ;naplní pracovní registr horním bytem adresy SoucasnaAdresa
MOVWF PCLATH ;zapíše horní byte adresy SoucasnaAdresa do PCLATH

Z předchozího je vidět, že se budeme snažit přechodům programu mezi různými bloky paměti vyhýbat. A snažit se napsat program, který těchto přechodů používá co nejméně.

Zásobník

U těchto procesorů je zásobník řešen jako speciální blok paměti, do které uživatel nemůže přistupovat. Zásobník je 8 úrovňový a ukládá se do něj návratová adresa. Adresa se ukládá jako celá 13bitová adresa a uživatel se tedy nemusí o nic starat. Zásobník je řešen jako kruhový, to znamená že pokud zavoláme podprogram a na zásobníku je již uloženo 8 návratových adres, devátá návratová adresa přepíše první, desátá druhou atd.

Adresování datové paměti RAM

Datovou paměť lze adresovat dvěma způsoby, buď přímo nebo nepřímo.

U přímé adresování je 9 bitová adresa datové buňky paměti určena jednak adresou určenou v instrukci, ta je 7 bitová a dále pomocí bitů RP0 a RP1 v registru STATUS, které vybírají banku. Před adresováním datové buňky musíme tedy zajistit správný výběr banky. To neplatí pro posledních 16 bytů každé banky u procesorů 876/877. Těchto 16 bytů je sdíleno a můžeme k nim přistupovat z jakékoliv banky.

Nepřímé adresování se provádí pomocí registrů FSR, INDF a bitu IRP registru STATUS. Registr FSR obsahuje 7 bitovou adresu nepřímo adresované datové buňky paměti, 7 bit určuje zda půjde o sudou nebo lichou banku, přičemž bit IRP rozhoduje o tom, zda se adresa bude týkat datové buňky paměti v bance 0,1 nebo 2,3. Tak se složí dohromady 9 bitová adresa, která určuje konkrétní buňku paměti. Registr INDF se potom chová jako registr naadresovaný pomocí FSR a IRP. To znamená, že zápisem do registru INDF zapisujeme do registru na adrese určené FSR a IRP. Totéž platí pro čtení registru INDF.

Popis programátoru

Programátor, který jsem vybral lze nalézt na HW serveru. Programátor z HW serveru je univerzálnější a neslouží pouze pro programování procesorů PIC, tak jsem si programátor upravil a jeho schema můžete nalézt zde. Výkres plošného spoje je zde. Řazení vrstev je top, bottom, assembly top a assembly bottom. Jedná se v podstatě pouze o převodník úrovní signálů ze sériového portu RS232 na "5V úrovně" a zdroj napětí 13V, který lze zapínat a vypínat.

Programátor se připojuje na sériové rozhraní RS232 počítače, potřebuje externí napájení. Pomocí switch lze nastavit, zda se bude programovat napětím 13V nebo pouze 5V. Novější procesory PIC již nepotřebují vyšší programovací napětí a mohou se programovat pouze 5V. Jinak nemá smysl dále programátor popisovat, protože jeho konstrukce je jednoduchá a jasná.

Popis programu

Po napsání programu a jeho odsimulování na počítači např. pomocí vývojového prostředí MpLab, které na svých stránkách nabízí firma Microchip je také nutné procesor naprogramovat. K tomu je potřeba jednak hardware a software. Dále se budeme zabývat popisem programu PonyProg, který může sloužit jako jeden z mnoha programů pro ovládání programátoru popsaného výše. PonyProg existuje jak pro Windows a Linux. Program je volně ke stažení na stránkách www.lancos.com.

Program PonyProg umí kromě programování některých typů procesorů PIC programovat i jiné procesory a paměti EEPROM. Základní okno programu vypadá následovně.

Po prvním spuštění programu je nutno provést nastavení interface a kalibraci.

Nastavení interface z menu Setup/Interface Setup...

Poté kalibrace z menu Setup/Calibration

Program doporučuje mít spuštěný pouze program PonyProg, což vřele doporučuji. Pokud budete mít při programování nebo kalibraci spuštěny i jiné programy zabírající čas procesoru nemusí programování proběhnout správně a programování skončí chybou, protože je nutné dodržet při programování určité časování. A toto časování se řídí pouze programově.

Dále je potřeba nastavit úkoly, které programátor může provádět. Nastavení doporučuji podle následujícího obrázku. Nutná je volba Byte Swap.

Volbu obvodu provedeme z menu Device

Jako program lze otevřít soubor typu hex, který produkuje kompilátor nebo linker. Lze otevřít soubor s obsahem programové nebo datové paměti EEPROM. Užitečná vlastnost je Reload Files. Tato funkce umožňuje znovu načíst soubory z disku před vlastním programování bez otevírání dialogových oken pro výběr souboru. To zrychluje opravování chyb a laděném programu, kdy opravíme zdrojový text, zkompilujeme a programujeme bez nutnosti otevírání a vybírání stále stejného souboru.

Při programování procesoru je dále nutné nastavit některé další parametry obvodu jako je např. typ použitého oscilátoru, nastavení WATCHDOGu atd. Tomuto nastavení se v tomto programu obecně říká Security and Configuration Bits. Význam těchto bitů nalezneme v katalogovém listu příslušného procesoru PIC v sekci Special features of the CPU v popisu Configuration Bits. Nulování bitů provádíme zaškrtáváním příslušných boxů. Bit, který má být nulový má zaškrtnut box a bit, který má být nastaven má prázdný box.

Dále popíšeme význam jednotlivých konfiguračních bitů procesoru.

Bity FOSC0 a FOSC1 jsou jasné a určují typ oscilátoru.
WDTE zapíná nebo vypíná tzv. WATCHDOG. Obvod WATCHDOGu obsahuje volně běžící RC oscilátor s čítačem a předděličkou, který v pravidelných časových intervalech v normálním provozu resetuje procesor, pokud není WATCHDOG vynulován. Pokud je procesor v režimu SLEEP, způsobí přetečení od WATCHDOGU probuzení procesoru a ten pokračuje v normální činnosti. WATCHDOG je velmi užitečný obvod pokud potřebuje navrhnout bezpečnější systém. Obvod se dá např. použít tak, že program musí v určitých intervalech nulovat WATCHDOG, aby se neprovedl reset procesoru. Pokud z nějakých příčin není WATCHDOG nulován provede se reset procesoru. Může se tak stát např. chybou programu nebo neočekávanou situací. Po resetu je na programu, aby zjistil, zda šlo o reset procesoru WATCHDOGem a aby se tak vypořádal se vzniklou situací.
Dalším konfiguračním bitem je PWRTE, který zapíná časovou prodlevu mezi zapnutím napájení obvodu a uvolněním resetu obvodu. To umožňuje spolehlivou práci obvodu i při použití napájecí zdroje, který má pomalejší náběh napájecího napětí. Obvod je držen po zapnutí napájení delší dobu v resetu.
BODEN bit zapíná detekci nedostatečného napětí napájení. Pokud napětí poklesne pod nastavenou úroveň vyvolá se reset pokud je aktivován konfigurační bit BEDEN. To umožňuje včasnou detekci poklesu napětí a případně např. uložit důležitá data do datové paměti EEPROM a předejít jejich ztracení.
Bit LVP určuje zda je povoleno programování nízkým programovacím napětím 5V. Pokud to není povoleno obvod lze naprogramovat pouze vysokým programovacím napětím 13V.
CPD bitem můžeme povolit vyčtení dat z datové paměti EEPROM. Dá se tím chránit její obsah.
WRT bit chrání programovou paměti EEPROM před tím, aby jí mohl uživatel pomocí programu zapsaného v paměti měnit.
Obvod obsahuje tzv. debuger na čipu. Tento obvod lze zapnout bitem DEBUG. Potom lze pomocí dvou vývodů obvodu a příslušného software ladit program přímo v obvodu, což určitě zrychluje vývoj a ladění aplikace.
Poslední skupinou konfiguračních bitů jsou bity nazvané CP0 a CP1. Těmito bity lze chránit program naprogramovaný v obvodu proti vyčtení.

Nyní je vše připraveno pro úspěšné programování procesoru. Programátor umožňuje číst, zapisovat a ověřovat programovou paměť a datovou paměť EEPROM. Požadovanou akci vybereme z menu Command.

Programové specifikace

Podrobnější informace lze nalézt na stránkách Microchipu v sekci Literature/Programming Specifications, kde jsou uvedeny specifikace pro jednotlivé druhy procesorů.

V jednotlivých dokumentech nalezneme význam a popis jednotlivých vývodů procesoru, které se používají pro programování. Jedná se v podstatě pouze o vývody napájení programovacího vývodu a sériové komunikace, kde jeden vývod slouží jako hodinový a jeden jako obousměrný datový vstup/výstup. Nachází se zde popis v jakém paměťovém prostoru při programování se nachází programová paměť, datová paměť EEPROM a konfigurační bity, včetně ID obvodu.

Dále jsou zde uvedeny příkazy, které kterými se dá ovládat obvod při programování v podrobné vývojové diagramy, které určují postup při programování. Jsou zde detailně popsány elektrické a časové parametry, které mají být dodrženy při programování. Lze se tak postavit svůj vlastní programátor i s ovládacím programem, protože jsou k dispozici všechny informace k tomu potřebné. Výčet příkazů pro ovládání obvodu při programování je v následující tabulce.