V našom predchádzajúcom tutoriáli sme sa dozvedeli o blikaní LED pomocou mikrokontroléra PIC a rovnaký obvod sme vytvorili na doske Perf. Potom sme na vyhodenie programu na našu Perf dosku použili PICkit 3, ICSP a MPLAB IPE. Teraz v tomto tutoriále postúpime k používaniu ďalších pinov na mikrokontroléri PIC. Použijeme 7 výstupov (LED) a jeden vstup. Pre tento tutoriál použijeme starú dosku Perf (zobrazenú nižšie) a pridáme berg tyčinky na vytiahnutie potrebných pinov na druhú LED dosku. Na konci tohto tutoriálu vygenerujeme sekvenciu blikajúcich LED diód pomocou mikrokontroléra PIC PIC16F877A a naučíme sa, ako používať viac vstupov a výstupov, základné základy slučky a volania funkcií.
LED doska nie je nič iné ako iná dokonalá doska, na ktorú budeme spájkovať LED diódy s rezistorom obmedzujúcim prúd (zobrazený nižšie). Pridáme tiež tlačidlo na spustenie blikania sekvenčnej LED.
Schéma zapojenia:
Mikrokontrolér PIC PIC16F877A LED blikajúci sekvenčný kód a pracovné vysvetlenie:
Kompletný kód je uvedený nižšie (kontrola na konci), tu ho dostaneme po riadkoch. Tento kód začne po stlačení tlačidla postupne svietiť LED diódami. Aby ste pochopili postupnosť, pozrite si video na konci tutoriálu. Odporučil by som vám porovnať výstup zobrazený vo videu s kódom uvedeným nižšie a pokúsiť sa porozumieť programu.
Pozrime sa na kódový riadok po riadku. Prvých pár riadkov slúži na nastavenie konfiguračných bitov, ktoré boli vysvetlené v predchádzajúcom návode, takže ich zatiaľ preskakujem. Najlepší spôsob, ako pochopiť akýkoľvek program, je začať od hlavnej funkcie ( void main () ), urobme to
TRISB0 = 1; // Dajte MCU pokyn, aby sa ako vstup pre tlačidlo použil pin 0 PORTB. TRISD = 0x00; // Inštruujte MCU, aby všetky piny boli na výstupe PORTD = 0x00; // Inicializujte všetky piny na 0
Slovo TRIS sa používa na definovanie toho, či sa pin používa ako vstup / výstup a slovo PORT sa používa na vytvorenie kolíka High / Low. Riadok TRISB0 = 1 vytvorí ako vstup 0. pin PORT B. Toto bude naše tlačidlo. Riadky TRISD = 0x00; PORTD = 0x00; urobí všetky piny portu D ako výstup a týmto pinom priradí počiatočnú hodnotu LOW.
Pretože sme povedali, že ako vstup sa používa B0, pripojíme jeden koniec tlačidla k pinu B0 a druhý koniec k zemi. Do tej doby, kedykoľvek stlačíme tlačidlo, bude kolík držaný na zemi, ako je to znázornené na schéme zapojenia vyššie. Aby sme to však dosiahli, musíme použiť pull-up rezistor, aby sa kolík udržal vysoko, keď nebude stlačené tlačidlo. Vytahovací rezistor je niečo také.
Ale náš PIC MCU má interný slabý pull up odpor, ktorý je možné aktivovať softvérom a ušetriť tak veľa problémov (keď je potrebné pripojiť viac tlačidiel).
Čo je to slabý pull up rezistor?
Existujú dva typy pull up rezistorov, jeden je Weak Pull Up a druhý je Strong Pull Up. Slabé odpory majú vysokú hodnotu a tak umožňujú pretekanie slabého prúdu a silné odpory majú nízku hodnotu, čo umožňuje prúdenie silného prúdu. Všetky MCU väčšinou používajú slabé pull up rezistory. Aby sme to aktivovali v našom PIC MCU, musíme sa pozrieť do nášho údajového listu pre OPTION_REG (register voliteľných doplnkov), ako je znázornené na snímke nižšie.
Ako je znázornené, bit 7 sa zaoberá slabým pull up rezistorom. Pre jeho aktiváciu by mala byť nastavená nula. To sa deje pomocou OPTION_REG <7> = 0 . Toto sa osobitne zaoberá tým, že bit 7 ponecháva ostatné bity na svoje predvolené hodnoty. Týmto sa dostaneme do našej while cyklu, kde pomocou if (RB0 == 0) skontroluje, či je tlačidlo stlačené . Ak je podmienka splnená, voláme našu funkciu s parametrami 1, 3, 7 a 15.
sblink (1); // FUNKČNÉ HOVOR 1 s parametrom 1 sblink (3); // FUNKČNÉ HOVOR 3 s parametrom 3 sblink (7); // FUNKČNÉ VOLANIE 7 s parametrom 7 sblink (15); // FUNKČNÉ VOLANIE 4 s parametrom 15
Prečo používame funkcie?
Funkcie sa používajú na zníženie počtu riadkov v našom kóde. Toto by vedela väčšina z nás. Prečo však musíme znížiť počet riadkov, najmä pokiaľ ide o programovanie MCU. Dôvodom je v našej pamäti programu obmedzený priestor. Ak kód neoptimalizujeme správne, mohlo by nám dôjsť miesto v pamäti. To sa bude hodiť, keď budeme písať dlhé stránky kódov.
Akákoľvek funkcia bude mať funkciu Definition (v našom prípade sblink (int get) ) a funkciu Call (v našom prípade sblink (1) ). Je voliteľné mať deklaráciu funkcie, aby som tomu zabránil, umiestnil som svoju definíciu funkcie pred volaním funkcie do mojej hlavnej funkcie.
Parametre funkcie sú hodnota, ktorá sa prenesie z volania funkcie do definície funkcie. V našom prípade sú celočíselné hodnoty (1, 3, 7, 15) parametre, ktoré sa prenášajú z volania funkcie a premenná „get“ dostane hodnotu parametrov do definície funkcie na ich spracovanie. Funkcia môže mať viac ako jeden parameter.
Po zavolaní funkcie sa vykonajú nasledujúce riadky v definícii funkcie.
pre (int i = 0; i <= 7 && RB0 == 0; i ++) {PORTD = get << i; // LED pohyb doľava Sekvencia __delay_ms (50); } for (int i = 7; i> = 0 && RB0 == 0; i--) {PORTD = get << i; // LED pohyb doľava Sekvencia __delay_ms (50); }
Teraz sa tento riadok zdá byť nepárny: PORTD = get << i . Vysvetlím, čo sa to tu vlastne deje.
„<<“ je operátor ľavého posunu, ktorý posúva všetky bity do svojej ľavej polohy. Teraz, keď voláme funkciu sblink (int get) s parametrom '1' ako sblink (1), bude mať hodnotu 'get' ako 1, čo je v binárnej podobe 0b00000001. Preto bude tento riadok vyzerať ako PORTD = 0b00000001 << i .
Hodnota „i“ sa bude pohybovať od 0 do 7, pretože sme použili „for loop“ pre (int i = 0; i <= 7 && RB0 == 0; i ++). Hodnota „i“ od 0 do 7 zmení výsledok nasledovne:
Ako vidíte, rozsvietili sme jednu LED naraz (zľava doprava) tak, že sme ostatné nechali VYPNUTÉ. To isté urobí aj nasledujúca slučka „ for “ pre (int i = 7; i> = 0 && RB0 == 0; i--) , ale tentokrát sa LED rozsvieti sprava doľava v poradí, pretože sme začínali od 7 a klesali k 0. Použili sme oneskorenie 200ms, aby sme mohli vizualizovať zapínanie a vypínanie LED.
Teraz, keď odovzdáme hodnotu 3 vo funkcii sblink (int get) , vykoná sa funkcia sblink (3), vďaka ktorej bude hodnota „get“ 0b00000011, takže výsledok na PORTD bude:
Takže teraz budú tentokrát rozsvietené dve LED diódy pomocou sblink (3). Podobne pre sblink (7) a sblink (15) budú postupne svietiť tri a štyri LED diódy. Keď je to hotové, rozsvietime všetky LED pomocou riadku PORTD = 0xFF . Kompletné ukážky nájdete na videu nižšie.
Dúfam, že ste pochopili kód, a tak ste sa naučili používať funkcie „for“ a „while“ na získanie požadovaných výstupov. Teraz môžete okolo kódu doladiť, aby vám začala blikať iná postupnosť LED. Pokračujte v kompilácii kódu, vložte ho do svojho MCU a užívajte si výstup. Ak niekde uviaznete, môžete použiť sekciu s komentármi. Tu som tiež pripojil súbory simulácie a programu.
To je zatiaľ všetko v našom ďalšom výučbe, kde sa naučíme používať časovače PIC16F877A namiesto použitia funkcií oneskorenia. Tu si môžete prezrieť všetky výukové programy pre mikrokontroléry PIC.