Serwis Edukacyjny
w I-LO w Tarnowie
obrazek

Materiały dla uczniów liceum

  Wyjście       Spis treści       Wstecz       Dalej  

obrazek

Autor artykułu: mgr Jerzy Wałaszek
Konsultacje: Wojciech Grodowski, mgr inż. Janusz Wałaszek

©2021 mgr Jerzy Wałaszek
I LO w Tarnowie

obrazek

Mikrokontrolery

ATtiny2313A/4313

Rdzeń mikroprocesora AVR

obrazek

Educational and Non-Profit Use of Copyrighted Material:

If you use Microchip copyrighted material solely for educational (non-profit) purposes falling under the “fair use” exception of the U.S. Copyright Act of 1976 then you do not need Microchip’s written permission. For example, Microchip’s permission is not required when using copyrighted material in: (1) an academic report, thesis, or dissertation; (2) classroom handouts or textbook; or (3) a presentation or article that is solely educational in nature (e.g., technical article published in a magazine).

https://www.microchip.com/about-us/legal-information/copyright-usage-guidelines

SPIS TREŚCI
Podrozdziały

obrazek

Rozdział ten opisuje ogólnie architekturę rdzenia AVR. Głównym zadaniem rdzenia mikroprocesora jest zapewnienie poprawnego wykonywania programu. W tym celu mikroprocesor musi posiadać dostęp do pamięci, wykonywać obliczenia, sterować układami peryferyjnymi i obsługiwać przerwania.

Przegląd architektury

Schemat blokowy architektury AVR

W celu zmaksymalizowania osiągów i współbieżności procesory AVR używają architekturę harwardzką – z rozdzielonymi pamięciami i magistralami dla programu i danych. Instrukcje w pamięci programu są wykonywane z jednopoziomowym nakładkowaniem. Gdy jedna instrukcja jest wykonywana, następna zostaje wstępnie pobrana z pamięci programu. Tym sposobem instrukcje są wykonywane w każdym cyklu zegara. Pamięć programu jest pamięcią FLASH reprogramowalną w układzie.

Zestaw rejestrów szybkiego dostępu zawiera 32 8-bitowe robocze rejestry ogólnego przeznaczenia o czasie dostępu w pojedynczym cyklu zegara. Pozwala to na jednotaktową operację w jednostce arytmetyczno-logicznej (JAL). W typowej operacji tej jednostki z zestawu rejestrów pobierana jest jednocześnie zawartość dwóch z nich, następnie jest wykonywana na nich operacja, a wynik jest z powrotem umieszczany w zestawie rejestrów – wszystko w jednym cyklu zegara.

Sześć z 32 rejestrów może zostać użyte jako trzy 16-bitowe wskaźniki adresowania pośredniego w przestrzeni adresowej danych – umożliwiając efektywne wyliczanie adresów. Jeden z tych wskaźników adresowych może być również użyty jako wskaźnik adresowy tablic wyszukiwań w pamięci FLASH programu. Te dodatkowe rejestry funkcyjne to 16-bitowe rejestry X, Y, i Z, opisane dalej w tym rozdziale.

Jednostka arytmetyczno-logiczna wykonuje operacje arytmetyczne i logiczne pomiędzy rejestrami lub pomiędzy stałą i rejestrem, a także operacje na pojedynczym rejestrze. Po operacji arytmetycznej uaktualniany jest rejestr stanu w celu odzwierciedlenia informacji o wyniku operacji.

Przebieg wykonywania instrukcji w programie może być regulowany przy pomocy instrukcji skoków warunkowych i bezwarunkowych oraz wywołań podprogramów zdolnych do bezpośredniego pokrycia całej przestrzeni adresowej. Większość instrukcji AVR posiada format 16-bitowy, lecz istnieją również szerokie instrukcje 32-bitowe. Właściwy zestaw instrukcji zmienia się w zależności od typu mikrokontrolera, ponieważ niektóre egzemplarze implementują tylko część pełnego zestawu instrukcji.

