- Prasības:
- PIC mikrokontrollera programmēšana UART komunikācijai:
- Mūsu programmas simulācija:
- Aparatūras iestatīšana un izejas pārbaude:
Šajā apmācībā mēs iemācīsimies iespējot UART saziņu ar PIC mikrokontrolleru un kā pārsūtīt datus uz datoru un no tā. Līdz šim mēs esam aptvēruši visus pamata moduļus, piemēram, ADC, taimeri, PWM, kā arī iemācījušies saskarnes LCD un 7 segmentu displejus. Tagad mēs aprīkosim sevi ar jaunu saziņas rīku ar nosaukumu UART, ko plaši izmanto lielākajā daļā mikrokontrolleru projektu. Pārbaudiet šeit mūsu pilnīgās PIC mikrokontrolleru apmācības, izmantojot MPLAB un XC8.
Šeit mēs izmantojām PIC16F877A MCU, tam ir modulis ar nosaukumu “Adresējamais universālais sinhronais asinhronais uztvērējs un raidītājs”, kas neilgi pazīstams kā USART. USART ir divu vadu sakaru sistēma, kurā dati plūst sērijveidā. USART ir arī pilna dupleksa komunikācija, tas nozīmē, ka varat vienlaikus nosūtīt un saņemt datus, kurus var izmantot, lai sazinātos ar perifērijas ierīcēm, piemēram, CRT termināliem un personālajiem datoriem.
USART var konfigurēt šādos režīmos:
- Asinhronais (pilna dupleksa)
- Sinhronais - galvenais (pusduplekss)
- Sinhronais - vergs (pusduplekss)
Ir arī divi dažādi režīmi, proti, 8 bitu un 9 bitu režīms, šajā apmācībā mēs konfigurēsim USART moduli darbam asinhronajā režīmā ar 8 bitu sakaru sistēmu, jo tas ir visbiežāk izmantotais saziņas veids. Tā kā tas ir asinhrons, tam nav jāsūta pulksteņa signāls kopā ar datu signāliem. UART datu nosūtīšanai (Tx) un saņemšanai (Rx) izmanto divas datu līnijas. Arī abu ierīču iezemējums būtu jāpadara kopīgs. Šāda veida sakariem nav kopīga pulksteņa, tāpēc kopīgs pamats ir ļoti svarīgs sistēmas darbībai.
Šīs apmācības beigās jūs varēsiet izveidot sakarus (UART) starp datoru un PIC mikrokontrolleru un no klēpjdatora pārslēgt LED uz PIC plates. Gaismas diodes statuss tiks nosūtīts uz jūsu klēpjdatoru no PIC MCU. Mēs pārbaudīsim izvadi, izmantojot datorā Hyper Terminal. Detalizēts video ir sniegts arī šīs apmācības beigās.
Prasības:
Aparatūra:
- PIC16F877A Perf Board
- RS232 uz USB pārveidotāju modulis
- Dators
- PICkit 3 programmētājs
Programmatūra:
- MPLABX
- HyperTerminal
Lai pārveidotu sērijas datus datorā lasāmā formā, ir nepieciešams RS232 pārveidotājs uz USB. Ir veidi, kā izveidot savu ķēdi, nevis iegādāties savu moduli, taču tie nav uzticami, jo tie ir pakļauti troksnim. Tas, kuru mēs izmantojam, ir parādīts zemāk
Piezīme. Katram RS232 uz USB pārveidotājam būtu jāinstalē īpašs draiveris; lielākajai daļai no tām jābūt automātiski instalētām, tiklīdz pievienojat ierīci. Bet, ja tas neatslābst !!! Izmantojiet komentāru sadaļu, un es jums palīdzēsim.
PIC mikrokontrollera programmēšana UART komunikācijai:
Tāpat kā visiem moduļiem (ADC, Taimeris, PWM), mums arī ir jāinicializē mūsu PIC16F877A MCU USART modulis un jāuzdod tam strādāt UART 8 bitu sakaru režīmā. Definēsim konfigurācijas bitus un sāksim ar UART inicializācijas funkciju.
PIC mikrokontrollera UART moduļa inicializēšana:
Tx un Rx tapas fiziski atrodas pie tapām RC6 un RC7. Saskaņā ar datu lapu deklarēsim TX kā izvadi un RX kā ievadi.
// **** I / O tapu iestatīšana UART **** // TRISC6 = 0; // TX tapa ir iestatīta kā izeja TRISC7 = 1; // RX tapa ir iestatīta kā ievade // ________ I / O tapu komplekts __________ //
Tagad ir jāiestata pārraides ātrums. Pārraides ātrums ir ātrums, kādā informācija tiek pārsūtīta sakaru kanālā. Šī var būt viena no daudzajām noklusējuma vērtībām, taču šajā programmā mēs izmantojam 9600, jo tā ir visbiežāk izmantotā datu pārraides ātrums.
/ ** Inicializējiet SPBRG reģistru vajadzīgajam datu pārraides ātrumam un iestatiet BRGH ātrai datu pārraides ātrumam ** / SPBRG = ((_XTAL_FREQ / 16) / Baud_rate) - 1; BRGH = 1; // augstam baud_rate // _________ baud_rate iestatījuma beigas _________ //
Pārraides ātruma vērtība jāiestata, izmantojot reģistru SPBRG, vērtība ir atkarīga no ārējā kristāla frekvences vērtības, formulas, lai aprēķinātu pārraides ātrumu, ir parādītas zemāk:
SPBRG = ((_XTAL_FREQ / 16) / Baud_rate) - 1;
Bits BRGH ir jāpadara augsts, lai iespējotu liela ātruma bitu pārraides ātrumu. Saskaņā ar datu lapu (13. lpp.) Vienmēr ir izdevīgi to iespējot, jo tas var novērst kļūdas saziņas laikā.
Kā jau minēts iepriekš, mēs strādāsim asinhronajā režīmā, tāpēc bitam SYNC jābūt nullei un bitam SPEM jābūt augstam, lai iespējotu sērijas tapas (TRISC6 un TRICSC5)
// **** Iespējot asinhrono seriālo portu ******* // SYNC = 0; // asinhronais SPEN = 1; // Iespējot seriālā porta tapas // _____ Asinhronais seriālais ports iespējots _______ //
Šajā apmācībā mēs sūtīsim un saņemsim datus starp MCU un datoru, tāpēc mums ir jāiespējo gan TXEN, gan CREN biti.
// ** Ļauj sagatavoties pārraidei un saņemšanai ** // TXEN = 1; // iespējot pārraidi CREN = 1; // iespējot uztveršanu // __ UART modulis ir izveidots un gatavs nosūtīšanai un saņemšanai __ //
Ar biti TX9 un RX9 ir jāveic nulli, lai mēs darbojas 8-bitu režīmā. Ja ir jānosaka augsta uzticamība, var izvēlēties 9 bitu režīmu.
// ** Atlasiet 8 bitu režīmu ** // TX9 = 0; // izvēlēta 8 bitu uztveršana RX9 = 0; // Atlasīts 8 bitu uztveršanas režīms // __ Atlasīts 8 bitu režīms __ //
Ar to mēs pabeidzam inicializācijas iestatīšanu. un ir gatava darbam.
Datu pārsūtīšana, izmantojot UART:
Tālāk norādīto funkciju var izmantot datu pārsūtīšanai caur UART moduli:
// ** Funkcija viena datuma baita nosūtīšanai uz UART ** // void UART_send_char (char bt) {while (! TXIF); // turiet programmu, līdz TX buferis ir brīvs TXREG = bt; // Ielādējiet raidītāja buferi ar saņemto vērtību} // _____________ Funkcijas beigas ________________ //
Kad modulis ir inicializēts, jebkura vērtība, kas tiek ielādēta reģistrā, TXREG tiks pārsūtīta caur UART, taču pārsūtīšana var pārklāties. Tāpēc mums vienmēr jāpārbauda, vai TXIF ir pārraides pārtraukuma karogs . Tikai tad, ja šis bits ir mazs, mēs varam turpināt nākamo bitu pārraidei, pretējā gadījumā mums vajadzētu gaidīt, kamēr šis karodziņš nokritīsies.
Tomēr iepriekš minēto funkciju var izmantot tikai, lai nosūtītu tikai vienu baitu datu, lai nosūtītu pilnīgu virkni, jāizmanto šī funkcija
// ** Funkcija, lai virkni pārveidotu baitā ** // void UART_send_string (char * st_pt) {while (* st_pt) // ja ir char UART_send_char (* st_pt ++); // apstrādāt tos kā baitu datus} // ___________ Funkcijas beigas ______________ //
Šo funkciju varētu būt mazliet sarežģīti saprast, jo tai ir norādes, taču ticiet man, ka rādītāji ir brīnišķīgi, un tie atvieglo programmēšanu, un tas ir viens labs piemērs tam pašam.
Kā jūs varat pamanīt, mēs atkal esam izsaukuši UART_send_char (), bet tagad iekšā while cilpa. Mēs esam sadalījuši virkni atsevišķās rakstzīmēs, katru reizi, kad tiek izsaukta šī funkcija, TXREG tiks nosūtīta viena char un tā tiks pārsūtīta.
Datu saņemšana, izmantojot UART:
Datu saņemšanai no UART moduļa var izmantot šo funkciju:
// ** Funkcija, lai iegūtu vienu baitu no datuma no UART ** // char UART_get_char () {if (OERR) // pārbaudiet, vai nav kļūdas {CREN = 0; // Ja kļūda -> Atiestatīt CREN = 1; // Ja kļūda -> Atiestatīt}, kamēr (! RCIF); // turiet programmu, līdz RX buferis ir bezmaksas atgriešanās RCREG; // saņem vērtību un nosūti to uz galveno funkciju} // _____________ Funkcijas beigas ________________ //
Kad datus saņem UART modulis, tas tos paņem un saglabā RCREG reģistrā. Mēs varam vienkārši pārsūtīt vērtību uz jebkuru mainīgo un to izmantot. Bet var būt kļūda pārklāšanās vai lietotājs var sūtīt datus nepārtraukti, un mēs tos vēl neesam pārsūtījuši uz mainīgo.
Tādā gadījumā saņem karodziņu Saņemt karogu RCIF. Šis bits samazināsies ikreiz, kad tiek saņemti dati un tie vēl netiek apstrādāti. Tāpēc mēs to izmantojam, kamēr ciklā izveidojam kavēšanos programmas turēšanai, līdz tiekam galā ar šo vērtību.
Gaismas diodes pārslēgšana, izmantojot PIC mikrokontrollera UART moduli:
Tagad nonāksim pie programmas pēdējās daļas - void main (void) funkcijas, kur mēs pārslēdzam LED caur datoru, izmantojot UART saziņu starp PIC un datoru.
Kad mēs nosūtīsim rakstzīmi “1” (no datora), LED tiks ieslēgts un statusa ziņojums “RED LED -> ON” tiks nosūtīts atpakaļ (no PIC MCU) uz datoru.
Līdzīgi mēs nosūtām rakstzīmi “0” (no datora), LED tiks izslēgts un statusa ziņojums “RED LED -> OFF” tiks nosūtīts atpakaļ (no PIC MCU) uz datoru.
while (1) // Bezgalīgā cilpa {get_value = UART_get_char (); if (get_value == '1') // Ja lietotājs sūta "1" {RB3 = 1; // Ieslēdziet LED UART_send_string ("RED LED -> ON"); // Nosūtīt paziņojumu datoram UART_send_char (10); // ASCII vērtību 10 izmanto karietes atgriešanai (drukāšanai jaunā rindā)} if (get_value == '0') // Ja lietotājs sūta "0" {RB3 = 0; // Izslēdziet LED UART_send_string ("RED -> OFF"); // Sūtīt paziņojumu datoram UART_send_char (10); // ASCII vērtību 10 izmanto pārvadāšanai atpakaļ (lai drukātu jaunā rindā)}}
Mūsu programmas simulācija:
Kā parasti, simulēsim savu programmu, izmantojot proteus, un noskaidrosim, vai tā darbojas, kā paredzēts.
Iepriekš redzamajā attēlā parādīts virtuālais terminālis, kurā tas parāda sveiciena ziņojumu un gaismas diodes statusu. Var pamanīt, ka sarkanās krāsas LED ir savienots ar tapu RB3. Detalizētu simulācijas darbu var atrast videoklipa beigās.
Aparatūras iestatīšana un izejas pārbaude:
Savienojums šai shēmai ir patiešām vienkāršs, mēs izmantojam mūsu PIC Perf plāksni un vienkārši savienojam trīs vadus ar RS232 ar USB pārveidotāju un savienojam moduli ar datoru, izmantojot USB datu kabeli, kā parādīts zemāk.
Tālāk mēs instalējam lietojumprogrammu Hyper Terminal (lejupielādējiet to šeit) un atveriet to. Tam vajadzētu parādīt kaut ko līdzīgu šim
Tagad datorā atveriet ierīču pārvaldnieku un pārbaudiet, ar kuru Com portu ir savienots jūsu modulis, mans ir savienots ar COM portu 17, kā parādīts zemāk
Piezīme. Moduļa COM porta nosaukums var mainīties atkarībā no pārdevēja, tā nav problēma.
Tagad atgriezieties pie Hyper Terminal Application un dodieties uz Set Up -> Port Configuration vai nospiediet Alt + C, lai iegūtu šādu uznirstošo lodziņu un uznirstošajā logā atlasiet vajadzīgo portu (manā gadījumā COM17) un noklikšķiniet uz connect.
Kad savienojums ir izveidots, ieslēdziet PIC perf plāksni, un jums vajadzētu redzēt kaut ko līdzīgu šim
Turiet kursoru komandu logā un ievadiet 1, pēc tam nospiediet taustiņu Enter. Gaismas diode tiks ieslēgta, un statuss tiks parādīts, kā parādīts zemāk.
Tādā pašā veidā turiet kursoru komandu logā un ievadiet 0, pēc tam nospiediet taustiņu Enter. Gaismas diode tiks izslēgta, un statuss tiks parādīts, kā parādīts zemāk.
Zemāk ir sniegts pilns kods un detalizēts video, kas parādīs, kā LED reāllaikā reaģē uz “1” un “0”.
Tas viss, puiši, mēs esam saskarnes PIC UART ar mūsu datoru un pārsūtījuši datus, lai pārslēgtu LED, izmantojot Hyper terminālu. Ceru, ka sapratāt, ja nē, izmantojiet komentāru sadaļu, lai uzdotu vaicājumu. Nākamajā apmācībā mēs atkal izmantosim UART, bet padarīsim to interesantāku, izmantojot Bluetooth moduli un pārraidot datus pa gaisu.
Pārbaudiet arī UART komunikāciju starp diviem ATmega8 mikrokontrolleriem un UART sakarus starp ATmega8 un Arduino Uno.