V našem předchozím tutoriálu jsme se dozvěděli o Blinking a LED pomocí PIC mikrokontroléru a postavili jsme stejný obvod na desce Perf. Poté jsme použili program PICkit 3, ICSP a MPLAB IPE pro výpis programu na naši desku Perf. Nyní v tomto tutoriálu postoupíme k používání více pinů na mikrokontroléru PIC. Použijeme 7 výstupů (LED) a jeden vstup. Pro tento tutoriál použijeme starou desku Perf (zobrazenou níže) a přidáme berg sticks, abychom vytáhli požadované kolíky na druhou LED desku. Na konci tohoto tutoriálu vygenerujeme sekvenci blikajících LED pomocí mikrokontroléru PIC PIC16F877A a naučíme se, jak používat více vstupů a výstupů, některé základy smyčky a volání funkcí pro.
Deska LED není nic jiného než další deska perf, na kterou budeme pájet LED diody s rezistorem omezujícím proud (zobrazeným níže). Přidáme také tlačítko k zahájení blikání LED sekvence.
Kruhový diagram:
Mikrokontrolér PIC PIC16F877A LED blikající sekvenční kód a pracovní vysvětlení:
Níže je uveden kompletní kód (zkontrolujte na konci), zde ho dostaneme po řádcích. Tento kód začne po stisknutí tlačítka postupně svítit LED diodami. Abychom pochopili sekvence, podívejte se na video na konci tutoriálu. Doporučil bych vám porovnat výstup zobrazený ve videu s níže uvedeným kódem a pokusit se porozumět programu.
Podívejme se na kód po řádku. Prvních několik řádků slouží k nastavení konfiguračních bitů, které byly vysvětleny v předchozím tutoriálu, takže je zatím přeskakuji. Nejlepší způsob, jak porozumět jakémukoli programu, je začít od funkce main ( void main () ), tak to udělejme
TRISB0 = 1; // Poučte MCU, aby se pin PORTB 0 použil jako vstup pro tlačítko. TRISD = 0x00; // Instruujte MCU, že všechny piny jsou na výstupu PORTD = 0x00; // Inicializujte všechny piny na 0
Slovo TRIS se používá k definování, zda se pin používá jako vstup / výstup a slovo PORT se používá k vytvoření pinů High / Low. Řádek TRISB0 = 1 vytvoří jako vstup 0. pin PORT B. Toto bude naše tlačítko. Řádky TRISD = 0x00; PORTD = 0x00; vytvoří všechny piny portu D jako výstup a těmto pinům přiřadí počáteční hodnotu LOW.
Protože jsme řekli, že jako vstup se používá B0, spojíme jeden konec tlačítka s pinem B0 a druhý konec se zemí. Do té doby, kdykoli stiskneme tlačítko, bude kolík přidržen na zemi, jak je znázorněno ve schématu připojení výše. Aby se to však stalo, musíme použít vytahovací rezistor, aby byl kolík držen vysoko, když není stisknuto tlačítko. Vytahovací rezistor je něco takového.
Ale náš PIC MCU má interní slabý pull up rezistor, který lze aktivovat softwarem tímto způsobem, což šetří spoustu potíží (pokud je třeba připojit více tlačítek).
Co je to Slabý pull up rezistor?
Existují dva typy pull up rezistoru, jeden je Weak Pull Up a druhý je Strong Pull Up. Slabé pull up rezistory mají vysokou hodnotu a umožňují tak protékat slabému proudu a silné pull up odpory mají nízkou hodnotu, což umožňuje protékání silného proudu. Všechny MCU většinou používají slabé odpory. Abychom to aktivovali v našem PIC MCU, musíme se podívat do našeho datového listu pro OPTION_REG (registr možností), jak je znázorněno na snímku níže.
Jak je ukázáno, bit 7 se zabývá slabým pull up rezistorem. Pro jeho aktivaci by měla být nastavena nula. To se děje pomocí OPTION_REG <7> = 0 . Toto konkrétně pojednává o tom, že bit 7 ponechává ostatní bity na své výchozí hodnoty. Tím se dostaneme do naší while smyčky, kde pomocí if (RB0 == 0) zkontroluje, zda je tlačítko stisknuto . Pokud je podmínka splněna, voláme naši funkci s parametry 1, 3, 7 a 15.
sblink (1); // FUNKČNÍ VOLÁNÍ 1 s parametrem 1 sblink (3); // FUNKČNÍ VOLÁNÍ 3 s parametrem 3 sblink (7); // FUNKČNÍ VOLÁNÍ 7 s parametrem 7 sblink (15); // FUNKČNÍ VOLÁNÍ 4 s parametrem 15
Proč používáme funkce?
Funkce se používají ke snížení počtu řádků v našem kódu. To by většina z nás věděla. Proč ale musíme snížit počet řádků, zvláště pokud jde o programování MCU. Důvodem je v naší paměti programu omezený prostor. Pokud kód neoptimalizujeme správně, mohlo by nám dojít místo v paměti. To se nám bude hodit, když budeme psát dlouhé stránky kódů.
Jakákoli funkce bude mít funkci Definition (v našem případě sblink (int get) ) a funkci Call (v našem případě sblink (1) ). Je volitelné mít deklaraci funkce, abych se tomu vyhnul, vložil jsem definici své funkce před voláním funkce do mé hlavní funkce.
Parametry funkce jsou hodnota, která bude předána z volání funkce do definice funkce. V našem případě jsou celočíselné hodnoty (1, 3, 7, 15) parametry předávané z volání funkce a proměnná „get“ získá hodnotu parametrů do definice funkce, aby je mohla zpracovat. Funkce může mít více než jeden parametr.
Po vyvolání funkce se provedou níže uvedené řádky v definici funkce.
for (int i = 0; i <= 7 && RB0 == 0; i ++) {PORTD = get << i; // LED move Left Sequence __delay_ms (50); } for (int i = 7; i> = 0 && RB0 == 0; i--) {PORTD = get << i; // LED move Left Sequence __delay_ms (50); }
Nyní se tento řádek zdá divný: PORTD = get << i . Vysvětlím, co se tady vlastně děje.
„<<“ je operátor levého posunu, který přesouvá všechny bity do své levé polohy. Nyní, když voláme funkci sblink (int get) s parametrem '1' jako sblink (1), udělá hodnotu 'get' jako 1, což je v binární podobě 0b00000001. Proto bude tento řádek vypadat jako PORTD = 0b00000001 << i .
Hodnota „i“ se bude lišit od 0 do 7, protože jsme použili „smyčku for “ pro (int i = 0; i <= 7 && RB0 == 0; i ++). Hodnota „i“ od 0 do 7 změní výsledek takto:
Jak vidíte, rozsvítili jsme jednu LED diodu po druhé (zleva doprava) tak, že jsme ostatní nechali VYPNUTO. Další „smyčka pro“ pro (int i = 7; i> = 0 && RB0 == 0; i--) bude také dělat totéž, ale tentokrát se LED rozsvítí zprava doleva v pořadí, jak jsme začínali od 7 a klesali k 0. Použili jsme zpoždění 200 ms, abychom mohli vizualizovat rozsvícení a zhasnutí LED.
Nyní, když předáme hodnotu 3 ve funkci sblink (int get) , bude provedena funkce sblink (3), díky níž bude hodnota 'get' 0b00000011, proto bude výsledek na PORTD:
Takže nyní se tentokrát rozsvítí dvě LED diody pomocí sblink (3). Podobně pro sblink (7) a sblink (15) se rozsvítí tři a čtyři LED diody v pořadí. Jakmile je to hotové, rozsvítíme všechny LED pomocí řádku PORTD = 0xFF . Kompletní ukázku najdete na videu níže.
Doufám, že jste pochopili kód, a tak jste se naučili používat funkce smyčky „pro“ a „while“ k získání požadovaných výstupů. Nyní můžete vyladit kód, aby vaše různá sekvence LED začala blikat. Pokračujte v kompilaci kódu, vložte jej do svého MCU a užijte si výstup. Pokud někde uvíznete, můžete použít sekci komentářů. Také jsem sem připojil soubory simulace a programu.
To je prozatím vše v našem dalším výukovém programu, kde se naučíme používat časovače PIC16F877A místo použití zpožďovacích funkcí. Zde si můžete prohlédnout všechny výukové programy pro mikrokontroléry PIC.