Podczas przerwań i wywołań podprogramów na stosie umieszczany jest adres powrotu z licznika rozkazów (ang. program counter, PC). Stos jest umieszczany w obrębie pamięci danych SRAM i konsekwentnie jego rozmiar jest jedynie ograniczony przez rozmiar dostępnej pamięci SRAM oraz jej wykorzystywanie w aplikacji. Wszystkie programy użytkownika muszą zainicjować wskaźnik stosu (ang. stack pointer, SP) w procedurze resetowania (zanim będą wykonywane podprogramy lub przerwania). Wskaźnik stosu jest rejestrem do zapisu i odczytu dostępnym w przestrzeni we/wy. Dostęp do pamięci danych SRAM jest z łatwością uzyskiwany poprzez cztery różne tryby adresowania obsługiwane przez architekturę AVR.

Wszystkie obszary pamięci w architekturze AVR są liniowe i regularne.

Elastyczny moduł przerwań posiada swoje rejestry sterujące w obszarze we/wy oraz dodatkowo bit globalnego włączania przerwań w rejestrze stanu. Wszystkie przerwania posiadają oddzielny wektor przerwań w tablicy wektorów przerwań. Przerwania posiadają priorytety zgodne z położeniem swoich wektorów przerwań. Im niższy adres wektora przerwań, tym wyższy priorytet.

Przestrzeń we/wy zawiera 64 adresy na potrzeby funkcji obsługi układów peryferyjnych przez CPU, takie jak rejestry sterujące, SPI (ang. serial peripheral interface) oraz inne funkcje we/wy. Pamięć we/wy może być adresowana jako pamięć danych za obszarem rejestrów roboczych o adresach w zakresie 0x20 ... 0x5F.

Na początek:  podrozdziału   strony 

Jednostka arytmetyczno-logiczna

Wysoko wydajna jednostka arytmetyczno-logiczna AVR (ang. arithmetic logic unit, ALU) pracuje z bezpośrednim połączeniem z 16 roboczymi rejestrami ogólnego przeznaczenia. W ciągu pojedynczego cyklu zegarowego wykonywane są operacje arytmetyczne pomiędzy dowolnymi dwoma rejestrami ogólnego przeznaczenia lub pomiędzy rejestrem a wartością bezpośrednią. Operacje wykonywane przez JAL dzielą się na trzy główne kategorie – arytmetyczne, logiczne i bitowe. Niektóre implementacje tej architektury udostępniają również obsługę mnożenia liczb całkowitych ze znakiem i bez oraz liczb ułamkowych. Zobacz do rozdziałów ”Instrukcje AVR" oraz  “Zestaw instrukcji”, gdzie znajdziesz więcej szczegółów.
Na początek:  podrozdziału   strony 

Rejestr stanu

Rejestr stanu SREG (ang. status register) zawiera informację o wyniku ostatnio wykonanej instrukcji arytmetycznej. Informację tę można wykorzystać do zmiany przebiegu programu w celu wykonania operacji warunkowych. Zwróć uwagę, że rejestr stanu jest uaktualniany po wszystkich operacjach JAL, jak określono w rozdziałach “Instrukcje AVR” oraz “Zestaw instrukcji”. To w wielu przypadkach usunie potrzebę użycia dedykowanych funkcji porównujących, dając w wyniku szybszy i krótszy kod.

Rejestr stanu nie jest automatycznie zapamiętywany przy wejściu do procedury obsługującej przerwanie ani odtwarzany przy wyjściu z tej procedury. Musi to być zrobione programowo.

SREG – Status Register – Rejestr stanu

Rejestr stanu mikroprocesora (SREG) umieszczony w przestrzeni we/wy pod adresem $3F posiada następującą definicję:

Bit 7 6 5 4 3 2 1 0  
0x3F (0x5F) I T H S V N Z C SREG
Zapis/Odczyt Z/O Z/O Z/O Z/O Z/O Z/O Z/O Z/O  
Wartość początkowa 0 0 0 0 0 0 0 0  

