Uživatel:Langsmar

Z MAM wiki

Přejít na: navigace, hledání

Obsah

Komunikácia AVR s PC

V tejto práci by som rád opísal komunikáciu mikrokontroléra AVR s PC pomocou asynchronného sérioveho kanála (v angličtine označenie UART - Universal Asynchronous Receiver Transmiter). Väčšina mikrokontrolérov AVR má perifériu sérioveho kanálu implementovanú. V katalógovom liste sa popis sérioveho kanálu vyskytuje pod označením USART. Táto verzia umožňuje okrem klasického asynchronného režimu aj režim synchrónny.

Príklady k tejto práci boli otestované na mikrokontroléri ATmega16, preto aj popis registrov bude tomu prispôsobený. Na iných verziách AVR-iek by to malo byť obdobné, poprípade s malými úpravami (Ak napríklad nejaký iný mikrokontrolér obsahuje viac sériových kanálov, treba určiť ktorý použijeme, problémy môžu byť aj s adresami prerušení).

Sériový kanál v mikrokontroléroch AVR

Mikrokontrolér ATmega16 obsahuje jeden plne duplexný sériový kanál, ktorý dokáže pracovať v synchrónnom i asynchrónnom režime. Širšie využívaný je asynchrónny režim, ktorému sa budem ďalej venovať.

Registre

Sériový kanál sa z programu ovláda pomocou registrov UCSRA, UCSRB, UCSRC, UBRRL,UBRRH, UDR. Je uvedený len stručný popis, plný popis je uvedený v datasheete.

  • UCSRA (USART Control and Status Register A)
    • Bit 7 - RXC (Receive Complete) - bit je nastavený do 1, ak sú ešte neprečítané dáta v príjimacom bufferi. Tento bit môže byť zdrojom prerušenia pri príjme dát
    • Bit 6 - TXC (Transmit Complete) - bit je nastavený do 1, ak sa odoslali všetky dáta z vysielacieho buffera. Môže byť zdrojom prerušenia pri odoslaní dát
    • Bit 5 - UDRE (USAR Data Register Empty) - ak je 1, príjimací buffer je prázdny, možno príjimať ďalšie dáta
    • Bit 4 - FE (Frame Error) - ak je 1, vyskytla sa chyba v priatom rámci
    • Bit 3 - DOR (Data OverRun) - ak je príjimací buffer plný a detekuje sa ďalší štartbit, nastaví sa do 1
    • Bit 2 - PE (Parity Error) - ak sa vyskytla chyba parity, nastaví sa do 1
    • Bit 1 - U2X - bit sa používa pri výpočte prenosovej rýchlosti v asynchronnom režime
    • Bit 0 - MPCM (Multi-Processor Communication Mode) - zapísaním hodnoty 1 možno aktivovať viacprocesorovú komunikáciu.
Soubor:UCSRA.PNG


  • UCSRB (USART Control and Status Register B)
    • Bit 7 - RXCIE (RX Complete Interrupt Enable) - zapísaním hodnoty 1 sa aktivuje prerušenie pri príjme
    • Bit 6 - TXCIE (TX Complete Interrupt Enable) - zapísaním hodnoty 1 sa aktivuje prerušenie pri vysielaní
    • Bit 5 - UDRIE (USAR Data Register Empty Interrupt Enable) - zapísaním hodnoty 1 sa aktivuje prerušenie ak dátový register prázdny
    • Bit 4 - RXEN (Receiver Enable) - zapísaním hodnoty 1, sa aktivuje činnosť príjimača USART
    • Bit 3 - TXEN (Transmit Enable) - zapísaním hodnoty 1, sa aktivuje činnosť vysielača USART
    • Bit 2 - UCSZ2 (Character Size) - v kombinácií s UCSZ0 a UCSZ1 nastavuje počet dátových bitov v rámci
    • Bit 1 - RXB8 (Receive Data Bit 8) - bit číslo 8 (resp. 9. bit ak sa cisluje od 1), pri prijme 9 dátových bitov v rámci
    • Bit 0 - TXB8 (Transmit Data Bit 8) - bit číslo 8 pri vysielaní 9 dátových bitov v rámci
