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ů. Části kódu jsou psány fialovým písmem monospace.

Programátor RS232

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. Prohlížeče obou formátů jsou volně ke stažení na stránkách firmy Abacom.

Programátor USB

   Protože nová PC již většinou nemají seriová rozhraní RS232 (COM), postavil jsem si programátor pro rozhraní USB. Osvědčilo se mi toto zapojení. Protože na originálních stránkách tohoto projektu není uveden návrh plošného spoje, udělal jsem si jej v mém oblíbeném programu sPrint Layout ver. 5: 

PK2 clone uC PIC18F2550 je nutno naprogramovat programem PK2V023200.hex pomocí již hotového programátoru (je možno použít výše uvedený JDM pro sériový port).
Při vlastním programování je programovaný obvod napájen napětím 5 V z USB konektoru (na pinu 2 konektoru TARGET_ICSP).

 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. POZOR! Pokud chceme PIC16F917 použít "běžným" způsobem, je třeba zakázat řadič pro LCD displej nastavením registru LCDCON na nulu (v mikrobasicu LCDCON = 0). Pokud toto neuděláme, budou něktré IO porty jako takové nefunkční! 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).

Programovací software PICPgm (pro programátor JDM)

  Programovací software je možno stáhnout zde. Umí si sám najít připojený programátor JDM, typ mikrokontroléru budeme muset asi zadávat ručně. Web softwaru je http://picpgm.picprojects.net/.

Programovací software PICkit 2 (pro programátor USB)

Tento software je vyvinut přímo firmou Microchip a má mnoho výhodných vlastností. Jedna z nich je, že pokud klikneme na tlačítko "Auto Import Hex + Write Device" a odkážeme na příslušný .hex soubor, program pozná jeho jakoukoliv změnu a aktualizovanou verzi ihned "nahraje" do mikrokontroléru. Pokud tedy uděláme nějakou změnu ve zdrojovém kódu a provedem "Build" příkaz, změna je ihned nahrána do mikrokontroléru a můžeme ihned změnu v chování zařízení. Toto chování je možno zakázat opětovný stlačením "Auto Import Hex + Write Device".

Programování v mikroBasicu od fy Mikroelektronika

Struktura programu

program název programu
include začlenění dalších modulů

'********************************************************
'* Globální deklarace:
'********************************************************

' deklarace symbolů
symbol ...

' deklarace konstant
const ...

' deklarace struktur
structure ...

' deklarace proměnných
dim Name[, Name2...] as [^]type [absolute 0x123] [external] [volatile] [register] [sfr]

' podprogramy
sub procedure procedure_name(...)
  lokální deklarace
  ...
end sub

' funkce
sub function function_name(...) as return_type
  local declarations
  ...
end sub

'********************************************************
'* Tělo programu:
'********************************************************

main:
  ' tady bude hlavní kód
end.

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

Proměnné (variables)

bit, sbit - velikost: 1 bit - nabývá hodnot: 0 nebo 1
byte, char - velikost: 8 bit - nabývá hodnot: 0 až 255
short - velikost: 8 bit - nabývá hodnot: -128 až 127
word - velikost: 16 bit - nabývá hodnot: 0 až 65535
integer - velikost: 16 bit - nabývá hodnot: -32768 až 32767
longword - velikost: 32 bit - nabývá hodnot: 0 až 4294967295
longint - velikost: 32 bit - nabývá hodnot: -2147483648 až 2147483647
float, double - velikost: 32 bit - nabývá hodnot: ±1.17549435082 * 10-38 až ±6.80564774407 * 1038

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

Nastavení vstupů/výstupů

Příklady:
Nastavení celého portu B jako vstup: TRISB = 255 nebo TRISB = %11111111
Nastavení RB0 a RB1 jako vstupy, ostatní výstupy: TRISB = %00000011
Nastavení pouze jednoho vývodu (RB2) jako výstup:TRISB.2 = 0
Nastavení pouze jednoho vývodu (RB4) jako vstup: TRISB.3 = 1

Zápis na výstup portu

Příklady:
Shození celého portu B do logické 0: PORTB = 0 nebo PORTB = %00000000 nebo PORTB = $00
Nahození celého portu B do logické 1: PORTB = 255 nebo PORTB = %11111111 nebo PORTB = $FF
Nahození pinu 1 portu B (RB1) do logické 1: PORTB.1 = 1

Čtení ze vstupu portu portu

Příklad:
if PORTB.0 = 0 then
...něco udělej
end if

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é 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.)

Blokové schéma AD převodníku

Blokové schéma ADC

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 uvádí vhodné výběry ADC hodin (Vdd > 3 V)

Clock period

1. RC oscilátor má typickou hodnotu TAD kolem 4 us.
2. Tyto hodnoty překračují minimální požadovaný čas TAD.
3. Pro větší rychlost převodu; doporučen jiný zdroj hodinového kmitočtu.
4. Je-li kmitočet RC oscilátoru vyšší než 1 MHz, doporučuje se provádět převod pouze v režimu spánku.

Zarovnání výsledku

Pomocí bitu ADFM registru ADCON0 můžeme zarovnat výsledek převodu zarovnat v registrech ADRESH a ADRESL buď vlevo nebo vpravo, jak je znázorněno na obrázku níže.

Zarovnání výsledku