Minule jsme začali s komunikací po sériové lince. Pokud jste si již pořídili převodník, dnes se dozvíte, jak ho můžete spolu s procesorem ATMEGA16 využít.
Procesor ATMEGA16 obsahuje obvod s „tajemným názvem“ USART, neboli Universal Synchronous and Asynchronous serial Receiver and Transmitter. Jde o obvod schopný obousměrné komunikace, a to jak synchronní, tak i asynchronní, s vysokou možnou přenosovou rychlostí, podporující 5-9 datových bitů, 1-2 stopibity, výběr mezi paritami, obsahuje hardware pro jejich kontrolu, množství přerušení na odchozí byte a možnost multiprocesorové komunikace.
My budeme toto rozhraní čile využívat, a to nejen ke komunikaci s jinými jednočipy, ale především pro komunikaci s PC. Budeme tak schopni vytvořit elektroniku, která bude uživatelem velmi lehce nastavitelná z PC. Pomůže nám k tomu i převodník, který jsme si postavili v minulém díle. Další možností je USB převodník s obvodem FT232R, který si uvedeme v příštím díle.
USART
Jednotku můžeme rozdělit na tři části:
- Generátor hodinových pulzů
- Vysílač
- Přijímač
Generátor hodinových půlzů slouží k synchronizaci vysílací i přijímací části. Používá se pro synchronní sériový režim.
Vysílač. Je-li jednotka USART korektně nastavena, provede se odeslání byte pouhým zapsáním do registru UDR
. Po úspěšném odvysílání je nastaven příznak TXC
v registru UCSRA
.
Přijímač. Je-li jednotka USART korektně nastavena, je po příjmu znaku nastaven příznak RXC
v registru UCSRA
. Poté je možno přečíst přijatý znak opět z registru UDR
. Důležité je, že znak může být čten pouze jednou.
Nastavení sériového kanálu
Pro nastavené sériového přenosu slouží u procesoru ATMEGA16 celkem 4 registry
- UCSRA
- UCSRB
- UCSRC
- UBRR
UCSRA
RXC | TXC | UDRE | FE | DOR | PE | U2X | MPCM |
RXC – příznak přijatého byte
TXC – příznak odvysílaného byte
UDRE – příznak vyprázdněného bufferu
FE – chyba rámce
DOR – nastaví se v případě přeplněného datového bufferu
PE – chyba parity
U2X – zdvojnásobí přenosovou rychlost, zmenší však přesnost
MPCM – nastaví do multiprocesorového komunikačního módu
UCSRB
RXCIE | TXCIE | UDRIE | RXEN | TXEN | UCSZ2 | RXB8 | TXB8 |
RXCIE – zápis tohoto bitu povolí přerušení od příjmového kanálu sérové linky
TXCIE – zápis tohoto bitu povolí přerušení od vysílacího kanálu sérové linky
UDRIE – zápis tohoto bitu povolí přerušení při vyprázdnění datového bufferu
RXEN – zápis tohoto bitu povolí příjem
TXEN – zápis tohoto bitu povolí vysílání
UCSZ2 – volí počet datových bitů
RXB8 – ovlivňuje nastavení čtení devátého bitu
TXB8 – ovlivňuje nastavení zápisu devátého bitu
UCSRC
URSEL | UMSEL | UPM1 | UPM0 | USBS | UCSZ1 | UCSZ0 | UCPOL |
URSEL – povolí zápis do registru UCSRS
UMSEL – (1) synchronní řezim, (0) asynchronní režim
UPM1, UPM0 – nastvují paritu. (00) – bez parity, (01) – nepoužívat, (10) – sudá, (11) – lichá
USBS – počet stop bitů – (0) – jeden
UCSZ1, UCSZ0 – délka znaku
UCPOL – polarita hodin (pouze v synchronním režimu)
UBRR
UBRR je registr určující přenosovou rychlost (baud rate). Hodnota tohoto registru se spočítá následovně: f0 ñ (UBRR + 1)
, přičemž UBRR je složen ze dvou registrů: UBBRH (vyšší byte) a UBRRL (nižší byte). Jedinou chybou, které byste se mohli dopustit, je, že registr UBRRH je dostupný pouze tehdy, je-li bit URSEL vynulován. Pokud je nastaven, pracujete s registrem UCRSC.
Vysílání
Vysílání dat je u procesoru AVR velice jednoduchou záležitostí. Stačí pouze zapsat odesílaná data do datového registru UBR
. Je ale nutné kontrolovat příznak UDRE
, abychom nepřepsali neodvysílaný obsah registru. Pro odvysílání je ale nutné mít korektně nastavenou přenosovou rychlost a povolené vysílání bitem TXEN
.
;podprogram cteni byte z UARTU, pri nastaveni RXC
;precte znak, jinak vyckava
VYSLANI_DAT:
SBIS UCSRA,TXC
RJMP VYSLANI_DAT
OUT UDR,R16
RET
Příjem
Opět i příjem znaků po sériové lince nemusí nikomu činit potíže. Po nastavení příznaku RXC (příjem kompletní) stačí přečíst registr UDR
. Číst se však může jen jednou, protože data jsou vysílána do kruhové fronty.
;podprogram cteni byte z UARTU, pri nastaveni RXC
;precte znak, jinak vyckava
PRIJEM_DAT:
SBIS UCSRA,RXC
RJMP PRIJEM_DAT
IN R16,UDR
RET
Spolu s nastavením může program prijem a opetovne vyslani znaku
vypadat takto:
.NOLIST
.INCLUDE "m16def.inc"
.LIST
.CSEG
RJMP RESET ;
RESET:
LDI R16,LOW(RAMEND)
OUT SPL,R16 ;SPL
LDI R16,HIGH(RAMEND)
OUT SPH,R16 ;SPH
LDI R16,LOW(0)
OUT UCSRA,R16
LDI R16,low(24) // TXEN || RXEN
OUT UCSRB,R16
LDI R16,low(134) // URSEL + paritni bity
OUT UCSRC,R16
LDI R16,LOW(0)
OUT UBRRH,R16
LDI R16,LOW(51)
OUT UBRRL,R16
START:
RCALL _getchar
CALL _putchar
RJMP START
_getchar:
sbis usr,rxc
rjmp _getchar
in r16,udr
RET
_putchar:
sbis usr,udre
rjmp _putchar
inc R16
out udr,r16
RET
Po zkompilování a nahrání do procesoru můžete program vyzkoušet v jakémkoliv terminálu.