Sunteți pe pagina 1din 9

Folosirea Interfetei Seriale UART

USART (UNIVERSAL SYNCHRONOUS ASYNCHRONOUS RECEIVER TRANSMITTER) Modulul USART este un periferic de comunicatie de intrare-iesire; contine toate generatoarele de ceas, registrii de deplasare si bufferele necesare pentru a transfera datele serial (intrare sau iesire) independent de executia programului. Modulul USART poate fi configurat ca un sistem asincron full-duplex sau ca un sistem sincron half-duplex. Noi il vom folosi numai in modul asincron (UART). Modulul UART transmite si receptioneaza datele in formatul standard non-return-tozero (NRZ). NRZ este implementat cu 2 nivele: o stare de MARK ce reprezinta un bit de "1" si o stare de SPACE ce reprezinta un bit de "0". NRZ se refera la faptul ca bitii de date de aceeasi valoare transmisi consecutiv stau la acelasi nivel de iesire, fara a se intoarce la un nivel neutru dupa fiecare bit transmis. O transmisie NRZ sta pasiva in starea MARK. Fiecare trasmisie a unui caracter este compusa dintr-un bit de Start, 8 (sau 9) biti de date, si unul (sau mai multi) biti de Stop. Bitul de Start este intoadeuna SPACE iar bitul de Stop este intodeuna MARK. Cea mai des intilbita transmisie este cea de 8 biti de date (fara paritate) si un singur bit de Stop. Fiecare bit transmis persita o durata de 1/baud. Un circuit dedicat (Baud Rate Generator) este folosit pentru a obtine rate de baud standard derivate din oscilatorul picului. Datele/bitii sint transmisi incepind cu bitul cel mai putin semnificativ. Sub-modulele de transmisie si receptie sint independente functional, insa partajeaza acelasi baud si acelasi format al datelor. Paritatea nu este suportata in hardware, insa poate fi implemnetata in software folosind cel de-al noulea bit. Generatorul de baud ( Baud Rate Generator = BRG) BRG suporta atit modurile asincron cit si sincron, si la unele PICuri poate fi selectat sa lucreze pe 8 sau 16 biti. In continuare nu ne vom referi decit la modul asincron si BRG pe8 biti. Registrul SPBRG controleaza perioada unui timer pe 8 biti. Tabelul de mai jos prezinta formula de calcul pentru diferite rate de baud, in functie de valoarea aleasa X pentru SPBRG si de modul selectat din bitul BRGH (viteza mica sau mare) BRGH = 0 (viteza mica) Baud = Fosc/(64 (X+1)) BRGH = 1 (viteza mare) Baud = Fosc/(16 (X+1))

Dindu-se valoarea baud dorita si Fosc (frecventa de oscilatie), cea mai apropiata vaoare intreaga pentru SPBRG poate fi calculata folosind formula. Dupa aceasta se poate determina si eroare de baud.

Exemple de calcul: Pentru un PIC ce foloseste un oscilator de 4 MHz, vrem sa folosim o rata de transmisie de 300 baud. Selectam modul de viteza redusa, BRGH = 0 X = Fosc/(BaudDorit*64)-1 = 4000000/(300*64)-1 = 207.3333 Deci SPBRG = 207 Calcul eroare: BaudReal = 4000000/((207+1)*64) = 300.4808 Eroare = (BaudReal - BaudDorit) / BaudDorit = (300.4808-300)/300 = 0.0016 0.16% Pentru un PIC ce foloseste un oscilator de 20 MHz, vrem sa folosim o rata de transmisie de 57600 baud. Selectam modul de viteza mare, BRGH = 1 X = Fosc/(BaudDorit*16)-1 = 20000000/(57600*16)-1 = 20.7014 Alegem SPBRG = 21 Calcul eroare: BaudReal = 20000000/((21+1)*16) = 56818.1818 Eroare = (BaudReal - BaudDorit) / BaudDorit = ( 56818.1818-57600)/57600 = 0.0136 1.36% In ambele exemple, eroarea este mica. Daca eroarea depaseste 4% este probablil sa apara erori datorita diferentei de baud intre emitator si receptor.

