Mikrokontroléry rady AVR – USART

Universal Synch/Asynch receiver transmitter – radič, ktorý je schopný obojsmernej komunikácie umožňujúci synchrónny alebo asynchrónny prenos s možnosťou nastavenia počtu prenášaných dátových bitov (5-9), nastavenie stop-bitov a parity a takisto je schopný multiprocesorovej komunikácie.

Umožňuje najpohodlnejší spôsob komunikácie Mcu s osobným počítačom (po sériovej linke – RS232).

Základný popis jednotky USART-u v MCU AVR:
-> full-duplex prenos;
-> asynchrónny alebo synchrónny prenos;
-> generátor prenosovej rýchlosti baudrate;
-> 5-9 dátových bitov, 1 alebo 2 stop bity;
-> odd, even parita a kontrola parity;
-> detekcia pretečenia dát a framing error-u;
-> tri nezávislé prerušenia od konca vysielania, vyprázdnenia vysielacieho buffer-a, ukončenia príjmu bajt-u;
-> multiprocesorová komunikácia;
-> nastavenie dvojnásobnej prenosovej rýchlosti – double speed asynch comm mode;

Jednotka USART je zložená z troch základných blokov a to z:
-> vysielača – obsahuje buffer pre vysielanie bajtu;
-> prijímača – obsahuje buffer pre príjem bajtu;
-> generátora hodín – pre generovanie synchronizačných signálov;

obr1

Obr.1 Bloková schéma USART

Režimy jednotky USART:
-> synchrónny režim master;
-> synchrónny režim ako slave;
-> asynchrónny režim;
-> asynchrónny režim s dvojnásobnou rýchlosťou;

Na komunikáciu s PC po sériovej linke využívame asynchrónny režim (poprípade s dvojnásobnou rýchlosťou – zápisom bitu U2X do registra UCSRA). Výber medzi sych a asynch režimom sa robí bitom UMSEL (log1 -> sych). Pri sychrónnom režime sa hodinový signál môže privádzať pinom XCK.

Formát frame-u

Vysielaný rámec sa skladá zo:
-> štart bitu
-> dátových bitov (kde prvý vysielaný bit je LSB – last significant bit – čiže bit0)
-> parity (ak je nastavená)
-> stop bitu

obr2

Obr.2 Diagram frame-u

Ak je nastavená parita tak jej chyba je hlásená bitom PE v registri UCSRA a takisto je v tomto registri hlásená chyba rámca bitom FE (frame error). Strata dát bitom DOR.

Inicializácia UART

Pre komunikáciu po sériovej linke (UART) je potrebné túto jednotku správne nastaviť. Nastavenie sa robí tzv. inicializáciou kedy sa nastavuje požadovaná rýchlosť (ktorú musí rešpektovať aj zariadenie na druhom konci), počet dátových bitov, stop bity, parita a niekedy aj hardware-ová kontrola (už sa často nevyžíva). Potom je dáta možné odoslať po bajtoch – zápisom príslušného bajtu do vysielacieho buffer-a – register UDR.

Najpoužívanejšie je nastavenie 8N1 bez hardware-ovej kontroly. Čiže 8 dátových bitov, bez parity a jeden stop-bit. Rýchlosť podľa chuti.

Prenosová rýchlosť sa nastavuje zápisom hodnoty do 16bit registra UBRR. Táto hodnota sa vypočíta vzorcom (pre asynch prenos, bez násobenia rýchlosti):

UBRR = f_osc/(16*baud)-1

kde f_osc je frekvencia hodín, a baud je požadovaná rýchlosť komunikácie.

Ďalšie vzorce ukazuje obrázok.

obr3

Obr.3 Vzorce pre výpočet UBRR pre baudrate

Ďalej sa pri inicializácii zapne vysielač a prijímač zápisom bitov RXEN a TXEN do registra UCSRB. Nastavenie dátových bitov sa vykoná bitmi UCSZx , stopbity USBS bitom a parita bitmi UPMx. Ďalej sa môže nastaviť prerušenie bitmi RXCIE, TXCIE a UDRIE v registri UCSRB.

Registre – ich prehľad a popis bitov

Jednotka USART obsahuje tieto v/v registre:

-> dátové:
UBRR – 16 bitový – UBRRH, UBRRL – nastavenie prenosovej rýchlosti (pre baud rate generator)
UDR – 8 bitový – pre prístup do buffer-ov; tento register sú v skutočnosti fyzicky oddelené registre zdieľajúce rovnaké I/O adresy; pri zápise do UDR sa zapisuje do vysielacieho registra a pri čítaní sa číta z registra prijímača;

-> konfiguračné:
UCSRA – 8 bitový
UCSRB – 8 bitový
UCSRC – 8 bitový

obr4

Obr.4 Register UCSRA

RXC – flag bit – nastavený ak sa v UDR nachádzajú neprečítané (došlé) dáta
TXC – flag bit – nastaví sa po vyprázdnený UDR vysielacieho registra
UDRE – flag bit – nastaví sa ak buffer (UDR) je pripravený pre príjem nových dát (bajtu)
FE – frame error – flag bit
DOR – data overrun – flag bit – pretečenie UDR
UPE – parity error – flag bit
U2X – násobenie prenosovej rýchlosti dvomi – double baud rate
MPCM – zapína multiprocesorový komunikačný režim

obr5

Obr.5 Register UCSRB