Bit 7 – I: Globalne Uaktywnienie Przerwań

Bit globalnego uaktywnienia przerwań (ang. Global Interrupt Enable bit) musi być ustawiony, aby mikrokontroler zaczął reagować na przerwania. Włączanie indywidualnych przerwań wykonywane jest wtedy w rejestrach GIMSK oraz TIMSK. Jeśli bit ten jest wyzerowany, to żadne przerwanie nie będzie aktywne bez względu na indywidualne ustawienia przerwań w GIMSK i TIMSK. Bit I jest zerowany przez logikę mikrokontrolera po wystąpieniu jakiegoś przerwania, a jest z powrotem ustawiany na 1 przez instrukcję RETI, aby włączyć obsługę kolejnych przerwań. Bit I może również być zerowany i ustawiany  przez instrukcje SEI i CLI (zobacz do rozdziałów "Instrukcje AVR" i "Zestaw instrukcji").

Bit 6 – T: Przechowanie bitu przy kopiowaniu

Instrukcje kopiowania bitu BLD (Bit LoaD) i BST (Bit STore) używają bitu T jako bitu źródłowego i docelowego. Bit z rejestru można skopiować do T za pomocą instrukcji BST, a bit w T można skopiować do bitu w rejestrze za pomocą instrukcji BLD.

Bit 5 – H: Znacznik połówkowego przeniesienia

Znacznik H oznacza przeniesienie połówkowe (z bitu czwartego na piąty) w niektórych operacjach arytmetycznych. Jest on użyteczny w arytmetyce liczb BCD (ang. binary coded decimal – liczby dziesiętne kodowane dwójkowo) (zobacz do rozdziałów "Instrukcje AVR" i "Zestaw instrukcji").

Bit 4 – S: Bit znaku, S = N obrazek V

Bit znaku jest zawsze wynikiem operacji sumy modulo dwa pomiędzy znacznikiem liczby ujemnej N oraz znacznikiem nadmiaru V liczb w systemie uzupełnień do podstawy 2 (zobacz do rozdziałów "Instrukcje AVR" i "Zestaw instrukcji").

Bit 3 – V: Znacznik nadmiaru dla liczb w systemie uzupełnień do podstawy 2

Znacznik ten wspiera arytmetykę liczb w systemie U2 (zobacz do rozdziałów "Instrukcje AVR" i "Zestaw instrukcji").

Bit 2 – N: Znacznik liczby ujemnej

Znacznik ten wskazuje na ujemny wynik w operacji arytmetycznej lub logicznej (zobacz do rozdziałów "Instrukcje AVR" i "Zestaw instrukcji").

Bit 1 – Z: Znacznik zera

Znacznik ten oznacza zerowy wynik w operacji arytmetycznej lub logicznej (zobacz do rozdziałów "Instrukcje AVR" i "Zestaw instrukcji").

Bit 0 – C: Znacznik przeniesienia

Znacznik C wskazuje na przeniesienie w operacji arytmetycznej lub logicznej (zobacz do rozdziałów "Instrukcje AVR" i "Zestaw instrukcji").

Na początek:  podrozdziału   strony 

Zestaw rejestrów ogólnego przeznaczenia

Zestaw rejestrów jest zoptymalizowany dla rozszerzonego zestawu instrukcji RISC AVR. W celu osiągnięcia pożądanej wydajności i elastyczności następujące schematy wejścia/wyjścia są wspierane przez zestaw rejestrów:

Poniższy rysunek przedstawia strukturę 32 rejestrów ogólnego przeznaczenia wewnątrz mikroprocesora AVR:

obrazek

Większość instrukcji operujących na zestawie rejestrów posiada bezpośredni dostęp do wszystkich rejestrów, a większość z nich to instrukcje wykonywane w jednym cyklu zegarowym.