TRANSMISIA PE UART Elementul principal al modulului de transmisie este registrul de deplasare TSR (Transmit Shift Register), ce nu este accesibil direct din software. TSR se incarca cu date din bufferul de transmisie, numit TXREG. Pentru a activa transmisia asincrona trebuie configurati urmatorii biti (ceilalti biti se presupune ca se afla in starea lor initiala): TXSTA<TXEN> = 1 (activeaza circuitul de transmitere) TXSTA<SYNC> = 0 (configureaza modul de operare asincron) RCSTA<SPEN> = 1 (activeaza UART si configureaza pinul de TX ca iesire) Transmisia unui caracter este initiata scriind o valoare in TXREG. Daca aceasta scriere este prima, sau daca caracterul dinainte a fost deja complet transmis (afara din TSR), atunci data din TXREG este imediat trasnferata in TSR. Daca insa TSR contine inca o parte din caracterul precedent , noua data este pastrata in TXREG pina cind caracterul precedent este trasmis complet; apoi este copiat in TSR si transmisa porneste automat (bit de start, bitii de date, bit de stop) Indicatorul TXIF (din registrul PIR1) este setat de fiecare data cind (modulul UART este activat si) registul TXREG este gol (nu contine nici un caracter in asteptare pentru trasmisie);deci TXIF este zero numai atunci cind TSR este ocupat cu transmisia unui caracter si un nou caracter a fost pus spre transmisie in TXREG. Bitul TXIF poate fi numai citit, el este automat pus de catrre hardware (pe 0 sau pe 1) si nu poate fi modificat din software. Pentru a genera intreruperi trebuie setat si bitul TXIE din PIE1. Folosirea intreruperilor la transmisie este folositoare pentru a transmite mai multi octeti unul dupa altul (dupa ce se trimite si ultimul caracter din buffer, cind nu mai sint date de trimis, bitul TXIE poate fi sters) Bitul TRMT din TXSTA indica stare registrului TSR. Bitul TRMT este setat cind registrul TSR este gol, si este pus pe zero atunci cind este incarcat un caracter din TXREG, raminind pe zero pina cind toti bitii au fost deplasati afara din TSR.

TXSTA (Bank1) 7 CSRC


7 CSRC ClockSouRCeSelect Ser.Asincrona:neimportant

6 TX9

5 TXEN

4 SYNC

3 SENDB

2 BRGH

1 TRMT

0 TX9D

6 5 4
3

TX9 TXEN SYNC


SENDB

9bitTransmit enable TransmitENable Selectiemod


SENDBreakcharacter

1=Selecteazatransmisiape9biti 0=Selecteazatransmisiape8biti 1=Trasnsmisiaactivata 0=Trasnsmisiadezactivata


1=transmisiesincrona

0=transmisieasincrona
1=trimiteuncaracterdeBreaklaurmatoareatransmisie

0=transmisienormala 2 1 0 BRGH TRMT TX9D HighBaudRate Select TransmitShift RegisterStatus Ninthbitod TransmitData 1=Vitezamare(baud) 0=Vitezaredusa(baud) 1=TSRgol 0=TSRplin(transmisieincursdedesfasurare) Celdealnouleabit(pentrutransmisiape9biti); poatefifolositcabitdeparitatesaude adresare

RECEPTIA PE UART Schema bloc a receptorului UART este prezentata mai jos. Datele sint receptionate pe pinul RX, de unde sint preluate de blocul de reconstructie a datelor; acest bloc functioneaza la o frecventa de 16 ori mai mare decit registrul de receptie serial RSR (Receive Shift Register) care functioneaza la frecventa data de rata de baud. Dupa ce toti (8 sau 9) bitii au fost receptionati, acestia sint transferati imediat intr-un buffer FIFO (First-In-First-Out); acest buffer permite receptia completa (si stocarea) a doua caractere, si receptia celui de-al treilea, inainte ca sa fie necesara interventia softului pentru a prelua aceste date. Caracterele receptionate sint accesibile prin intermediul registrului RCREG. Pentru a activa receptia asincrona trebuie configurati urmatorii biti (ceilalti biti se presupune ca se afla in starea lor initiala): CREN = 1 (activeaza circuitul de receptie) SYNC = 0 (configureaza seriala pentru modul asincron) SPEN = 1 (activeaza modulul UART si configureaza pinul RX ca intrare)

Receptia datelor Circuitul de reconstructie a datelor initiaza receptia unui caracter pe frontul descrescator al primului bit; acest bit este bitul de start ce este intodeauna zero. Circuitul numara echivalentul a jumatate de bit (astfel incit sa se afle centrat la jumatatea bitului de stat) si verifica daca linia este inca zero. Daca nu este zero, atunci anuleaza receptia caracterului curent si reia procesul de la inceput (cu asteptarea urmatorului front descrescator). Daca bitul de stop a fost validat (ca fiind zero) atunci se continua receptia periodic, esantionind linia cu perioada data de rata de baud; de fiecare data bitul obtinut (0 sau 1) este trecut in registrul de deplasare RSR; procesul se repeta pina ce au fost receptionati toti bitii (inclusiv bitul de stop). Imediat dupa ce au fost receptionati toti bitii, datele sint transferate in bufferul FIFO si bitul RCIF este aprins. Primul caracter receptionat, aflat in FIFO, poate fi extras, cititnd registrul RCREG. Generarea Intreruperilor la Receptie Indicatorul RCIF din registrul PIR1 este setat de fiecare data cind (modulul usart este activat si) exista un caracter necitit in FIFO. Bitul RCIF nu poate fi modificat in software, el este setat automat de catre hardware cidn exista caractere necitite, si pus pe 0 atunci cind bufferul este gol. Pentru a activa intreruperile la receptie, trebuie ca: Bitul de activare a intreruperilor pe receptie sa fie setat PIE1<RCIE> = 1 Bitul de activare a intreruperilor periferice sa fie setat: INTCON<PEIE> = 1 Intreruperile sa fie activate global INTCON<GIE> = 1 Eroarea de cadru: Fiecare caracter din bufferul FIFO are un indicator FERR (framing error) ce indica daca pentru caracterul respectiv, bitul de stop a fost citit corect. Folosirea/verificarea bitului FERR este optionala, insa daca acesta este setat, este foarte probabil ca octetul respectiv receptionat, sa fie eronat. Eroarea de depasire: Bufferul FIFO al receptorului serial poate tine 2 caractere; daca este receptionat complet si un al treilea caracter, atunci se genereaza o eroare de depasire, ce este

