- Požadavky:
- Programování mikrokontroléru PIC pro komunikaci UART:
- Simulace našeho programu:
- Nastavení hardwaru a testování výstupu:
V tomto kurzu se naučíme Povolit komunikaci UART s mikrokontrolérem PIC a jak přenášet data do az vašeho počítače. Zatím jsme pokryli všechny základní moduly jako ADC, Timers, PWM a také jsme se naučili, jak propojit LCD a 7segmentové displeje. Nyní vybavíme sebe sama novým komunikačním nástrojem s názvem UART, který je široce používán ve většině projektů mikrokontroléru. Podívejte se zde na naše kompletní výukové programy pro mikrokontroléry PIC pomocí MPLAB a XC8.
Zde jsme použili PIC16F877A MCU, má modul s názvem „Adresovatelný univerzální synchronní asynchronní přijímač a vysílač“, krátce známý jako USART. USART je dvouvodičový komunikační systém, ve kterém data tečou sériově. USART je také plně duplexní komunikace, což znamená, že můžete současně odesílat a přijímat data, která lze použít ke komunikaci s periferními zařízeními, jako jsou terminály CRT a osobní počítače.
USART lze konfigurovat v následujících režimech:
- Asynchronní (plně duplexní)
- Synchronní - hlavní (poloduplexní)
- Synchronní - podřízený (poloduplexní)
Existují také dva různé režimy, jmenovitě 8bitový a 9bitový režim, v tomto výukovém programu nakonfigurujeme modul USART tak, aby pracoval v asynchronním režimu s 8bitovým komunikačním systémem, protože se jedná o nejpoužívanější typ komunikace. Protože je asynchronní, nemusí posílat hodinový signál spolu s datovými signály. UART používá dvě datové linky pro odesílání (Tx) a příjem (Rx) dat. Uzemnění obou zařízení by také mělo být společné. Tento typ komunikace nesdílí společné hodiny, a proto je pro fungování systému velmi důležitá společná základna.
Na konci tohoto kurzu budete moci navázat komunikaci (UART) mezi počítačem a mikrokontrolérem PIC a přepínat LED na desce PIC z vašeho notebooku. Stav LED bude odeslán do vašeho notebooku z PIC MCU. Výstup otestujeme pomocí Hyper Terminal v počítači. Podrobné video je také uvedeno na konci tohoto tutoriálu.
Požadavky:
Hardware:
- PIC16F877A Perf Board
- Modul převaděče RS232 na USB
- Počítač
- Programátor PICkit 3
Software:
- MPLABX
- HyperTerminal
K převodu sériových dat do počítačem čitelné podoby je vyžadován převodník RS232 na USB. Existují způsoby, jak navrhnout vlastní obvod namísto nákupu vlastního modulu, ale nejsou spolehlivé, protože jsou vystaveny hluku. Ten, který používáme, je uveden níže
Poznámka: Každý převodník RS232 na USB by vyžadoval instalaci speciálního ovladače; většina z nich by se měla nainstalovat automaticky, jakmile připojíte zařízení. Pokud se však neuvolní !!! Použijte sekci komentářů a já vám pomůžu.
Programování mikrokontroléru PIC pro komunikaci UART:
Stejně jako všechny moduly (ADC, Timer, PWM) bychom měli také inicializovat náš USART modul našeho PIC16F877A MCU a dát mu pokyn, aby pracoval v 8bitovém komunikačním režimu UART. Pojďme definovat konfigurační bity a začneme s inicializační funkcí UART.
Inicializace modulu UART mikrokontroléru PIC:
Kolíky Tx a Rx jsou fyzicky přítomny na kolících RC6 a RC7. Podle datasheetu deklarujme TX jako výstup a RX jako vstup.
// **** Nastavení I / O pinů pro UART **** // TRISC6 = 0; // TX Pin nastaven jako výstup TRISC7 = 1; // RX Pin nastaven jako vstup // ________ I / O piny nastaveny __________ //
Nyní je třeba nastavit přenosovou rychlost. Přenosová rychlost je rychlost, při které jsou informace přenášeny v komunikačním kanálu. To může být jedna z mnoha výchozích hodnot, ale v tomto programu používáme 9600 od jeho nejpoužívanější přenosové rychlosti.
/ ** Inicializovat registr SPBRG pro požadovanou přenosovou rychlost a nastavit BRGH pro rychlou přenosovou rychlost ** / SPBRG = ((_XTAL_FREQ / 16) / přenosová rychlost) - 1; BRGH = 1; // pro vysokou přenosovou rychlost // _________ Konec nastavení přenosové rychlosti _________ //
Hodnotu přenosové rychlosti je třeba nastavit pomocí registru SPBRG, hodnota závisí na hodnotě frekvence externího krystalu, vzorce pro výpočet přenosové rychlosti jsou uvedeny níže:
SPBRG = ((_XTAL_FREQ / 16) / přenosová rychlost) - 1;
Bit BRGH musí být nastaven vysoko, aby umožňoval vysokorychlostní bitovou rychlost. Podle datového listu (strana 13) je vždy výhodné jej povolit, protože může eliminovat chyby během komunikace.
Jak již bylo řečeno, budeme pracovat v asynchronním režimu, proto by měl být bit SYNC nastaven na nulu a bit SPEM musí být nastaven vysoko, aby bylo možné povolit sériové piny (TRISC6 a TRICSC5)
// **** Povolit asynchronní sériový port ******* // SYNC = 0; // Asynchronous SPEN = 1; // Povolit piny sériového portu // _____ Asynchronní sériový port povolen _______ //
V tomto kurzu budeme odesílat i přijímat data mezi MCU a počítačem, proto musíme povolit jak TXEN, tak CREN bity.
// ** Pojďme se připravit na vysílání a příjem ** // TXEN = 1; // povolit přenos CREN = 1; // povolení příjmu // __ modul UART připravený k přenosu a příjmu __ //
Tyto bity TX9 a RX9 musí být nulová, takže se pohybujeme v 8-bitovém režimu. Pokud musí být zajištěna vysoká spolehlivost, lze zvolit 9bitový režim.
// ** Vyberte 8bitový režim ** // TX9 = 0; // 8bitový příjem zvolen RX9 = 0; // Je vybrán 8bitový režim příjmu // __ Je vybrán 8bitový režim __ //
Tímto dokončujeme nastavení inicializace. a je připraven k provozu.
Přenos dat pomocí UART:
K přenosu dat prostřednictvím modulu UART lze použít níže uvedenou funkci:
// ** Funkce pro odeslání jednoho bajtu data na UART ** // void UART_send_char (char bt) {while (! TXIF); // podržte program, dokud není TX buffer volný TXREG = bt; // Načtení vyrovnávací paměti vysílače přijetou hodnotou} // _____________ Konec funkce ________________ //
Jakmile je modul inicializován, bude jakákoli hodnota načtená do registru TXREG vysílána přes UART, ale přenos se může překrývat. Proto bychom měli vždy zkontrolovat příznak TXIF Přerušení přenosu. Pouze pokud je tento bit nízký, můžeme pokračovat s dalším bitem pro přenos, jinak bychom měli počkat, až se tento příznak sníží.
Výše uvedená funkce však může být použita pouze k odeslání pouze jednoho bajtu dat, k odeslání úplného řetězce by měla být použita níže uvedená funkce
// ** Funkce pro převod řetězce na bajt ** // void UART_send_string (char * st_pt) {while (* st_pt) // pokud existuje char UART_send_char (* st_pt ++); // zpracovat jako bajtová data} // ___________ Konec funkce ______________ //
Tato funkce může být trochu složitější pochopit, protože má ukazatele, ale věřte mi, ukazatele jsou úžasné a usnadňují programování, což je jeden dobrý příklad toho samého.
Jak si můžete všimnout, znovu jsme nazvali UART_send_char (), ale nyní ve smyčce while. Řetězec jsme rozdělili na jednotlivé znaky, pokaždé, když je tato funkce volána, jeden znak bude odeslán do TXREG a bude přenesen.
Příjem dat pomocí UART:
Pro příjem dat z modulu UART lze použít následující funkci:
// ** Funkce pro získání jednoho bajtu data z UART ** // char UART_get_char () {if (OERR) // zkontrolovat chybu {CREN = 0; // Pokud chyba -> Resetovat CREN = 1; // Pokud dojde k chybě -> Resetovat} while (! RCIF); // podržte program, dokud není RX buffer volný návrat RCREG; // přijetí hodnoty a její odeslání do hlavní funkce} // _____________ Konec funkce ________________ //
Když modul UART přijme data, vyzvedne je a uloží do registru RCREG. Můžeme jednoduše převést hodnotu na libovolnou proměnnou a použít ji. Může se však stát, že dojde k chybě překrytí, nebo bude uživatel odesílat data nepřetržitě a dosud jsme je nepřenesli do proměnné.
V takovém případě přijde příznakový bit RCIF na záchranu. Tento bit se sníží vždy, když jsou přijata data a ještě nejsou zpracována. Proto jej používáme ve smyčce while a vytváříme zpoždění pro udržení programu, dokud se s touto hodnotou nevypořádáme.
Přepínání LED pomocí modulu UART mikrokontroléru PIC:
Nyní pojďme k závěrečné části Programu, funkci void main (void) , kde budeme přepínat LED přes počítač pomocí komunikace UART mezi PIC a počítačem.
Když pošleme znak „1“ (z počítače), LED se rozsvítí a stavová zpráva „RED LED -> ON“ se odešle zpět (z PIC MCU) do počítače.
Podobně pošleme znak „0“ (z počítače), LED dioda zhasne a stavová zpráva „RED LED -> OFF“ bude odeslána zpět (z PIC MCU) do počítače.
while (1) // Nekonečná smyčka {get_value = UART_get_char (); if (get_value == '1') // Pokud uživatel odešle "1" {RB3 = 1; // Zapnout LED UART_send_string ("ČERVENÁ LED -> ZAPNUTO"); // Odeslat oznámení do počítače UART_send_char (10); // Hodnota ASCII 10 se používá pro návrat na začátek řádku (pro tisk v novém řádku)} if (get_value == '0') // Pokud uživatel odešle „0“ {RB3 = 0; // Vypnout LED UART_send_string ("ČERVENÉ -> VYPNUTÉ"); // Odeslat oznámení do počítače UART_send_char (10); // hodnota ASCII 10 se používá pro návrat na začátek řádku (pro tisk v novém řádku)}}
Simulace našeho programu:
Jako obvykle pojďme simulovat náš program pomocí proteus a zjistíme, zda funguje podle očekávání.
Výše uvedený obrázek ukazuje virtuální terminál, na kterém zobrazuje uvítací zprávu a stav LED. Je možné si všimnout, že červená barva LED je připojena ke kolíku RB3. Podrobný postup simulace je uveden ve videu na konci.
Nastavení hardwaru a testování výstupu:
Připojení pro tento obvod je opravdu jednoduché, používáme naši desku PIC Perf a stačí připojit tři vodiče k převaděči RS232 na USB a připojit modul k našemu počítači pomocí datového kabelu USB, jak je znázorněno níže.
Dále nainstalujeme aplikaci Hyper Terminal (stáhněte si ji zde) a otevřete ji. Mělo by to ukázat něco takového
Nyní otevřete Správce zařízení v počítači a zkontrolujte, ke kterému Com portu je váš modul připojen, moje je připojena k COM portu 17, jak je znázorněno níže
Poznámka: Název portu COM pro váš modul se může změnit podle vašeho dodavatele, není to problém.
Nyní se vraťte zpět do aplikace Hyper Terminal a přejděte na Nastavit -> Konfigurace portu nebo stiskněte Alt + C, abyste získali následující vyskakovací pole a ve vyskakovacím okně vyberte požadovaný port (v mém případě COM17) a klikněte na připojení.
Jakmile je spojení navázáno, zapněte PIC perf board a něco podobného byste měli vidět níže
Umístěte kurzor do příkazového okna a zadejte 1 a poté stiskněte klávesu Enter. LED dioda se rozsvítí a stav se zobrazí, jak je uvedeno níže.
Stejným způsobem podržte kurzor v příkazovém okně, zadejte 0 a stiskněte klávesu Enter. Kontrolka LED zhasne a stav se zobrazí, jak je uvedeno níže.
Níže je uveden kompletní kód a podrobné video, které ukazuje, jak LED reaguje v reálném čase na „1“ a „0“.
To je vše, propojili jsme PIC UART s naším počítačem a přenesli data k přepnutí LED pomocí terminálu Hyper. Doufám, že jste pochopili, pokud ne, zeptejte se v sekci komentářů. V našem dalším výukovém programu znovu použijeme UART, ale učiníme to zajímavější pomocí modulu Bluetooth a vysíláme data vzduchem.
Zkontrolujte také komunikaci UART mezi dvěma mikrokontroléry ATmega8 a komunikaci UART mezi ATmega8 a Arduino Uno.