- Zahtjevi:
- Programiranje PIC mikrokontrolera za UART komunikaciju:
- Simuliranje našeg programa:
- Postavljanje hardvera i testiranje rezultata:
U ovom uputstvu učimo kako omogućiti UART komunikaciju s PIC mikrokontrolerom i kako prenositi podatke na vaše računalo i s njega. Do sada smo pokrili sve osnovne module poput ADC-a, mjerača vremena, PWM-a, a također smo naučili i kako povezati LCD-e i 7-segmentne zaslone. Sada ćemo se opremiti novim komunikacijskim alatom zvanim UART koji se široko koristi u većini projekata mikrokontrolera. Ovdje pogledajte naše kompletne Vodiče za PIC mikrokontrolere koji koriste MPLAB i XC8.
Ovdje smo koristili PIC16F877A MCU, on ima modul nazvan „Adresibilni univerzalni sinkroni asinkroni prijemnik i odašiljač“, kratko poznat kao USART. USART je dvožični komunikacijski sustav u kojem podaci serijski teku. USART je također full-duplex komunikacija, što znači da istovremeno možete slati i primati podatke koji se mogu koristiti za komunikaciju s perifernim uređajima, poput CRT terminala i osobnih računala.
USART može biti konfiguriran u sljedećih načina:
- Asinkroni (full-duplex)
- Sinkroni - glavni (poludupleks)
- Sinkroni - podređeni (poludupleks)
Postoje i dva različita načina rada, naime 8-bitni i 9-bitni način rada, u ovom uputstvu konfigurirat ćemo USART modul za rad u asinkronom načinu rada s 8-bitnim komunikacijskim sustavom, jer je to najčešće korištena vrsta komunikacije. Budući da je asinkron, ne mora zajedno s podatkovnim signalima slati i satni signal. UART koristi dvije podatkovne linije za slanje (Tx) i primanje (Rx) podataka. Uzemljenje oba uređaja također bi trebalo biti zajedničko. Ova vrsta komunikacije ne dijeli zajednički sat, stoga je zajedničko tlo vrlo važno za rad sustava.

Na kraju ovog vodiča moći ćete uspostaviti komunikaciju (UART) između vašeg računala i vašeg PIC mikrokontrolera i uključiti LED na PIC ploči s vašeg prijenosnog računala. Status LED-a poslat će se na vaš prijenosnik s PIC MCU-a. Testirat ćemo izlaz pomoću Hyper Terminala na računalu. Detaljan videozapis također je dat na kraju ovog vodiča.
Zahtjevi:
Hardver:
- PIC16F877A Perf ploča
- Modul pretvarača RS232 u USB
- Računalo
- Programer PICkit 3
Softver:
- MPLABX
- HyperTerminal
Za pretvorbu serijskih podataka u računalno čitljiv oblik potreban je pretvarač RS232 u USB. Postoje načini da dizajnirate vlastiti sklop, umjesto da kupite vlastiti modul, ali nisu pouzdani jer su izloženi buci. Ona koju koristimo prikazana je u nastavku

