luni, 15 noiembrie 2010

USART

Lucrarea de laborator Nr.7


Tema: Interfaţa serială USART

Scopul lucrării: Stabilirea comunicării prin interfaţa USART între două microcontrollere.

Expunerea problemei: Să  se proiecteze un sistem de comunicare între două controllere în aşa mod ca configuraţia unui port de la intrare să fie motorizată la un alt port de la celalalt controller şi invers. Să se elaboreze un program care va asigura comportamentul simetric al MC.


Consideraţii teoretice:

Toate microcontrollerele familiei AtMega au în componenţa lor modulul universal asincron (UART) sau modulul sincron/asincron (USART) de primire/tansmitere. Mai mult ca atât, în unele modele sunt câte 2 module. Realizarea modulelor în diferite modele poate fi observată din tab.1.
tab.1
Momentul de observat este că modulul USART în timpul lucrului, în regim asincron este compatibil cu modulele UART cât după locaţia biţilor a regiştrilor de comandă, atâşi după funcţionare.
Mici diferenţe există doar la funcţionarea schemei de buferizare a blocului de recepţie a modulului şîn denumirea (nu în destinaţia) unor biţi din regiştrii de comandă.
Toate modulele transmiţătoarelor/receptoarelor permit schimbul full-duplex prin canalul de serie, viteza de transmitere a datelor poate varia în limite destul de largi.
În modelele UART transmiterea poate fi de 8 sau 9 biţi, iar în modulele USART lungimea datelor poate varia de la 5 la 9 biţi. Încă o deosebire  a modulelor USART este prezenţa schemelor de formare şi control a parităţii.
Modulele USART/UART, realizate in microcontrollerele familiei Atmega, pot determina următoarele erori:
  • Depăşirea;
  • Eroare la cadrare;
  • Bit de start greşit;
Pentru a micşora probabilitatea apariţiei a astfel de erori în module este implementată o funcţie utilă de filtrare a zgomotelor.
Pentru a interacţiona cu programa în module sunt prevăzute 3 întreruperi, cerere de generare a căror se formează la urmatoarele evenimente: ”transmiterea e terminată”, ”registrul de date e gol” şi ”recepţie terminată”.
Ca de obicei, pinii microcontrollerului, ce sunt folosiţi de modulele USART/UART, sunt liniile porturilor de intrare/ieşire de uz general. Toţi pinii microcontrollerelor, ce sunt utilizaţi de module, sunt arătaţîtab.2.

Tab.2. Pinii utilizaţi de modulele UART/USART

tab.2

Fig.1 Schema bloc a modulului USART

fig.1
USART trebuie iniţializată înainte de pornirea oricărei alte comunicaţii.
Procesul normal de iniţializare constă în : stabilirea ratei baud, cadrului şi activarea Transmiţătorului şi Receptorului în funcţie de opţiuni. Pe durata iniţializării, steagul de intrerupere trebuie dezactivat.
Pentru o reiniţializare, orice transmisie trebuie să fie încheiată înaintea modificării registrelor. Steagul TXC verifică dacă toate transmisiile au fost încheiate, iar steagul RXC verifică dacă sunt date necitite în buffer-ul receptorului. Steagul TXC trebuie dezactivat înaintea oricărei transmisii.
Transmiţătorul USART este activat de bitul Transmit Enable (TXEN) în registrul UCSRB. Când transmiţătorul este activat, portul pinului TxD este suprascris de USART, transmisia realizându-se către ieşirea serial.
Transmisia datelor:
Un pachet (frame) este compus din:
  • St: 1 bit de start, cu valoare ‘0’;
  • D: Biţi de date (5…9, valoare stabilită la ambii participanţi la transmisie);
  • P: 1 bit de paritate. Paritatea poate fi:
    • Absenţa: bitul P nu există
    • Pară (Even)
    • Impară (Odd)
  • Sp: 1 sau 2 biţi de stop, cu valoare ‘1’ – numărul biţilor trebuie stabilit la ambii participanţi la transmisie.
Start bit este bitul de sincronizare şi serveşte ca semnal de iniţiere a transmisiei. Receptorul se sincronizează cu ajutorul acestui bit pentru a prelua fără erori de date. Receptorul şi emiţătorul trebuie să fie configurţi la aceeaşi viteză de recepţie. Viteza de transmitere boud se măsoară în Boud/s. Boud – e un bit transmis (un bit de info transmis). Numărul de stop bit de fapt reprezintă indicatorul de sfîrşit a freimului şi totodată reprezintă o bază dintre 2 freimi.
Prezentarea modulului USART:
Modulul USART implementează o unitate de emisie şi o unitate de recepţie care funcţioniază conform standartului RS232. Principalele caracteristici:
  • Poate opera full duplex(unităţile de emisie şi recepţie sunt independente);
  • Lucrează în mod sincron sau asincron;
  • Cadrele de date pot avea între 5 şi 9 biţi;
  • Calculiază şi verifică parietatea independent, fără intervenţie software;
  • Poate lucra pe baza de intrerupere;
