Mikrokontroléry PIC (Microchip)

Prosím, aby následující řádky nebyly pojímány jako nějaký oficiální návod, ale spíše moje poznámky pro praxi, které mohou být (snad) užitečné i ostatním zájemcům o programování těchto mikrokontrolérů.

Programátor

Budeme-li se chtít zabývat mikrokontroléry PIC a jejich programováním, budeme potřebovat nějaký programátor. Tímto je myšleno zařízení, které se připojí k příslušným vývodům mikrokontroléru a pomocí něho se program "nahraje" do mikrokontroléru. Po špatných zkušenostech s programátorem pro paralelní port - konkrétně P16PRO jsem se rozhodl pro stavbu jednoduchého programátoru na bázi JDM pro port sériový. Jeho výhodou je i to, že nepotřebuje vnější napájení (je napájen z portu).

Jeho schéma je zde: schematic  a DPS zde: Plošný spoj 300 DPI  velikost 71 x 32 mm (rozlišení 300 dpi)

Schéma a DPS byly vytvořeny v programu sPlan v.6 a sPrint v.5 od fy Abacom. Zde je možno stáhnout prohlížeč schémat ve formátu sPlan a prohlížeč návrhů DPS ve formátu sPrint. Oba prohlížeče jsou volně ke stažení na stránkách firmy Abacom.

 Dále je dobré udělat si několik "bastldesek", např. jednu jako procesorovou desku, které obsahuje samotný mikrokontrolér (příklad pro PIC16F917) a několik desek s periferiemi jako LED, tlačítka, piezo, potenciometr (testování A/D převodníků a komparátorů)... Tyto "periferie" se pak propojují s deskou procesoru nejlépe pomocí konektorů MLW10 a PFL10. Také je možno použít desky s nepájivým kontaktním polem, kde si můžeme vytvořit zapojení dle již konkrétní zamýšlené aplikace. Co se týče hardware (bastldesek) - fantazii se meze nekladou a každý si asi vytvoří sadu podle svých potřeb a zamýšlených aplikací.
   Co se týče výběru typů mikrokontrolérů budu se asi omezovat na sice již zastaralý, ale oblíbený typ 16F84A - 18 pinů a 16F917 - 40 pinů (těchto uC jsem získal větší množství ze starých likvidovaných desek). Oba mají napájecí napětí 2 - 5 V. Příklady kódů (spíše jen jejich částí) budu uvádět v MikroBasicu.
Piny potřebné pro programování výše uvedených mikrokontrolérů:
Vdd (+ napájení) ... pin 14 (16F84), pin 11 a 32 (16F917)
Vss (zem) ... pin 5 (16F84), pin 12 a 31 (16F917)
MCLR (Vpp) ... pin 4 (16F84), pin 1 (16F917)
ICSPCLK (RB6) ... pin 12 (16F84), pin 39 (16F917)
ICSPDAT (RB7) ... pin 13 (16F84), pin 40 (16F917)
Obsazování RB6 a RB7 je proto lepší se pokud možno vyhnout. Mikrokontrolér se přepne do režimu programování přivedením napětí 12V na pin MCLR (Vpp). Nesmíme zapomenout zapojit odpor 10k mezi tento pin a Vdd.

Programovací software WinPic od DL4YHF

Nastavení softwaru:
Nejprve zvolíme typ uC. Menu Device / Part: a vybereme požadovaný typ.
Potom otevřeme záložku Interface a nastavujeme:
- Interface Type: JDM (2) for serial port
- on port: vybereme požadovaný (v mém případě COM9) adr: zůstane prázdné
- baudrate: 115200
- extra delay before reading data line [us]: 3
- extra lenghtening for clock [us]: 2
- slow mode: nevybráno
Stiskneme tlačítko Initialize ! a pod Custom interface definition file se musí objevit Interface tested, OK.

Programování v MikroBasicu od fy Mikroelektronika

Zápis číselných hodnot

Binární čísla: s prefixem %, např. %01110101
Hexadecimální čísla: s prefixem $, např. $4D
Dekadická čísla: bez prefixu, např. 128

