Title: Rodzina AVR wyklad 4
1Rodzina AVRwyklad 4
2AVR
2/33
Porty szeregoweUART/USARTUSISPI
3AVR - porty szeregowe ATtiny2313/ATmega8515
3/33
- Port USART
- Cechy ukladu
- transmisja asynchroniczna i synchroniczna w
pelnym dupleksie - transmisja synchroniczna w trybie master
(wlasny) lub slave (zewn. przebieg
synchronizujacy o fXCKltfOSC4) - transmisja znaków 5-, 6-, 7-, 8- i 9-bitowych z
1 lub 2 bitami stopu - sprzetowa generacja i sprawdzanie kontrolnych
bitów parzystosci/nieparzystosci
4AVR - porty szeregowe ATtiny2313/ATmega8515
4/33
- Cechy ukladu UART
- wykrywanie bledów przepelnienia odbiornika
(overrun error), ramki (framing error) i
falszywego bitu startu (false start bit error) - trzy mozliwe przyczyny przerwania
- wlasny, niezalezny generator predkosci
- szybkosc transmisji do 1250 kbodów przy
fOSC10MHz - podwójny bufor odbiornika
- realizacja komunikacji w systemie
wieloprocesorowym - mozliwosc zdwojenia szybkosci transmisji
asynchronicznej.
5AVR - porty szeregowe ATtiny2313/ATmega8515
5/33
WEWN. SZYNA DANYCH
REJ. SZYBK. UBRR
REJ. BUF. ODBIORNIKA
REJESTRBUFOROWY NADAJNIKA
REJ. BUF. ODBIORNIKA
UDR
16fBOD
f
XTAL
GENERATORSZYBKOSCI
B
O
D
16
GEN.BITU PARZ.
WPIS DO UDR
PRZEPISZ Z UDR
XCK
PD2
UKL.SYNCH
1
U.S.PINU
KONTR PARZ.
TXD
REJESTR PRZESUWNY ODBIORNIKA
UKLADODTWARZ.BITÓW
PD1
REJESTR PRZESUWNY NADAJNIKA
U.S.PINU
RXD
U.S.NAD
PD0
UDRE
UCSZ2
RXC
UCPOL
DOR
UPE
UCSZ0
UMSEL
RXB8
TXB8
RXEN
TXEN
UPM1
TXC
FE
MPCM
U2X
UCSZ1
UPM0
USBS
REJ. STANU/STER USR/UCSRA
REJ. STER UCR/UCSRB
REJ. STANU/STER UCSRC
RXC
TXC
UDRE
TXCIE
RXCIE
UDRIE
WEWN. SZYNA DANYCH
PRZERWANIA RXC TXC UDRE
6AVR - porty szeregowe ATtiny2313/ATmega8515
6/33
Rejestry portu szeregowego
UDR - rejestr buforowy portu szeregowego- odczyt
odebranego znaku- zapis znaku do wyslania.
W przypadku ATtiny2313 odbiornik jest buforowany
podwójnie - rejestr FIFO
7AVR - porty szeregowe ATtiny2313/ATmega8515
7/33
Rejestry portu szeregowego
W ATtiny2313 i ATmega8515 sa 2 rejestry
szybkosci transmisji UBRRH i UBRRL
fTRASYNbod fOSC2U2X/(16(UBRR1)) fTRSYNbod
fOSC/(2(UBRR1))
URSEL - musi byc 0 przy wpisie do UBRRH
8AVR - porty szeregowe ATtiny2313/ATmega8515
8/33
UCSRA - rejestr stanu transmisji
RXC - flaga sygnalizujaca odebranie znaku,
kasowana automatycznie przy odczycie
znaku poprzez UDR TXC - flaga sygnalizujaca
koniec nadawania znaku (wyslano bit stopu),
zerowana automatycznie przy wejsciu w
procedure obslugi przerwania,
programowe ustawienie tej flagi moze uruchomic
przerwanie UDRE - flaga opróznienia rejestru
buforowego nadajnika (znak z bufora zostal
przeniesiony do rejestru przesuwajacego
nadajnika), zerowana automatycznie
podczas wpisu do rejestru UDR, ale gdy rejestr
przesuwajacy nadajnika jest pusty to
zapis do UDR trafia wprost do tego
rejestru i flaga pozostaje ustawiona
9AVR - porty szeregowe ATtiny2313/ATmega8515
9/33
UCSRA - rejestr stanu transmisji
FE - flaga sygnalizujaca blad ramki DOR - flaga
przepelnienia bufora odbiornika UPE/PE - flaga
sygnalizujaca blad parzystosci odebranego znaku
(czekajacego na odczyt z UDR) U2X - bit
zdwojenia szybkosci transmisji asynchronicznej MPC
M - bit wlaczajacy tryb komunikacji
wieloprocesorowej
10AVR - porty szeregowe ATtiny2313/ATmega8515
10/33
UCSRB - rejestr sterujacy transmisja
RXCIE - zezwolenie na przerwania wywolane
odebraniem znaku TXCIE - zezwolenie na przerwania
wywolane zakonczeniem nadawania znaku UDRIE -
zezwolenie na przerwania wywolane opróznieniem
bufora nadajnika RXEN - wlaczenie odbiornika TXEN
- wlaczenie nadajnika UCSZ2 - wlaczenie
transmisji 9-bitowej (CHR9 w AT90S2313) RXB8 -
najstarszy bit odebranego znaku 9-bitowego TXB8 -
najstarszy bit 9-bitowego znaku do nadania
11AVR - porty szeregowe ATtiny2313/ATmega8515
11/33
UCSRC - rejestr sterujacy transmisja
URSEL - musi byc 1 przy zapisie do UCSRC, 0
przy zapisie do UBRRH UMSEL - wybór miedzy
asynchronicznym i synchronicznym trybem
pracy UPM1,UPM0 - okreslaja rodzaj kontroli
parzystosci 00 - kontrola i generacja
wylaczone 10 - kontrola i generacja bitu
parzystosci 11 - kontrola i generacja bitu
nieparzystosci USBS - ustawiony wlacza drugi
bit stopu UCSZ1,UCSZ0 - razem z UCSZ2 okreslaja
dlugosc transmitowanych znaków 000 - 5b 001 -
6b 010 - 7b 011 - 8b 100..110 -
zarezerwowane 111 - 9b UCPOL - tylko dla
transmisji synchronicznej - wybór zbocza sygnalu
XCK, przy którym nastepuje
zmiana stanu linii nadajnika i odbiornika
12AVR - porty szeregowe ATtiny2313/ATmega8515
12/33
Przyklad programowania do pracy portu
szeregowego procedura inicjujaca port szeregowy
do pracy w trybie asynchronicznym, 19200,n,8,1
z przerwaniami .equ ubrrconst fosc/16/baudrate-1
iniuartldi rtmp,low(ubrrconst) ldi r17,high(ubrr
const) out ubrrh,r17 ustawienie
podzielnika out ubrrl,rtmp generatora
szybkosci in rtmp,udr in rtmp,ucsra clr rtmp o
ut ucsra,rtmp ldi rtmp,(1ltltRXEN) (1ltltTXEN)
(1ltltRXCIE) (1ltltTXCIE) wlaczenie nadajnika,
odbiornika i przerwan out ucsrb,rtmp ldi rtmp,(1
ltltURSEL) (1ltltUCSZ1) (1ltltUCSZ0) ustawienie
ramki n,8,1 out ucsrc,rtmp ret
13AVR - porty szeregowe ATtiny2313/ATmega8515
13/33
Przyklad buforowanego odbioru tekstu z
wykorzystaniem przerwan od odbiornika.
Zalozenia .equ CR 0x0D kod znaku
CR .def rtmp r16 R10 zarezerwowany na
potrzeby obslugi przerwania od odbiornika para
adresujaca X do dostepu do bufora odbieranego
tekstu znak CR (0x0D) konczy tekst .equ wr_in_t
ekst_ptr 0xE0 wskaznik zapisu do bufora wej.
.equ rd_in_tekst_ptr 0xE1 wskaznik odczytu z
bufora wej. .equ in_tekst 0xE4 bufor 14B na
polecenie z PC obecnosc nowego komunikatu w
buforze po odebraniu CR jest sygnalizowana
przez ustawienie zmiennej rd_in_tekst_ptr na
niezerowa wartosc low(in_tekst)
14AVR - porty szeregowe ATtiny2313/ATmega8515
14/33
.org 0x0009 rjmp rxcsrv . . . rxcsrv in r10,udr
odczyt bufora danych push rtmp przechowanie
R16 na stosie in rtmp,sreg przechowanie SREG na
stosie push rtmp in rtmp,ucsra sprawdzenie
statusu andi rtmp,0x1C czy ustawione flagi
bledow brne rxc_err skok do obslugi
bledow push XL push XH ldi XH,high(in_tekst) l
ds XL,wr_in_tekst_ptr lds rtmp,rd_in_tekst_ptr t
st rtmp czy zaczeto obrobke polecenia brne rxcs
rv2 skok jesli tak - nie dopisuj znaku . . .
15AVR - porty szeregowe ATtiny2313/ATmega8515
15/33
. . . st X,r10 jesli nie - dopisz
znak cpi XL,in_tekst14 czy zapelniony bufor
? brcs rxcsrv1 skok jesli nie dec XL rxcsrv1s
ts wr_in_tekst_ptr,XL mov rtmp,r10 czy odebrany
znak to CR cpi rtmp,CR brne rxcsrv2 skok gdy
nie CR ldi rtmp,low(in_tekst) jesli tak to
ustawienie wskaznika sts rd_in_tekst_ptr,rtmp
odczytu na poczatek bufora rxcsrv2pop XH pop XL
rjmp rxcsrv_fini rxc_err reakcja na bledy
odbioru - do wypelnienia rxcsrv_fini pop rtmp o
ut sreg,rtmp odtworzenie SREG pop rtmp odtworz
enie R16 reti
16AVR - porty szeregowe ATtiny2313/ATmega8515
16/33
Przyklad buforowanego wysylania tekstu z
wykorzystaniem przerwan od nadajnika.
Zalozenia .equ CR 0x0D kod znaku
CR .def rtmp r16 para adresujaca X do
dostepu do bufora wysylanego tekstu znak NUL
(0x00) znacznik konca znakow do
wyslania .equ wr_out_tekst_ptr 0xE2 wskaznik
zapisu do bufora wyj. .equ rd_out_tekst_ptr
0xE3 wskaznik odczytu z bufora
wyj. .equ out_tekst 0xF2 bufor 14B na tekst
wyjsciowy brak tekstu do nadawania i
oproznienie bufora wyjsciowego jest
sygnalizowane przez zmienna rd_out_tekst_ptr0
17AVR - porty szeregowe ATtiny2313/ATmega8515
17/33
.org 0x000A rjmp udresrv .org 0x000B rjmp txcsrv
. . . udresrvcbi ucsrb,udrie wylaczenie
przerwan od pustego bufora
nadajnika txcsrv push rtmp in rtmp,sreg przech
owanie SREG push rtmp push XL przechowanie X
na stosie push XH lds XL,rd_out_tekst_ptr XRD
_OUT_TEKST_PTR tst XL breq restore_X skok gdy
OUT_TEKST oprozniony ldi XH,high(out_tekst) ld r
tmp,X pobranie znaku z bufora
TEKST tst rtmp breq koniec_tekstu skok gdy
znak0x00 . . .
18AVR - porty szeregowe ATtiny2313/ATmega8515
18/33
. . . out udr,rtmp wyslanie znaku do
nadajnika rjmp store_X koniec_tekstu ldi XL,low
(out_tekst) zainicjowanie X (wskaznika
wpisywanego tekstu) clr rtmp sts wr_out_tekst_pt
r,XL i wskaznika wysylanego tekstu sts rd_out_te
kst_ptr,rtmp rjmp restore_X store_Xsts rd_out_te
kst_ptr,XL aktualizacja RD_OUT_TEKST_PTR restore_
X pop XH odtworzenie X ze stosu pop XL pop
rtmp out sreg,rtmp odtworzenie
SREG pop rtmp reti
19AVR - porty szeregowe ATtiny2313/ATmega8515
19/33
Fragment programu tla przygotowujacy
nadawanie send_answ zainicjowania nadawania
tekstu z out_tekst ldi XH,high(out_tekst) ldi XL
,out_tekst ldi rtmp,CR dopisanie znaku CR do
tekstu wyj. st X,rtmp clr rtmp wpis
znacznika 0x00 st X,rtmp konca tekstu do
wyslania ldi rtmp,low(out_tekst) sts rd_out_teks
t_ptr,rtmp sbi ucsrb,udrie wlaczenie dodatkowo
przerwan od pustego bufora
nadajnika send_answ3 oczekiwanie na oproznienie
bufora wyjsciowego lds rtmp,rd_out_tekst_ptr tst
rtmp brne send_answ3 . . .
20AVR - porty szeregowe ATtiny2313
20/33
Uniwersalny interfejs szeregowy USI
- Wlasciwosci
- sprzetowy interfejs dwu-przewodowej transmisji
synchronicznej (I2C) w trybie master lub
slave - sprzetowy interfejs trój-przewodowej transmisji
synchronicznej (SPI w trybie 0 lub 1) jako
master lub slave - mozliwosc zgloszenia przerwania po odebraniu
bajtu danej - moze wybudzic mikrokontroler z trybu pracy z
obnizonym poborem energii - przy pracy interfejsu dwu-przewodowego mozliwe
jest wybudzenie takze z trybu power-down - wykrycie bitu startu przy odbiorze
dwu-przewodowym takze moze byc przyczyna
przerwania.
21AVR - porty szeregowe ATtiny2313
21/33
Uniwersalny interfejs szeregowy USI
22AVR - porty szeregowe ATtiny2313
22/33
- Wpisujac poczatkowa wartosc do 4-bitowego
licznika mozna okreslicpo ilu nadanych/odebranych
bitach ma sie pojawic przerwanie (USIOIF) od
przepelnienia tego licznika. - Taktowanie transmisji
- wewnetrzne - sygnalami przepelnien z
timera/licznika 0 - sygnalem zewnetrznym, doprowadzonym do koncówki
USCK/SCL (przy pracy jako slave) - programowe poprzez wpisywanie 1 do bitu USITC
w rej. USICR. - UWAGAprzy taktowaniu zewnetrznym przesuwanie
bitów w rej. USIUDRodbywa sie przy wybranym
zboczu zegara, ale 4-bitowy licznik zlicza
wszystkie zbocza.
23AVR - porty szeregowe ATtiny2313
23/33
Praca interfejsu trój-przewodowego
Praca interfejsu dwu-przewodowego (przesyl 1
bajtu master ? slave
24AVR - porty szeregowe ATtiny2313
24/33
USICR - rejestr sterujacy transmisja
USISIE - zezwolenie na przerwanie po odebraniu
warunku startu USIOIE - zezwolenie na przerwanie
od przepelnienia sie licznika 4b USIWM1,USIWM0 -
okreslaja tryb pracy interfejsu 00 -
wylaczony 01 - tryb trój-przewodowy 10,11 - dwa
warianty interfejsu dwu-przewodowego
(róznice w pracy linii
SCL) USICS1,USICS0 i USICLK - wybór zródla
taktowania interfejsu USITC - zmienia stan
wyjscia zegarowego, do programowego taktowania
transmisji szeregowej
25AVR - porty szeregowe ATtiny2313
25/33
USISR - rejestr stanu transmisji
USISIF - flaga przerwania od odebrania bitu
startu przy I2C lub zbocza na wejsciu zegarowym
SCK USIOIF - flaga przerwania od przepelnienia
licznika 4-bitowego USIPF - flaga ustawiana po
odebraniu bitu stopu przy I2C USIDC - flaga
ustawiana przy nadawaniu przez I2C po wykryciu
kolizji 7-go bitu na linii
SDA USICNT3..USICNT0 - stan 4-bitowego licznika
26AVR - porty szeregowe ATtiny2313
26/33
USIDR - rejestr danych
rejestr do odczytu odebranej danej i zapisu bajtu
do wyslania
27AVR - porty szeregowe ATmega8515
27/33
- Port SPI
- 3-przewodowy, pracujacy w pelnym dupleksie
- tryb master lub slave
- mozliwy wybór kolejnosci transmisji bitów (od
LSB albo od MSB) - mozliwy wybór jednego z 4 trybów transmisji
- zglaszanie przerwania od zakonczenia transmisji
- szybkosc transmisji dobierana multiplekserem
z podzielnika generatora systemowego
28AVR - porty szeregowe ATmega8515
28/33
Port SPI
29AVR - porty szeregowe ATmega8515
29/33
Rejestr sterujacy SPI
SPIE - flaga zezwolenia na przerwanie od portu
SPI SPE - bit wlaczajacy do pracy port SPI DORD
- bit ustalajacy porzadek przesylu bitów gdy 1
od LSB, gdy 0 od MSB MSTR - gdy 1 wymusza tryb
master portu SPI, ale podanie na wejscie /SS0
automatycznie kasuje ten bit CPOL,
CPHA - bity wybierajace jeden z 4 trybów (0..3)
transmisji SPICPOL0 stan SCK niski gdy nie ma
transmisjiCPOL1 stan SCK wysoki gdy nie ma
transmisjiCPHA0 odczyt danych przy pierwszym
zboczu, zmiana przy drugim zboczuCPHA1 odczyt
danych przy drugim zboczu, zmiana przy pierwszym
zboczu
30AVR - porty szeregowe ATmega8515
30/33
Rejestr sterujacy SPI
SPR1,SPR0 - bity okreslajace razem z SPI2X
szybkosc transmisji portu SPI SPI2X,SPR1,SPR0
czestotliwosc SCK 0 0
0 fOSC / 4 0
0 1 fOSC / 16
0 1 0
fOSC / 64 0 1 1
fOSC / 128 1 0 0
fOSC / 2 1 0
1 fOSC / 8 1 1
0 fOSC / 32 1
1 1 fOSC / 64
31AVR - porty szeregowe ATmega8515
31/33
Rejestr stanu SPI
SPIF - flaga przerwania od portu SPI (gdy
transmisja sie skonczy lub pojawi sie
na wejsciu /SS niski poziom) WCOL - bit
sygnalizujacy wpis do rejestru buforujacego dane
SPDR w trakcie transmisji
Rejestr buforowy danych SPI
32AVR - porty szeregowe ATmega8515
32/33
Przyklad uzycia SPI do dwukierunkowej transmisji
slów 16-bitowych
.equ sdo5923pin 6 SPI.MISO .equ sdi5923pin 5
SPI.MOSI .equ sclk5923pin 7 SPI.SCK .equ port5
923 portb .equ pin5923 pinb .equ ddr5923 ddrb
... clr r16 out port5923,r16 ldi r16,(1ltltsdo5
923pin) out ddr5923,r16 przygotowanie
sprzetowego SPI do pracy ldi r16,0b00010000 wlac
z.SPI w master out spcr, r16 ldi r16,0b00000001
SCKfreqfosc/2 out spsr, r16 ...
33AVR - porty szeregowe ATmega8515
33/33
Przyklad uzycia SPI do dwukierunkowej transmisji
slów 16-bitowych
... sbi spcr,spe out spdr,r19 wyslanie bajtu
starszego send_byteHC sbis spsr,spif czekanie
na SPIF1 rjmp send_byteHC in r19,spdr odczyt
odebranego starszego bajtu out spdr,r18 wyslanie
bajtu mlodszego send_byteLC sbis spsr,spif cze
kanie na SPIF1 rjmp send_byteLC in r18,spdr od
czyt odebranego mlodszego bajtu cbi spcr,spe