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

Zdravím u třetího dílu této série!

Minule jsme si ukázali poměrně velké spektrum věcí. Naučili jsme se nastavit vnitřní oscilátor a ovládat LEDku. Dnes si do hry přidáme také nějaký digitální vstup. V tomhle případě nám bohatě poslouží obyčejné tlačítko. Pojďme na to!

K rozsvícení LEDky jsme nastavovali bity na registru LATx (konkrétně LATC). Pokud bychom nastavili určitý pin jako digitální vstup a pokusili bychom se zjistit hodnotu na tomto pinu pomocí registru LATx, pravděpodobně bychom nedostali správnou hodnotu. V tomto případě bychom přečetli nastavenou hodnotu (v datasheetu můžete nalézt výchozí hodnoty po resetu/přerušení).

Ke čtení aktuální hodnoty vstupu nám tedy poslouží jiný registr a tím je PORTx. Do něj nebudeme vkládat žádné hodnoty, ale naopak je číst. K tomu nám poslouží i několik nových příkazů. Budeme používat tzv. skokové instrukce (prozatím btfsc, btfss, goto).

Instrukce jsou následující: (jinak odkazuji na přiložený materiál u předchozího článku, kde je většina instrukcí sepsána pohromadě)

  • btfsc [Bit Test and Skip if Clear] – tento příkaz otestuje určitý bit na registru f a přeskočí následující instrukci, pokud je bit v nule
  • btfss [Bit Test and Skip if Set] – to samé, jako předchozí příkaz, ale děje se tak, pokud je bit v jedničce
  • goto – skočí na určité místo v programové paměti (ukážeme si příklad, nebojte)
  • nop [No OPeration] – není úplně tak od věci si ukázat i tuto instrukci, je to tzv. prázdná instrukce, procesor neudělá nic

To by asi prozatím stačilo…

Použijme kód z minulého dílu:

Návěští

Návěští (anglicky label) je jakési programátorovo slovní označení určitého místa v programové paměti. Každý příkaz procesoru je uložen na nějakou adresu v programové paměti. Kdybychom na toto místo chtěli v programu přeskočit, museli bychom si zjišťovat vždy jeho adresu. Naštěstí pro nás si můžeme tato místa pojmenovat a zbytek za nás vyřeší kompilátor.

Pojďme si tedy ukázat, jak takové návěští vypadá:

Jak jste si mohli všimnout, přibylo nám do kódu slůvko START. Samozřejmě si návěští můžete pojmenovat dle své libosti. Takto nám je ale celkem k ničemu.

Ještě než přikročím k nějakému užitečnému použití, musím vám říci jednu důležitou věc. Náš mikrokontrolér po skončení programu vždy začíná zase od začátku. To znamená, že jakmile se nám rozsvítí LEDka a skončí program, začnou se znovu nastavovat konfigurační bity, vnitřní oscilátor a samotná LEDka. My bychom ale konfigurační bity a vnitřní oscilátor potřebovali nastavit jen jednou.
Návěští tedy nabyde významu ve chvíli, kdy přidám instrukci goto:

Trochu jsem upravil celý kód a přidal nějaké komentáře. Nyní je patrné, že konfigurační bity, vnitřní oscilátor a TRISC bit nastaví jen jednou. Poté se stále dokola zapíná LEDka.

Ukážeme si ještě jedno možné použití instrukce goto:

V tomto případě má kód stejný efekt. Znak $ nám značí aktuální instrukci. Číslo za ním (u kladných čísel se píše znaménko ‘+’ – př: $+5) říká, o kolik instrukcí a jakým směrem má procesor skočit. Pokud použijeme znaménko mínus, skočí procesor zpět, pokud použijeme plus, skočí procesor vpřed.

Pokud bychom napsali toto,

vytvořili bychom, jak mnozí z vás už jistě tuší, nekonečnou smyčku, kdy by se procesor zasekl na této instrukci a dostal by se tak do mrtvého bodu.

Pojďme vložit do hry nějaký vstup! Schéma zapojení bude vypadat následovně:

Tut3_1

LEDku ponecháme na jejím místě a na bit RC2 připojíme vypínač. Pro jistotu si ale nejdříve naprogramujeme mikrokontrolér, pak teprve sestavíme obvod a připojíme k napájení (kvůli již dříve zmíněné možnosti zkratu).

Odpory si zvolte podle své libosti 🙂 .

Nejdříve vám popíšu slovně, o co se pokusíme.

Ze začátku samozřejmě nastavíme konfigurační bity, vnitřní oscilátor atd., to už víme… V hlavní smyčce pak vždy vypneme LEDku, pak se zeptáme, jestli je tlačítko sepnuté. Pokud ano, zapneme LEDku. Pokud ne, neuděláme nic. Dále pokračujeme zase na začátku hlavní smyčky.

Pojďme to zapsat do programu:

Začátek programu je asi všem jasný. Jediné, co vás mohlo zarazit, je použití registru ANSELx. Náš mikrokontrolér všechny digitální vstupy nastavuje automaticky jako analogové. My potřebujeme digitální. Takže příslušný bit nastavíme na nulu. Pak přijde návěští START. Za ním vypneme LEDku. Poté testujeme bit RC2, jestli je v jedničce (seplé tlačítko). Pokud není, vracíme se zpět na START. Pokud je, zapneme LEDku a jdeme na START. To je celý program.

Pokud se vám podařilo tento kód zprovoznit, gratuluji! Zkuste si nyní napsat kód, který zapne LEDku při vypnutém tlačítku a naopak.

To by bylo pro tento díl vše. Příště si ukážeme nějaké další příklady s tlačítkem. Do dalšího dílu, mějte se!

Napsat komentář

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