Jak pokazuje powyższy rysunek, każdy rejestr ma również powiązany z nim adres pamięci danych, co odwzorowuje rejestry bezpośrednio w pierwszych 32 komórkach przestrzeni danych użytkownika. Chociaż rejestry te nie są fizycznie zaimplementowane jako komórki pamięci SRAM, to taka organizacja pamięci udostępnia dużą elastyczność przy dostępie do rejestrów, ponieważ rejestry wskaźnikowe X, Y i Z można ustawić tak, aby indeksowały dowolny rejestr w zestawie.

Rejestry X, Y i Z

Rejestry R26...R31 posiadają dodatkowe funkcje oprócz ich ogólnego zastosowania. Tworzą one 16-bitowe wskaźniki do adresowania pośredniego obszaru danych. Trzy rejestry adresowania pośredniego X, Y i Z są zdefiniowane tak, jak pokazano na poniższym rysunku:

W różnych trybach adresowania zawartość tych rejestrów adresowych jest automatycznie zwiększana o 1 lub zmniejszana o 1 (zobacz do rozdziałów "Instrukcje AVR" i "Zestaw instrukcji")

Na początek:  podrozdziału   strony 

Wskaźnik stosu

Stos jest głównie używany do przechowywania tymczasowych danych, zmiennych lokalnych oraz adresów powrotnych z przerwań i podprogramów. Rejestr wskaźnika stosu zawsze wskazuje szczyt stosu. Zwróć uwagę, iż stos jest zaimplementowany tak, iż rośnie w kierunku niższych adresów (od góry obszaru pamięci w dół). Oznacza to, iż polecenie umieszczenia na stosie zmniejsza zawartość wskaźnika stosu.

Wskaźnik stosu wskazuje obszar pamięci danych SRAM, gdzie są umieszczone stosy przerwań i podprogramów. Ten obszar stosu w pamięci danych SRAM musi zostać zdefiniowany przed wywołaniem jakiegokolwiek podprogramu lub przed włączeniem przerwań. Wskaźnik stosu musi być tak ustawiony, aby wskazywał ponad adres 0x60.

Wskaźnik stosu jest zmniejszany o 1, gdy dane są umieszczane na stosie za pomocą instrukcji PUSH, a zmniejszany o 2, gdy na stosie zostaje umieszczony adres powrotny przez wywołanie podprogramu lub wystąpienie przerwania.

Wskaźnik stosu jest zwiększany o 1, gdy dane są pobierane ze stosu przy pomocy instrukcji POP, a jest zwiększany o 2, gdy dane są pobierane ze stosu przy powrocie z podprogramu instrukcją RET lub przy powrocie z przerwania instrukcją RETI.

Wskaźnik stosu AVR jest zaimplementowany jako dwa 8-bitowe rejestry w obszarze we/wy. Rzeczywista liczba używanych bitów zależy od konkretnej implementacji (typu mikrokontrolera). Zwróć uwagę, że obszar danych w niektórych implementacjach architektury AVR jest tak mały, iż jedynie młodszy bajt SPL (ang. stack pointer low byte) jest potrzebny. W takim przypadku rejestr starszego bajtu SPH (ang. stack pointer high byte) nie będzie obecny. W ATtiny2313A/4313 rejestr stosu jest 8-bitowy.

Bit 15 14 13 12 11 10 9 8  
0x3E SPH
0x3D (0x5D) SP7 SP6 SP5 SP4 SP3 SP2 SP1 SP0 SPL
Bit 7 6 5 4 3 2 1 0  
Zapis/Odczyt O O O O O O O O  
  Z/O Z/O Z/O Z/O Z/O Z/O Z/O Z/O  
Wartość początkowa RAMEND RAMEND RAMEND RAMEND RAMEND RAMEND RAMEND RAMEND  
  RAMEND RAMEND RAMEND RAMEND RAMEND RAMEND RAMEND RAMEND  
Na początek:  podrozdziału   strony 

Czasy wykonywania instrukcji

Ten rozdział opisuje ogólne zagadnienia czasów wykonywania instrukcji. Procesor AVR jest synchronizowany impulsami zegarowymi clkCPU, bezpośrednio generowanymi z wybranego źródła zegara dla układu. Wewnątrz nie jest stosowany żaden podział zegara.