Pentru a comanda şi a utiliza modulul USART, programatorul are la dispoziţie un număr de registrii care pot fi grupaţîn următoarele categorii:
  • Registrul de date pentru emisie/recepţie UDR;
  • Registrul de 12 biţi UBRR pentru calculul vitezei de comunicaţie. UBRR este implementat sub forma a doi regiştrii de 8 biţi UBRRH şi UBRRL care se iniţializează separate;
  • Regiştrii generali de configurare: UCSRA, UCSRB, UCSRC;
Modurile de operare:
Există 4 moduri distincte de operare a modulului USART: asincron, normal, asincron cu viteză dublă, sincron master şi sincron slave.
Modulul asincron normal este cel mai utilizat. In acest mod dispozitivul emiţător şi cel care recepţionează au fiecare un ceas intern iar sincronizarea se face prin intermediul protocolului de comunicare. Modulul asincron cu viteză dublă operează la fel ca cel normal dar viteza de comunicaţie a microcontrollerlui poate fi de două ori mai mare.
În mod sincron se utilizeză un singur ceas pentru emiţător şi receptor. În acest caz microcontrollerul poate fi master (el generează ceasul pentru comunicaţie)sau salve (primeşte semnalul de ceas de la dispozitivul cu care comunică).
Recepţia şi transmiterea datelor:
Modulul USART din Atmega16 foloseşte un singur registru de date pentru emisie/recepţie şi anume UDR. Diferenţierea între cele două situaţii se fac astfel: octeţii care se scriu în registru UDR sunt automat trimişi la unitatea de emisie, atunci cînd programul solicită citirea registrului UDR, datele din unitatea de recepţie sunt incărcate automat în registru şi astfel se poate avea acces la datele recepţionate.
Modulul USART poate genera intreruperi pentru următoarele evenimente:
  • Recepţia corectă a unui cadru de date;
  • Golirea registrului de date de emisie;
  • Terminarea completă a emisiei unui cadru de date;
Configurarea modulului USART:
Regiştrii utilizaţi pentru configurare sunt UCSRA,UCSRB şi UCSRC. Descrierea generală a biţilor registrului UCSRA este dată în tabelul de mai jos:

Tabelul 3

Tab.3
Descrierea generală a biţilor registrului UCSRB este dată în tabelul de mai jos:

Tabelul 4

Tab.4
Descrierea generală a biţilor registrului UCSRC este dată în tabelul de mai jos:

Tabelul 5

Tab.5
Mersul lucrării:
1) Programul este extrem de simplu, algoritmul va fi următorul: iniţializarea USART-ului şi a două subrutine de prelucrare a evenimentelor ”recepţie finisată” şi respectiv ”transmisie finisată”.
În prima se citeşte registrul de date UBR şi se arată la un port de ieşire, în a doua subrutină se citeşte un alt port de intrare şi datele se copie în registru de date UBR, care le trimite la al doilea microcontroller.
Schema bloc:
2)  În baza schemei create, construim schema electrică cu ajutorul programului PROTEUS, care la rîndul ei va acţiona în baza programului.
 Fig. 2  Schema electrică:
3)   În baza schemei bloc create prezentăm  Listingul programului:
         ...
4)  Compilarea programului  şi verificarea funcţionării sale (executarii) pas cu pas cu scopul de a găsi şi elimina erorile.
5)  Ultimul pas este simularea circuitului creat în PROTEUS, corecţia acestuia în caz de necesitate, în urma careia ne putem convinge ca programul funţionează corect şi ca microcontrollerul execută toate comenzile cu exactitate, obţinînd rezultatul dorit: conectarea a doua microprocesoare prin intermediul modulul USART, în care am iniţializat regiştrii şi modulele necesare pentru  pornirea acestei interfeţe. Citind starea pinului de intrare a unui controller, datele se trimit la ieşirea altuia. Comunicarea bilaterală între microprocesoare se confirmă prin afişarea rezultatul cu ajutorul aprinderii ledului corespunzător.
Descrierea comenzilor utilizate:
  • Ldi - copiază valoarea “k” în registrul Rd (instructiune de transfer);
  • Rjmp - reprezintă salt necondiţionat cu “k” poziţii faţă de adresa curentă din memoria de program sau salt la o etichetă concretă (operator condiţional);
  • In - copiază conţinutul registrului de I/O P  în registrul Rd (instrucţiune de transfer);
  • Out - copiază conţinutul registrului Rr în registrul de I/O P(instrucţiune de transfer);
  • Ldi încarcare indirect a constantei în registruul Rd(comanda de transfer);
  • Sei - setarea flagului intreruperii globale(comanda de testare a biţilor);
  • Reti - returnare din intrerupere;
  • Sbr - setarea bitului într-un registru;