- Zahteve:
- Programiranje mikrokrmilnika PIC za komunikacijo UART:
- Simulacija našega programa:
- Namestitev strojne opreme in preizkušanje izhoda:
V tej vadnici se naučimo omogočiti UART komunikacijo z mikrokrmilnikom PIC in kako prenašati podatke v računalnik in iz njega. Do zdaj smo pokrivali vse osnovne module, kot so ADC, merilniki časa, PWM, pa tudi naučili smo se vmesnikov LCD in 7-segmentnih zaslonov. Zdaj se bomo opremili z novim komunikacijskim orodjem UART, ki se pogosto uporablja v večini projektov mikrokrmilnika. Tukaj si oglejte naše celotne vadnice mikrokrmilnika PIC z uporabo MPLAB in XC8.
Tukaj smo uporabili PIC16F877A MCU, ki ima modul, imenovan »Addressable Universal Synchronous Asynchronous Receiver and Transmitter«, imenovan USART. USART je dvožični komunikacijski sistem, v katerem se podatki pretakajo zaporedno. USART je tudi dupleksna komunikacija, kar pomeni, da lahko hkrati pošiljate in prejemate podatke, ki se lahko uporabljajo za komunikacijo z zunanjimi napravami, kot so terminali CRT in osebni računalniki.
USART je mogoče nastaviti na naslednje načine:
- Asinhroni (polni dupleks)
- Sinhrono - glavni (pol-dupleks)
- Sinhrono - podrejeni (pol-dupleks)
Obstajata tudi dva različna načina, in sicer 8-bitni in 9-bitni način, v tej vadnici bomo konfigurirali modul USART za delovanje v asinhronem načinu z 8-bitnim komunikacijskim sistemom, saj je to najpogostejša vrsta komunikacije. Ker je asinhron, mu ni treba pošiljati takta skupaj s podatkovnimi signali. UART uporablja dve podatkovni liniji za pošiljanje (Tx) in sprejemanje (Rx) podatkov. Tudi ozemljitev obeh naprav bi morala biti skupna. Ta vrsta komunikacije nima skupne ure, zato je skupni temelj zelo pomemben za delovanje sistema.
Na koncu te vadnice boste lahko vzpostavili komunikacijo (UART) med računalnikom in mikrokrmilnikom PIC ter na prenosnem računalniku preklopili LED na plošči PIC. Status LED bo na vaš prenosnik poslan iz PIC MCU. Izhod bomo preizkusili s pomočjo Hyper Terminala v računalniku. Na koncu te vadnice je tudi podroben video.
Zahteve:
Strojna oprema:
- PIC16F877A Perf Board
- Modul pretvornika RS232 v USB
- Računalnik
- Programer PICkit 3
Programska oprema:
- MPLABX
- HyperTerminal
Za pretvorbo serijskih podatkov v računalniško berljivo obliko je potreben pretvornik RS232 v USB. Obstajajo načini za načrtovanje lastnega vezja, namesto da bi kupili svoj modul, vendar niso zanesljivi, saj so izpostavljeni hrupu. Tisti, ki ga uporabljamo, je prikazan spodaj
Opomba: Vsak pretvornik RS232 v USB zahteva poseben gonilnik; večina jih mora biti nameščena samodejno, takoj ko priključite napravo. Ampak, če se ne sprosti !!! Uporabite odsek za komentarje in pomagal vam bom.
Programiranje mikrokrmilnika PIC za komunikacijo UART:
Kot vsi moduli (ADC, časovnik, PWM) bi tudi mi morali inicializirati naš modul USART našega PIC16F877A MCU in mu naročiti, naj deluje v 8-bitnem načinu UART komunikacije. Določimo konfiguracijske bite in začnimo s funkcijo inicializacije UART.
Inicializacija modula UART mikrokrmilnika PIC:
Zatiča Tx in Rx sta fizično prisotna na nožicah RC6 in RC7. V skladu s podatkovnim listom razglasimo TX kot izhod in RX kot vhod.
// **** Nastavitev V / I zatičev za UART **** // TRISC6 = 0; // TX pin nastavljen kot izhod TRISC7 = 1; // RX pin nastavljen kot vhod // ________ I / O pin set __________ //
Zdaj je treba nastaviti hitrost prenosa. Hitrost prenosa je hitrost prenosa informacij v komunikacijskem kanalu. To je lahko ena od številnih privzetih vrednosti, vendar v tem programu uporabljamo 9600, saj je njegova najpogostejša hitrost prenosa.
/ ** Inicializirajte register SPBRG za zahtevano hitrost prenosa in nastavite BRGH za hitro baud_rate ** / SPBRG = ((_XTAL_FREQ / 16) / Baud_rate) - 1; BRGH = 1; // za visoko hitrost prenosa // _________ Nastavitev konca hitrosti prenosa _________ //
Vrednost hitrosti prenosa je treba nastaviti z uporabo registra SPBRG, vrednost je odvisna od vrednosti zunanje kristalne frekvence, formule za izračun hitrosti prenosa so prikazane spodaj:
SPBRG = ((_XTAL_FREQ / 16) / hitrost prenosa) - 1;
Bit BRGH mora biti postavljen visoko, da se omogoči hitra bitna hitrost. Glede na podatkovni list (stran 13) ga je vedno koristno omogočiti, saj lahko odpravi napake med komunikacijo.
Kot smo že omenili, bomo delali v asinhronem načinu, zato je treba bit SYNC postaviti na nič, bit SPEM pa mora biti visok, da omogočimo zaporedne nožice (TRISC6 in TRICSC5)
// **** Omogoči asinhrona serijska vrata ******* // SYNC = 0; // Asinhroni SPEN = 1; // Omogoči zatiče serijskih vrat // _____ Omogočena asinhrona serijska vrata _______ //
V tej vadnici bomo pošiljali in prejemali podatke med MCU in računalnikom, zato moramo omogočiti tako TXEN kot CREN bit.
// ** Pripravimo se na prenos in sprejem ** // TXEN = 1; // omogoči prenos CREN = 1; // omogoči sprejem // __ UART modul pripravljen in pripravljen za prenos in sprejem __ //
V bitov TX9 in RX9 morajo biti nič tako, da delujemo v 8-bitnem načinu. Če je treba določiti visoko zanesljivost, lahko izberete 9-bitni način.
// ** Izberite 8-bitni način ** // TX9 = 0; // izbran 8-bitni sprejem RX9 = 0; // izbran 8-bitni način sprejema // __ izbran 8-bitni način __ //
S tem smo zaključili namestitev inicializacije. in je pripravljen za delovanje.
Prenos podatkov s pomočjo UART:
Spodnjo funkcijo lahko uporabite za prenos podatkov prek modula UART:
// ** Funkcija pošiljanja enega bajta datuma UART ** // void UART_send_char (char bt) {while (! TXIF); // pridržite program, dokler ni vmesni pomnilnik TX prost TXREG = bt; // Naloži vmesni pomnilnik oddajnika s prejeto vrednostjo} // _____________ Konec funkcije ________________ //
Ko je modul inicializiran, se katera koli vrednost naloži v register, TXREG se pošlje prek UART, vendar se prenos lahko prekriva. Zato moramo vedno preveriti, ali je zastavica TXIF prekinitve prenosa. Le če je ta bit nizek, lahko nadaljujemo z naslednjim bitom za prenos, sicer moramo počakati, da ta zastavica postane nizka.
Vendar je zgornjo funkcijo mogoče uporabiti samo za pošiljanje samo enega bajta podatkov, za pošiljanje celotnega niza pa je treba uporabiti spodnjo funkcijo
// ** Funkcija za pretvorbo niza v bajt ** // void UART_send_string (char * st_pt) {while (* st_pt) // če obstaja char UART_send_char (* st_pt ++); // obdelamo kot bajtne podatke} // ___________ Konec funkcije ______________ //
To funkcijo je morda nekoliko zapleteno razumeti, saj ima kazalce, a verjemite mi, da so kazalci čudoviti in olajšajo programiranje, kar je en dober primer tega.
Kot lahko opazite, smo ponovno poklicali UART_send_char (), zdaj pa znotraj zanke while. Niz smo razdelili na posamezne znake, vsakič, ko pokličete to funkcijo, bo en znak poslan na TXREG in bo poslan.
Prejemanje podatkov s pomočjo UART:
Za sprejem podatkov iz modula UART lahko uporabite naslednjo funkcijo:
// ** Funkcija za pridobitev enega bajta datuma iz UART ** // char UART_get_char () {if (OERR) // preverimo napako {CREN = 0; // Če je napaka -> Ponastavi CREN = 1; // Če je napaka -> Ponastavi} while (! RCIF); // držimo program, dokler RX medpomnilnik ni prost vrne RCREG; // prejmemo vrednost in jo pošljemo glavni funkciji} // _____________ Konec funkcije ________________ //
Ko modul UART prejme podatke, jih pobere in shrani v register RCREG. Vrednost lahko preprosto prenesemo v katero koli spremenljivko in jo uporabimo. Lahko pa pride do napake v prekrivanju ali pa uporabnik neprekinjeno pošilja podatke in jih še nismo prenesli v spremenljivko.
V tem primeru priskoči na pomoč bit sprejema RCIF. Ta bit se bo znižal vsakič, ko bodo podatki prejeti in še niso obdelani. Zato ga uporabljamo v zanki while, ki ustvarja zamik, da zadržimo program, dokler se ne spopademo s to vrednostjo.
Preklop LED z uporabo UART modula mikrokrmilnika PIC:
Zdaj pa pojdimo na zadnji del programa, funkcijo void main (void) , kjer bomo prek računalnika preklapljali LED z uporabo UART komunikacije med PIC in računalnikom.
Ko pošljemo znak "1" (iz računalnika), se LED vklopi in sporočilo o stanju "RDEČA LED -> VKLOP" se pošlje nazaj (iz PIC MCU) v računalnik.
Podobno pošljemo znak "0" (iz računalnika) LED se izklopi in sporočilo o stanju "RDEČA LED -> IZKLOP" se pošlje nazaj (iz PIC MCU) v računalnik.
while (1) // Neskončna zanka {get_value = UART_get_char (); if (get_value == '1') // Če uporabnik pošlje "1" {RB3 = 1; // Vklop LED UART_send_string ("RDEČA LED -> ON"); // pošljemo obvestilo računalniku UART_send_char (10); // vrednost ASCII 10 se uporablja za vrnitev nosilca (za tiskanje v novi vrstici)}} if (get_value == '0') // Če uporabnik pošlje "0" {RB3 = 0; // ugasnemo LED UART_send_string ("RDEČA -> IZKLOP"); // pošljemo obvestilo računalniku UART_send_char (10); // vrednost ASCII 10 se uporablja za vrnitev kočije (za tiskanje v novi vrstici)}}
Simulacija našega programa:
Kot ponavadi simulirajmo naš program z uporabo proteusa in ugotovimo, ali deluje po pričakovanjih.
Zgornja slika prikazuje navidezni terminal, v katerem prikazuje pozdravno sporočilo in stanje LED. Opazimo, da je rdeča barva LED priključena na zatič RB3. Podrobno delovanje simulacije najdete v videu na koncu.
Namestitev strojne opreme in preizkušanje izhoda:
Povezava s tem vezjem je zelo preprosta, uporabljamo našo PIC Perf ploščo in samo priključimo tri žice na pretvornik RS232 v USB in modul povežemo z našim računalnikom s pomočjo podatkovnega kabla USB, kot je prikazano spodaj.
Nato namestimo program Hyper Terminal (prenesite ga od tukaj) in ga odprite. To bi moralo pokazati nekaj takega
Zdaj v računalniku odprite Device Manager in preverite, na katera Com vrata je povezan vaš modul, moj pa na COM vrata 17, kot je prikazano spodaj
Opomba: Ime vrat COM za vaš modul se lahko spremeni glede na vašega prodajalca, ni problem.
Zdaj se vrnite na Hyper Terminal Application in se pomaknite do Set Up -> Port Configuration ali pritisnite Alt + C, da dobite naslednje pojavno okno in v pojavnem oknu izberite želena vrata (COM17 v mojem primeru) in kliknite povezavo.
Ko je povezava vzpostavljena, vklopite svojo PIC ploščo in spodaj boste videli nekaj takega
Držite kazalec v ukaznem oknu in vnesite 1, nato pritisnite enter. Lučka LED bo vklopljena in stanje bo prikazano, kot je prikazano spodaj.
Na enak način držite kazalec v ukaznem oknu in vnesite 0, nato pritisnite enter. Lučka LED bo ugasnila in stanje bo prikazano, kot je prikazano spodaj.
Spodaj so podani celotna koda in podroben video, ki bo prikazal, kako se LED v realnem času odziva na "1" in "0".
To je to, fantje, PIC UART smo povezali z našim računalnikom in podatke prenesli za preklop LED z uporabo Hyper terminala. Upam, da ste razumeli, če ne, uporabite vprašalnik v razdelku s komentarji. V naslednji vadnici bomo znova uporabili UART, vendar ga bomo naredili bolj zanimivega z uporabo modula Bluetooth in podatke oddajali po zraku.
Preverite tudi komunikacijo UART med dvema mikrokrmilnikoma ATmega8 in komunikacijo UART med ATmega8 in Arduino Uno.