obrazek

Powyższy rysunek pokazuje równoległe pobrania i wykonania instrukcji w architekturze harwardzkiej. Jest to podstawowa koncepcja nakładkowania w celu osiągnięcia do 1 MIPS na MHz z odpowiednimi unikalnymi wynikami redukcji kosztów, wykorzystania zegara oraz zmniejszenia poboru energii.

Niżej przedstawiono wewnętrzne czasy dostępu do zestawu rejestrów. W pojedynczym cyklu zegara wykonywana jest operacja jednostki arytmetyczno-logicznej przy użyciu dwóch argumentów-rejestrów, a wynik zostaje z powrotem umieszczony w rejestrze docelowym.

obrazek

Na początek:  podrozdziału   strony 

Reset i obsługa przerwań

Architektura AVR dostarcza kilku różnych źródeł przerwań. Przerwania te wraz z Resetem posiadają osobne wektory przerwań w obszarze pamięci programu. Wszystkie przerwania posiadają przydzielone sobie indywidualne bity sterujące, które muszą zostać ustawione w stan logiczny 1 wraz z globalnym bitem uaktywniania przerwań I w rejestrze stanu, aby dane przerwanie zostało uaktywnione. Pełny opis listy wektorów znajdziesz  w rozdziale "Przerwania". Lista ta określa również poziomy priorytetów (ważności) różnych przerwań. Im niższy adres posiada wektor, tym wyższy ma priorytet. Najwyższy priorytet ma RESET, a następnie INT0 – żądanie przerwania zewnętrznego 0 (ang. External Interrupt Request 0).

Gdy wystąpi przerwanie zostaje wyzerowany bit I globalnego uaktywniania przerwań, a wszystkie inne przerwania zostają zablokowane. Program użytkownika może ustawić bit w stan logiczny 1 w celu uaktywnienia przerwań zagnieżdżonych. Wtedy wszystkie uaktywnione przerwania mogą przerywać bieżącą procedurę obsługi przerwania. Bit I zostaje automatycznie ustawiony w stan 1, gdy jest wykonywana instrukcja powrotu z obsługi przerwania – RETI.

Zasadniczo są dwa rodzaje przerwań. Pierwszy jest wyzwalany przez zdarzenie ustawiające określony znacznik przerwania. Przy tych przerwaniach licznik rozkazów zostaje przekierowany na odpowiedni wektor przerwania w celu wykonania procedury obsługującej to przerwanie, a znacznik przerwania zostaje wyzerowany sprzętowo. Znaczniki przerwań mogą również być zerowane przez zapis logicznej 1 (nie zera!) na pozycji znacznika, który ma zostać wyzerowany. W ten sposób można wyzerować naraz więcej niż jeden znacznik przerwania. Jeśli pojawi się warunek przerwania, gdy odpowiadający mu bit uaktywnienia jest wyzerowany, znacznik przerwania zostaje ustawiony i zapamiętany, aż przerwanie to będzie uaktywnione lub znacznik zostanie wyzerowany programowo. Podobnie, jeśli zdarzy się jeden lub więcej warunków przerwania, gdy bit I globalnego uaktywnienia przerwań jest wyzerowany, to odpowiednie znaczniki przerwania będą ustawione i zapamiętane, aż bit I zostanie ustawiony, a wtedy procedury obsługi przerwań będą wywoływane w kolejności ich priorytetów.

Drugi rodzaj przerwań będzie wyzwalany tak długo, jak obecny jest warunek przerwania. Tego rodzaju przerwanie niekoniecznie posiadają znaczniki przerwania. Jeśli warunek przerwania zniknie, zanim przerwanie to zostanie uaktywnione, to przerwanie nie zostanie wyzwolone..

Gdy mikrokontroler AVR wychodzi z procedury obsługującej przerwanie, zawsze wraca do głównego programu i wykonuje jedną więcej instrukcję zanim zostanie obsłużone następne, oczekujące przerwanie.

