[PIC programování] – 6. díl

Samuel Trávníček 10

Vítám vás u šestého dílu série PIC programování!

V tomto díle jsem se rozhodl seznámit vás s moduly Timer2/4/6. Ty nám od tohoto dílu sloužit jako časovače našich programů. Co timer umí? Nic moc. Jen podle toho, jakou frekvenci mu nastavíme, odpočítává, a když dojde do konce, tak se zresetuje a dá nám vědět, že dopočítal. Jeho výstup buď můžeme sledovat programově, nebo jej vyvést na nějaký z portů mikrokontroléru. Mikrokontrolér PIC16F1705 má celkem 4 osmibitové časovače a jeden šestnáctibitový. My budem pracovat s modulem Timer2, který je osmibitový, což pro naše účely bohatě postačí. Pokud se naučíte s Timerem 2, budete zároveň umět nastavit Timer 4 a 6.

Schéma časovače vypadá následovně: (datasheet na straně 257)

Snímek obrazovky pořízený 2016-05-16 20:12:47

Z diagramu je patrné, že základní frekvencí pro časovač je frekvence oscilátoru děleno 4. V našem případě, pokud máme vnitřní oscilátor nastaven na 4 MHz, budeme počítat s hodnotou 1 MHz. Dále se celá frekvence dělí tzv. prescalerem. Můžeme buď nechat základní frekvenci, nebo dělit čtyřmi, šestnácti nebo šedesáti čtyřmi. Pokud signál projde prescalerem, inkrementuje se (zvýší se o jedničku) registr TMR2. Jeho hodnota se pomocí komparátoru porovnává s hodnotou registru PR2. Pokud se tyto dvě hodnoty rovnají, signál projde dál. Pro nás to znamená, že můžeme frekvenci po úpravě prescalerem ještě podělit hodnotou v registru PR2. Pokud se hodnoty registrů TMR2 a PR2 rovnají, resetuje se registr TMR2 (nastaví se na nulu). Poté můžeme buď signál přivést do některých periferií (např. nějaká sériová linka, třeba SPI, ale o tom až později) nebo může jít ještě skrze tzv. postscaler. V postscaleru se frekvence ještě podělí. Dělit můžeme hodnotou od 1 do 16. Teprve až když projde signál i postscalerem, nastaví se bit TMR2IF v registru PIR1 na jedničku. My tedy budeme testovat tento bit, abychom zjistili, zda můžeme v programu pokračovat.

Pojďme se pokusit si popsat strukturu našeho kódu. Ze začátku samozřejmě nastavíme konfigurační bity, vnitřní oscilátor atd. Poté nastavíme prescaler, postscaler a registr PR2. Součet jejich hodnot nám dá celkový dělitel frekvence. Pro náš příklad (a také pro pozdější využití) si nastavíme frekvenci 100 Hz. Pojďme tedy počítat:

Začínáme na frekvenci 4 MHz, ta se podělí čtyřmi. K prescaleru “dorazí” frekvence 1 MHz. Nyní jí podělíme čtyřmi. Máme tedy frekvenci 250 kHz. Poté nastavíme registr PR2 na hodnotu 25010, čímž dostaneme frekvenci pouhý 1 kHz. V postscaleru podělíme frekvenci deseti. Tím dostaneme 100 Hz.

Ano vím, nejspíš je to trochu složité, ale nebojte, až si projdete kód, tak to pochopíte. Proto, abychom mohli nastavit prescaler a postscaler, musíme znát registr T2CON:

Snímek obrazovky pořízený 2016-05-16 20:32:04

Sedmý bit (tedy první zleva) je neimplementovaný. Ať ho nastavíme, jak ho nastavíme, procesor ho neřeší. Následuje skupina čtyř bitů pojmenovaná jako T2OUTPS. Pomocí této skupiny nastavíme postscaler. Postscaler jsme chtěli nastavit na hodnotu deset. V seznamu pod tabulkou je pro hodnotu deset uvedena hodnota 10012. Dále máme jeden bit pojmenovaný TMR2ON. Pokud chceme, aby timer počítal, musíme tento bit nastavit na jedničku. Zbývá skupina dvou bitů pojmenovaná T2CKPS. Tou se nastavuje prescaler. Ten jsme chtěli nastavit na čtyřku, volíme tedy hodnotu 012. Poté už jen nastavíme registr PR2 na hodnotu 25010. Pokud je čítač platný (doběhl do konce), nastaví se bit TMR2IF na jedničku. Tento bit musíme ručně vynulovat, nebo zůstane v jedničce.

Pojďme si to ukázat v kódu:

Po pročtení komentářů by mělo snad být vše jasné. Pokud ne, pročtěte si jej znovu i s popisem, není to tak těžké.

Komentářem jsem označil místo, kam budem umisťovat náš kód. Pojďme si třeba rozblikat LEDku. Než tak uděláme, budeme potřebovat značně nižší frekvenci. Pokud naší frekvenci podělíme stem, dostaneme se na frekvenci 1 Hz. To bude pro nás optimální. Do kódu přidáme jednu proměnnou, kterou nastavíme na 100 a budeme jí tak dlouho dekrementovat (snižovat o jedničku) až dojdeme do nuly. Poté jí opět nastavíme na 100 a provedeme naší rutinu. Upravený kód bude vypadat takto:

Zde jen vysvětlím příkaz decfsz [DECrement F and Skip if Zero]. Tento příkaz odečte z registru F jedničku. Pokud je registr v nule, přeskočí se následující instrukce. Pokud bychom registr CITAC nevynulovali, pak pokračuje na svojí maximální hodnotě (111111112 = 25510). Tomu se říká přetečení (angl. overflow). Totéž by se dělo při inkrementaci na hodnotě 255, akorát že by se začalo od nuly. Více nemám co dodat, komentáře snad mluví jasně.

Nyní už nás čeká samotná rutina pro blikání LEDky. LEDku si necháme z minulého dílu na portu RC3. Schéma zapojení bude vypadat tedy takto:

Tut6_1

Velikost odporu u LEDky nechám opět na vás…

Pojďme si ještě do kódu (někam nad hlavní smyčku) nastavit port RC3 jako výstup a vynulovat ho:

Teď už jen zbývá hlavní rutina. Nebudeme dělat nic jiného, než negovat bit RC3. Pokud bude v jedničce, nastavíme ho do nuly. Pokud bude v nule, nastavíme ho do jedničky. To budeme tedy provádět s naší frekvencí 1 Hz, což znamená, že by LEDka měla svítit jednu sekundu a být zhasnuta jednu sekundu (a tak pořád dokola).

Opět, komentáře by měly být jasné, příkazy taktéž. Celý kód bude vypadat následovně:

Pokud vám LEDka bliká s frekvencí 1 Hz, tak vám gratuluji! Právě jste se naučili jednu z nejužitečnějších věcí o programování PIC mikrokontrolérů. Nyní si už můžete podle sebe časovat vaše programy.

V příštím díle se hlouběji ponoříme do časování, vytvoříme si několik smyček o různých frekvencích a ukážeme si, jak vytvářet podprogramy, čímž se nám vše podstatně zjednoduší. Pokud jste vydrželi až sem, tak vám děkuji a prosím o sdílení a také o zpětnou vazbu v komentářích. Do příštího dílu se mějte!

10 Replies to “[PIC programování] – 6. díl”

    1. Zatím jsem neplánoval, ale mohl bych tam přidat pár věcí, třeba sériovou komunikaci, mTouch a další…

  1. Taky bych se přimlouval za další články o programování PIC. Je to moc hezky psáno a hlavně polopatisticky.

  2. Jsem rád, že to někdo sleduje, tak se pokusím dneska udělat díl na PWM. Snad ještě najdu ten samej mikrokontrolér někde…

  3. Moc pěkně napsáno a vysvětleno. Je to i čtivé. Prošel jsem všechny kapitoly, velmi se mi tento styl výuky zamlouvá a přimlouvám se za pokračování.

  4. Krásné napsané články, čtivé, perfektně vysvětlené, stále jsem věřil že bude pokračování, ale asi už dál nic nebude po takové době. Moc velká škoda že to nepokračuje. Nic lepšího jsem doposud na PIC nenašel. Kdyby se přece něco změnilo, dejte vědět, rád budu číst dál.

    1. Děkuji, mám už asi půl roku rozepsaný sedmý díl, bohužel jsem nějak neměl čas jej dokončit. Pokusím se přes prázdniny něco sesmolit.

  5. Moc děkuji za články o programování PIC, jsem důchodce (68) “ajťák” a v důchodu jsem se vrátil ke koníčku z mládí : elektronika. Docela mě láká programování PIC a vaše články jsou pro mě inspirací a výukou zároveň. Moc děkuji.

    1. Dobrý den, bohužel Microchip před několika lety koupil AVR a od té doby stihl zlikvidovat (skončil vývoj a podpora) kompilátoru MPASM. Nyní je k dispozici pouze XC8 (Cčkový) kompilátor a jeho XC8 PIC Assembler. Osobně jsem v PIC ztratil zálibu vzhledem k chování Microchipu, uzavřenosti platformy a mizerným vývojovým nástrojům (SW i HW, tedy MPLAB X IDE, PicKit 4). Osobně preferuji STM32 čipy. Ty sice asi nebudete ručně programovat v assembleru, nicméně můžete použít otevřený kompilátor jako je GCC. Taky je velmi pěkný čip RP2040 od Raspberry Pi Ltd. Ten je navržený hlavně pro výuku, ale zároveň je to docela slušný a levný čip (když jsem se díval posledně, stál asi 20 kč, ale potřebujete externí paměť). Dá se programovat v C/C++/MicroPythonu/Rustu a pravděpodobně i dalších jazycích. Má velmi zajímavou periferii PIO, což je v assembleru programovatélné IO, lidé s tím umí vyrobit sběrnici CAN, náhrandí UART, dokonce někdo i vyvíjí Ethernet rozhraní (zatím snad na velmi pomalé přenosy). Nicméně pokud potřebujete levný čip (na koruny) na jednoduchou logiku, tak stejně vždycky šáhnete po AVR nebo po PIC. STM taky dělá 8-bity, ale tenkrát jsem nějak neviděl cenový rozdíl oproti 32-bitům.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.