Serwis Edukacyjny w I-LO w Tarnowie Materiały dla uczniów liceum |
Wyjście Spis treści Wstecz Dalej Autor artykułu: mgr Jerzy Wałaszek |
©2024 mgr Jerzy Wałaszek |
https://www.microchip.com/about-us/legal-information/copyright-usage-guidelines
Schemat blokowy architektury AVR
Sześć z 16 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 o adresach w zakresie 0x0000 ... 0x003F.
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.
Poniższy rysunek pokazuje strukturę 16 roboczych rejestrów ogólnego przeznaczenia w mikroprocesorze:
Uwaga: | Typowa implementacja zestawu rejestrów AVR zawiera 32 rejestry ogólnego przeznaczenia, lecz mikrokontrolery ATtiny20 implementują tylko 16 rejestrów. Z powodów kompatybilności rejestry te są numerowane jako R16...R31, a nie jako R0...R15. |
Większość instrukcji operujących na zestawie rejestrów posiada bezpośredni dostęp do wszystkich rejestrów, a większość z nich wykonuje się w jednym cyklu zegarowym.
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”).
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 0x40.
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.
Wskaźnik stosu musi zostać tak ustawiony, aby wskazywał ponad obszar rejestrów we/wy, a najmniejsza wartość to najniższy adres w pamięci SRAM.
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 zmniejszania kosztów, wykorzystania zegara oraz zmniejszenia poboru energii.
Niżej przedstawiono wewnętrzny chronometraż 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.
Program użytkownika może wpisać logiczne 1 do bitu I, aby uaktywnić zagnieżdżone przerwania.
Wtedy wszystkie uaktywnione przerwania mogą przerwać wykonywanie bieżącej procedury obsługi przerwania. Bit I jest automatycznie ustawiany na 1, gdy następuje powrót z procedury obsługi przerwania przez wykonanie instrukcji RETI.
Istnieją zasadniczo dwa rodzaje przerwań. Pierwszy rodzaj jest wyzwalany przez zdarzenie ustawiające znacznik przerwania (ang. interrupt flag). Dla tych przerwań licznik rozkazów (ang. program counter) przyjmuje zawartość aktualnego wektora przerwań w celu wykonania procedury obsługi przerwania, a układy logiczne zerują odpowiedni znacznik przerwania. Znacznik przerwania może również być wyzerowany przez zapisanie logicznej jedynki (nie zera!) na pozycji bitu znacznika, który ma zostać wyzerowany (w ten sposób można jednocześnie wyzerować kilka znaczników wpisując bity 1 na ich pozycjach). Jeśli warunek przerwania wystąpi w czasie, gdy odpowiadający mu bit uaktywniający przerwanie jest wyzerowany, znacznik przerwania zostanie ustawiony i zapamiętany aż do uaktywnienia tego przerwania lub wyzerowania znacznika przez oprogramowanie. Podobnie, jeśli wystąpi jedno lub więcej przerwań, gdy bit globalnego uaktywniania przerwań jest wyzerowany, to odpowiedni znacznik (lub znaczniki) przerwania zostanie ustawiony i zapamiętany aż do ustawienia na 1 globalnego bitu uaktywniania przerwań, a wtedy przerwanie zostanie obsłużone zgodnie z jego priorytetem.
Drugi rodzaj przerwań jest wyzwalany gdy pojawi się odpowiedni warunek wyzwolenia przerwania. Te przerwania niekoniecznie posiadają znaczniki przerwania. Jeśli warunek przerwania zniknie zanim dane przerwanie będzie uaktywnione, to przerwanie nie zostanie wyzwolone.
Gdy AVR wychodzi z przerwania, zawsze wraca do głównego programu i wykonuje jedną instrukcję więcej, zanim obsłuży jakiekolwiek oczekujące przerwanie.
Zwróć uwagę, że rejestr stanu (ang. status register) nie jest automatycznie zapamiętywany przy wejściu do procedury obsługi przerwania, ani automatycznie odtwarzany przy wyjściu z tej procedury. To musi być wykonane przez program.
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.
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 ; ustaw bit globalnego uaktywniania przerwań sleep ; wejdź w uśpienie, czekając na przerwanie ; uwaga: wejście w uśpienie nastąpi przed jakimkolwiek oczekującym przerwaniem |
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 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.
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0x3C | CCP[7:0] | CCP | |||||||
Zapis/Odczyt | Z | Z | Z | Z | Z | Z | Z | Z/O | |
Wartość początkowa | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
W celu zmiany zawartości chronionego rejestru we/wy rejestr CCP musi zostać najpierw zapisany poprawną sygnaturą. Po zapisie rejestru CCP chronione rejestry we/wy mogą zostać zapisane nową zawartością podczas następnych czterech cykli instrukcji (nie taktów!) mikroprocesora. Podczas tych cykli ignorowane są wszystkie przerwania. Po tych cyklach przerwania są znów automatycznie obsługiwane przez mikroprocesor, a oczekujące przerwania zostaną obsłużone zgodnie z ich priorytetami. Gdy sygnatura chronionego rejestru we/wy zostanie zapisana, bit CCP[0] będzie miał wartość 1 tak długo, jak chroniony zapis jest uaktywniony, natomiast bity CCP[7:1] zawsze będą wyzerowane.
Poniższa tabela przedstawia sygnatury rozpoznawane przez rejestr CCP:
Sygnatura | Grupa | Opis |
0xD8 | IOREG: CLKMSR, CLKPSR, WDTCSR(1), MCUCR(2) | Chroniony rejestr we/wy |
Uwagi: | 1. | Tylko bit WDE i bity WDP[3:0] są chronione w rejestrze WDTCSR |
2. | Tylko bit BODS jest chroniony w rejestrze MCUCR |
Bit | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | |
0x3E | - | - | - | - | - | - | - | - | SPH |
0x3D | SP7 | SP6 | SP5 | SP4 | SP3 | SP2 | SP1 | SP0 | SPL |
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
Zapis/Odczyt | 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 |
Rejestr wskaźnika stosu wskazuje szczyt stosu, który jest zaimplementowany jako rosnący w kierunku spodu pamięci RAM. Stąd polecenie przesłania na stos, PUSH, zmniejsza zawartość wskaźnika stosu.
Obszar stosu w pamięci danych SRAM musi zostać zdefiniowany przez program przed wykonaniem wywołań jakiegokolwiek podprogramu lub uaktywnieniem obsługi przerwań.
W mikrokontrolerze ATtiny20 rejestr SPH nie został zaimplementowany.
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0x3F | 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 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 oddzielnych rejestrach sterujących. Jeśli bit ten jest wyzerowany, to żadne przerwanie nie będzie aktywne bez względu na indywidualne ustawienia przerwań. 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").
Instrukcje kopiowania bitu BLD (Bit LoaD) i BLD (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.
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 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").
Znacznik ten wspiera arytmetykę liczb w systemie U2 (zobacz do rozdziałów "Instrukcje AVR" i "Zestaw instrukcji").
Znacznik ten wskazuje na ujemny wynik w operacji arytmetycznej lub logicznej (zobacz do rozdziałów "Instrukcje AVR" i "Zestaw instrukcji").
Znacznik ten oznacza zerowy wynik w operacji arytmetycznej lub logicznej (zobacz do rozdziałów "Instrukcje AVR" i "Zestaw instrukcji").
Znacznik C wskazuje na przeniesienie w operacji arytmetycznej lub logicznej (zobacz do rozdziałów "Instrukcje AVR" i "Zestaw instrukcji").
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2024 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:
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.