Mikroprocesory i mikrosterowniki
kolokwium 1
1
1. Mikrokontroler
2. Rejestry
W mikrokontrolerze rozróżniamy dwa rodzaje rejestrów- uniwersalne oraz specjalne.
Rejestry uniwersalne służą do wykonywania operacji arytmetycznych, logicznych itp. Możemy do nich
dowolnie wpisywad lub sczytywad dane, które następnie używane są przez mikrokontroler.
W Atmega8535 rejestrów uniwersalnych jest 32 ( o nazwach od R0 do R31)
Rejestry specjalne są przypisane do konkretnego urządzenia wewnętrznego mikrokontrolera (np. 3
rejestry specjalne portów I/O) i w odpowiedni sposób nim steruje. Użytkownik nie ma bezpośredniego
dostępu do tych rejestrów, wszelkie operacje wykonuje się z wykorzystaniem rejestrów uniwersalnych.
W Atmega8535 rejestrów specjalnych jest 64, ich nazwy są skrótami np. SREG- Status Register
3. Porty WE/WY (I/O)
Atmega8535 ma 4 (A,B,C,D) porty I/O, po 8 pinów każdy. Do wszystkich portów przyporządkowane są po
3 rejestry specjalne:
- DDR (Data Direction Register) w którym ustalany czy dany pin wysyła (1) czy sczytuje informacje (0)
- PORT w którym ustawiamy wartośd, którą chcemy z mikrokontrolera wysład
- PIN do którego szczytujemy wartośd z zewnątrz
przykład zastosowania:
Mikroprocesory i mikrosterowniki
kolokwium 1
2
Ustawiając dany port(pin) jako wejście możemy spodziewad się że będą się na nim generowały stany
losowe, które następnie mogą byd sczytane przez mikrokontroler i zaburzad jego pracę. Aby
wyeliminowad stany losowe stosuje się pull-up.
Pull-up polega na wpisaniu do rejestru PORT wartości 1.
LDI R16, $00
OUT DDRA, R16 ; ustawanie portu A na wyjście
LDI R16, $FF
OUT PORTA, R16 ; ustawienie pull-up na tym porcie A
4. Inicjalizacja stosu
Inicjalizacja stosu jest niezbędna gdy chcemy używad podprogramów (tzn. instrukcji RCALL, ICALL, RET,
RETI) lub gdy chcemy odkładad/zdejmowad jakieś dane na stos (PUSH, POP)
Polega ona na „powiedzeniu” mikrokontrolerowi, gdzie w pamięci Internal SRAM znajduje się
wierzchołek stosu (czyli określenie stack pointer SP- pierwszy wolny wiersz stosu)
Ponieważ adres wiersza jest 16-bitowy, SP dzielimy na częśd młodszą (SPL) i
starszą (SPH)
Przykład inicjalizacji stosu :
low (RAMEND) jest stałą odpowiadającą młodszej części adresu ostatniego wiersza ($5F)
high (RAMEND) odpowiada starszej części adresu ostatniego wiersza($02)
5. Podstawowe instrukcje
LDI – load immediate- załadowanie stałej do rejestru uniwersalnego
np. LDI R16, 128 ; załadowanie wartości 128 do rejestru R16
Przy LDI możemy używad rejestrów od R16 do R31 mikrokontrolera i stałych od 0 do 255 zapisanych w
kodzie binarnym, dwójkowym lub szesnastkowym.
OUT- przepisanie wartości z rejestru uniwersalnego do rejestru specjalnego
np. OUT PORTC, R11 ; wczytanie do rejestru PORTC zawartości rejestru R11
Przy tej instrukcji można używad dowolnych rejestrów uniwersalnych i specjalnych.
Mikroprocesory i mikrosterowniki
kolokwium 1
3
IN – przepisanie zawartości z rejestru specjalnego do rejestru uniwersalnego
np. IN R23, PIND ; przepisanie wartości rejestru PIN do rejestru R23
Również możemy stosowad dowolne rejestry.
RJMP – relative jump- skok do określonej etykiety, lub linijki o danym numerze
np. pętla:
jakiś kod
RJMP pętla
Najczęściej służy do zapętlenia jakiejś czynności
RCALL- odnośnik do podprogramu, RET – powrót z podprogramu (RETI – powrót z podprogramu obsługi
przerwania)
np. RCALL zwolnij
jakiś kod
jakiś kod
zwolnij:
jakiś kod
jakiś kod
RET
SBRS/ SBRC – skip if bit in register set /cleared- opuśd linijkę kodu poniżej, jeśli dany bit w danym
rejestrze jest 1/0
np. SBRC R17,4 ; pominięcie następnej linijki jeśli 4 bit w rejestrze R17 ma wartośd 0
BRNE – testuje flagę Z w rejestrze SREG. Jeśli Z=0, wykonywany jest skok do podanej etykiety lub linijki
kodu, jeśli Z=1 instrukcja nie jest wykonywana i program idzie dalej.
np. BRNE OP ; skok do etykiety OP jeśli Z=0
6. Pętla opóźniająca
Jeśli chcemy zauważyd efekty pracy mikrokontrolera gołym okiem, np. przy pracy z diodami, musimy
opóźnid czas trwania jakiejś czynności tak aby była ona zauważalna. Stosujemy do tego pętlę
opóźniającą:
LDI R17, $FF ; załadowanie do rejestru wartości 255
OP:
DEC R17 ; dekrementowanie wpisanej wartości
BRNE OP ; skok do etykiety OP, dopóki wartośd rejestru R17 się nie wyzeruje
Taka najprostsza pętla opóźniająca trwa około 766 cykli zegara, co ciągle nie jest zauważalne gołym
okiem. Dlatego pętlę można rozbudowad:
Mikroprocesory i mikrosterowniki
kolokwium 1
4
LDI R17, $FF
OP1:
LDI R18, $FF
OP:
DEC R18
BRNE OP
DEC R17
BRNE OP1
Taka pętla trwa ponad 190 tys. cykli, czyli około 200 ms, i jest już zauważalna gołym okiem.
7. Działanie CPU
Centralna jednostka obliczeniowa (CPU) składa się z:
jednostki arytmetyczno-logicznej (ALU), która wykonuje wszystkie instrukcji logiczne i
arytmetyczne
rejestrów uniwersalnych
STATUS REGISTER (SREG)- składa się z 7 flag, zawiera m.in. informacje na temat wyników
ostatnio wykonanych instrukcji arytmetycznych, umożliwia także włączenie przerwao (bit 7 – I)
wskaźnik stosu (STACK POINTER-SP) – określający gdzie w pamięci SRAM znajduje się
wierzchołek stosu
licznik rozkazów (PROGRAM COUNTER-PC) wskazuje adres spod którego pobierane są kolejne
instrukcje
pamięci (SRAM, Flash)
8. Rodzaje pamięci
W Atmedze8535 wyróżniamy 3 rodzaje pamięci:
Pamięd programu – FLASH EEPROM
Zawiera 8kB pamięci służącej do przechowywania programu. Dla bezpieczeostwa
oprogramowania, podzielona jest ona na częśd bootowalną (BOOT PROGRAM SECTION) i częśd
aplikacji (APPLICATION PROGRAM SECTION). Zorganizowana jest w komórki 4K x 16 bajtów.
Wytrzymuje 10 000 cykli.
Pamięd danych – SRAM
Zawiera 512B pamięci służącej do przechowywania tymczasowych danych. Podzielona jest 608
lokacji: rejestry uniwersalne i specjalne (96 lokacji) oraz Internal SRAM (stos- 512 lokacji)
Pamięd dodatkowa (użytkownika) – EEPROM
Jest to 512B pamięci, z której może korzystad użytkownik.
Mikroprocesory i mikrosterowniki
kolokwium 1
5
9. Tryby adresowania
Możemy wyróżnid 5 rodzajów adresowania pamięci SRAM:
Bezpośrednie
Pośrednie
Pośrednie z predekrementacją
Pośrednie z postinkrementacją
Pośrednie z przesunięciem (tylko rejestry Y i Z)
Adresowanie bezpośrednie polega na bezpośrednim podaniu adresu w ramce instrukcji.
Adresowanie pośrednie wykorzystuje rejestry X, Y, Z ( są to rejestry od R26 do R31, które oprócz bycia
rejestrem uniwersalnym mają dodaną funkcję 16-bitowych wskaźników adresu)
10. Przerwania
W mikrokontrolerze Atmega8535 występuje 21 przerwao (reset, 3 zewnętrzne, 17 wewnętrznych) o
malejących priorytetach. Wystąpienie przerwania powoduje natychmiastowe przerwanie programu
głównego i przejście do podprogramu obsługi przerwania.
Aby korzystad z przerwao należy
włączyd przerwania globalne (7 bit w SREG- flaga I) np. komendą SEI
aktywowad konkretne przerwanie
Np. w rejestrze TIMSK aktywujemy przerwania od licznika
w rejestrze GICR aktywujemy przerwania zewnętrzne
użyd na początku dyrektywy .org z odpowiednim wektorem przerwania (np. .org $000-
przerwanie RESET)
W momencie obsługi podprogramu przerwania, flaga I jest automatycznie wyzerowywana, aby żadne
inne przerwanie nie mogło w tym czasie nastąpid. Po powrocie z podprogramu (RETI) flaga jest
ponownie ustawiana na 1.
11. Przerwania zewnętrzne
Możemy wyróżnid 3 przerwania zewnętrzne :
INT0 (priorytet 2), INT1 ( priorytet 3), INT2 (priorytet 19).
INT0 I INT1 mogą reagowad na dowolne zbocze lub stan niski. INT2 jest wyzwalany wyłącznie zboczem.
Czas trwania impulsu wyzwalającego to min. 1 cykl zegara przy wyzwalaniu zboczem (50 ns dla INT2) lub
poziom niski na tyle długi aby zakooczyła się obecnie wykonywana instrukcja.
Przerwania zewnętrzne używają następujących rejestrów specjalnych:
GICR- gdzie aktywujemy konkretne, bądź wszystkie przerwania zewnętrzne
GIFR- gdzie występują flagi przerwao zewnętrznych (1- gdy przerwanie jest wykonywane, 0- gdy
się zakooczyło)
MCUCR- gdzie ustawiamy reakcje INT0 lub INT1 (tzn. czy ma byd wyzwalane zboczem
opadającym, rosnącym, czy poziomem)
MCUSCR- ustawienie reakcji INT2 (zbocze opadające lub rosnące)
Mikroprocesory i mikrosterowniki
kolokwium 1
6
12. Licznik
Licznik służy do zliczania impulsów zegarowych lub zewnętrznych, generowania sygnału PWM bądź
generowania częstotliwości. Ma jedno wejście T0 i jedno wyjście OC0.
Z licznikiem związane są 3 rejestry specjalne
TCCR0- wybieramy w nim tryb pracy, sterowanie wyjściem(zależne od trybu pracy), ustawiamy
prescaler
TCNT0- w którym zapisywana jest obecna wartośd do której licznik doliczył
OCR0- w którym podajemy wartośd do której licznik ma zliczad
Używamy również rejestru TIMSK w którym włączamy przerwania od licznika oraz TIFR w którym
znajdują się flagi przerwao.
Z licznikiem związane są dwa przerwania:
Od przepełnienia (gdy doliczy do 255) i się przekręci – TOV0
Od doliczenia do zadanej wartości- OCF0
Licznik oferuje 4 tryby pracy:
Normalny - po doliczeniu do wartości maksymalnej (255) następuje przekręcenie licznika do
wartości 0. Wartośd TCNT0 można modyfikowad w dowolnym momencie. Flaga przepełnienia
TOV0 ustawiana jest przy przejściu MAX->0.
Tryb ten można stosowad do generowania impulsów, ale nie jest to rozwiązanie optymalne.
Najczęściej stosuje się go do zliczania impulsów.
CTC (clear on compare)- w rejestrze OCR0 zapisujemy wartośd do której licznik ma zliczad. Po
zrównaniu się TCNT0 z OCR0 następuje przekręcenie licznika. Flaga przepełnienia TOV0
ustawiana jest przy przejściu MAX->0, a flaga zrównania OCF0 ustawiana przy przejściu TOP->
Tryb ten jest odpowiedni do generowania impulsów o określonej częstotliwości. W tym celu
korzystamy ze wzoru
f
OC0
- częstotliwośd generowana
f
clk
- częstotliwośd zegara
N- prescaler
OCR0- wartośd jaką należy wpisad do rejestru aby otrzymad f
OC0
Fast PWM- w tym trybie licznik zlicza od wartości 0 do wartości maksymalnej(255). Po
doliczeniu do 255 następuje przekręcenie licznika. W tym trybie licznik reaguje tylko na jedno
zbocze (narastające) przez co jest szybszy niż zwykły PWM.
Na pinie OC0 ustawiane jest 0 przy zrównaniu i 1 przy przepełnieniu.
Tryb ten używany jest to generowania impulsów o zadanej częstotliwości i wypełnieniu.
Mikroprocesory i mikrosterowniki
kolokwium 1
7
Do OCR0 wpisujemy wartośd w*256, gdzie w jest zadanym
wypełnieniem w %
PWM z korekcją fazy- jest to tryb dwa razy wolniejszy ale dokładniejszy niż fast PWM, gdyż
reaguje na oba zbocza. Zliczanie przebiega 0->MAX->0.
Na pinie OC0 pojawia się 0 przy zrównaniu na zboczu narastającym, 1 przy zrównaniu na zboczu
opadającym
Glitch – drobne zakłócenie w systemie, spowodowane np. impulsem krótszym lub o mniejszej
amplitudzie niż zakłada specyfikacja . W liczniku glitch może wystąpid gdy np. zmiana wartości na
OCR0 wystąpi podczas zliczania w rejestrze TCNT0. Zakłóca to przebieg sygnału wejściowego.
Aby tego uniknąd zmiany OCR0 są zsynchronizowane z przekręceniem się licznika.
13. Konwerter analogowo- cyfrowy
Wejścia konwertera znajdują się na porcie A. Dodatkowo posiada on 3 piny- uziemienie, napięcie
odniesienia i zasilania. Wyniki konwersji są 10 bitowe. Typowo konwersja trwa 65-260 us.
Konwerter może przeprowadzad konwersję bez wzmocnienia lub ze wzmocnieniem 1x, 10x, 200x(wynik
jest wtedy 8 bądź 7 bitowy)
Mikroprocesory i mikrosterowniki
kolokwium 1
8
Z konwerterem związane są następujące rejestry:
ADMUX- ustala się w nim źródło napięcia referencyjnego, wybiera kanał wejściowy i tryb
prezentacji wyników
ADCSRA- tutaj włączamy konwerter, startujemy konwersję, wybieramy rodzaj konwersji,
aktywujemy przerwania i wybieramy prescaler
ADCL+ADCH- rejestry wyniku
SFIOR- wybór zdarzenia które wywoła konwersję
Występuje też przerwanie od zakooczenia konwersji. Aktywacja przerwania jaki i jego flaga zawarte są w
rejestrze ADCSRA.
Typy konwersji:
Pojedyncza
Konwersja rozpoczyna się wraz z pierwszym zboczem narastającym zegara po starcie konwersji
(ADSC <<1). Konwersja trwa 13 cykli zegara (z wyjątkiem pierwszej, która trwa 25 cykli).
Pomiędzy pojedynczymi konwersjami następuje odstęp długości 1,5 cyklu zegarowego.
Wielokrotna (free running)
Pierwsza konwersja rozpoczyna się tak samo jak konwersja pojedyncza, jednak pomiędzy
kolejnymi konwersjami nie ma żadnego odstępu czasu. Aby uruchomid tę konwersję należy w
rejestrze ADCSRA ustawid ADATE<<1 oraz w rejestrze SFIOR na bitach ADTS2..0 << ‘000’
Wyzwalana zdarzeniem
Odstęp pomiędzy zdarzeniem wyzwalającym a startem konwersji to 2 cykle zegara. Pomiędzy
poszczególnymi konwersjami jest duży odstęp w celu synchronizacji. Aby uruchomid tę
konwersję należy w rejestrze ADCSRA ustawid ADATE<<1 oraz w rejestrze SFIOR wybrad
zdarzenie wyzwalające (przerwanie zewnętrzne lub jedno z przerwao liczników).
Eliminacja zakłóceo
Aby zminimalizowad bądź całkowicie wyeliminowad zakłócenia z przebiegu konwersji należy przede
wszystkim stosowad jak najkrótsze kable, a wszelkie przełączniki trzymad jak najdalej od kontrolera.
Napięcie zasilania do konwertera należy podłączad poprzez filtr LC.
W czasie konwersji mikrokontroler powinien byd uśpiony (tryb Noise Reduction, Idle) oraz żadne porty
I/O nie powinny byd wykorzystywane.
Z doświadczenia wiadomo, że obudowa PDIP daje najmniej dokładne wyniki konwersji.
Wynik konwersji
Całkowita niedokładnośd konwersji wynosi maksymalnie ±2 LSB
Mikroprocesory i mikrosterowniki
kolokwium 1
9
Zakres konwersji
𝐴𝐷𝐶 =
𝑉
𝑖𝑛
∙ 1024
𝑉
𝑅𝐸𝐹
= [$000, $3𝐹𝐹]
1024 − 𝑟𝑜𝑧𝑑𝑧𝑖𝑒𝑙𝑐𝑧𝑜ść
Zakres konwersji dla sygnałów różnicowych
𝐴𝐷𝐶 =
(𝑉
+
− 𝑉
−
) ∙ 512 ∙ 𝐺
𝑉
𝑅𝐸𝐹
= $200, $1𝐹𝐹 = [−512,511]
512 − 𝑟𝑜𝑧𝑑𝑧𝑖𝑒𝑙𝑐𝑧𝑜ść
𝐺 − 𝑤𝑧𝑚𝑜𝑐𝑛𝑖𝑒𝑛𝑖𝑒
Odczytując wyniki konwersji najpierw należy odczytad rejestr z młodszą częścią wyniku - ADCL
14. Magistrala szeregowa SPI
Magistrala szeregowa umożliwia komunikację mikrokontrolera z urządzeniami zewnętrznymi, takimi jak inne
mikrokontrolery, sterowniki, układy scalone itd. Magistrala pracuje w dwóch trybach: master i slave.
Piny magistrali znajdują się na pinach portu B:
PB4 - SS- slave select- wybór slave’a następuje poprzez wysłanie z mastera 0 na pin SS
wybranego urządzenia
PB5 – MOSI- master output/slave input
PB6 – MISO – master input/slave output
PB7 – SCK – zegar magistrali
Należy pamiętad aby przy łączeniu mastera ze slavem łączyd pin MOSI z MOSI, nie z MISO.
Mikroprocesory i mikrosterowniki
kolokwium 1
10
Z magistralą związane są następujące rejestry specjalne:
SPCR – control register - w którym włączamy magistralę, ustalamy tryb pracy (master/slave),
wybieramy sposób wysyłania bitów (LSB -> MSB lub MSB -> LSB), wybieramy prescaler
SPSR – status register - w którym znajduje się dodatkowy bit do wyboru prescalera oraz dwa bity
wyłącznie do odczytu informujące o przerwaniu (flaga SPIF) i kolizji danych
SPDR – data register – w którym znajdują się przesyłane dane
Magistrala wywołuje jedno przerwanie – od zakooczenia transmisji. Jego flaga znajduje się w rejestrze
SPSR.
DODATEK
(na podstawie A.Skorupski Podstawy techniki cyfrowej i mikroprocesorowej)
A. KOD BINARNY
Zamiana kodu dziesiętnego na binarny
np. liczba 89
czytamy od tej strony
89
10
= (1011001)
2
Zamiana kodu binarnego na dziesiętny
B. KOD U2
Liczby dodatnie reprezentowane są tak samo jak w kodzie binarnym, tylko trzeba dodad na najstarszym
bicie 0 np.
19
10
=(10011)
2
=(010011)
U2
Liczby ujemne natomiast można obliczyd według następującego algorytmu:
010011
U2
+19
101100 odwraca się bity
+1 i dodaje 1
101101
U2
- 19
Mikroprocesory i mikrosterowniki
kolokwium 1
11
C. KOD SZESNASTKOWY
0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
Zamiana kodu binarnego na szesnastkowy
np.
110
2
= 6
10
= 6
HEX
1100
2
=10
10
=A
HEX
1111
2
=15
10
=F
HEX
001101
2
= 00|1101= 0
10
13
10
= 0D
HEX
11101101
2
=1110|1101= 14
10
13
10
= ED
HEX
Zamieniając z dziesiętnego na hexagonalny, najłatwiej zamienid jest najpierw dziesiętny na binarny a
następnie binarny na hexagonalny.
D5B423
HEX
= 13x16
5
+ 5x16
4
+ 11x16
3
+ 4x16
2
+ 2x16
1
+ 3x16
0
= 14005283
10
Wykonane przez:
CVercetti
.:Spinx:.
na podstawie wykładu dra Piotra Markowskiego i datasheet ATmega8535.