duminică, 28 august 2011

USART

Prezentare generală
USART(Universal synchronous/asynchronous receiver/transmitter) este un standard de comunicare serială între diverse dispozitive cum ar fi comunicarea între calculator(prin portul serial COM) şi alte dispozitive.Acesta se poate folosi pentru comunicare în conjuncţe cu standardele RS-232,RS-422 sau RS-485 însă în aplicaţiile noastre vom folosi doar standardul RS-232 pentru comunicarea cu PC-ul.Comunicarea serială presupune folosirea unei singure legături dacă ea este unidirecţională, adică există un trasmiţător şi un receptor sau invers.Dacă este bidirecţională avem nevoie de două legături , pe o legătură realizându-se transmisia iar pe alta recepţia.Dacă se foloseşte modul sincron pe lâng[ legăturile de transmisie a datelor se mai foloseşte o legătură prin care se stabileşte acelaş semnal de tact între dispozitive.Schema de principiu este următoarea:
Dispozitivul care transmite date se numeşte master iar cel care primeşte se numeşte slave.De obicei masterul stabileşte formatul cuvântului şi frecvenţa ceasului iar datele furnizate se vor obţine la pinul TX.Slave-ul va trebui configurat astfel încât să primească cuvinte care au acelaş format cu cele generate de master şi să funcţioneze la aceeaşi frecvenţă.Pinul prin care un dispozitiv primeşte date este pinul RX.

Viteza de transmisie a datelor se măsoară in BAUD , unitate care reprezintă numărul de biţi transmişi într-o secundă.Această viteză trebuie să fie egală între dispozitivele care comunică serial.La transmisia asincronă pot apărea diverse erori deoarece frecvenţele de tact pot fi puţin diferite chiar dacă ele sunt setate aparent egal.Acest neajuns este înlăturat la transmisia sincronă deoarece semnalul de tact generat de master este transmis slave-ului prin legătura XCK.

Momentan ne vom concentra pe transmisia asincronă deoarece ea este cea mai folosită la comunicarea între dispozitivele periferice şi PC,având doar două legături.

Transmisia asincronă
După cum am văzut mai sus pentru ca această transmisie să fie bidirecţională trebuie să folosim două conexiuni, una prin care trimitem şi una prin care primim datele. Cuvântul care este trimis este format din două părţi , o parte care reprezintă datele iar altă parte care reprezintă codul de verificare:
Orce cuvânt începe cu un bit de start care trebuie să fie 0.Următorii biţi sunt biţii de date care pot avea o lungime între 5 şi 8 biţi iar la sfârşit avem un bit de stop care întodeauna trebuie să fie 1.
Microcontrolerul ATMega8 poate trimite următorul format de cuvânt:
Primul bit St reprezintă bitul de start.Lungimea cuvântului de date poate fi cuprinsă între 5 şi 9 biţi.Pentru o mai bună securitate în transmisie se poate seta la sfârşitul cuvântului de date un bit de paritate care verifică paritatea biţilor de date.Sfârşitul cuvântului poate fi reprezentat de unul sau doi biţi care trebuie să aibă valoarea 1.Transmiţătorul sau receptorul sunt libere doar atunci când s-au transmis biţii de stop şi sunt în stare Idle, stare care este reprezentată de 1 logic pe linile de conexiune.

La configurarea a două dispozitive care vor comunica serial asicron trebuie să avem grijă ca viteza de transfer să fie egală la transmisie şi recepţie şi să avem aceeaşi lungime a cuvântului de date.De asemenea trebuie totuşi să stabilim dacă folosim verificarea parităţii şi dacă folosim unul sau doi biţi de stop.

Principala sursă de eroare poate apărea atunci când configurarea între dispozitive nu este făcută corect, aceasta fiind o problemă de incompatibilitate în comunicare.Alte erori pot fi generate pe linile de transmisie, ele putând fi detectate prin bitul de paritate sau prin biţii de stop.

La transmiterea sau recepţia a mai multor cuvinte consecutive trebuie verificat dacă USART-ul a realizat operaţia completă de trimitere sau citire, altfel poate apărea o altă eroare de transmisie generată de data asta de partea soft.

Schimbul de date se face prin doi regiştrii, unul în care se înscriu datele şi unul de şiftare prin care se transmite cuvântul.În ATMega8 datele se scriu sau se citesc din registrul UDR.De exemplu pentru transmiterea unui caracter char pe 8 biţi trebuie să scriem caracterul în UDR.USART-ul va trece automat conţinutul lui UDR în registrul serial apoi îl va transmite pe linia de legătură celuilalt dispozitiv care va prelua datele tot în registrul serial al cărui conţinut va fi transmis registrului UDR.Registrul serial,dacă dispozitivul este configurat ca transmiţător, va pune pe lângă date şi bitul de start , bitul de paritate şi bitul/biţii de final.Dacă dispozitivul este configurat ca receptor, registrul serial va verifica dacă transmisia este corectă şi dacă da datele cuvântului vor fi copiate în UDR.

Regiştrii folosiţi în ATMega8 pentru comunicarea serială sunt următorii:
-Registrul UDR care are rolul de a stoca datele necesare pentru transmisie sau recepţie:
Dacă se realizează transmisia, datele sunt stocate în TXB iar dacă se realizează recepţia datele se găsesc în RXB.

-Registrul UCSRA:
Bitul 7 –RXC- indică starea registrului de recepţiei.Dacă încă se mai primesc date valoarea lui este 1 iar dacă recepţia a fost efectuată complet valoarea lui este 0.

Bitul 6 –TXC- indică starea registrului de transmisiei.Dacă încă se mai transmit date valoarea lui este 1 iar dacă transmisia a fost efectuată complet valoarea lui este 0.

Bitul 5 – UDRE – indică dacă UDR poate fi citit sau scris.Dacă este 1 UDR poate fi scris, dacă este 0 nu se pot efectua operaţii cu acest registru.
Aceşti 3 biţi pot genera întreruperi care pot fi tratate în rutine speciale .

Bitul 4 – FE – Detectează dacă există erori la transmiterea cuvântului verificând bitul/biţii de final.Dacă acest/aceşti biţi au o valoare diferită de 1 atunci bitul FF ia valoarea 1.Dacă totul este în regulă atunci valoarea lui FE va fi 0.

Bitul 3 –DOR - Detectează dacă există erori de suprascrierea USAR-tului.De exemplu la recepţie poate apărea o astfel de eroare dacă UDR şi registrul serial este plin şi alt caracter este pe cale de a fi primit.FE este 1 dacă s-a semnalat o astfel de eroare şi 0 dacă nu avem o eroare de acest fel.

Bitul 2 – PE – are rolul de a detecta eroarea de paritate.Dacă s-a detectat o astfel de eroare ia valoarea 1 iar dacă nu valoarea lui va fi 0.

Bitul 1 – U2X – Acest bit este 1 dacă dorim să dublăm viteza de transmisie în modul asicron şi 0 dacă se foloseşte viteza normală.Acest bit trebuie să aibă întotdeauna valoarea 0 dacă este folosit modul sincron.

Bitul 0 – U2X- Se setează 1 dacă se foloseşte comunicarea multiprocesor şi 0 dacă se foloseşte comunicarea uniprocesor.In exemplele ce vor urma îl vom seta ca 0.

-Registrul UCSRB:
-Bitul 7-RXCIE – 1 setează generarea unei întreruperi la terminarea recepţiei,0 întreruperea nu este flosită.

-Bitul 6-RXCIE – 1 setează generarea unei întreruperi la terminarea transmisiei,0 întreruperea nu este flosită.

-Bitul 5-RXCIE – 1 setează generarea unei întreruperi atunci când registrul UDRIE poate fi folosit,0 întreruperea nu este folosită.

-Bitul 4- RXEN – 1 setează USART-ul ca receptor.

-Bitul 3- TXEN – 1 setează USART-ul ca Transmiţător.

-Bitul 2- UCSZ2 – se foloseşte împreună cu o parte din biţii registrului UCSRC după cum vom vedea mai jos.

-Bitul 1 – RXB8 – este al 9-lea bit din schimbul de date pe 9 biţi şi se foloseşte la recepţie.

-Bitul 0 – TXB8 – este al 9-lea bit din schimbul de date pe 9 biţi şi se foloseşte la transmisie.

-Registrul UCSRC:
-Bitul 7 –URSEL- se foloseşte pentru selecţia regiştrilor astfel:1 dacă se lucrează cu registrul UCSRC şi 0 dacă se lucrează cu registrul UBBRH.

-Bitul 6 –UMSEL-Prin acest bit se setează modul de funcţionare al USART-ului:1 dacă funcţionează în modul sincron şi 0 dacă funcţionează în modul sincron.

-Bitul 5 şi 4 –UPM1 şi UPM0 – Se folosesc pentru selecţia parităţii:
UPM1 UPM0
00 - Nu se foloseşte bitul de paritate.
01 - Combinaţie rezervată.
10 - Se foloseşte bitul de paritete ca bit par.
11 - Se foloseşte bitul de paritete ca bit impar.

-Bitul 3 –USBS- se foloseşte pentru a seta numărul biţilor care reprezintă sfârşitul cuvântului: 1- se setează doi biţi de stop,0-se setează un singur bit de stop.

-Biţii 2 şi 1– UCSZ1 şi UCSZ0- se folosesc împreună cu UCSZ2 din UCSRB pentru a seta lungimea cunvântului de date:
UCSZ2 UCSZ1 UCSZ0 Lungimea Cuvântului
000 – 5 biţi;
001 – 6 biţi;
010 – 7 biţi;
011 – 8 biţi;
100 – Combinaţie rezervată;
101 – Combinaţie rezervată;
110 – Combinaţie rezervată;
111 – 9 biţi;

-Bitul 0 – UCPOL-Se foloseşte pentru modul sincron şi setează ce front al semnalului de pe linia XCK va fi folosit în transmisie.În modul asincron acesta se setează 0.Valorile pe care le poate lua sunt următoarele:0 – se foloseşte frontul crescător, 1 se foloseşte frontul descrescător.

-Registrul UBRR – Acest registru se foloseşte pentru a seta viteza de transmisie a datelor.

-Bitul 15 – URSEL – trebuie să fie 0 atunci când se efectuează operaţii cu acest registru.
-Biţii 12,13,12 sunt nişte biţi rezervaţi nefolosiţi în acest microcontroler.
-Biţii 11:0 sunt folosiţi pentru a seta viteza de transmisie a datelor.Totuşi setarea se face doar cu biţii cei mai semnificativi, 11:8.Viteza de transmisie a datelor se calculează după formula:
Unde BAUD reprezintă viteza de transmisie măsurată în Baud,f_int reprezită frecvenţa internă a procesorului iar UBBR este valoarea setată în registru.
Eroarea la transmisie se calculează după formula:
În tabelul de mai jos putem urmări ce influenţă are frecvenţa asupra erorii la transmisie:
Următorul exemplu are ca scop schimbul de date între microcontrolerul ATMega8 şi PC.Citirea şi trimiterea de date de la PC la microcontroler o puteţi face cu un program ca HiperTerminal.Datele pe care le va primi microcontrolerul le vom afişa pe un LCD.Transmisia de date se va face asincron ,lungimea cuvântului de date va fi de 8 biţi , vom folosi un singur bit de stop iar viteza de transmisie va fi de 4800 baud.
Programul îl puteţi downloada de la secţiunea Download -USART -Aplicaţie 1.

Înainte de a începe transmisia toate aceste setări vor fi făcute în regiştrii USART-ului după cum urmează:

UCSRA=0x00;
UCSRB=0x98;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x0C;

Schema electrică a aplicaţiei este următoarea:
Pentru a simula PC-ul am folosit o unealtă oferită de Proteus numită Virtual Terminal.Aceasta împreună cu oşciloscopul se găsesc în partea dreaptă a ferestrei la butonul Virtual Instruments Mode.
La secţiunea de generare a codului trebuie să setaţi LCD-ul pe portul D, pinul 0 al portului D ca pin de intrare, pinul 1 al portului D ca ieşire şi USART-ul după cum urmează:
Pentru recepţie am folosit întreruperea deoarece dorim să afişăm caracterul pe LCD imediat ce el a fost primit.
În partea de ciclare infinită a programului vom trimite date PC-ului:

while(1)
{
//trimitem toate caracterele ASCII catre computer
caracter ++;
printf("%c",13);
printf("%c",caracter);
delay_ms(150);
};

Observăm că trimiterea de date se face foarte simplu cu ajutorul funcţiei printf().Afişarea caracterelor pe LCD se face în rutina de tratare a întreruperii generate de recepţia datelor după cum urmează:

nr_caractere++;
lcd_putchar(data);
if(nr_caractere > 15)
{
lcd_clear();
nr_caractere = 0;
}

Afişarea se face pe o singură linie.Dacă s-a ajuns să se scrie 16 caractere pe LCD , adică să se completeze prima linie, LCD-ul este curăţat.Dacă simularea funcţionează cum trebuie ar trebui să vă afişeze cam aşa:
Pentru a trimite date microcontrolerului trebuie să daţi click pe Virtual Terminal şi să tastaţi caractere.
Fizic , pentru a se putea realiza conexiunea este nevoie de un integrat MAX232 care face legătura între microcontroler şi cablu serial astfel:
Momentan cam atât despre USART.

0 comentarii:

Trimiteți un comentariu

Twitter Delicious Facebook Digg Stumbleupon Favorites More