RXCIE – RX Complete Interrupt Enable – generuje prerušenie od RXC flag bit-u
TXCIE – TX Complete Interrupt Enable – generuje prerušenie od TXC flag bit-u
UDRIE – generuje prerušenie od UDRE flag bit-u
RXEN – zapína prijímač
TXEN – zapína vysielač
UCSZ2 – počet dátových bitov
RXB8 – prijíma 9-tý bit
TXB8 – prijíma 9-tý bit

obr7

Obr.6 Register UCSRC

UMSEL – log0 ->asynchrónny režim; log1 -> synchrónny režim
UPM1:0 – nastavenie parity
USBS – nastavenie stop bitov; log0 -> 1 stop bit; log1 -> pre 2 stop bity
UCSZ1:0 – počet dátových bitov
UCPOL – clock polarity – pozri datasheet str. 135

obr6

Obr.7 Nastavenie dátových bitov UCSZx

obr8

Obr.8 Nastavenie parity UPMx

Upozornenie !
Registre UCSRC a UBRRH majú spoločný adresný priestor a preto pri zápise do registra UCSRC sa musí zároveň zapisovať aj bit URSEL !!!

Zapojenie MCU s prevodníkom

Popis prepojenia MCU s PC prevodníkom som popísal v článku „Prevodníky pre komunikáciu MCU s PC cez sériovú linku“ a preto to znova dávať nebudem. Taká zjednodušená názorná bloková schéma prepojenia.

obr9

Obr.9 Prevodník úrovne TTL->RS232

obr10

Obr.10 Prevodník s FT232RL – prepojenie cez USB – virtual COM port

Mini knižnica pre UART-AVR a popis jej funkcií

Táto knižnica opäť (ako každá mnou upravovaná) obsahuje jednoduché funkcie na prácu s UARTom. Pre profesionálne knižnice si musíte zagoogliť. Na nete je ich kopec.

Takže. Na začiatku je potrebné direktívou (v súbore uart.h) vybrať či sa jedna o MCU rady TINY alebo MEGA (ja som rozdiel postrehol iba v inicializácii). Takisto obsahuje direktívu na povolenie prerušení od UART-u. V súbore uart.c sa hneď nachádzajú ISR funkcie pre príslušné prerušenia takže si ich stačí odtiaľto presunúť do hlavného zdrojového súboru.

Funkcia void uart_init(unsigned int baud); inicializuje jednotku UART na 8N1 bez HW kontroly a na rýchlosť, ktorá sa zadáva ako parameter funkcie.

Funkcia void uart_putc(unsigned char c); odošle jeden bajt (znak) po sériovej linke a funkcia void uart_puts(unsigned char *s); vyšle reťazec bajtov (znakov).

Príjem znaku sa môže (okrem spôsobu prerušenia) uskutočniť funkciou unsigned char uart_getc(void); , ktorej návratová hodnota je prijatý bajt (znak). Efektívnejšie je použiť prerušenie.

No a nakoniec je tu funkcia void uart_flush(void); pre vyčistenie buffer-a.

Príklad

Vytvoril som taký jednoduchý príklad kde sa UART-om príjme reťazec zakončený znakom LF (alebo ‘\n’) a ten sa vypíše na displej a spätne pošle do PC. Prijem reťazca sa vykonáva naplnením buffer-a prichádzajúcimi znakmi (bajtmi). Príjem znaku sa vykonáva cez prerušenie. Ak je posledný znak LF platí podmienka vo while(1) cykle a reťazec sa vypíše. Predtým sa ešte na koniec reťazca pridá ukončovacia nula ‘\0′, ktorá v C-čku značí koniec reťazca.

Parametre sériovej linky 9600 8N1. Externý Xtal je 7.3728 MHz. Je možné použiť aj iný – potom ho treba nastaviť aj v projekte AVR Studia. Ja som použil naschvál tento lebo sa často využíva v aplikáciách kde je potrebné zabezpečiť vysokú presnosť prenosu po sériovej linke. V datasheete na str.166 si môžete pozrieť presnosť prenosu s týmto xtal-om pri rôznych rýchlostiach.

#include <avr/io.h>
#include <avr/interrupt.h>
#include "lcd.h"
#include "uart.h"

volatile char buff[30];		// buffer
volatile unsigned char i = 0;	// pocitadlo

int main()
{
	lcd_init();		// inicializacia displeja
	uart_init(9600);	// inicializacia uart - prenosova rychlost 9600 8N1

	sei();	// povolenie preruseni

	while(1)
	{
		if (buff[i-1] == '\n')
		{
			buff[i] = '\0';		// ukoncenie retazca

			lcd_clear();		// zmaz displej
			lcd_home();		// na zaciatok

			lcd_puts(buff);		// vypis string na displej
			uart_puts(buff);	// string posle spat cez uart do PC

			i = 0;			// vynulovanie pocitadla
		}
	}

	return 0;
}

ISR(USART_RXC_vect)
{
	buff[i] = UDR;	// ulozenie znaku do buffer-a
	i++;		// inkrementuj pocitadlo
}

Ako softvér na komunikáciu môžete využiť aj program, ktorý som vytvoril ja a je zverejnený na tomto webe. Pred odoslaním je potrebné zaškrtnúť checkbox LF, ktorý automaticky za každým reťazcom odošle znak LF.

obr11

Obr.11 SerialCom – nastavenie

Záver

O multiprocesorovej komunikácii sa môžete dočítať v datasheete na str. 157 a príklady nastavenia baud rate teda registra UBRR na str. 165.

Príklady

11_uart_displej

usart

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *

Môžete použiť tieto HTML značky a atribúty: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>