Od autora 9
Wstęp 10
1. Struktura urządzeń z wykorzystaniem mikrokontrolerów 13
2. Jak jest zbudowany mikrokontroler AVR 15
2.1. Pamięć programu 16
2.2. Pamięć danych 16
2.3. Rejestry mikrokontrolera 17
2.4. Rejestry wejścia-wyjścia 18
2.5. Wskaźniki 20
3. Organizacja pamięci w mikrokontrolerach AVR 23
4. Jak działa mikrokontroler 27
4.1. Łączność ze światem zewnętrznym 27
4.2. Istota stosu 28
4.3. Przyjęcie przerwania 30
4.4. System watchdog 33
4.5. Programowanie mikrokontrolerów 34
4.6. Bity zabezpieczające i konfiguracyjne 35
5. Kody stosowane w mikrokontrolerach 37
6. Rejestry sterujące mikrokontrolera 41
6.1. Rejestry portów 41
6.1.1. Rejestry portu A 41
6.1.2. Rejestry portu B 42
6.1.3. Rejestry portu C 44
6.1.4. Rejestry portu D 44
6.1.5. Rejestry portu E 46
6.2. Rejestry układu transmisji szeregowej USART 47
6.2.1. UCSRA – rejestr sterujący A oraz statusów USART 47
6.2.2. UCSRB – rejestr sterujący B USART 48
6.2.3. UCSRC – rejestr sterujący C USART 49
6.2.4. UBRRH i UBRRL – rejestry podzielnika prędkości transmisji 50
6.2.5. UDR – rejestr danych USART 51
6.3. Rejestry zegara/licznika 0 51
6.3.1. TCCR0 – rejestr sterujący zegara/licznika 0 52
6.3.2. TCNT0 – rejestr zliczający zegara/licznika 0 53
6.3.3. OCR0 – rejestr wzorca porównania zegara/licznika 0 53
6.4. Rejestry zegara/licznika 1 54
6.4.1. TCCR1A – rejestr sterujący A zegara/licznika 1 54
6.4.2. TCCR1B – rejestr sterujący B zegara/licznika 1 54
6.4.3. TCNT1H i TCNT1L – rejestry danych zegara/licznika 1 55
6.4.4. OCR1AL i OCR1AH – rejestry porównania zegara/licznika 1 56
6.4.5. OCR1BH i OCR1BL – rejestry porównania zegara/licznika 1 57
6.4.6. ICR1L i ICR1H – rejestry przechwytywania zegara/licznika 1 57
6.5. Rejestry pamięci EEPROM 58
6.5.1. EEARH i EEARL – para rejestrów adresowych pamięci EEPROM 58
6.5.2. EEDR – rejestr danych pamięci EEPROM 58
6.5.3. EECR – rejestr sterujący dostępem do pamięci EEPROM 59
6.6. Rejestr komparatora analogowego 60
6.7. Rejestry interfejsu szeregowego SPI 61
6.7.1. SPCR – rejestr sterujący SPI 62
6.7.2. SPSR – rejestr statusów SPI 62
6.7.3. SPDR – rejestr danych SPI 63
6.8. Rejestry kontrolera przerwań 63
6.8.1. TIMSK – rejestr maskowania przerwań licznika/zegara 64
6.8.2. TIFR – rejestr wskaźników przerwań licznika/zegara 64
6.8.3. GICR – rejestr sterujący kontrolera przerwań 65
6.8.4. GIFR – rejestr wskaźników przerwań 66
6.9. Rejestry pozostałe 66
6.9.1. MCUCR – rejestr sterujący mikrokontrolerem 66
6.9.2. EMCUCR – rozszerzony rejestr sterujący mikrokontrolerem 67
6.9.3. MCUCSR – rejestr sterujący i statusów mikrokontrolera 68
6.9.4. WDTCR – rejestr sterujący watchdoga 69
6.9.5. SFIOR – rejestr określający funkcje rejestrów IO 70
6.9.6. SPMCR – rejestr sterujący zapisem kodu programu 71
6.9.7. SPH, SPL – rejestr wskaźnika stosu 71
6.9.8. SREG – rejestr statusów 72
7. Lista instrukcji mikrokontrolera 73
7.1. Tryby adresowania 74
7.2. Sumaryczne zestawienie instrukcji 77
Instrukcje arytmetyczne i logiczne 77
Instrukcje skoków 78
Instrukcje przesyłania danych 79
Instrukcje operacji bitowych 80
Instrukcje kontroli pracy jednostki centralnej 81
7.3. Opis działania instrukcji mikrokontrolera AV R 81
ADC – suma zawartości rejestrów z uwzględnieniem przeniesienia 82
ADD – suma zawartości rejestrów 83
ADIW – suma zawartości słowa i wartości stałej 84
AND – iloczyn logiczny zawartości rejestrów 85
ANDI – iloczyn logiczny zawartości rejestru i wartości stałej 86
ASR – arytmetyczne przesunięcie zawartości rejestru w prawo 87
BCLR – zerowanie bitu w rejestrze statusowym SREG 88
BLD – przepisanie wskaźnika T do bitu rejestru 89
BRBC – skok warunkowy (jeżeli bit w SREG jest wyzerowany) 90
BRBS – skok warunkowy (jeżeli bit w SREG jest ustawiony) 91
BRCC – skok warunkowy (jeżeli wskaźnik C jest wyzerowany) 92
BRCS – skok warunkowy (jeżeli wskaźnik C jest ustawiony) 93
BREAK – zatrzymanie CPU 94
BREQ – skok warunkowy (jeżeli wskaźnik Z jest ustawiony) 95
BRGE – skok warunkowy (dla warunku większy lub równy) 96
BRHC – skok warunkowy (jeżeli wskaźnik H jest wyzerowany) 97
BRHS – skok warunkowy (jeżeli wskaźnik H jest ustawiony) 98
BRID – skok warunkowy (jeżeli wskaźnik I jest wyzerowany) 99
BRIE – skok warunkowy (jeżeli wskaźnik I jest ustawiony) 100
BRLO – skok warunkowy (dla warunku mniejszy) 101
BRLT – skok warunkowy (dla warunku mniejszy) 102
BRMI – skok warunkowy (jeżeli wartość jest ujemna) 103
BRNE – skok warunkowy (jeżeli wskaźnik Z jest wyzerowany) 104
BRPL – skok warunkowy (jeżeli wartość jest dodatnia) 105
BRSH – skok warunkowy (dla większy lub równy) 106
BRTC – skok warunkowy (jeżeli wskaźnik T = 0) 107
BRTS – skok warunkowy (jeżeli wskaźnik T = 1) 108
BRVC – skok warunkowy (jeżeli wskaźnik V = 0) 109
BRVS – skok warunkowy (jeżeli wskaźnik V = 1) 110
BSET – ustawienie bitu w rejestrze statusowym SREG 111
BST – przepisanie bitu z rejestru do wskaźnika T 112
CALL – instrukcja wywołania procedury 113
CBI – zerowanie wskazanego bitu w rejestrze wejścia/wyjścia 114
CBR – zerowanie wskazanych bitów w rejestrze 115
CLC – zerowanie wskaźnika C w rejestrze SREG 116
CLH – zerowanie wskaźnika H w rejestrze SREG 117
CLI – zerowanie wskaźnika I w rejestrze SREG 118
CLN – zerowanie wskaźnika N w rejestrze SREG 119
CLR – zerowanie rejestru 120
CLS – zerowanie wskaźnika S w rejestrze SREG 121
CLT – zerowanie wskaźnika T w rejestrze SREG 122
CLV – zerowanie wskaźnika V w rejestrze SREG 123
CLZ – zerowanie wskaźnika Z w rejestrze SREG 124
COM – negacja logiczna 125
CP – porównanie 126
CPC – porównanie z uwzględnieniem wskaźnika przeniesienia 127
CPI – porównanie zawartości rejestru z wartością stałej 128
CPSE – porównanie zawartości rejestrów i warunkowe
pominięcie wykonania następnej instrukcji 129
DEC – zmniejszenie zawartości rejestru o 1 130
ELPM – rozszerzone pobranie bajtu z pamięci programu 131
EOR – suma logiczna Exclusive OR 132
FMUL – mnożenie ułamkowe liczb bez znaku 133
FMULS – mnożenie ułamkowe liczb ze znakiem 134
FMULSU – mnożenie ułamkowe liczby ze znakiem przez liczbę bez znaku 135
ICALL – instrukcja pośredniego wywołania procedury 136
IJMP – instrukcja pośredniego skoku bezwarunkowego 137
IN – przesłanie zawartości rejestru I/O do rejestru roboczego 138
INC – zwiększenie zawartości rejestru o 1 139
JMP – instrukcja bezpośredniego skoku bezwarunkowego 140
LD – przepisanie do rejestru zawartości komórki pamięci adresowanej pośrednio 141
LDD – przepisanie do rejestru zawartości komórki pamięci adresowanej
pośrednio z przesunięciem 143
LDI – bezpośrednie wpisanie do rejestru wartości stałej 144
LDS – przepisanie do rejestru zawartości komórki pamięci
adresowanej bezpośrednio 145
LPM – pobranie bajtu z pamięci programu 146
LSL – logiczne przesunięcie zawartości rejestru w lewo 147
LSR – logiczne przesunięcie zawartości rejestru w prawo 148
MOV – przepisanie zawartości rejestru do rejestru 149
MOVW – przepisanie zawartości pary rejestrów do innej pary rejestrów 150
MUL – mnożenie liczb bez znaku 151
MULS – mnożenie liczb ze znakiem 152
MULSU – mnożenie liczby ze znakiem z liczbą bez znaku 153
NEG – negacja arytmetyczna 154
NOP – instrukcja pusta 155
OR – suma logiczna zawartości rejestrów 156
ORI – suma logiczna zawartości rejestru i wartości stałej 157
OUT – przesłanie zawartości rejestru roboczego do rejestru I/O 158
POP – pobranie zawartości rejestru ze stosu 159
PUSH – odłożenie zawartości rejestru na stosie 160
RCALL – instrukcja wywołania procedury lub funkcji 161
RET – powrót z procedury lub funkcji 162
RETI – powrót z procedury obsługi przerwania 163
RJMP – instrukcja bezpośredniego skoku bezwarunkowego 164
ROL – obrót cykliczny zawartości rejestru w lewo 165
ROR – obrót cykliczny zawartości rejestru w prawo 166
SBC – różnica zawartości rejestrów z uwzględnieniem wskaźnika C 167
SBCI – różnica zawartości rejestru i wartości stałej z uwzględnieniem wskaźnika C 168
SBI – ustawienie wskazanego bitu w rejestrze wejścia/wyjścia 169
SBIC – warunkowe pominięcie następnej instrukcji (jeżeli bit w rejestrze wejścia/wyjścia jest wyzerowany) 170
SBIS – warunkowe pominięcie następnej instrukcji (jeżeli bit w rejestrze wejścia/wyjścia jest ustawiony) 171
SBIW – różnica zawartości słowa i wartość stałej 172
SBR – ustawienie bitów w rejestrze 173
SBRC – warunkowe pominięcie wykonania następnej instrukcji (jeżeli bit w rejestrze roboczym jest wyzerowany) 174
SBRS – warunkowe pominięcie wykonania następnej instrukcji (jeżeli bit w rejestrze roboczym jest ustawiony) 175
SEC – ustawienie wskaźnika C w rejestrze SREG 176
SEH – ustawienie wskaźnika H w rejestrze SREG 177
SEI – ustawienie wskaźnika I w rejestrze SREG 178
SEN – ustawienie wskaźnika N w rejestrze SREG 179
SER – ustaw wszystkie bity w rejestrze roboczym 180
SES – ustawienie wskaźnika S w rejestrze SREG 181
SET – ustawienie wskaźnika T w rejestrze SREG 182
SEV – ustawienie wskaźnika V w rejestrze SREG 183
SEZ – ustawienie wskaźnika Z w rejestrze SREG 184
SLEEP – przejście w tryb uśpienia 185
SPM – zapis do pamięci programu 186
ST – zapisanie zawartości rejestru w pamięci
RAM adresowanej pośrednio 187
STD – zapisanie zawartości rejestru w pamięci adresowanej pośrednio z przesunięciem 188
STS – zapisanie zawartości rejestru w pamięci
RAM adresowanej bezpośrednio 189
SUB – różnica zawartości rejestrów 190
SUBI – różnica zawartości rejestru i wartości stałej 191
SWAP – zamiana półbajtów w rejestrze 192
TST – test zawartości rejestru 193
WDR – zerowanie licznika watchdog 194
8. Opis języka asembler 195
8.1. Elementy języka 196
8.2. Dyrektywy 197
8.2.1. Dyrektywy segmentowe 198
8.2.2. Dyrektywa BYTE 200
8.2.3. Dyrektywa DB i DW 201
8.2.4. Dyrektywa DEVICE 203
8.2.5. Dyrektywa DEF 204
8.2.6. Dyrektywa EQU 204
8.2.7. Dyrektywa ORG 205
8.2.8. Dyrektywa MACRO 206
8.3. Funkcje i operatory występujące w wyrażeniach 206
8.4. Instrukcje asemblera 209
8.5. Kompilacja warunkowa 212
8.6. Pierwszy program 215
9. Instalacja programów narzędziowych 227
10. Zasady arytmetyki 233
10.1. Dodawanie liczb 235
10.2. Negacja liczb ze znakiem 236
10.3. Mnożenie liczb przez 2 238
10.4. Mnożenie liczb przez 10 240
10.5. Mnożenie liczb dwubajtowych 243
10.6. Dzielenie liczb przez 2 250
10.7. Dzielenie liczb przez 10 252
10.8. Dzielenie liczb 254
10.9. Porównywanie liczb jednobajtowych 257
10.10. Porównywanie liczb wielobajtowych 264
10.11. Badanie stanu bitów 266
10.12. Obsługa tekstów 267
11. Asembler a język wysokiego poziomu 269
11.1. Typy i zmienne 269
11.2. Instrukcja podstawienia 280
11.3. Instrukcja warunkowa 283
11.4. Instrukcje pętli 287
11.5. Instrukcje wyboru 293
11.6. Instrukcje wywołania procedury 295
11.7. Instrukcje wywołania funkcji 298
11.8. Rozważania końcowe 301
12. Wybrane algorytmy i ich użycie 303
12.1. Obsługa przerwań od upływu czasu 303
12.2. Obsługa klawiatury 323
13. Programowanie najprostszych mikrokontrolerów 345
Dodatek: znaki ASCII 347
Literatura 349