Konfigurace mikrokontroléru

  Veškerá nastavení konfigurace děláme již při prvním založení nového projektu. Zde se nastavuje především typ oscilátoru, watchdog timer (hlídací časovač), Power-up Timer nebo ochrana proti přepsání kódu (nechat vypnuté!). Tato nastavení lze dodatečně měnit v menu Project - Edit Project. Nastavení se přenesou do softwaru WinPic při dalším nahrání hex souboru (předtím je nutno v MikroBasicu zkompilovat). Nastavení PIC16F917 (Edit Project v MikroBasicu):
Oscillator Selection: výběr režimu hodinového oscilátoru
Watchdog Timer: hlídací časovač
Power Up Timer: prodleva 72 ms po zapnutí mikrokontroléru
RE3/MCLR pin function select: Enabled (1) = funkce MCLR na pinu 1, Disabled (0) = RE3 na pinu 1 - reset je vnitřně připojen na Vdd
Code protection: ochrana kódu paměti programu
Data Code protection: ochrana kódu paměti dat
Brown-out Reset Selection: reset při poklesu napětí Vdd pod cca 2,3 V
Internal External Switchover: dvourychlostní mód chodu generátoru hodin po startu (resetu)
Fail-Safe Clock Monitor: přepnutí na vnitřní generátor hodin při poruše vnějšího zdroje taktování
In-Circuit Debugger Mode: ladění přímo v zapojeném obvodu
Zde je příklad "normálního" nastavení s vnitřním generátorem hodin na 4 MHz (změnu kmitočtu lze provést v registru OSCCON). Budeme-li chtít použít RA6 jako I/O port, je nutno změnit konfiguraci oscilátoru na INTOSCIO.

Oscilátory hodinového kmitočtu

Oscilátor XT: Je to krystalový oscilátor nebo oscilátor s keramickým rezonátorem. Krystal se zapojuje mezi vývody OSC1 a OSC2 t.j. mezi pin 15 a 16 u 16F84 a 13 a 14 u 16F917. Je vhodný pro kmitočty 0,4 - 4 MHz. Tento oscilátor poskytuje vysokou stabilitu kmitočtu.

Oscilátor HS: Totéž jako XT, ale vhodný pro kmitočty od 3,5 MHz. V tomto případě se ještě někdy přidává odpor Rs do série s vývodem OSC2. Při použití tohoto typu oscilátoru má být napájecí napětí vyšší než 4,5 V

Oscilátor LP: Low Power - úsporný typ krystalového oscilátoru. Vhodný pro nízké kmitočty např. s "hodinkovým" krystalem 32 kHz. Vyzkoušená spolehlivá hodnota kondenzátorů je 68 - 100 pF.

 Mezi pin OSC1 a zem a OSC2 a zem se zapojují kondenzátory. Jejich kapacita je dána požitým kmitočtem. Při použití oscilátoru XT a HS a kmitočtu krystalů v rozsahu 2 - 22 MHz pracuje spolehlivě oscilátor s kapacitou 22 pF (prakticky ověřeno). Při kmitočtech nad 3,5 MHz je doporučeno použít oscilátor HS a napájecí napětí min. 4,5 V. Vyšší kapacita kondenzátorů znamená vyšší stabilitu kmitočtu, ale delší dobu ustálení po zapnutí napájení. Pro Vdd vyšší než 4,5 V jsou výrobcem doporučovány oba kondenzátory o kapacitě 30 pF.

Kapacita kondenzátorů

Oscilátor RC: Pro aplikace nenáročné na stabilitu kmitočtu. Odpor o hodnotě 5 k - 100 k se zapojuje mezi Vdd a pin OSC1, kondenzátor o kapacitě vyšší než 20 pF se zapojuje mezi OSC1 a zem (Vss). Pro kmitočet 756 kHz vyzkoušeny hodnoty R = 10 k, C = 100 pF. Z vývodu OSC2 je v tomto případě možno odebírat signál o kmitočtu fosc./4. Hodnoty R a C jsou v tabulce:

RC osc.

EC (Externí hodiny): Vnější taktovací kmitočet se připojuje na OSC1 a režimy jsou XT, HS, nebo LP při dodržení výše uvedených pravidel. OSC2 se v tomto případě nezapojuje.