Napomena: Svaki pretvarač RS232 u USB trebao bi instalirati poseban upravljački program; većina njih trebala bi se automatski instalirati čim priključite uređaj. Ali, ako se ne opusti !!! Koristite odjeljak za komentare i ja ću vam pomoći.
Programiranje PIC mikrokontrolera za UART komunikaciju:
Kao i svi moduli (ADC, timer, PWM), također bismo trebali inicijalizirati naš USART modul našeg PIC16F877A MCU-a i uputiti ga da radi u UART 8-bitnom načinu komunikacije. Definirajmo konfiguracijske bitove i započnimo s funkcijom UART inicijalizacije.
Inicijalizacija UART modula PIC mikrokontrolera:
Klinovi Tx i Rx fizički su prisutni na klinovima RC6 i RC7. Prema tablici podataka, proglasimo TX izlazom, a RX ulazom.
// **** Postavljanje I / O pinova za UART **** // TRISC6 = 0; // TX pin postavljen kao izlaz TRISC7 = 1; // RX pin postavljen kao ulaz // ________ I / O pin postavljen __________ //
Sada se mora postaviti brzina prijenosa. Brzina prijenosa je brzina kojom se informacije prenose u komunikacijskom kanalu. To može biti jedna od mnogih zadanih vrijednosti, ali u ovom programu koristimo 9600 od svoje najčešće korištene brzine prijenosa.
/ ** Inicijalizirajte SPBRG registar za potrebnu brzinu prijenosa podataka i postavite BRGH za brzu brzinu prijenosa ** / SPBRG = ((_XTAL_FREQ / 16) / Baud_rate) - 1; BRGH = 1; // za visoku brzinu prijenosa // _________ Kraj postavke brzine prijenosa _________ //
Vrijednost brzine prijenosa mora se postaviti pomoću registra SPBRG, vrijednost ovisi o vrijednosti vanjske kristalne frekvencije, formule za izračunavanje brzine prijenosa prikazane su u nastavku:
SPBRG = ((_XTAL_FREQ / 16) / brzina_bauda) - 1;
Bit BRGH mora biti visok kako bi se omogućila brzina brzine prijenosa. Prema podatkovnom listu (stranica 13), uvijek je korisno to omogućiti, jer može ukloniti pogreške tijekom komunikacije.
Kao što je ranije rečeno, radit ćemo u asinkronom načinu, stoga bit SYNC treba učiniti nula, a bit SPEM mora biti visok kako bi se omogućili serijski pinovi (TRISC6 i TRICSC5)
// **** Omogući asinkroni serijski port ******* // SYNC = 0; // Asinkroni SPEN = 1; // Omogući pinove serijskog porta // _____ Omogućen asinkroni serijski port _______ //
U ovom ćemo uputstvu slati i primati podatke između MCU-a i računala, stoga moramo omogućiti i TXEN i CREN bitove.
// ** Pripremimo se za prijenos i prijem ** // TXEN = 1; // omogućiti prijenos CREN = 1; // omogućiti prijem // __ UART modul je spreman za prijenos i prijem __ //
U bitovi TX9 i RX9 moraju biti nula, tako da djelujemo u 8-bitnom modu. Ako treba uspostaviti visoku pouzdanost, tada se može odabrati 9-bitni način.
// ** Odaberite 8-bitni način rada ** // TX9 = 0; // odabran 8-bitni prijem RX9 = 0; // odabran 8-bitni način prijema // __ odabran 8-bitni način __ //
Ovim završavamo postavljanje inicijalizacije. i spreman je za rad.
Prijenos podataka pomoću UART-a:
Sljedeća se funkcija može koristiti za prijenos podataka putem UART modula:
// ** Funkcija slanja jednog bajta datuma na UART ** // void UART_send_char (char bt) {while (! TXIF); // držimo program dok TX međuspremnik ne bude slobodan TXREG = bt; // Učitajte međuspremnik odašiljača s primljenom vrijednošću} // _____________ Kraj funkcije ________________ //
Jednom kada je modul inicijaliziran, bilo koja vrijednost učitana u registar TXREG će se prenositi putem UART-a, ali prijenos se može preklapati. Stoga bismo uvijek trebali provjeriti postoji li oznaka TXIF za prekid prijenosa . Samo ako je ovaj bit nizak, možemo nastaviti sa sljedećim bitom za prijenos, inače bismo trebali pričekati da se ova zastavica smanji.
Međutim, gornja funkcija može se koristiti samo za slanje samo jednog bajta podataka, a za slanje kompletnog niza treba koristiti donju funkciju
// ** Funkcija za pretvaranje niza u bajt ** // void UART_send_string (char * st_pt) {while (* st_pt) // ako postoji char UART_send_char (* st_pt ++); // obradimo ga kao bajtni podatak} // ___________ Kraj funkcije ______________ //
Ovu funkciju možda je pomalo nezgodno razumjeti jer ima pokazivače, ali vjerujte mi da su pokazivači prekrasni i olakšavaju programiranje, a ovo je jedan dobar primjer toga.
Kao što možete primijetiti, ponovno smo pozvali UART_send_char (), ali sada unutar while petlje. Niz smo podijelili na pojedinačne znakove, svaki put kad se ova funkcija pozove, jedan će se znak poslati na TXREG i on će se prenijeti.
Primanje podataka pomoću UART-a:
Sljedeća se funkcija može koristiti za primanje podataka iz UART modula:
// ** Funkcija za dobivanje jednog bajta datuma iz UART-a ** // char UART_get_char () {if (OERR) // provjera greške {CREN = 0; // Ako je pogreška -> Resetiraj CREN = 1; // Ako je pogreška -> Resetiraj} while (! RCIF); // držite program dok RX međuspremnik ne bude slobodan povratak RCREG; // primiti vrijednost i poslati je glavnoj funkciji} // _____________ Kraj funkcije ________________ //
Kada UART modul primi podatke, on ih preuzima i pohranjuje u RCREG registar. Vrijednost jednostavno možemo prenijeti u bilo koju varijablu i koristiti je. No, moglo bi doći do pogreške u preklapanju ili korisnik možda kontinuirano šalje podatke, a mi ih još nismo prenijeli u varijablu.
U tom slučaju u pomoć dolazi bit RCIF zastavice za primanje. Ovaj bit bit će nizak kad god se podaci prime i još nisu obrađeni. Stoga ga koristimo u while petlji stvarajući odgodu da zadržimo program dok se ne pozabavimo tom vrijednošću.
Uključivanje LED diode pomoću UART modula PIC mikrokontrolera:
Sada ćemo doći do završnog dijela Programa, glavne funkcije void (void) , gdje ćemo uključiti LED kroz računalo koristeći UART komunikaciju između PIC-a i računala.
Kada pošaljemo znak "1" (s računala), LED će se uključiti, a poruka o statusu "CRVENA LED -> UKLJUČENA" vratit će se na računalo (s PIC MCU).
Slično tome, šaljemo znak "0" (s računala) LED će se isključiti, a poruka o statusu "CRVENA LED -> ISKLJUČENA" vratit će se na računalo (s PIC MCU).
while (1) // Beskonačna petlja {get_value = UART_get_char (); if (get_value == '1') // Ako korisnik pošalje "1" {RB3 = 1; // Uključivanje LED UART_send_string ("CRVENA LED -> UKLJUČENA"); // Pošaljite obavijest računalu UART_send_char (10); // ASCII vrijednost 10 koristi se za povratak nosača (za ispis u novom retku)} if (get_value == '0') // Ako korisnik pošalje "0" {RB3 = 0; // Isključivanje LED UART_send_string ("CRVENO -> ISKLJUČENO"); // Pošaljite obavijest računalu UART_send_char (10); // ASCII vrijednost 10 koristi se za povratak kočije (za ispis u novom retku)}}
Simuliranje našeg programa:
Kao i obično, simulirajmo naš program pomoću proteusa i saznajmo radi li prema očekivanjima.

