Lepší než předtím
Nová řada, jak již bylo uvedeno nabízí oproti starší změnu media programové paměti ze starší EPROM na dnes již standard FLASH. Odpadla tím nutnost programátorů psát programy v simulátoru, mít emulátor, nebo několik "okénkových" EPROM čipů v šuplíčku a neustále je mazat UV mazačkou neúnosných mnoho minut, protože pamět typu flash je smazaná prakticky okamžitě. Daní za toto pohodlí je v sériové výrobě poněkud delší čas pro programování paměti typu FLASH.
Rodina mikrokontrolérů PIC16F7x má v současnosti, stejně jako její maminka 16C7x (3,4,6,7),
celkem čtyři zástupce a těmi jsou: PIC16F73, PIC16F74, PIC16F76 a PIC16F77.Tyto se liší
velikostí pouzdra, počtem I/O pinů, integrovanými periferiemi a velikostí paměti FLASH a RAM.
Obvody v pouzdrech DIL40, PLCC44, TQFP44 a MQFP44, tj. obvody PIC16F74 a PIC16F77, disponují oproti
menším bratříčkům 16F73 a 6 paralelním portem navíc ( Slave mód).
Ačkoliv zde uváděná rodina vychází - co se periferií týče ze shodné
PIC16C7x - rozebereme si je nyní jednotlivě.
Speciální funkce ...
Power Up Timer
Po přivedení napájecího napětí drží procesor v RESET stavu 72ms. Tato doba je určena pro ustálení stabilizátorů napětí. Tuto volbu je většinou možno vypnout.
Oscillator Startup Timer
Časovač zapne po přivedení napájecího napětí RESET při zvolení oscilátoru typu LP, XT nebo HS - tedy krystalových oscilátorů. Počká na prvních 1024 kmitů oscilátoru. Čeká na ustálení oscilátoru a poté RESET uvolní.
Brown-out detector - Detektor poklesu napájecího napětí
Příčiny chybné funkce zařízení bývají různé. Jednou z
možných příčin mohou být krátkodobé poklesy napájecího
napětí řádů jednotek až desítek ms. Typickým místem, kde tato situace může
nastat, jsou bateriová zařízení, kde se vyskytují periferní obvody s
velkým odběrem jako jsou např. elektrické motory, velké LED displeje,… Tato situace může
být ještě umocněna špatným stavem baterie (velký vnitřní odpor), jenž
celé zařízení napájí.
Z výše uvedeného důvodu byl na čip přidán obvod který takovéto
krátkodobé výpadky je schopen detekovat a při jejich výskytu pak procesor resetovat a
tím uvést procesor do správného stavu. Abychom poznali, že byl výpadek - a
tudíž reset rařízení - způsoben právě sníženým napětím,
zanechá po sobě Brown-Out podpis ve formě změněného příznaku v univerzálním
registru PCON. Tento se doporoučuje po zkontrolování vymazat.
Watch Dog - pohodlí pod střechou
U Microchipů standardně WatchDog na čipu. Dá se při programování zakázat. Pokud tak neučiníte budete muset softwareově mazat speciální registr WDT. K němu se dá softwareově připojit předdělička, která je společná pro TMR0, musíte si tedy vybrat. Pokud WDT včas nevynulujete - například instrukcí přímo k tomu určenou CLRWDT - obvod se vyRESETuje. Stejně jako BronwOut, zanechá po sobě WDT příznak a to v registru STATUS.
RB0/INT - Vnější interrupt
Pomocí pinu 0 na bráně B mikrokontroleru je možné při povolení prostřednictvím INTCON registru možné vyvolat přerušení. Uživatel může zvolit na kterou hranu bude spouštěč reagovat. Nastavení se provádí prostřednictvím speciálního registru OPTION.
RB4..7 Int - Přerušení při změně stavu
Při změně stavu na pinech 4 až 7 brány B se generuje přerušení. Je možné jej povolit nebo zakázat prostřednictvím INTCON registru. Dá se použít například pro aplikaci klávesnice.
Timer 0 - Čítač/časovač 0
Jednoduchý osmibitový čítač, který dle zvoleného režimu může fungovat i jako časovač. Softwareově mu lze přiřadit osmibitovou předděličku, která však jak již bylo výše uvedeno je společná pro WDT, takže si programátor musí vybrat pro kterou periferii si ji vybere. Časovači je možné přidělit vstup z hodin procesoru - režim časovač, nebo z vnějšího zdroje přes bránu procesoru - režim čítač. Přerušení je možné povolit prostřednictvím registru INTCON.
Timer 1 - Čítač/časovač 1
Blokové schéma tohoto modulu čítače můžeme vidět na obr.1
Uvedený modul TIMER1 může pracovat v celkem třech různých režimech.
Základním režimem je režim časovače (timeru), kdy čítač čítá čtvrtinu frekvence
vnitřního oscilátoru, kterým je řízen vlastní procesor. Tato frekvence může
být ještě před vlastním čítáním snížena na potřebnou frekvenci
předděličem, který je schopen propustit kmitočet beze změny nebo podělit 2, 4 nebo 8.
Čítání tohoto kmitočtu je pak možno povolit či zakázat pomocí signálu (bit
v konfiguračním byte čítače T1CON) TMR1ON. Vlastní čítač je tvořen dvěma
osmibitovými čítači, jenž jsou zapojeny jako jeden 16ti bitový. Při přetečení
čítače, tj. přechodu ze stavu 0FFFFHEX do stavu 00000HEX je generováno přerušení,
které může být opět povoleno/zakázáno příslušným bitem (bit0) ve
stavovém byte PIE1.
Druhým režimem je čítání externího kmitočtu v synchronním módu, kdy
je inkrementace vlastního čítače synchronizována kmitočtem vnitřního oscilátoru.
Další možnosti nastavení jsou shodné s předešlým módem.
Třetím režimem (módem) je čítání externího kmitočtu v asynchronním
módu, tj. inkrementace čítače TMR1 není synchronizována s vnitřním kmitočtem.
Tohoto módu lze využít ke „vzbuzení“ mikroprocesoru ze SLEEP módu, neboť při
přetečení čítače je standardním způsobem generováno přerušení. Jako zdroj
externího kmitočtu je možné použít oscilátor přístupný na pinech RB6 a RB7
s externím krystalem např. 32kHz. Při tomto režimu bude perioda „probouzení“
mikroprocesoru 0.5sec, 1.0sec, 2.0sec nebo 4sec.
V tomto režimu je schopen čítač čítat vnější frekvenci s periodou vyšší než 60ns, tj. čítač je schopen zpracovat kmitočet nižší než 16.67MHz.
Maximální frekvence, jakou je oscilátor T1OSC schopen kmitat je dle výrobce cca
200kHz, což je stejně jako u hlavního oscilátoru v módu LP.
U této periferie je možné využít možnosti harwareového přerušení
prostřednictvím speciálních registrů INTCON a PIE1.
Timer 2 - Časovač 2
Jeho blokové schéma můžeme vidět na obr.2.
I když tento, pouze 8mi bitový čítač, nemůže čítat externí kmitočet (pouze čtvrtinu frekvence vnitřního oscilátoru Fosc/4), tj. nedisponuje režimem časovače, jsou možnosti jeho využití široké díky jednotce komparátoru, která umožňuje zkrátit cyklus čítače na hodnotu, která je nastavena v 8mi bitovém registru PR2. Výstupní signál z komparátoru je možné využít pro generování přerušení. Díky programovatelnému děliči (postscaler) připojeného na výstup komparátoru je možné nastavit generování přerušení po jednom až 16ti cyklech čítače.
U této periferie je možné využít možnosti harwareového přerušení prostřednictvím speciálních registrů INTCON a PIE1.
A/D convertor – Analogově digitální převodník
Vlastnímu A/D převodníku je předřazen analogový multiplexer, který, v případě obvodů zapouzdřených v 28vývodovém pouzdru, má 5 vstupů, u obvodů ve 40ti vývodovém pouzdru je vstupů celkem 8. Vlastnímu A/D převodníku je ještě předřazen S/H obvod (Sample/Hold), který „podrží“ příslušnou hodnotu vstupního napětí konstantní po celou dobu převodu A/D převodníku. Tento obvod je nutný vzhledem k použitému principu A/D převodu. Aby bylo možné využít plné přesnosti tohoto A/D převodníku je nutné dodržet doporučení výrobce. Mezi tato doporučení patří zejména nízká impedance měřeného místa, která by neměla překročit 10kOhmů a dostatečně dlouhá doba vzorkování.
Obr.3
Další informace nutné pro používání A/D převodníku s
podrobným vysvětlením můžeme najít v referenčním manuálu popisující
všechny periferie všech členů rodiny PIC16C „PICmicroTM Mid-Range MCU Family“ nebo v
příslušných katalogových listech.
Je možné využít možnosti harwareového přerušení při ukončení převodu
prostřednictvím speciálních registrů INTCON a PIE1.
CCP – Modul Capture/Compare/PWM
Jak už ze samotného názvu vyplývá, jednotka může pracovat v jednom ze tří režimů. Tyto režimy si v následujících odstavcích stručně popíšeme.
Prvním režimem, nebo chcete-li stavem, v kterém může jednotka CCP pracovat, je režim
Capture.
Blokové schéma jednotky v tomto režimu je vidět na obr.4
Jako reference je zde použita jednotka Timer 1 (16ti bitový čítač/časovač), jejíž stav je
zachycován na základě vnějšího podnětu, přivedeného z pinu RB3, do registru
CCPR1. Zajímavostí je možnost nastavení určitého dělícího poměru pro
vstupní signál, což znamená, že jednotka bude reagovat až po určitém počtu period
vstupního signálu a to buď každou periodu, každou čtvrtou nebo každou 16. V případě
použití dělícího poměru 1, tj. předdělič pouze propouští signál, si můžeme
vybrat aktivní hranu signálu na kterou bude jednotka reagovat. Při použití jiného
dělícího poměru než 1, bude jednotka reagovat vždy na vzestupnou hranu. Aby program nebyl
zatížen neustálým dotazováním na stav jednotky Capture, je jednotka schopna
generovat přerušení v okamžiku zachycení stavu čítače TMR1. Použijeme-li jako
„časovou základnu“ čítač TMR1 v asynchroním režimu, jsme schopni pomocí
této jednotky určit dobu příchodu aktivní hrany s přesností 60ns.
Druhým režimem v kterém se jednotka CCP může nacházet je režim Compare. Blokové
schéma jednotky v tomto režimu je vidět na obr.5.
Činnost jednotky CCP v tomto režimu je hodně podobná funkci časovače Timer 2. Na rozdíl od tohoto časovače je však čítač TMR1 16ti bitový a komparace probíhá samozřejmě 16ti bitově. Druhým rozdílem je, že signál o dosažení shody mezi TMR1 a údajem v registru CCPR1, není použit ke zkrácení cyklu čítače jako tomu bylo v případě časovače TIMER2, ale je použit k nastavení předvolené log. úrovně na výstupním pinu RB3, tj. uživatel si může nastavit, jaká logická úroveň se má objevit na pinu RB3 v momentu dosažení shody. Samozřejmě je zde možnost ponechat výstup nezměněn a použít signál pouze ke generování přerušení.
Obr.6
Třetím režimem v kterém se může jednotka nacházet, je režim PWM. Blokové
schéma jednotky CCP v režimu PWM je vidět na obr.6. Díky dobře navržené konstrukci jednotky PWM
je možné možné generovat PWM signál s 10bitovým rozlišením a
opakovací frekvencí až 19.53kHz a nebo dokonce s opakovací frekvencí 78.12kHz při
8bitovém rozlišení. Tyto hodnoty jsou platné při maximální hodinové
frekvenci procesoru 20MHz. Popišme si krátce princip PWM jednotky. Opakovací frekvence, tj.
perioda výstupního signálu je dána hodnotou v registru PR2, neboť v momentu
dosažení shody mezi zmíněným registrem a čítačem TMR2 je čítač
inicializován na hodnotu 0, tj. začne znovu čítat od začátku a výstup, signál na
pinu RB3, je nastaven na log. 1. Tato část tedy pracuje téměř shodně jak bylo popsáno v
části věnované časovači TIMER2. Píši téměř shodně, neboť, pokud si dobře
prohlédneme obr.6 zjistíme, že ač je registr PR2 jen 8mi bitový, skutečná hodnota se
kterou počítáme při výpočtech opakovací doby je 4x větší, neboť se v
podstatě jedná o vrchních 8 bitů desetibitového slova!!!
Doba, po kterou se výstupní signál na pinu RB3 nachází v log. 1, je určen
hodnotou v registru CCPR1H. Tato hodnota je opět porovnávána s hodnotou registru časovače TMR2. V
tomto případě je porovnání celkem 10ti bitové. Jelikož je však registr časovače
TMR2 pouze 8mi bitový, scházející 2 nejnižší bity jsou doplněny buď dvěma
bity z předděliče (viz popis Timer2-časovač2), nebo dvěma bity interního čítače
generujícího takt pro jádro mikroprocesoru. Aby návrháři obvodu předešli
problémům při zápisu hodnot do registru CCPR1H, je zápis do tohoto registru prováděn
synchronně s inicializací registru TMR2. Příslušná hodnota se kopíruje z bufferu,
registru CCPR1L, do kterého může uživatel zapisovat kdykoliv. Jelikož je registr CCPR1L opět jen 8mi
bitový, je doplněn na 10bitů pomocí dvou bitů z konfiguračního registru CCP1CON.
I tato součást mikrokontroleru má přiřazené hardwareové přerušení,
které lze povolit prostřednictvím speciálních registrů INTCON a PIE1.
USART – Univerzální Synchronní/Asynchronní sériový kanál
USART implementovaný v této rodině mikroprocesorů, může pracovat v jednom ze tří módů; asynchronním, synchronním jako master, synchronním jako slave. Následujíce stručný popis zaměřený pouze nazajímavé vlastnosti tohoto rozhraní. První dobrou „charakterovou vlastností“ tohoto rozhraní je vlastní „baud rate generator“, tj. čítač, který generuje systémový takt pro tento kanál, takže uživatel nepřichází o jeden „drahocenný“ čítač/časovač jako např. u mikroprocesorů 80C5x. Díky tomuto dedikovanému generátoru taktu zvládá asynchronní sériový port přenosové rychlosti až 1.25MBd. Taktéž je zde podpora 9ti bitové komunikace (tzv. multiprocesorová komunikace), kdy je 9. bit používán jako příznak adresy oslovovaného zařízení (začátek povelu) a pouze při příchodu znaku s nastaveným 9. bitem je vygenerována žádost o obsluhu přijatého znaku (interrupt). Snad jedinou drobnou vadou na kráse je neexistence FIFO bufferu, neboť zvlášte při vysokých komunikačních rychlostech má programátor těžkou pozici, neboť program musí „uklidit“znak z registru přijímače během několika us (1.25MBd -> 8us/znak !!! tj. při 20MHz kmitočtu jen 40 instrukčních cyklů..). V synchronním provozu je maximální komunikační rychlost dokonce 5Mbaud (1.6us/znak !!!).
SSP – Synchronní sériový kanál
Podporovanými módy jsou: SPI/slave, SPI/master, I2C/slave a I2C/master mód. U
rozhraní I2C je podporován mód se 7mi bitovou i 10ti bitovou adresou. Díky implementaci
detekce kolizí na sběrnici I2C je možné provozovat toto rozhraní i v režimu multi-master.
Problematika sériového přenosu, zvláště pak protokol sběrnice I2C, je natolik
rozsáhlý, že v manuálech procesorů je mu věnováno 30-40 stran, což je nad možnosti
tohoto článku. Pro detailní popis tohoto rozhraní odkazuji tedy laskavé čtenáře
na tyto manuály , případně lze nastudovat problematiku I2C sběrnice z manuálů firmy Philips,
která je autorem tohoto rozhraní.
UART
Jak již bylo výše uvedeno má BaudRateGenerator nezávislý na ostatních časovačích, čímž se liší od rodiny Atmelů. Má volitelnou možnost osmi nebo devítibitového přenosu. Jedná se o naprosto hardwareově nezávislou periferii s jednobytovým bufferem.
USART jednotce jsou přiřazena dvě harwareová přerušení a sice jedno po odeslání byte a jedno po přijetí byte do bufferu. Přerušení nemusí programátor použít, správná funkce USARTu se dá zajistit i bez využití přerušení pomocí speciálních registrů. O případnou identifikaci chyb při přenosu se starají taktéž speciální registry. Hardware USARTu je schopen identifikovat a programu předat informace o přetečení bufferu i ostatních chybách, které mohou při přenosu nastat.
PSP – Parallel Slave Port
Dalším prvkem, který najdeme u rodiny mikroprocesorů PIC16F7x je Paralelní Slave Port. Tento port najdeme vzhledem k potřebnému počtu vývodů však pouze u obvodů ve 40/44 vývodových pouzdrech. Blokové schéma tohoto portu můžeme vidět na obr.7.
Obr.7
Umožnuje rychlý přenos dat např. mezi procesory, či procesorem a periferií. V principu se
jedná o dva 8mi bitové registry, přičemž zápis a čtení z těchto registrů lze
ovládat z vně mikroprocesoru pomocí řídicích signálů RD, WR a CS a
také zevnitř procesoru. Oba registry vytváří tedy vyrovnávací buffery pro jeden
byte.
Jako všechny i tato periferie má samozřejmě přiřazené přerušení. Povolit i
zakázat lze klasicky prostřednictvím INTCON a PIE1
Závěr
Nová řada vyniká nesporně v rychlosti přeprogramování obvodu. Velikým plus je možnost opětovného ICSP v již osazeném výrobku. V praxi to znamená možnost update firmwareu bez dalšího zásahu do HW. Tato možnost u mateřské řady chyběla.