Interní hodiny PIC16F917: U tohoto mikrokontroléru lze s výhodou použít vnitřní generátor hodinového kmitočtu. Jeho kmitočet je však "natvrdo" nastaven na 4 MHz. Pokud změníme hodnotu MCU Clock Frequency v okně Edit Project, tak pouze "rozhážeme" časové konstanty pro překlad programu. Tím se naruší např. časování prodlev vytvořených pomocí delay. Nastavení jiného kmitočtu provedeme na začátku programu zápisem do registru OSCCON. Hodnota musí korespondovat s frekvencí v okně Project Settings před kompilací programu.
OSCCON = %01110101 (117) pro frekvenci hodin = 8 MHz
OSCCON = %01100101 (101) pro frekvenci hodin = 4 MHz
OSCCON = %01010101 (85) pro frekvenci hodin = 2 MHz
OSCCON = %00110101 (53) pro frekvenci hodin = 500 kHz
OSCCON = %00100101 (37) pro frekvenci hodin = 250 kHz
OSCCON = %00010101 (21) pro frekvenci hodin = 125 kHz
OSCCON = %00000011 (3) pro frekvenci hodin = 31 kHz

I/O porty

Pull-up resistory

Pull-up (zdvihací) rezistory se zapojí mezi vstup portu a Vdd napětí. Port musí být nakonfigurován jako vstup a nesmí být v režimu "analog" (např. jako vstup AD převodníku). Pozor! Ne všechny porty jsou vybaveny PU rezistory. Např. u PIC16F917 je to pouze RB a RE3 - pokud je aktivován vstup MCLR. Aby bylo možno zapnout PU rezistory, musí být povolen globální RBPU.

PIC16F917

Pokud chceme používat porty jako "normální" I/O porty, musíme zakázat LCD driver: LCDCON=%01000000 a vypnout analogové vstupy: ANSEL = 0

PORTA: Pro nastavení pinu 14 (RA6/CLKOUT) jako I/O port je nutno v okně Edit Project v MikroBasicu nastavit Oscillator Selection: INTOSCIO

PORTC: Aby byly nakonfigurovány PC0-PC2 jako I/O porty, je nutno zakázat LCD driver takto: LCDCON = %01000000

A/D převodník

PIC16F917

Tento převodník umožňuje konverzi analogového signálu na 10ti bitové binární číslo. Používá analogové vstupy multiplexované do na jeden vzorkovací vstup s hold funkcí. Výstup vzorkovacího obvodu je připojen na vstup převodníku. Výstupem je desetibitové binární číslo a toto je uloženo do registrů ADRESL a ADRESH. Referenční napětí je buď externí nebo interní - softwarově volitelné. ADC může generovat přerušení po dokončení konverze. Toto přerušení může být použito k probuzení z režimu spánku.

Konfigurace portu

Převodník může být použit pro převod jak analogových tak digitálních signálů. Pro převod analogových signálů musí být I/O pin nakonfigurován pro analogové nastavení viz sekce Portů v datasheetu - TRIS a ANSEL bity.

Výběr kanálu

Který kanál je připojen k vzorkovacímu obvodu je určeno CHS bitem registru ADCON0. Dojde-li ke změně kanálu, je potřeba před zahájením další konverze vložit prodlevu. Pro více informací viz oddíl 12.2 ADC Operation v datasheetu.

Referenční napětí

Kladné referenční napětí je možno brát z Vdd - bit 5 (VCFG0) = 0 nebo je ho možno brát z pinu RA3/AN3/Vref+. Potom je bit 5 (VCFG0) = 1. Záporné referenční napětí (zem) je možno brát z Vss - bit 6 (VCFG1) = 0 nebo je ho možno brát z pinu RA2/AN2/Vref-, potom je bit 6 (VCFG0) = 1. Zmíněné bity přísluší registru ADCON0. (V originálním datasheetu je chyba na str. 180 kde u bitu 5 VCFG0 0 = má být správně Vdd.)

Hodiny pro převodník

Zdroj hodinového kmitočtu je možno volit pomocí bitů ADCS registru ADCON1. Možné varianty jsou Fosc/2 až Fosc/64 nebo interní oscilátor. Čas potřebný k dokončení jednoho bitu konverze je definován jako TAD. Plný desetibitový převod trvá 11 TAD období. Pro správný převod musí být splněna specifikace TAD viz A/D conversion requirements v sekci 19.0 “Electrical Specifications” originálního datasheetu. Tabulka 12-1 na str. 177 uvádí vhodné výběry ADC hodin.