- Požiadavky:
- Programovanie mikrokontroléra PIC pre komunikáciu UART:
- Simulujeme náš program:
- Hardvérové nastavenie a testovanie výstupu:
V tomto výučbe sa naučíme Povoliť komunikáciu UART s mikrokontrolérom PIC a spôsob prenosu údajov do az vášho počítača. Zatiaľ sme pokryli všetky základné moduly ako ADC, Timers, PWM a tiež sme sa naučili, ako prepojiť LCD a 7-segmentové displeje. Teraz vybavíme svoje ja novým komunikačným nástrojom s názvom UART, ktorý sa široko používa vo väčšine projektov mikrokontrolérov. Skontrolujte tu naše kompletné výukové programy pre mikrokontroléry PIC pomocou MPLAB a XC8.
Tu sme použili PIC16F877A MCU, ktorý má modul s názvom „Adresovateľný univerzálny synchrónny asynchrónny prijímač a vysielač“, krátko známy ako USART. USART je dvojvodičový komunikačný systém, v ktorom údaje prúdia sériovo. USART je tiež plne duplexná komunikácia, čo znamená, že môžete súčasne odosielať a prijímať údaje, ktoré sa dajú použiť na komunikáciu s periférnymi zariadeniami, ako sú terminály CRT a osobné počítače.
USART možno konfigurovať v nasledujúcich režimoch:
- Asynchrónny (full-duplex)
- Synchrónny - hlavný (polovičný duplex)
- Synchrónny - podriadený (poloduplexný)
K dispozícii sú tiež dva rôzne režimy, a to 8-bitový a 9-bitový režim, v tomto výučbe nakonfigurujeme modul USART tak, aby pracoval v asynchrónnom režime s 8-bitovým komunikačným systémom, pretože ide o najbežnejší typ komunikácie. Pretože je asynchrónny, nemusí vysielať hodinový signál spolu s dátovými signálmi. UART používa na prenos (Tx) a príjem (Rx) údajov dve dátové linky. Uzemnenie oboch zariadení by malo byť tiež spoločné. Tento typ komunikácie nezdieľa spoločné hodiny, a preto je pre fungovanie systému veľmi dôležitá spoločná zem.
Na konci tohto tutoriálu budete schopní nadviazať komunikáciu (UART) medzi počítačom a vašim mikrokontrolérom PIC a prepínať LED na doske PIC z vášho notebooku. Stav LED bude odoslaný na váš laptop z PIC MCU. Výstup otestujeme pomocou Hyper Terminal v počítači. Na konci tohto tutoriálu je uvedené aj podrobné video.
Požiadavky:
Hardvér:
- PIC16F877A Perf Board
- Modul prevodníka RS232 na USB
- Počítač
- Programátor PICkit 3
Softvér:
- MPLABX
- HyperTerminal
Na prevod sériových údajov do počítačom čitateľnej podoby je potrebný prevodník RS232 na USB. Existujú spôsoby, ako navrhnúť vlastný obvod namiesto nákupu vlastného modulu, ale nie sú spoľahlivé, pretože sú vystavené hluku. Ten, ktorý používame, je uvedený nižšie
Poznámka: Každý prevodník RS232 na USB by vyžadoval inštaláciu špeciálneho ovládača; väčšina z nich by sa mala nainštalovať automaticky hneď po pripojení zariadenia. Ale ak sa neuvoľní !!! Použite sekciu s komentármi a pomôžem vám.
Programovanie mikrokontroléra PIC pre komunikáciu UART:
Rovnako ako všetky moduly (ADC, Timer, PWM) by sme aj my mali inicializovať náš USART modul nášho PIC16F877A MCU a dať mu pokyn, aby pracoval v 8-bitovom komunikačnom režime UART. Definujme konfiguračné bity a začnime s inicializačnou funkciou UART.
Inicializácia modulu UART mikrokontroléra PIC:
Kolíky Tx a Rx sú fyzicky prítomné na kolíkoch RC6 a RC7. Podľa údajového listu deklarujme TX ako výstup a RX ako vstup.
// **** Nastavenie I / O pinov pre UART **** // TRISC6 = 0; // TX Pin nastavený ako výstup TRISC7 = 1; // RX Pin nastavený ako vstup // ________ I / O piny nastavené __________ //
Teraz je potrebné nastaviť prenosovú rýchlosť. Prenosová rýchlosť je rýchlosť, ktorou sa informácie prenášajú v komunikačnom kanáli. Môže to byť jedna z mnohých predvolených hodnôt, ale v tomto programe používame 9600 od svojej najpoužívanejšej prenosovej rýchlosti.
/ ** Inicializujte register SPBRG pre požadovanú prenosovú rýchlosť a nastavte BRGH pre rýchlu prenosovú rýchlosť ** / SPBRG = ((_XTAL_FREQ / 16) / prenosová rýchlosť) - 1; BRGH = 1; // pre vysokú prenosovú rýchlosť // _________ Koniec nastavenia prenosovej rýchlosti _________ //
Hodnotu prenosovej rýchlosti je potrebné nastaviť pomocou registra SPBRG, hodnota závisí od hodnoty frekvencie externého kryštálu, vzorce na výpočet prenosovej rýchlosti sú uvedené nižšie:
SPBRG = ((_XTAL_FREQ / 16) / prenosová rýchlosť) - 1;
Bit BRGH musí byť vyrobený vysoko, aby umožňoval vysokorýchlostný bitový tok. Podľa údajového listu (strana 13) je vždy výhodné ho povoliť, pretože tak možno eliminovať chyby pri komunikácii.
Ako už bolo povedané, budeme pracovať v asynchrónnom režime, preto by mal byť bit SYNC nastavený na nulu a bit SPEM musí byť nastavený vysoko, aby sa umožnili sériové piny (TRISC6 a TRICSC5)
// **** Povoliť asynchrónny sériový port ******* // SYNC = 0; // Asynchrónne SPEN = 1; // Povoliť piny sériového portu // _____ Povolený asynchrónny sériový port _______ //
V tomto výučbe budeme odosielať aj prijímať dáta medzi MCU a počítačom, preto musíme povoliť bity TXEN aj CREN.
// ** Umožňuje pripraviť sa na vysielanie a príjem ** // TXEN = 1; // povoliť prenos CREN = 1; // povoliť príjem // __ UART modul je pripravený a pripravený na prenos a príjem __ //
Tieto bity TX9 a RX9 musí byť nulová, takže sa pohybujeme v 8-bitovom režime. Ak je potrebné zabezpečiť vysokú spoľahlivosť, je možné zvoliť 9-bitový režim.
// ** Vyberte 8-bitový režim ** // TX9 = 0; // vybraný 8-bitový príjem RX9 = 0; // Je vybraný 8-bitový režim príjmu // __ Je vybraný 8-bitový režim __ //
Týmto dokončujeme naše inicializačné nastavenie. a je pripravený na prevádzku.
Prenos údajov pomocou UART:
Na prenos údajov cez modul UART možno použiť nasledujúcu funkciu:
// ** Funkcia na odoslanie jedného bajtu dátumu na UART ** // void UART_send_char (char bt) {while (! TXIF); // podržte program, kým nebude vyrovnávacia pamäť TX voľná TXREG = bt; // Načítajte do vyrovnávacej pamäte vysielača prijatú hodnotu} // _____________ Koniec funkcie ________________ //
Akonáhle je modul inicializovaný, akákoľvek hodnota je načítaná do registra, TXREG sa bude vysielať cez UART, ale prenos sa môže prekrývať. Preto by sme mali vždy skontrolovať príznak TXIF prerušenia prenosu. Iba ak je tento bit nízky, môžeme pokračovať ďalším bitom na prenos, inak by sme mali počkať, kým sa tento príznak nedostane.
Vyššie uvedenú funkciu je však možné použiť iba na odoslanie iba jedného bajtu údajov. Na odoslanie úplného reťazca je potrebné použiť nasledujúcu funkciu
// ** Funkcia na prevod reťazca na bajt ** // void UART_send_string (char * st_pt) {while (* st_pt) // ak existuje char UART_send_char (* st_pt ++); // spracujeme to ako bajtové dáta} // ___________ Koniec funkcie ______________ //
Táto funkcia môže byť trochu zložitá na pochopenie, pretože má ukazovatele, ale verte mi, ukazovatele sú úžasné a uľahčujú programovanie. Toto je jeden z dobrých príkladov.
Ako si môžete všimnúť, znova sme nazvali UART_send_char (), ale teraz sme vo vnútri while. Reťazec sme rozdelili na jednotlivé znaky, pri každom vyvolaní tejto funkcie sa do TXREG odošle jeden znak a ten sa prenesie.
Príjem dát pomocou UART:
Na príjem údajov z modulu UART je možné použiť nasledujúcu funkciu:
// ** Funkcia na získanie jedného bajtu s dátumom od UART ** // char UART_get_char () {if (OERR) // kontrola chyby {CREN = 0; // Ak chyba -> Reset CREN = 1; // Ak chyba -> Reset} while (! RCIF); // podržte program, kým nie je RX buffer voľný návrat RCREG; // príjem hodnoty a jej odoslanie do hlavnej funkcie} // _____________ Koniec funkcie ________________ //
Keď modul UART prijme dáta, zhromaždí ich a uloží do registra RCREG. Hodnotu môžeme jednoducho preniesť do ľubovoľnej premennej a použiť ju. Môže sa však vyskytnúť chyba prekrytia alebo používateľ môže odosielať údaje nepretržite a zatiaľ sme ich nepreniesli do premennej.
V takom prípade príde na záchranu príznakový bit RCIF. Tento bit klesne na nízku úroveň vždy, keď sú prijaté dáta a ešte nie sú spracované. Preto ho používame v cykle while, čím vytvárame oneskorenie pre udržanie programu, kým sa s touto hodnotou nebudeme zaoberať.
Prepínanie LED pomocou modulu UART mikrokontroléra PIC:
Poďme teraz k poslednej časti programu, funkcii void main (void) , kde budeme prepínať LED diódu cez počítač pomocou komunikácie UART medzi PIC a počítačom.
Keď pošleme znak „1“ (z počítača), LED sa rozsvieti a stavová správa „RED LED -> ON“ sa odošle späť (z PIC MCU) do počítača.
Podobne pošleme znak „0“ (z počítača), LED dióda zhasne a stavová správa „RED LED -> OFF“ sa odošle späť (z PIC MCU) do počítača.
while (1) // Nekonečná slučka {get_value = UART_get_char (); if (get_value == '1') // Ak užívateľ pošle "1" {RB3 = 1; // Zapnúť LED UART_send_string ("ČERVENÁ LED -> ZAPNUTÁ"); // Odoslať upozornenie do počítača UART_send_char (10); // Hodnota ASCII 10 sa použije na návrat vozíka (na tlač v novom riadku)} if (get_value == '0') // Ak používateľ odošle „0“ {RB3 = 0; // Vypnúť LED UART_send_string ("ČERVENÉ -> VYPNUTÉ"); // Odoslať upozornenie do počítača UART_send_char (10); // hodnota ASCII 10 sa použije na návrat vozíka (na tlač v novom riadku)}}
Simulujeme náš program:
Ako obvykle poďme simulovať náš program pomocou proteus a zistíme, či funguje podľa očakávania.
Vyššie uvedený obrázok zobrazuje virtuálny terminál, v ktorom zobrazuje uvítaciu správu a stav LED. Je možné si všimnúť, že červená farba LED je pripojená k pinu RB3. Detailné fungovanie simulácie nájdete vo videu na konci.
Hardvérové nastavenie a testovanie výstupu:
Pripojenie pre tento obvod je naozaj jednoduché, používame našu dosku PIC Perf a stačí pripojiť tri vodiče k prevodníku RS232 na USB a modul pripojiť k nášmu počítaču pomocou dátového kábla USB, ako je uvedené nižšie.
Ďalej nainštalujeme aplikáciu Hyper Terminal (stiahnite si ju odtiaľto) a otvoríme ju. Malo by to ukazovať niečo také
Teraz otvorte Správcu zariadení na vašom počítači a skontrolujte, ku ktorému Com portu je váš modul pripojený, môj je pripojený k COM portu 17, ako je uvedené nižšie
Poznámka: Názov portu COM pre váš modul sa môže meniť podľa vášho dodávateľa, nie je to problém.
Teraz sa vráťte späť do aplikácie Hyper Terminal a prejdite na Nastaviť -> Konfigurácia portu alebo stlačte kombináciu klávesov Alt + C, aby ste získali nasledujúce rozbaľovacie okno a v rozbaľovacom okne vyberte požadovaný port (v mojom prípade COM17) a kliknite na pripojenie.
Po nadviazaní spojenia zapnite svoju dosku PIC perf a nižšie by sa malo zobraziť niečo také
Podržte kurzor na príkazovom okne a zadajte 1, potom stlačte kláves Enter. LED dióda sa rozsvieti a stav sa zobrazí, ako je uvedené nižšie.
Rovnakým spôsobom podržte kurzor v príkazovom okne a zadajte 0, potom stlačte kláves Enter. LED dióda zhasne a zobrazí sa stav, ako je to znázornené nižšie.
Ďalej uvádzame kompletný kód a podrobné video, ktoré ukazuje, ako LED reaguje v reálnom čase na „1“ a „0“.
To je všetko, prepojili sme PIC UART s našim počítačom a preniesli údaje na prepnutie LED pomocou terminálu Hyper. Dúfam, že ste pochopili, ak nie, položte svoj dotaz pomocou sekcie komentárov. V našom ďalšom tutoriále opäť použijeme UART, ale urobíme ho zaujímavejším pomocou modulu Bluetooth a vysielania dát vzduchom.
Skontrolujte tiež komunikáciu UART medzi dvoma mikrokontrolérmi ATmega8 a komunikáciu UART medzi ATmega8 a Arduino Uno.