- Vaatimukset:
- PIC-mikrokontrollerin ohjelmointi UART-tiedonsiirtoa varten:
- Ohjelmamme simulointi:
- Laitteiston asennus ja testitulos:
Tässä opetusohjelmassa opitaan ottamaan käyttöön UART-tiedonsiirto PIC-mikrokontrollerin kanssa ja kuinka siirtää tietoja tietokoneellesi ja tietokoneelta. Toistaiseksi olemme käsittäneet kaikki perusmoduulit, kuten ADC, ajastimet, PWM, ja oppineet myös LCD-näyttöjen ja 7-segmenttisten näyttöjen liittämisen. Nyt varustamme itsemme uudella UART-viestintätyökalulla, jota käytetään laajasti useimmissa mikrokontrolleriprojekteissa. Katso täältä täydelliset PIC-mikrokontrollerioppaat, jotka käyttävät MPLAB: ää ja XC8: ta.
Tässä olemme käyttäneet PIC16F877A MCU: ta, sillä on moduuli nimeltä "Addressable Universal Synchronous Asynchronous Receiver and Transmitter", joka tunnetaan pian nimellä USART. USART on kaksijohtiminen viestintäjärjestelmä, jossa data kulkee sarjaan. USART on myös kaksisuuntainen tiedonsiirto, joten voit lähettää ja vastaanottaa tietoja samanaikaisesti, jota voidaan käyttää viestintään oheislaitteiden, kuten CRT-päätelaitteiden ja henkilökohtaisten tietokoneiden, kanssa.
USART voidaan konfiguroida seuraavissa tiloissa:
- Asynkroninen (kaksisuuntainen)
- Synkroninen - Master (puoli-duplex)
- Synkroninen - orja (puoliduplex)
On myös kahta erilaista tilaa, nimittäin 8-bittinen ja 9-bittinen tila, tässä opetusohjelmassa määritämme USART-moduulin toimimaan asynkronisessa tilassa 8-bittisen tietoliikennejärjestelmän kanssa, koska se on eniten käytetty viestintätyyppi. Koska se on asynkronista, sen ei tarvitse lähettää kellosignaalia yhdessä datasignaalien kanssa. UART käyttää kahta tietolinjaa datan lähettämiseen (Tx) ja vastaanottamiseen (Rx). Molempien laitteiden maadoitus tulisi myös tehdä yhteiseksi. Tämän tyyppisellä viestinnällä ei ole yhteistä kelloa, joten yhteinen perusta on erittäin tärkeä järjestelmän toimimiselle.
Tämän opetusohjelman lopussa voit muodostaa yhteyden (UART) tietokoneen ja PIC-mikrokontrollerin välille ja vaihtaa PIC-kortin LED-valon kannettavasta tietokoneesta. LED: n tila lähetetään kannettavaan tietokoneeseen PIC MCU: lta. Testataan lähtö Hyper Terminalin avulla tietokoneessa. Yksityiskohtainen video on myös tämän opetusohjelman lopussa.
Vaatimukset:
Laitteisto:
- PIC16F877A Perf Board
- RS232 - USB-muunnin -moduuli
- Tietokone
- PICkit 3 -ohjelmoija
Ohjelmisto:
- MPLABX
- HyperTerminal
RS232 USB-muunnin on tarpeen muuntaa sarjamuotoisen datan sähköisessä muodossa. On olemassa tapoja suunnitella oma piiri sen sijaan, että ostat oman moduulin, mutta ne eivät ole luotettavia, koska niihin kohdistuu melua. Käytämme on alla
Huomaa: Jokainen RS232-USB-muunnin vaatii erityisen ohjaimen asennuksen; Suurin osa niistä pitäisi asentaa automaattisesti heti, kun liität laitteen. Mutta jos se ei rentoudu !!! Käytä kommenttiosaa ja autan sinua.
PIC-mikrokontrollerin ohjelmointi UART-tiedonsiirtoa varten:
Kuten kaikki moduulit (ADC, Timer, PWM), meidän tulisi myös alustaa PIC16F877A MCU: n USART-moduulimme ja ohjeistaa sitä toimimaan UART 8-bittisessä kommunikaatiotilassa. Määritetään konfigurointibitit ja aloitetaan UART-alustustoiminnolla.
PIC-mikrokontrollerin UART-moduulin alustaminen:
Tx- ja Rx-nastat ovat fyysisesti läsnä nastoissa RC6 ja RC7. Ilmoitetaan tietolomakkeen mukaan TX tuotokseksi ja RX syötteeksi.
// **** I / O-nastojen asettaminen UART: lle **** // TRISC6 = 0; // TX-nasta asetettu lähtöön TRISC7 = 1; // RX-nasta asetettu tuloksi // ________ I / O-nastat asetettu __________ //
Nyt siirtonopeus on asetettava. Siirtonopeus on nopeus, jolla tietoa siirretään tietoliikennekanavalla. Tämä voi olla yksi monista oletusarvoista, mutta tässä ohjelmassa käytämme 9600, koska se on eniten käytetty siirtonopeus.
/ ** Alusta SPBRG-rekisteri vaaditulle siirtonopeudelle ja aseta BRGH nopealle tiedonsiirtonopeudelle ** / SPBRG = ((_XTAL_FREQ / 16) / Baud_rate) - 1; BRGH = 1; // korkealle baudinopeudelle // _________ baudinopeuden asetuksen loppu _________ //
Siirtonopeuden arvo on asetettava rekisterin SPBRG avulla, arvo riippuu Ulkoisen kidetaajuuden arvosta, alla olevat kaavat tiedonsiirtonopeuden laskemiseksi:
SPBRG = ((_XTAL_FREQ / 16) / Baud_rate) - 1;
Bitti BRGH on tehtävä korkeaksi nopean bittinopeuden mahdollistamiseksi. Datalehden (sivu 13) mukaan on aina hyödyllistä ottaa se käyttöön, koska se voi poistaa virheet viestinnän aikana.
Kuten aiemmin sanoimme, työskentelemme asynkronisessa tilassa, joten bitti SYNC tulisi tehdä nollaksi ja bitti SPEM pitää tehdä korkeaksi, jotta sarjaliittimet (TRISC6 ja TRICSC5)
// **** Ota asynkroninen sarjaportti käyttöön ******* // SYNC = 0; // Asynkroninen SPEN = 1; // Ota sarjaportin nastat käyttöön // _____ Asynkroninen sarjaportti käytössä _______ //
Tässä opetusohjelmassa lähetämme ja vastaanotamme tietoja MCU: n ja tietokoneen välillä, joten meidän on otettava käyttöön sekä TXEN- että CREN-bitit.
// ** Valmistautuu lähetykseen ja vastaanottoon ** // TXEN = 1; // ota lähetys käyttöön CREN = 1; // ota vastaanotto käyttöön // __ UART-moduuli valmiina lähetykseen ja vastaanottoon __ //
Bitit TX9 ja RX9 on tehtävä nollaksi niin, että me toimivat 8-bittisessä tilassa. Jos luotettavuuden on oltava korkea, voidaan valita 9-bittinen tila.
// ** Valitse 8-bittinen tila ** // TX9 = 0; // 8-bittinen vastaanotto valittu RX9 = 0; // 8-bittinen vastaanottotila valittu // __ 8-bittinen tila valittu __ //
Tämän avulla olemme suorittaneet alustusasetukset loppuun. ja on käyttövalmis.
Tietojen lähettäminen UART: n avulla:
Seuraavaa toimintoa voidaan käyttää tietojen lähettämiseen UART-moduulin kautta:
// ** Toiminto lähettää yhden tavun päivämäärä UART: lle // // void UART_send_char (char bt) {while (! TXIF); // pidä ohjelmaa, kunnes TX-puskuri on vapaa TXREG = bt; // Lataa lähetinpuskuri vastaanotetulla arvolla} // _____________ Toiminnon loppu ________________ //
Kun moduuli on alustettu, mikä tahansa rekisteriin ladattu arvo lähetetään, TXREG lähetetään UART: n kautta, mutta lähetys saattaa olla päällekkäinen. Siksi meidän tulisi aina tarkistaa lähetyskatkoksen lippu TXIF. Vain jos tämä bitti on matala, voimme jatkaa seuraavaa bittiä lähetystä varten, muuten meidän pitäisi odottaa, että tämä lippu laskee matalaksi.
Yllä olevaa toimintoa voidaan kuitenkin käyttää vain yhden tavun tietojen lähettämiseen, täydellisen merkkijonon lähettämiseen alla olevaa toimintoa tulisi käyttää
// ** Funktio, jolla merkkijono muunnetaan tavuksi ** // void UART_send_string (char * st_pt) {while (* st_pt) // if on char UART_send_char (* st_pt ++); // käsittele sitä tavutiedona} // ___________ Toiminnon loppu ______________ //
Tämä toiminto voi olla hieman hankala ymmärtää, koska siinä on osoittimia, mutta luota minuun osoittimet ovat ihania ja ne tekevät ohjelmoinnista helpompaa, ja tämä on yksi hyvä esimerkki samasta.
Kuten huomaat, olemme jälleen kutsuneet UART_send_char (): ta, mutta nyt while-silmukan sisään. Olemme jakaneet merkkijonon yksittäisiksi merkeiksi, aina kun tätä toimintoa kutsutaan, yksi merkki lähetetään TXREG: lle ja se lähetetään.
Tietojen vastaanottaminen UART: n avulla:
Seuraavaa toimintoa voidaan käyttää tietojen vastaanottamiseen UART-moduulista:
// ** Funktio, jolla saat yhden tavun päivämäärää UART: lta ** // char UART_get_char () {if (OERR) // tarkista virhe {CREN = 0; // Jos virhe -> Nollaa CREN = 1; // Jos virhe -> Nollaa} kun (! RCIF); // pidä ohjelmaa, kunnes RX-puskuri on ilmainen paluu RCREG; // vastaanota arvo ja lähetä se pääfunktiolle} // _____________ Funktion loppu ________________ //
Kun UART-moduuli vastaanottaa tiedot, se hakee ne ja tallentaa ne RCREG- rekisteriin. Voimme yksinkertaisesti siirtää arvon mihin tahansa muuttujaan ja käyttää sitä. Mutta siinä saattaa olla päällekkäisvirhe tai käyttäjä saattaa lähettää tietoja jatkuvasti, emmekä ole vielä siirtäneet niitä muuttujaan.
Siinä tapauksessa vastaanottolippubitti RCIF tulee pelastamaan. Tämä bitti laskee vähän, kun tieto vastaanotetaan eikä sitä ole vielä käsitelty. Siksi käytämme sitä samalla silmukassa luoden viiveen ohjelman pitämiseen, kunnes käsittelemme tätä arvoa.
LEDin vaihtaminen PIC-mikrokontrollerin UART-moduulilla:
Tulkaamme nyt ohjelman viimeiseen osaan, void main (void) -toimintoon, jossa vaihdamme LED: n tietokoneen läpi käyttämällä UIC-tiedonsiirtoa PIC: n ja tietokoneen välillä.
Kun lähetämme merkin "1" (tietokoneelta), LED syttyy ja tilaviesti "PUNAINEN LED -> PÄÄLLÄ" lähetetään takaisin (PIC MCU: lta) tietokoneelle.
Vastaavasti lähetämme merkin "0" (tietokoneelta), LED sammuu ja tilaviesti "PUNAINEN LED -> POIS" lähetetään takaisin (PIC MCU: lta) tietokoneelle.
while (1) // Ääretön silmukka {get_value = UART_get_char (); if (get_value == '1') // Jos käyttäjä lähettää "1" {RB3 = 1; // Kytke LED päälle UART_send_string ("PUNAINEN LED -> PÄÄLLÄ"); // Lähetä ilmoitus tietokoneelle UART_send_char (10); // ASCII-arvoa 10 käytetään vaunun palautukseen (tulostetaan uudella rivillä)} if (get_value == '0') // Jos käyttäjä lähettää "0" {RB3 = 0; // sammuta LED UART_send_string ("PUNAINEN -> POIS"); // Lähetä ilmoitus tietokoneelle UART_send_char (10); // ASCII-arvoa 10 käytetään kuljetuksen palauttamiseen (tulostetaan uudella rivillä)}}
Ohjelmamme simulointi:
Simuloidaan ohjelmamme tavallisesti proteusta käyttäen ja selvitetään, toimiiko se odotetusti.
Yllä oleva kuva näyttää virtuaalisen päätelaitteen, jossa siinä näkyy tervetuloviesti ja LED-valon tila. Punainen väri-LED voidaan havaita olevan kytkettynä tapiin RB3. Simulaation yksityiskohtainen työskentely löytyy lopussa olevasta videosta.
Laitteiston asennus ja testitulos:
Tämän piirin kytkentä on todella yksinkertaista, käytämme PIC Perf -piirileväämme ja yhdistämme vain kolme johtoa RS232: een USB-muuntimeen ja liitämme moduulin tietokoneeseemme USB-datakaapelilla alla olevan kuvan mukaisesti.
Seuraavaksi asennamme Hyper Terminal -sovelluksen (lataa se täältä) ja avaa se. Sen pitäisi näyttää jotain tällaista
Avaa nyt Laitehallinta tietokoneellasi ja tarkista, mihin Com-porttiin moduuli on kytketty, minun on kytketty COM-porttiin 17 alla olevan kuvan mukaisesti
Huomautus: Moduulin COM-portin nimi saattaa muuttua toimittajan mukaan, se ei ole ongelma.
Palaa nyt takaisin Hyper Terminal -sovellukseen ja siirry kohtaan Set Up -> Port Configuration tai paina Alt + C, saadaksesi seuraavan ponnahdusikkunan ja valitsemalla haluamasi portin (minun tapauksessani COM17) ponnahdusikkunassa ja napsauttamalla connect.
Kun yhteys on muodostettu, käynnistä PIC perf -taulutietokoneesi ja sinun pitäisi nähdä jotain tällaista alla
Pidä kohdistinta komentoikkunassa ja kirjoita 1 ja paina sitten enter. LED syttyy ja tila näytetään alla olevan kuvan mukaisesti.
Pidä kursori samalla tavalla komentoikkunassa ja syötä 0 ja paina sitten enter. LED sammuu ja tila näytetään alla olevan kuvan mukaisesti.
Alla on annettu täydellinen koodi ja yksityiskohtainen video, joka näyttää kuinka LED reagoi reaaliajassa numeroille 1 ja 0.
Siinä kaverit, olemme liittäneet PIC UART: n tietokoneeseemme ja siirtäneet tiedot vaihtaaksesi LED-valoa Hyper-päätelaitteen avulla. Toivottavasti ymmärrät, jos ei, kysy kyselyä kommenttiosasta. Seuraavassa opetusohjelmassa käytämme jälleen UART: ta, mutta teemme siitä mielenkiintoisemman käyttämällä Bluetooth-moduulia ja lähettämällä tiedot ilman kautta.
Tarkista myös UART-yhteys kahden ATmega8-mikrokontrollerin välillä ja UART-yhteys ATmega8: n ja Arduino Unon välillä.