Gornja slika prikazuje virtualni terminal u kojem prikazuje poruku dobrodošlice i status LED diode. Primjećuje se da je LED crvene boje spojen na pin RB3. Detaljan rad simulacije nalazi se u videu na kraju.
Postavljanje hardvera i testiranje rezultata:
Veza za ovaj sklop je zaista jednostavna, koristimo našu PIC Perf ploču i samo spojimo tri žice na RS232 u USB pretvarač i povežemo modul s našim računalom pomoću USB podatkovnog kabela kao što je prikazano u nastavku.


Dalje instaliramo aplikaciju Hyper Terminal (preuzmite je odavde) i otvorite je. Trebalo bi pokazati ovako nešto

Sada otvorite Device Manager na računalu i provjerite na koji je Com port povezan vaš modul, moj je spojen na COM port 17 kao što je prikazano dolje

Napomena: Naziv COM porta za vaš modul može se mijenjati u skladu s vašim dobavljačem, to nije problem.
Sada se vratite na Hyper Terminal Application i idite na Set Up -> Port Configuration ili pritisnite Alt + C, da biste dobili sljedeći skočni okvir i odaberite željeni port (COM17 u mom slučaju) u skočnom prozoru i kliknite na connect.

Jednom kada se veza uspostavi, uključite PIC perf ploču i trebali biste vidjeti nešto poput ovoga u nastavku

Držite kursor u naredbenom prozoru i unesite 1, a zatim pritisnite enter. LED će se uključiti i status će se prikazati kao što je prikazano u nastavku.

Na isti način, zadržite pokazivač u naredbenom prozoru i unesite 0, a zatim pritisnite enter. LED će se isključiti i status će se prikazati kao što je prikazano u nastavku.

Ispod su dati cjeloviti kod i detaljan video, koji će pokazati kako LED reagira u stvarnom vremenu na "1" i "0".
To je to, dečki, povezali smo PIC UART s našim računalom i prenijeli podatke za prebacivanje LED diode pomoću Hyper terminala. Nadam se da ste razumjeli, ako ne, koristite odjeljak za komentare da biste postavili upit. U sljedećem uputstvu opet ćemo koristiti UART, ali ga učiniti zanimljivijim pomoću Bluetooth modula i emitirati podatke u eter.
Također provjerite UART komunikaciju između dva ATmega8 mikrokontrolera i UART komunikaciju između ATmega8 i Arduino Uno.