Zauważ, iż rejestr stanu nie jest automatycznie zachowywany przy wejściu do procedury obsługi przerwania ani odtwarzany przy powrocie z procedury obsługi przerwania. Musi być to zrobione programowo.

Gdy zostanie użyta instrukcja CLI w celu zablokowania obsługi przerwań, przerwania zostaną natychmiast wyłączone. Po instrukcji CLI nie zostanie obsłużone żadne przerwanie, nawet jeśli wystąpi ono jednocześnie z instrukcją CLI.

Poniższy przykład pokazuje sposób użycia tej instrukcji w celu uniknięcia przerwań podczas wykonywania sekwencji zapisu do pamięci EEPROM:

Przykład w kodzie maszynowym
  in r16, SREG    ; zachowaj zawartość SREG
  cli             ; wyłącz przerwania podczas sekwencji zapisu
  sbi EECR, EEMPE ; rozpocznij zapis EEPROM
  sbi EECR, EEPE
  out SREG, r16   ; odtwórz zawartość SREG (bit I) 
Przykład w języku C
char cSREG;
cSREG = SREG;       /* zachowaj zawartość SREG */
/* wyłącz przerwania podczas sekwencji zapisu */
__disable_interrupt();
EECR |= (1<<EEMPE); /* rozpocznij zapis w EEPROM */
EECR |= (1<<EEPE);
SREG = cSREG;       /* odtwórz zawartość SREG (bit I) */

Gdy zostanie użyta instrukcja SEI do uaktywnienia obsługi przerwań, instrukcja występująca za SEI zostanie wykonana przed obsługą jakiegokolwiek oczekującego przerwania, jak pokazano w poniższym przykładzie

Przykład w kodzie maszynowym
  sei   ; włącz globalnie przerwania
  sleep ; wejdź w stan uśpienia, oczekując na przerwanie
  ; Uwaga: mikrokontroler wejdzie w uśpienie przed
  ; obsługą jakiegokolwiek oczekującego przerwania
Przykład w języku C
__enable_interrupt(); /* włącz globalnie przerwania */
__sleep();            /* wejdź w stan uśpienia, oczekując na przerwanie */
                      /* uwaga: tryb uśpienia zostanie uaktywniony przed obsługą
                         oczekującego przerwania */

Czas odpowiedzi na przerwanie

Czas pomiędzy wystąpieniem przerwania a rozpoczęciem jego obsługi wynosi minimum cztery cykle zegarowe dla wszystkich uaktywnionych przerwań AVR. Po czterech cyklach zegarowych mikrokontroler przechodzi do wykonania programu pod adresem wektora wektora przerwania. Podczas tych czterech cykli zegara licznik rozkazów jest umieszczany na stosie. Wektor jest zwykle skokiem do procedury obsługi przerwania, a ten skok zabiera trzy cykle zegara. Jeśli przerwanie wystąpi podczas wykonywania instrukcji wielocyklowej, to instrukcja ta jest doprowadzana do końca przed obsługa przerwania. Jeśli przerwanie wystąpi, gdy mikrokontroler jest w trybie uśpienia, to czas obsługi zwiększa się o cztery cykle zegarowe. Ten wzrost dodaje się do czasu wybudzania z wybranego trybu uśpienia.

Powrót z procedury obsługi przerwania zabiera cztery cykle zegara. Podczas tych czterech cykli licznik rozkazów (dwa bajty) jest pobierany ze stosu, wskaźnik stosu jest zwiększany o 2, a bit I w SREG zostaje ustawiony na 1.

Na początek:  podrozdziału   strony 

Zespół Przedmiotowy
Chemii-Fizyki-Informatyki

w I Liceum Ogólnokształcącym
im. Kazimierza Brodzińskiego
w Tarnowie
ul. Piłsudskiego 4
©2021 mgr Jerzy Wałaszek

Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone
pod warunkiem podania źródła oraz niepobierania za to pieniędzy.

Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl

Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.