electronica

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-to- zero (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) BRGH = 1 (viteza mare) Baud = Fosc/(64 (X+1)) 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.

Upload: lucianno-nm

Post on 28-Nov-2015

11 views

Category:

Documents


2 download

DESCRIPTION

UART seriala

TRANSCRIPT

Page 1: electronica

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-to-zero (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)

BRGH = 1 (viteza mare)

Baud = Fosc/(64 (X+1))

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.

Page 2: electronica

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.

Page 3: electronica

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.

  

Page 4: electronica

TXSTA (Bank 1) 

7  6  5  4  3  2  1  0 

CSRC  TX9  TXEN  SYNC  SENDB  BRGH  TRMT  TX9D 

  7  CSRC  Clock SouRCe Select  Ser.Asincrona: neimportant 

6  TX9  9‐bit Transmit enable 

1 = Selecteaza transmisia pe9 biti 0 = Selecteaza transmisia pe 8 biti 

5  TXEN  Transmit ENable  1 = Trasnsmisia activata 0 = Trasnsmisia dezactivata 

4  SYNC  Selectie mod  1 = transmisie sincrona 

0 = transmisie asincrona 

3  SENDB  SEND Break character  1 = trimite un caracter de Break la urmatoarea transmisie 

0 = transmisie normala 

2  BRGH  High Baud Rate Select 

1 = Viteza mare (baud) 0 = Viteza redusa (baud) 

1  TRMT  Transmit Shift Register Status 

1 = TSR gol 0 = TSR plin (transmisie in curs de desfasurare) 

0  TX9D  Ninth bit od Transmit Data 

Cel de‐al noulea bit (pentru transmisia pe 9 biti); poate fi folosit ca  bit de paritate sau de 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)     

Page 5: electronica

  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

Page 6: electronica

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 (Bank 0) 

7  6  5  4  3  2  1  0 

SPEN  RX9  SREN  CREN  ADDEN  FERR  OERR  RX9D 

  

7  SPEN  Serial Port Enable 

1 = activeaza portul serial (pinii de RX si TX sint configurati ca pini seriali 0 = dezactiveaza seriala 

6  RX9  9‐bit Receive Enable 

1 = activeaza modul de receptie pe 9 biti 0 = receptie pe 8 biti 

5  SREN  Single Receive ENable  In modul asincron nu conteaza 

4  CREN  Continuous Receive ENable 

1 = activeaza receptia pe seriala 0 = dezactiveaza receptia 

3  ADDEN  Address Detect Enable 

Folosit in modul 9‐bit 

2  FERR  Framing ERRor  1 = a aparut o eroare de framing la receptie (poate fi actualizat, citind RCREG si receptionind urmatorul octet valid) 

1  OERR  Overun ERRor  1 = Overrun error (poate fi sters punind CREN pe zero) 

0  RX9D  Ninth bit of received data 

Cel de‐al noulea bit poate fi de adresa sau de paritate si trebuie calculat in software 

Page 7: electronica

   

Page 8: electronica

Urmatorul program este un exemplu de initializare a portului serial si de transmitere a mai multor caractere pe seriala. Caracterele (literele alfabetului de la ‘a’ la ‘z’ pot fi vizualizate pe PC folosind un terminal)  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 STATUS MOVLW 0x00 MOVWF PCLATH GOTO init ;************ initial ******************* init bsf STATUS,RP0 ; select bank 1 movlw d'10' ; la 20Mhz cu 115200 => 10 movwf SPBRG ; la 4Mhz cu 19200 => 12 movlw b'00100100' ; TXEN+BRGH movwf TXSTA bcf STATUS,RP0 ; select bank 0 movlw b'10010000' movwf RCSTA start movlw "a" ; se porneste de la caracterul "a" movwf car repeta movf car, w call SendLWait ; se trimite caracterul curent incf car ; trecere la urmatorul caracter movlw "{" ; echivalent cu: "z"+1 subwf car, w btfss STATUS,Z ; verifica daca s-a trecut de litera "z" goto repeta infinit goto infinit SendLWait btfss PIR1, TXIF ; verifica daca bufferul este gol goto $-1 ; daca este plin, asteapta. movwf TXREG ; trimite octetul din W return END     

Page 9: electronica

Urmatorul exemplu este pentru receptia unui octet pe seriala. Programul asteapta un caracter, dupa care, cind il receptioneaza, ii afiseaza codul pe LEDuri:    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 STATUS MOVLW 0x00 MOVWF PCLATH GOTO init ;************ initial ******************* init bsf STATUS,RP0 ; select bank 1 movlw d'10' ; la 20Mhz cu 115200 => 10 movwf SPBRG ; la 4Mhz cu 19200 => 12 movlw b'00100100' ; TXEN+BRGH movwf TXSTA clrf TRISD bcf STATUS,RP0 ; select bank 0 movlw b'10010000' movwf RCSTA clrf PORTD repeta call WaitForChar movwf PORTD goto 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