- Reikalavimai:
- PIC mikrovaldiklio programavimas UART ryšiui:
- Modeliuojant mūsų programą:
- Aparatūros nustatymas ir išvesties testavimas:
Šioje pamokoje mes išmokome įgalinti UART ryšį su PIC mikrovaldikliu ir kaip perkelti duomenis į jūsų kompiuterį ir iš jo. Iki šiol apėmėme visus pagrindinius modulius, tokius kaip ADC, „Timers“, „PWM“, taip pat išmokome valdyti skystųjų kristalų ekranus ir 7 segmentų ekranus. Dabar mes aprūpinsime save nauju komunikacijos įrankiu, vadinamu UART, kuris plačiai naudojamas daugumoje mikrovaldiklių projektų. Čia patikrinkite visas mūsų PIC mikrovaldiklių pamokas, naudojančias MPLAB ir XC8.
Čia mes panaudojome PIC16F877A MCU, jis turi modulį, pavadintą „Adresuojamas universalus sinchroninis asinchroninis imtuvas ir siųstuvas“, trumpai žinomas kaip USART. USART yra dviejų laidų ryšio sistema, kurioje duomenys teka nuosekliai. „USART“ taip pat yra visas dvipusis ryšys, tai reiškia, kad tuo pačiu metu galite siųsti ir gauti duomenis, kuriuos galima naudoti bendraujant su išoriniais įrenginiais, tokiais kaip CRT terminalai ir asmeniniai kompiuteriai.
USART gali būti konfigūruojamas šiais režimais:
- Asinchroninis (dvipusis)
- Sinchroninis - pagrindinis (pusiau dvipusis)
- Sinchroninis - vergas (pusiau dvipusis)
Taip pat yra du skirtingi režimai, būtent 8 bitų ir 9 bitų režimas, šioje pamokoje sukonfigūruosime USART modulį, kad jis veiktų asinchroniniu režimu su 8 bitų ryšio sistema, nes tai yra dažniausiai naudojamas ryšio tipas. Kadangi jis yra asinchroninis, nereikia siųsti laikrodžio signalo kartu su duomenų signalais. UART naudoja dvi duomenų linijas duomenims siųsti (Tx) ir priimti (Rx). Abiejų prietaisų pagrindas taip pat turėtų būti bendras. Šio tipo ryšys neturi bendro laikrodžio, todėl sistema veikia labai svarbu.
Šios pamokos pabaigoje galėsite užmegzti ryšį (UART) tarp savo kompiuterio ir PIC mikrovaldiklio ir iš nešiojamojo kompiuterio perjungti šviesos diodą PIC plokštėje. Šviesos diodo būsena bus siunčiama į jūsų nešiojamąjį kompiuterį iš PIC MCU. Mes išbandysime išvestį naudodami „Hyper Terminal“ kompiuteryje. Išsamus vaizdo įrašas taip pat pateikiamas šios pamokos pabaigoje.
Reikalavimai:
Techninė įranga:
- PIC16F877A Perf Board
- RS232 į USB keitiklio modulis
- Kompiuteris
- „PICkit 3“ programuotojas
Programinė įranga:
- MPLABX
- „HyperTerminal“
RS232 į USB keitiklis reikalingas konvertuoti serijos duomenis į kompiuteriu nuskaitoma forma. Yra keletas būdų susikurti savo grandinę, užuot įsigijus savo modulį, tačiau jie nėra patikimi, nes jiems būdingas triukšmas. Toliau parodyta ta, kurią mes naudojame
Pastaba: kiekvienam RS232 į USB keitiklį reikia įdiegti specialią tvarkyklę; dauguma jų turėtų būti įdiegti automatiškai, kai tik prijungiate įrenginį. Bet, jei neatsipalaiduoja !!! Naudokitės komentarų skiltimi ir aš jums padėsiu.
PIC mikrovaldiklio programavimas UART ryšiui:
Kaip ir visi moduliai (ADC, laikmatis, PWM), taip pat turėtume inicializuoti savo USART modulį iš savo PIC16F877A MCU ir nurodyti jam dirbti UART 8 bitų ryšio režimu. Apibrėžkime konfigūracijos bitus ir pradėkime nuo UART inicializavimo funkcijos.
PIC mikrovaldiklio UART modulio inicijavimas:
Tx ir Rx kaiščiai yra fiziškai prie kaiščių RC6 ir RC7. Pagal duomenų lapą deklaruokime TX kaip išvestį ir RX kaip įvestį.
// **** UART įvesties / išvesties kaiščių nustatymas **** // TRISC6 = 0; // TX kaištis nustatytas kaip išėjimas TRISC7 = 1; // RX kaištis nustatytas kaip įvestis // ________ Įvesties / išvesties kaiščių rinkinys __________ //
Dabar turi būti nustatytas perdavimo greitis. Duomenų perdavimo sparta - tai greitis, kuriuo informacija perduodama ryšio kanalu. Tai gali būti viena iš daugelio numatytųjų reikšmių, tačiau šioje programoje mes naudojame 9600, nes ji yra dažniausiai naudojama duomenų perdavimo sparta.
/ ** Inicializuokite reikiamo duomenų perdavimo spartos SPBRG registrą ir nustatykite BRGH greitam baudos greičiui ** / SPBRG = ((_XTAL_FREQ / 16) / Baud_rate) - 1; BRGH = 1; // esant dideliam baudos greičiui // _________ „baud_rate“ nustatymo pabaiga _________ //
Duomenų perdavimo spartos reikšmė turi būti nustatyta naudojant registrą SPBRG, vertė priklauso nuo išorinio kristalo dažnio vertės, formulės, skirtos apskaičiuoti perdavimo greitį, parodytos žemiau:
SPBRG = ((_XTAL_FREQ / 16) / Baud_rate) - 1;
Kad būtų įmanomas didelis spartos spartos sparta, bitą BRGH reikia padaryti aukštą. Pagal duomenų lapą (13 psl.) Visada naudinga jį įgalinti, nes tai gali pašalinti klaidas bendraujant.
Kaip minėjome anksčiau, dirbsime asinchroniniu režimu, todėl bitų SYNC reikšmė turėtų būti lygi nuliui, o SPEM bitai turi būti aukšti, kad būtų galima įjungti serijinius kaiščius (TRISC6 ir TRICSC5)
// **** Įjungti asinchroninį nuoseklųjį prievadą ******* // SYNC = 0; // asinchroninis SPEN = 1; // Įgalinti nuoseklaus prievado kaiščius // _____ Įjungtas asinchroninis nuoseklusis prievadas _______ //
Šioje pamokoje mes siųsime ir priimsime duomenis tarp MCU ir kompiuterio, todėl turime įgalinti tiek TXEN, tiek CREN bitus.
// ** Pasiruošia perdavimui ir priėmimui ** // TXEN = 1; // įgalinti perdavimą CREN = 1; // įjungti priėmimą // __ UART modulis parengtas ir paruoštas perduoti bei priimti __ //
Į bitai TX9 ir RX9 turi būti lygi nuliui, kad dirbame 8 bitų režimu. Jei turi būti nustatytas didelis patikimumas, galima pasirinkti 9 bitų režimą.
// ** Pasirinkite 8 bitų režimą ** // TX9 = 0; // pasirinktas 8 bitų priėmimas RX9 = 0; // Pasirinktas 8 bitų priėmimo režimas // __ Pasirinktas 8 bitų režimas __ //
Tai atlikę mes atliksime pradinę sąranką. ir yra paruoštas naudoti.
Duomenų perdavimas naudojant UART:
Žemiau pateiktą funkciją galima naudoti duomenims perduoti per UART modulį:
// ** Funkcija siųsti vieną baitą datą į UART ** // negalioja UART_send_char (char bt) {while (! TXIF); // laikykite programą tol, kol TX buferis bus laisvas TXREG = bt; // Įkelkite siųstuvo buferį su gauta verte} // _____________ Funkcijos pabaiga ________________ //
Inicializavus modulį, bet kokia vertė, įkelta į registrą, TXREG bus perduodama per UART, tačiau perdavimas gali sutapti. Taigi mes visada turėtume patikrinti, ar TXIF yra perdavimo pertraukimo žymė. Tik tuo atveju, jei šio bito yra mažai, mes galime tęsti kitą bitą perduoti, kitaip turėtume palaukti, kol ši vėliava bus maža.
Tačiau aukščiau nurodytą funkciją galima naudoti tik norint siųsti tik vieną baitą duomenų, norint išsiųsti visą eilutę, reikia naudoti šią funkciją
// ** Funkcija, paverčianti eilutę baitais ** // negaliojanti UART_send_string (char * st_pt) {while (* st_pt) //, jei yra char UART_send_char (* st_pt ++); // apdorokite juos kaip baitų duomenis} // ___________ Funkcijos pabaiga ______________ //
Šią funkciją gali būti šiek tiek keblu suprasti, nes ji turi rodyklių, tačiau patikėkite manimi, patarimai yra nuostabūs ir palengvina programavimą, ir tai yra vienas iš gerų to paties pavyzdžių.
Kaip pastebėjote, mes vėl paskambinome UART_send_char (), bet dabar - while ciklo viduje. Mes suskirstėme eilutę į atskirus simbolius, kiekvieną kartą, kai ši funkcija yra iškviečiama, viena char bus išsiųsta į TXREG ir ji bus perduota.
Duomenų gavimas naudojant UART:
Šią funkciją galima naudoti norint gauti duomenis iš UART modulio:
// ** Funkcija gauti vieną baitą datos iš UART ** // char UART_get_char () {if (OERR) // patikrinkite, ar nėra klaidos {CREN = 0; // Jei klaida -> Reset CREN = 1; // Jei klaida -> Atstatyti}, kol (! RCIF); // laikykite programą tol, kol RX buferis bus nemokamas, RCREG; // gaukite vertę ir nusiųskite ją į pagrindinę funkciją} // _____________ Funkcijos pabaiga ________________ //
Kai duomenis gauna UART modulis, jis juos paima ir išsaugo RCREG registre. Mes galime tiesiog perkelti vertę į bet kurį kintamąjį ir ją naudoti. Tačiau gali būti sutapimo klaida arba vartotojas gali nuolat siųsti duomenis, o mes jų dar neperkėlėme į kintamąjį.
Tokiu atveju gelbėti gaunamas vėliavos bitas RCIF. Šis bitas bus mažas, kai tik gaunami ir dar neapdoroti duomenys. Taigi mes naudojame jį tuo pačiu cikle, sukurdami delsą laikyti programą tol, kol susitvarkysime su ta verte.
Šviesos diodų perjungimas naudojant PIC mikrovaldiklio UART modulį:
Dabar pereikime prie paskutinės programos dalies - „ void main (void“) funkcijos, kur perjungsime šviesos diodą per kompiuterį naudodami UART ryšį tarp PIC ir kompiuterio.
Kai išsiųsime simbolį „1“ (iš kompiuterio), šviesos diodas bus įjungtas ir būsenos pranešimas „RED LED -> ON“ bus išsiųstas atgal (iš PIC MCU) į kompiuterį.
Panašiai mes siunčiame simbolį „0“ (iš kompiuterio). LED bus išjungtas, o būsenos pranešimas „RED LED -> OFF“ bus išsiųstas atgal (iš PIC MCU) į kompiuterį.
while (1) // Begalinė kilpa {get_value = UART_get_char (); if (get_value == '1') // Jei vartotojas siunčia „1“ {RB3 = 1; // Įjungti LED UART_send_string ("RED LED -> ON"); // Siųsti pranešimą į kompiuterį UART_send_char (10); // ASCII 10 vertė naudojama grąžinti vežimą (atspausdinti naujoje eilutėje)} if (get_value == '0') // Jei vartotojas siunčia „0“ {RB3 = 0; // Išjunkite LED UART_send_string ("RED -> OFF"); // Siųsti pranešimą į kompiuterį UART_send_char (10); // ASCII 10 vertė naudojama grąžinti vežimą (atspausdinti naujoje eilutėje)}}
Modeliuojant mūsų programą:
Kaip įprasta, imituokime savo programą naudodami proteus ir sužinokime, ar ji veikia taip, kaip tikėtasi.
Aukščiau pateiktame paveikslėlyje parodytas virtualus terminalas, kuriame rodomas pasveikinimo pranešimas ir šviesos diodo būsena. Galima pastebėti, kad raudonos spalvos šviesos diodas yra prijungtas prie kaiščio RB3. Išsamų modeliavimo darbą galite rasti vaizdo įrašo pabaigoje.
Aparatūros nustatymas ir išvesties testavimas:
Šios grandinės prijungimas yra tikrai paprastas, mes naudojame savo PIC Perf plokštę ir tiesiog prijungiame tris laidus prie RS232 prie USB keitiklio ir prijungiame modulį prie savo kompiuterio naudodami USB duomenų kabelį, kaip parodyta žemiau.
Tada mes įdiegsime „ Hyper Terminal“ programą (atsisiųskite iš čia) ir atidarykite. Tai turėtų parodyti kažką panašaus
Dabar kompiuteryje atidarykite „Device Manager“ ir patikrinkite, prie kurio „Com“ prievado yra prijungtas jūsų modulis, mano - prie 17 COM prievado, kaip parodyta žemiau
Pastaba: modulio COM prievado pavadinimas gali keistis, atsižvelgiant į pardavėją, tai nėra problema.
Dabar grįžkite į „Hyper Terminal Application“ ir eikite į „ Set Up“ -> „Port Configuration“ arba paspauskite „Alt“ + C, kad gautumėte šį iššokantįjį langelį ir iššokančiajame lange pasirinkite norimą prievadą (mano atveju COM17) ir spustelėkite prisijungti.
Kai ryšys bus užmegztas, įjunkite savo PIC perf plokštę ir toliau turėtumėte pamatyti kažką panašaus
Laikykite žymeklį komandos lange ir įveskite 1, tada paspauskite enter. Šviesos diodas bus įjungtas ir būsena bus rodoma taip, kaip parodyta žemiau.
Tokiu pačiu būdu laikykite žymeklį komandos lange ir įveskite 0, tada paspauskite enter. Šviesos diodas bus išjungtas ir būsena bus rodoma, kaip parodyta žemiau.
Žemiau pateikiamas visas kodas ir išsamus vaizdo įrašas, kuriame bus parodyta, kaip šviesos diodas reaguodamas reaguoja į „1“ ir „0“.
Tai viskas, vaikinai, mes sujungėme PIC UART su savo kompiuteriu ir perdavėme duomenis, kad perjungtume šviesos diodą naudodami „Hyper“ terminalą. Tikiuosi, kad supratote, jei ne, naudokite komentarų skiltį ir paklauskite savo užklausos. Kitoje pamokoje mes vėl naudosime UART, bet padarysime jį įdomesnį naudodami „Bluetooth“ modulį ir transliuosime duomenis eteryje.
Taip pat patikrinkite UART ryšį tarp dviejų „ATmega8“ mikrovaldiklių ir UART ryšį tarp „ATmega8“ ir „Arduino Uno“.