semnalizata prin setarea biului OERR. Caracterele deja receptionate pot fi citite, insa pentru a continua operarea serialei, trebuie sters unul din bitii CREN sau SPEN.
RCSTA (Bank0) 7 SPEN 7 SPEN SerialPort Enable 9bitReceive Enable
SingleReceiveENable

6 RX9

5 SREN

4 CREN

3 ADDEN

2 FERR

1 OERR

0 RX9D

1=activeazaportulserial(piniideRXsiTXsint configuraticapiniseriali 0=dezactiveazaseriala 1=activeazamoduldereceptiepe9biti 0=receptiepe8biti


Inmodulasincronnuconteaza

6
5

RX9
SREN

4 3 2

CREN ADDEN FERR

Continuous ReceiveENable AddressDetect Enable FramingERRor

1=activeazareceptiapeseriala 0=dezactiveazareceptia Folositinmodul9bit 1=aaparutoeroaredeframinglareceptie (poatefiactualizat,citindRCREGsireceptionind urmatoruloctetvalid) 1=Overrunerror(poatefisterspunindCRENpe zero) Celdealnouleabitpoatefideadresasaude paritatesitrebuiecalculatinsoftware

1 0

OERR RX9D

OverunERRor Ninthbitof receiveddata

Urmatorulprogramesteunexempludeinitializareaportuluiserialsidetransmitere amaimultorcaracterepeseriala.Caracterele(literelealfabetuluidelaalazpotfi vizualizatepePCfolosindunterminal)


LIST P=16F887, F=INHX8M #include "p16f887.inc" radix dec ;__CONFIG _HS_OSC & _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _LVP_OFF & _DEBUG_OFF & _CPD_OFF CBLOCK 0x20 car ENDC ORG 0 CLRF MOVLW MOVWF GOTO

STATUS 0x00 PCLATH init

;************ initial ******************* init bsf movlw movwf movlw movwf bcf movlw movwf start movlw movwf repeta movf call incf movlw subwf btfss goto infinit goto STATUS,RP0 d'10' SPBRG b'00100100' TXSTA STATUS,RP0 b'10010000' RCSTA ; ; ; ; select bank 1 la 20Mhz cu 115200 => 10 la 4Mhz cu 19200 => 12 TXEN+BRGH

; select bank 0

"a" car car, w SendLWait car "{" car, w STATUS,Z repeta

; se porneste de la caracterul "a"

; se trimite caracterul curent ; trecere la urmatorul caracter ; echivalent cu: "z"+1 ; verifica daca s-a trecut de litera "z"

infinit

SendLWait btfss PIR1, TXIF goto $-1 movwf TXREG return END

; verifica daca bufferul este gol ; daca este plin, asteapta. ; trimite octetul din W

Urmatorulexempluestepentrureceptiaunuioctetpeseriala.Programulasteaptauncaracter,dupa care,cindilreceptioneaza,iiafiseazacodulpeLEDuri: LIST P=16F887, F=INHX8M #include "p16f887.inc" radix dec ;__CONFIG _HS_OSC & _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _LVP_OFF & _DEBUG_OFF & _CPD_OFF CBLOCK 0x20 car ENDC ORG 0 CLRF MOVLW MOVWF GOTO

STATUS 0x00 PCLATH init

;************ initial ******************* init bsf movlw movwf movlw movwf clrf bcf movlw movwf clrf repeta call movwf goto STATUS,RP0 d'10' SPBRG b'00100100' TXSTA TRISD STATUS,RP0 b'10010000' RCSTA PORTD ; ; ; ; select bank 1 la 20Mhz cu 115200 => 10 la 4Mhz cu 19200 => 12 TXEN+BRGH

; select bank 0

WaitForChar PORTD repeta

;procedura ce asteapta pina se receptioneaza un caracter WaitForChar btfss PIR1, RCIF ; verifica daca s-a receptionat un car goto $-1 ; daca nu, asteapta. movf RCREG, w ; preia caracterul in W return END

S-ar putea să vă placă și