Mikrokontrolery AVR Wykład 1
Konsultacje SR 15-17
CZ 13-15
Pok 304a/E1
Kolokwium zaliczeniowe na początku maja na ostatnim wykładzie kolokwium poprawkowe
Można korzystać z własnych materiałów , będzie 30 pytań na 60 minut
Plan wykładu :
Ogólne przedstawienie i klasyfikacja mikrokontrolerów rodziny AVR
Architektura mikrokontrolerów AVR - porównanie z rodziną 8051
Przesyłanie danych w AVR
Operacje arytmetyczno-logiczne.Procedury mnożenia wielobajtowego
Operacje na liczbach ułamkowych w technice stałoprzecinkowej
Instrukcje warunkowe
Operacje bitowe.Podstawowe schematy aplikacyjne kontrolerów AVR
System przerwań , porty , pamięć EEPROM
Timery i PWM
Kontroler LCD w ATMEGA169
Kolokwium
Przetwarzanie A/C i C/A
Programowanie pamięci FLASH i EEPROM
Poprawka
Będą dostępne wydruki wykładów
Literatura: noty aplikacyjne producenta na stronie atmela w języq angielskim (szlag)
AT90S2313
AT90S1200
AVR - zaawansowany RISC
CISC- complex Instruction Set Computer(duży zestaw instrukcji , krótki kod programu, długi czas wykonywania instrukcji)
RISC- Reduced Instruction Set Computer(mały zestaw instrukcji , długi kod programu , krótki czas wykonywania instrukcji)
Zestaw instrukcji CISC w RISC-wei implementacji
Kompletny zestaw instrukcji zawierający:
Instrukcje arytmetyczno-logiczne
Instrukcje skoków warunkowych
Instrukcje transferu danych
Instrukcje operacji bitowych i testowania pojedynczych bitów
Większośc operacji jest wykonywana w jednym cyklu maszynowym
Cykl maszynowy=Cykl zegarowy(AVR)!
Klasyczny 8051: cykl maszynowy = 12 cykli zegarowych
Ulepszony rdzeń 8051 (maxim): cykl maszynowy = 4 cykle zegarowe
(cygnal): cykl maszynowy=cykl zegarowy
Rdzeń procesora AVR
Pytanie na kolokwium: różnica pomiędzy rdzeniem 8051 a AVR:
Brak w AVR akumulatora w miejsce którego są 32 rejestry ogólnego przeznaczenia na których wykonywane są operacje arytmetyczno-logiczne
Rozdzielona pamięć programu i danych - architektura Hardvard
Reprogramowalna w układzie pamięć programu (FLASH)
Wszystkie kontrolery są wyposażone w pamięć EEPROM niektóre posiadają interfejs do podłączenia zewnętrznej pamięci danych
Statyczny rdzeń procesora
Brak wydzielonego akumulatora
32 rejestry na których wykonywane są operacje arytmetyczno-logiczne
3 16-bitowe rejestry wskaźnikowe do adresowania pamięci danych : X,Y,Z
16-bitowe instrukcje
Watchdog
Stos lokowany w pamięci danych
Konfigurowalne porty wejścia-wyjścia
Możliwość taktowania wewnętrznym oscylatorem RC
1-poziomowy pipeline (pobieranie instrukcji, wykonanie instrukcji - niewielkie opóźnienie w przypadq skoq )
statyczny rdzeń umożliwia taktowanie dowolnym zegarem byle nie przekraczać wartości maxymalnej AVR można taktować do 20 MHz przetaktowanie może skutkować zaburzeniem zakresu temperaturowego pracy
16-bitowość instrukcji jest spowodowana tym , że instrukcje zawierają również argumenty , jednakże w przypadku instrukcji bez argumentów np. NOP następuje marnowanie pamięci
stos jest ulokowany w pamięci danych , wskaźnik stosu nie jest inicjalizowany w momencie startu procesora, więc trzeba to zrobić samodzielnie, na ogół stos lokuje się na końcu pamięci , wskaźnik stosu jest dekrementowany
powstaje problem przy wysyłaniu komunikatów na porty z uwagi na szybkość 100ns, w ciągu tak krótkiego czasu nie ma możliwości ładowania pasożytniczych pojemności
AVR posiada 2 rejestry odpowiedzialne do sterowania portami : pierwszy do zapisu i drugi do odczytu
Wykład 2
Kody wygenerowane dla 51 i avr - porownanie
Instrukcje dla 8051
Mov r7, wielkoscbloku
Skok:
Mov dpl,r6
Mov dph,r5
Movx a,@dptr
Inc dptr
Mov R6,dpl
Mov R7,dph
Mov dpl,r4
Mov dph,r3
Movx @dptr,a
Inc dptr
Mov r4,dpl
Mov r3,dph
Djnz r7,skok
R5 r6 - adres zrodla
R3 r4 - adres docelowy
Instrukcje dla AVR
LDI R16,wielkoscbloku
Skok:
LD R17,Z+
ST X+,R17
DEC R16
BRNE skok
z-adres żródła
x-adres docelowy
zasilanie i taktowanie AVR
pobor pradu w trybie power down : 0.1 uA
3 uA w trybie budzenia przez uklad Watchdog
napiecia zasilania - 1.8- 5.5 V w szczególnych przypadkach <7V
czas wyjscia z trybu Powr Down: <1us
4 MIPS przy napięciu zasilania 1.8 V
1.8 V, 4 MHz
2.7 V, 10 MHz
4.5 V, 20 MHz
liniowa zależnośc między częstotliwością taktowania i napięciem zasilania
porownanie historii AVR
AT90S1200 (1997)
89 instrukcji - brak sprzętowego mnożenia
1kB pamięci FLASH (512 instrukcji , 1000 cykli programowania)
Brak pamięci RAM
64 B pamięci EEPROM
Taktowanie do 20 MHz
Wewnętrzny komparator napięcia
Jeden 8-bitowy timer z prescalerem
ATMEGA169(2002)
130 instrukcji
16kB pamięci FLASH (8192 instrukcje 10000 cykli programowania)
1kB pamięci RAM
512 B pamięci EEPROM
Taktowanie do 16 MHz
Wewnętrzny komparator napięcia
3 timery (1 - 16bitowy 2 - 8bitowe) z prescalerami
RTC
Interfejs JTAG
Sterownik matrycy LCD (4*25)
4 kanały PWM
Przetwornik A/C z 8-kanałowym multiplekserem
Interfejsy szeregowe: UART, SPI, I2C
Wewnętrzne źródło napięcia odniesienia
Przerwa
Rodzina ukladow ze sterownikiem LCD
Kompatybilnosc funkcjonalna i zgodnosc wyprowadzen
Sterowanie do 160 segmentow LCD - programowa regulacja kontrastu
Niewielki pobór mocy
Dostepne wersje ukladow bez sterownika LCD
Koniec pokazu slajdów
AT2313
Przesylanie danych w kontrolerach AVR
32 rejestry ogólnego przeznaczenia ;)
stałe mozna wpisywać tylko do rejestrów R16-R31
rejestry 30 i 31 tworzą rejstry wskaźnikowe Z
rejestry 28 i 29 tworzą rejstry wskaźnikowe Y
rejestry 26 i 27 tworzą rejstry wskaźnikowe X
mozna sie do rejestrow odwolywac zarowno przez ich nazwe jak i ich adres
Ładowanie stałych do rejestru - instrukcja LDI
LDI R16, 15 wartość 15
LDI R17, $15 warość 15 szesnastkowo
Ładowanie adresu 1000 do rejestru wskaźnika Z
LDI R30, low(1000) = LDI ZL, low(1000)
LDI R31, high(1000) = LDI ZH, high(1000)
Przesłania między rejestrami
Operacja 8-bitowa
MOV R0,R16; kopiuje zawartosc rejestru R16 do R0
Operacja 16-bitowa (procesory ATMEGA):
MOVW R17:R16,R1:R0 kopiuje zawartość rejestrów r1 i r0 do r17 i r16 w jednym cyklu maszynowym
MOVW ZH:ZL,R3:R2 kopiuje zawartosc rejestrow r3 i r2 do wskaznika Z
Istnieje konwencja kopiowania rejestrów taka , że najpierw ma być rejestr starszy nieparzysty
Mapa pamięci RAM
Obszar dostepny pamieci dla uzytkownika zaczyna sie od adresu 0x0100 w ATMEGA169
Zapis , odczyt rejestrów I/O
Wszystkie rejestry konfigurujące peryferia, procesor, porty, są w architekturze AVR rejestrami I/O
Zapis i odczyt rejestrów I/O odbywa się zawsze poprzez 32 rejestry ogólnego przeznaczenia
Zapis/odczyt rejestrów I/O może być wykkonywany przez instrukcje „in” i „out”, jeśli rejestry są ulokowane poniżej adresu 60h w pamięci RAM
Zapis wartosci 1 do portu A
LDI R16,1; zapis do rejestru 16
OUT PORTA,R16; prezepisanie wartości do portu
Odczyt zawartości licznika T0
IN R16, TCNT0; odczyt z TCNT0 do R16
Adresowanie bezpośrednie pamięci RAM
Dostęp do rejestrów I/O od adresu 60h jest możliwy tylko przez wykorzystanie instrukcji do adresowania pamięci RAM
STS $0FF,R2; zapisuje zawartość rejestru 2 do komórki pamięci o adresie FFh
STS UDR,R2; zapisuje zawartość rejestru 2 do portu szeregowego
LDS R2,$0FF; odczytuje zawartość komórki o adresie FFh do R2
LDS R2,UDR; odczytuje z portu szeregowego do rejestru 2
Dostep do rejestrow I/O od adresu 60 h jest mozliwy tylko przez wykorzystanie instrukcji do adresu pamięci RAM
Wyklad 3 8 03 2006
Do adresowania pośredniego są wykorzystywane 3 rejestry wskaźnikowe X,Y,Z
Adresowanie pośredni
LDL XL,low ($0FF); ładuje adres do rejestru wskaźnikowego
LDL XH,high($0FF);
ST X,R2; zapisuje zawartość rrejestru R2 do komórki pamięci o adresie FFH
LD R2,X; odczytuje zawartość komórki o adresie FFH do rejestru R2
Adresowanie pośrednie z post inkrementacją wskaźnika
ST X+,R2; po zapisaniu komórki pamięci o adresie X wartość w rejestrze X jet zwiększana o 1
Adresowanie pośrednie z predekrementacją wskaźnika
ST -X, R2; przed zapisaniem komórki pamięci wartość w rejestrze X jest zmniejszana o 1 zapis następuje do komórki o adresie (X-1)
Adresowanie pośrednie z przesunięciem jest uzyteczne przy odwoływaniu się do elementów tablicy lokowanych w pamięci RAM
STD Y+q,Rr gdzie 0<=q<=63
LDD Rd,Y+q
Np:
LDI XL,low($0FF); ładuje adres początku tablicy do rejestru wskaźnikowego X
LDI XH,high($0FF);
STD X+1,R2; zapisuje zawrtość R2 do komórki pamięci o adresie 100h
LDD R2,X+2; odczytuje zawartość komórki o adresie 101h do R2
Wykonanie komend „lds sts ld std ldd” wymaga dwóch cykli maszynowych niezależnie od tego , czy jest używane postinkrementowanie lub predekrementowanie wskaźnika bądź przesunięcie
Pobieranie danych z pamięci programu
Pamięć programu może być adresowana tylko pośrednio z wykorzystaniem wskaźnika Z
Pamięć programu jest zorganizowana w słowa 16-bitowe
Instrukcja „LPM” adresuje bajtowo
Wykonanie instrukcji „LPM” wymaga 3 cykli maszynowych
LDI Zh, high (tablica<<1); załadowanie wskaźnika Z
LDI Zl, low (tablica <<1); przesunięcie konieczne ze względu na adresowanie bajtowe
LPM R17, Z+; pobranie pierwszego elementu z tablicy do R17 wskaźnik Z pokazuje na drugi element tablicy
Tablica:
Db 1,2,3
Rozkazy arytmetyczno- logiczne
Operacje na rejestrach
Dodawanie
ADD R15, R16; R15=R15+R16
Operacje ze stałymi (tylko rejestry 16-31)
Dodawanie brak
Odejmowanie SUBI R16,7;
SBCI R16,7;
Iloczyn logiczny ANDI R16,7;
Suma logiczna ORI R16,7;
Dodanie stałej do wartości rejestru w trybie 8-bitowym można zrealizować przez operację odejmowania stałej o przeciwnym znaku
SUBI R16,-7;
Dodanie , odjęcie stałej od liczby 16-bitowej
ADIW R17:R16,7; (R17:R16 + 7)
SBIW R17:R16, 7; (R17:R16 - 7)
Wykonanie instrukcji adiw i sbiw zajmuje 2 cykle maszynowe
Instrukcje COM i NEG
CLR R17
NEG R17
COM R17
LDI R17, 1;
NEG R17;
LDI R17, 1;
COM R17;
Instrukcja NEG neguje wartość w kodzie U2
Pozostałe instrukcje
Zerowanie rejestru CLR R16;
Ustawienie rejestru SET R16;
Inkrementacja rejestru INC R16;
Dekrementacja rejestru DEC R16;
Ustawienie bitu w rejestrze SBR R16,6
Kasowanie bitu w rejestrze qrwa
Instrukcje mnożenia 8-bitowego
Mnożenie dwóch liczb bez znaku MUL R12 , R13
Mnożenie dwóch liczb ze znakiem MULS R12 , R13
Mnożenie liczby ze znakiem przez liczbe bez znaku MULSU R12 , R13
R12 -> ze znakiem
R13 -> bez znaku
Wynik mnożenia znajduje się zawsze w rejestrach R1 i R0
Instrukcje mnożenia zawierają tylko procesory serii ATMEGA
Wykonanie mnożenia zajmuje 2 cykle maszynowe
Instrukcje mnożenia z przesunięciem wyniku o 1 pozycję w lewo: fmul, fmuls, fmulsu
LDI R17, low(RAMEND);
OUT SPL, R17;
LDI R17, high(RAMEND);
OUT SPH, R17;
LDI Zh, high(tablica<<1);
LDI Zl, low(tablica<<1)
LDI Xh, high($100)
LDI Xl, low($100)
LDI R16,7
Skok:
LPM R17,Z+
ST X+,R17
DEC R16
BRNE Skok
Petla:
RJMP Petla
Tablica:
DB 1,2,3,4,5,6,7
Wykład 4
Metody wykonywania mnożenia :
L1= a<<8 + b;
L2= c<<8 + d;
A i c - liczby ze znakiem
B i d - liczby bez znaku
(L1:L2) = (a<<8+b)*(c<<8+d)=(a*c)<<16+(b*d)<<8+(a*d)<<8+b*d
r19:r18:r17:r16 = (r23:r22)*(r21:r20)
muls16_16
clr r2
muls r23:r21
movw r19:r18,r1:r0
mul r22:r20
movw r17:r16,r1:r0
mulsu r23:r20
sbc r19,r2
add r17,r0
adc r18,r1
adc r19,r2
muls r21,r22
sbc r19,r2
add r17,r0
adc r18,r1
adc r19,r2
Instrukcje skoków w AVR
Skoki bezwarunkowe
Bezwzględny : jmp (jump)
Względny : do +/- 2kB rjmp (relative jump)
Pośredni - rejestr Z ijmp (indirect jump)
(zawartość licznika Z jest przepisywana do licznika rozkazów)
Wywołanie podprogramu:
Bezwzględne (4 cykle maszynowe) call
Względne do +/- 2 kB (3 cykle) rcall
Pośrednie rejestr Z (3 cykle) icall
(zawartość rejestru Z jest przepisywana do licznika rozkazów)
Skoki warunkowe - zależne od ustawienia flag w rejestrze statusowym (zakres skoku
-64,+63 względem licznika rozkazów)
Skok jeśli stan flagi : 1 0
C brcs brcc
Z breq brne
N brmi brpl
V brvs brvc
S brge brlt
H brhs brhc
T brts brtc
Brcs - branch carry set
Brcc - branch carry clear
Breq - branch equal
Brne - branch not equal
Status Register (SREG)
7 6 5 4 3 2 1 0
I T H S V N Z C
S - znak wyniku operacji na liczbach U2 - uwzględnia przekroczenie zakresu (V xor N)
V - flaga przekroczenia zakresu dla operacji U2
N - flaga wartości ujemnej
Z - flaga zera
I - flaga włączenia / wyłączenia przerwań (sei,cli)
T - flaga wykorzystywana do kopiowania bitów (bld,bst)
H - flaga przeniesienia między bitem 3 a 4 „Half carry”
C - flaga przeniesienia carry
Wykład 5 22 - 03 - 2006
Operacja C Z N V S
1+1 = 2 0 0 0 0 0
1 + (-1) = 0 1 1 0 0 0
-1 + (-1) = -2 1 0 1 0 1
-1 + (-128) = -129 1 0 0 1 1
1 + 127 = 128 0 0 1 1 0
Instrukcja TST:
Tst r15 - testuje zawartość rejestru - ustawia flagi Z,N,V
Może być wykorzystywana, jeżeli nie wykonywano operacji arytmetyczno - logicznej ustawiającej flagi np.: zawartość rejestru pobrano z pamięci
Porównywanie liczb 16 - bitowych
Porównanie zawartości rejestru ze stałą
Przeskok następnej instrukcji
Zachowywanie SREQ i blokowanie przerwań