Soubor:UCSRB.PNG


  • UCSRC (USART Control and Status Register C)
    • Bit 7 - URSEL (Register Select) - bit vyberá medzi prístupom do UCSRC alebo do UBRRH. Tieto registre majú rovnakú adresu
    • Bit 6 - UMSEL (Mode Select) - nastavenie synchrónneho alebo asynchrónneho režimu
    • Bit 5 - UPM1 (Parity mode 1) - spolu s UPM0 sa nastavuje parita
    • Bit 4 - UPM0 (Parity mode 0)
    • Bit 3 - USBS (Stop Bit Select) - nastavenie formátu stopbitu
    • Bit 2 - UCSZ1 (Character size) - v kominácií s UCSZ0 a UCSZ2 nastavuje počet dátových bitov v rámci. Viď tabuľka 1
    • Bit 1 - UCSZ0 (Character size)
    • Bit 0 - UCPOL (Clock Polarity) - Nastavenie polarity hodinového signálu. Má význam len v synchrónnom režime
Soubor:UCSRC.PNG

Nastavenie počtu dátových bitov v rámci (tabuľka 1):

Soubor:data_bits.PNG


  • UBRRL, UBBRH (USART Baud Rate Register Low/High)
Soubor:UBRR.PNG

Spoločne sa tento register nazýva UBRR. Horný bajt je UBRRH, dolný bajt je UBRRL. Register UBBRH je 4 bitový, a prekrýva sa s UCSRC. Dohromady môže dvojica UBBRL, UBBRH uchovať 12 bitové číslo. Toto číslo určuje prenosovú rýchlosť. Výpočet prenosovej rýchlosti je uvedený nižšie.


  • UDR (USART I/O Data Register)
Soubor:UDR.PNG

Tento 8 bitový register v skutočnosti tvoria dva registre, ktoré majú spoločnú adresu. Jeden je príjimací, druhý vysielaci. Pre čítanie a zápis tak programátor pristupuje len k 1 registru. Čo treba odoslať sériovým kanálom sa zapíše do tohto registra. Naopak, všetko čo sa príjme je uložené v tomto registri.


Nastavenie prenosovej rýchlosti

Rýchlosť prenosu sa určuje hodnotou, ktorá sa zapíše do registrov UBRRL, UBRRH. Táto hodnota je závislá od použitej taktovacej frekvencie. Vypočítať ju možno podľa nasledujúcich vzťahov. V uvedených príkladoch nižšie budem využívať prenosovú rýchlosť 9600 Bd pri taktovacej frekvencií 1 MHz. Hodnota UBRR pri U2X = 1 bude 12 (UBRRH = 0, UBBRL = 12).

Soubor:baud_rate.PNG

Pre bežne používané prenosové rýchlosti a taktovacie frekvencie sú v datasheete tabuľky, kde možno príslušnú hodnotu UBRR ľahko vyčítať. Podľa tabuľky je hodnota UBRR pre 9600 Bd a takte 1 MHz taktiež 12. Treba ale nastaviť bit U2X v registri UCSRA. Pri tejto konfigurácií je chyba pri generovaní prenosovej rýchlost 0,2%. Ak by bolo U2X = 0, tak hodnota UBRR by bola 6, ale s chybou -7% od požadovanej prenosovej rýchlosti.

Soubor:baud_rate_table.PNG


Inicializácia sériového kanála

Assembler

init_UART:
    ldi R16,0b00000010       ; U2X = 1
    out UCSRA,R16
    ldi R16,0b00011000       ; vypnutie generovania prerusenia, zapnutie prijimaca a vysielaca
    out UCSRB,R16
    ldi R16,0b10000110       ; asynchronny rezim, ziadna parita, 1 stop bit, 8 datovych bitov v ramci
    out UCSRC,R16
    ldi R16,0
    out UBRRH,R16            ; nastavenie prenosovej rychlosti UBRR = 12 -> 9600 Bd pri 1 MHz taktovani
    ldi R16,12
    out UBRRL,R16
    ret

C

void init_UART()
{
    UCSRA = _BV(U2X);  
    UCSRB = _BV(RXEN) | _BV(TXEN);
    UCSRC = _BV(URSEL) | _BV(UCSZ1) | _BV(UCSZ0);
    UBRRH = 0;
    UBRRL = 12;
}

Prepojenie AVR s PC

Cez RS-232

Soubor:kom_rs232.png

Cez externý prevodnik RS-232/USB

Soubor:kom_cez_prevodnik.png

Cez USB prevodnik FT232XX

Soubor:kom_usb.png

Obsluha na PC

Priklady

Záver

Osobní nástroje