background image

Mikroprocesory i mikrosterowniki 

kolokwium 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: 

 

 

 

 

 

background image

Mikroprocesory i mikrosterowniki 

kolokwium 1 

 

 

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. 

background image

Mikroprocesory i mikrosterowniki 

kolokwium 1 

 

 

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: 
 
 
 
 

background image

Mikroprocesory i mikrosterowniki 

kolokwium 1 

 

 

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. 

background image

Mikroprocesory i mikrosterowniki 

kolokwium 1 

 

 

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) 

 

 

background image

Mikroprocesory i mikrosterowniki 

kolokwium 1 

 

 

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. 
 
 

background image

Mikroprocesory i mikrosterowniki 

kolokwium 1 

 

 

 

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) 
 
 

background image

Mikroprocesory i mikrosterowniki 

kolokwium 1 

 

 

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 

 

 

 

background image

Mikroprocesory i mikrosterowniki 

kolokwium 1 

 

 

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. 
  
 
 
 
 
 
 
 
 
 
 

 

background image

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 

 
 

background image

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.