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
Zestaw szybkich rejestrów składa się z 32 8-bitowych rejestrów roboczych ogólnego przeznaczenia z czasem dostępu równym jednemu cyklowi zegara. Oznacza to, iż podczas jednego cyklu zegarowego wykonywana jest jedna operacja jednostki arytmetyczno-logicznej (ang. Arithmetic Logic Unit, ALU). Na początku cyklu z zestawu rejestrów wyprowadzana jest zawartość dwóch rejestrów, następnie w środku cyklu wykonywana jest operacja na tej zawartości, a pod koniec cyklu wynik zostaje z powrotem wpisany do zestawu rejestrów – wszystko odbywa się w jednym cyklu zegara.
Dwa z tych 32 rejestrów mogą zostać użyte jako 16-bitowy wskaźnik przy pośrednim dostępie do pamięci. Wskaźnik ten nazywany jest wskaźnikiem Z (ang. Z-pointer) i może adresować rejestry w zestawie, rejestry we/wy oraz pamięć FLASH programu.
Architektura RISC AVR mikrokontrolera ATtiny15
Jednostka arytmetyczno-logiczna (ALU) wykonuje operacje arytmetyczne i logiczne pomiędzy rejestrami lub pomiędzy stałą i rejestrem. Operacje na pojedynczym rejestrze również są wykonywane w ALU. Powyższy rysunek przedstawia schematycznie architekturę AVR RISC mikrokontrolera ATtiny15. AVR używa koncepcji architektury harwardzkiej z rozdzielonymi pamięciami i magistralami dla pamięci programu i danych. Dostęp do pamięci programu odbywa się z dwuetapowym nakładkowaniem (ang. two-stage pipeline). Gdy wykonywana jest jedna instrukcja, następna zostaje wstępnie pobrana z pamięci programu. Koncepcja ta pozwala wykonywać instrukcje w każdym cyklu zegara. Pamięć programu jest pamięcią FLASH programowalną w systemie (ang. In-System Programmable FLASH memory).
Cała przestrzeń adresowa jest bezpośrednio dostępna dla skoku względnego i wywołania względnego. Wszystkie instrukcje AVR posiadają pojedynczy 16-bitowy format, co oznacz, iż każda 16-bitowa komórka pamięci programu zawiera pojedynczą 16-bitową instrukcję.
Podczas przerwań i wywołań podprogramów adres powrotny w liczniku programu (ang. Program Counter, PC) jest umieszczany na stosie (ang. Stack). Stos jest stosem sprzętowym o pojemności 3 adresów, który został przeznaczony dla podprogramów i przerwań. Taka pojemność stosu ogranicza zagnieżdżanie wywołań podprogramów, lecz musisz pamiętać, iż ATtiny15 przeznaczony jest do prostych zastosowań, które nie wymagają skomplikowanych programów.
Przestrzeń adresowa we/wy zawiera 64 adresy dla funkcji peryferyjnych mikroprocesora takich jak rejestry sterujące, timery/liczniki oraz inne funkcje we/wy. Wszystkie przestrzenie adresowe w architekturze AVR są liniowymi i regularnymi odwzorowaniami pamięciowymi.
Elastyczny moduł przerwań posiada swoje rejestry sterujące w przestrzeni we/wy z dodatkowym bitem uaktywniającym globalnie przerwania (ang. Global Interrupt Enable bit) w rejestrze stanu (ang. Status Register). Wszystkie różne przerwania mają swoje oddzielne wektory przerwań (ang. Interrupt Vectors) w tablicy wektorów przerwań znajdującej się na początku pamięci programu. Różne przerwania posiadają priorytety zgodnie z pozycją ich wektora przerwań. Im niższy adres wektora, tym wyższy priorytet.
Wektor przerwania jest adresem w pamięci programu, pod który następuje skok w momencie rozpoczęcia obsługi danego przerwania. Pod tym adresem znajduje się najczęściej instrukcja skoku względnego do procedury obsługi przerwania. Dzięki temu rozwiązaniu procedura ta może być umieszczana w dowolnie wybranym miejscu pamięci programu.
Zestaw rejestrów ogólnego przeznaczenia w ATtiny15
7 | 0 |
R0 | |
R1 | |
R2 | |
... | |
... | |
R28 | |
R29 | |
R30 (dolny bajt rejestru Z) | |
R31 (górny bajt rejestru Z) |
Wszystkie instrukcje operujące na rejestrach w zestawie instrukcji posiadają bezpośredni i jedno-cyklowy dostęp do wszystkich rejestrów. Jedynym wyjątkiem jest pięć instrukcji arytmetycznych i logicznych SBCI, SUBI, CPI, ANDI i ORI pomiędzy stałą a rejestrem oraz instrukcja LDI lądująca bezpośrednie dane stałe. Instrukcje te operują na drugiej połowie rejestrów w zestawie – R16..R31. Ogólne instrukcje SBC, SUB, CP, AND, OR oraz wszystkie pozostałe operacje pomiędzy dwoma rejestrami lub na pojedynczym rejestrze mają dostęp do wszystkich rejestrów w całym zestawie.
Rejestry 30 i 31 tworzą 16-bitowy wskaźnik (wskaźnik Z), który jest wykorzystywany do pośredniego dostępu do pamięci FLASH oraz do zestawu rejestrów. Gdy wykonywany jest dostęp do zestawu rejestrów, zawartość R31 (górny bajt wskaźnika Z) jest ignorowana przez mikroprocesor.
Licznik programu w ATtiny15 ma długość 9 bitów, co pozwala mu zaadresować 512 słów pamięci programu we FLASH.
Szczegółowy opis pamięci FLASH znajdziesz w rozdziale o jej programowaniu.
Więcej na ten temat znajdziesz w rozdziale "Instrukcje AVR".
Argument instrukcji zawarty jest w rejestrze d (Rd).
Dostęp następuje do rejestru wskazywanego przez dolny bajt rejestru Z (R30). Zawartość górnego bajtu (R31) jest ignorowana.
Argumenty instrukcji znajdują się w rejestrach r (Rr) i d (Rd). Wynik jest zapisywany w rejestrze d (Rd).
Adres argumentu zawarty jest w 6 bitach słowa instrukcji. Pole Rr/Rd określa rejestr docelowy lub źródłowy.
Tryb dotyczy instrukcji RJMP i
RCALL. Pole k jest zwiększane o 1 i
dodawane do aktualnej zawartości licznika rozkazów, a wynik
zostaje umieszczony w liczniku rozkazów. W efekcie
mikrokontroler wykona instrukcję spod adresu
Tryb ten odnosi się do instrukcji LPM. Adres bajtu stałej jest określany przez zawartość rejestru Z. Pamięć programu zorganizowana jest w słowa 16-bitowe, zatem każda jej komórka składa się z dwóch bajtów: dolnego (ang. Less Significant Bajt, LSB) oraz górnego (ang. More Significant Byte, MSB). 15 starszych bitów rejestru Z stanowi adres komórki ze stałą, czyli adres słowa 16-bitowego. Dla instrukcji LPM najmłodszy bit rejestru Z wybiera dolny bajt stałej, jeśli jest wyzerowany, lub górny bajt stałej, jeśli jest ustawiony na 1.
Jeśli wystąpią kolejno więcej niż 3 wywołania podprogramów lub przerwań, to pierwsze wartości zapisane na stosie ulegną nadpisaniu. Umieszczenie na stosie czterech adresów powrotnych A1, A2, A3 i A4, a następnie wykonanie czterech powrotów, pobierze ze stosu A4, A3, A2 i jeszcze raz A2.
Na pierwszy rzut oka może to wyglądać na wadę mikrokontrolera. Pamiętaj jednak, iż ATtiny15 opracowano specjalnie dla prostych zastosowań. Jeśli potrzebujesz wywoływać dużo podprogramów lub stosujesz złożony system przerwań, to prawdopodobnie potrzebny będzie ci inny mikrokontroler.
Rysunek poniżej pokazuje pobieranie instrukcji równolegle z ich wykonywaniem, co umożliwia architektura harwardzka i zbiór rejestrów o szybkim dostępie. Jest to podstawowa koncepcja nakładkowania w celu osiągnięcia wydajności do 1 MIPSa (ang. Million Instructions per Second – milion operacji na sekundę) na 1 MHz zegara 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 JAL przy użyciu dwóch argumentów-rejestrów, a wynik zostaje z powrotem umieszczony w rejestrze docelowym.
Adres | Nazwa | Funkcja |
0x3F | SREG | Rejestr stanu |
0x3B | GIMSK | Ogólny rejestr maski przerwań |
0x3A | GIFR | Ogólny rejestr znaczników przerwań |
0x39 | TIMSK | Rejestr maski przerwań z timera/licznika |
0x38 | TIFR | Rejestr znaczników przerwań z timera/licznika |
0x35 | MCUCR | Rejestr sterowania mikrokontrolerem |
0x34 | MCUSR | Rejestr stanu mikrokontrolera |
0x33 | TCCR0 | Rejestr sterowania timerem/licznikiem 0 |
0x32 | TCNT0 | Timer/licznik 0 (8 bitów) |
0x31 | OSCCAL | Rejestr kalibracji oscylatora |
0x30 | TCCR1 | Rejestr sterowania timerem/licznikiem 1 |
0x2F | TCNT1 | Timer/licznik 1 (8 bitów) |
0x2E | OCR1A | Rejestr A Output Compare dla timera/licznika 1 |
0x2D | OCR1B | Rejestr B Output Compare dla timera/licznika 1 |
0x2C | SFIOR | Rejestr funkcji specjalnych |
0x21 | WDTCR | Rejestr sterowania licznikiem zegarowym |
0x1E | EEAR | Rejestr adresu dla EEPROM |
0x1D | EEDR | Rejestr danych dla/z EEPROM |
0x1C | EECR | Rejestr sterowania EEPROM |
0x18 | PORTB | Rejestr danych portu B |
0x17 | DDRB | Rejestr kierunku dla portu B |
0x16 | PINB | Stan końcówek wejściowych portu B |
0x08 | ACSR | Rejestr sterowania i stanu komparatora analogowego |
0x07 | ADMUX | Rejestr wyboru kanału wejściowego dla przetwornika A/C |
0x06 | ADCSR | Rejestr sterowania i stanu przetwornika A/C |
0x05 | ADCH | Rejestr górnego bajtu danych z przetwornika A/C |
0x04 | ADCL | Rejestr dolnego bajtu danych z przetwornika A/C |
Uwaga: W tabeli zostały pominięte komórki zarezerwowane lub nieużywane.
Wszystkie układy peryferyjne we/wy ATtiny15 są obsługiwane poprzez przestrzeń we/wy. Komórki w tej przestrzeni są odczytywane i zapisywane odpowiednio instrukcjami IN i OUT, które wykonują przesył danych pomiędzy 32 rejestrami ogólnego przeznaczenia a przestrzenią we/wy.. Rejestry we/wy znajdujące się w zakresie adresów od 0x00 do 0x1F są bezpośrednio dostępne bitowo za pomocą instrukcji SBI i CBI. W tych rejestrach wartość pojedynczych bitów można sprawdzać przy użyciu instrukcji SBIS i SBIC.
Dla kompatybilności z przyszłymi modelami mikrokontrolerów zarezerwowane bity powinny przy dostępie być zapisywane wartością 0. Zarezerwowanych adresów pamięci we/wy nigdy nie należy zapisywać.
Rejestr stanu mikroprocesora (SREG) umieszczony w przestrzeni we/wy pod adresem 0x3F posiada następującą definicję:
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 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").
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.
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").
Najniższe adresy w pamięci programu są automatycznie zdefiniowane jako wektory resetu oraz przerwań. Kompletną listę wektorów prezentuje tabela poniżej. Lista ta określa również poziomy priorytetów różnych przerwań. Im niższy adres posiada wektor przerwania, tym wyższy priorytet ma to przerwanie. Najwyższy priorytet ma RESET, a następny należy do INT0 – żądania obsługi przerwania zewnętrznego 0, itd.
Wektory RESET i przerwań
Numer wektora |
Adres wektora |
Źródło przerwania |
Opis przerwania |
1 | 0x000 | RESET | Reset zewnętrzny, reset przy włączaniu
zasilania, reset przy spadku napięcia zasilającego i reset od licznika zegarowego |
2 | 0x001 | INT0 | Żądanie obsługi przerwania zewnętrznego 0 |
3 | 0x002 | Końcówki we/wy | Przerwanie od zmiany stanu końcówki |
4 | 0x003 | TIMER1,COMPA | Zgodność porównania A dla timera/licznika 1 |
5 | 0x004 | TIMER1, OVF | Przepełnienie w timerze/liczniku 1 |
6 | 0x005 | TIMER0, OVF | Przepełnienie w timerze/liczniku 0 |
7 | 0x006 | EE_RDY | Gotowość EEPROM |
8 | 0x007 | ANA_COMP | Komparator analogowy |
9 | 0x008 | ADC | Zakończenie przetwarzania w przetworniku A/C |
Najbardziej typowy i ogólny układ programu dla wektorów RESET i przerwań dla ATtiny15L jest następujący:
Przykład w kodzie maszynowym |
Adres Etykiety Kod Komentarze 0x000 rjmp RESET ; Obsługa resetu 0x001 rjmp EXT_INT0 ; Obsługa IRQ0 0x002 rjmp PIN_CHANGE ; Obsługa zmiany stanu końcówki 0x003 rjmp TIM1_CMP ; Zgodność porównania w Timer1 0x004 rjmp TIM1_OVF ; Obsługa przepełnienia Timer1 0x005 rjmp TIM0_OVF ; Obsługa przepełnienia Timer0 0x006 rjmp EE_RDY ; Obsługa gotowości EEPROM 0x007 rjmp ANA_COMP ; Obsługa komparatora analogowego 0x008 rjmp ADC ; Obsługa przetwarzania w przetworniku A/C ; 0x009 MAIN: <instr> xxx ; Start programu głównego … … … … |
ATtiny15L posiada cztery źródła resetu:
Podczas resetu wszystkie rejestry we/wy są ustawiane na swoje początkowe wartości a wykonanie programu rozpoczyna się od adresu 0x000. Pod tym adresem powinna znaleźć się instrukcja RJMP (ang. relative jump – skok względny) prowadząca do procedury obsługi resetu. Jeśli program nigdy nie uaktywnia źródeł przerwań, to wektory przerwań nie będą używane i w ich miejscu można umieścić normalny kod programu. Na poniższym rysunku przedstawiono schemat blokowy układu resetowania. Zwróć uwagę, iż reset nie zmienia zawartości zestawu rejestrów.
Parametry resetu (VCC = 5V)(1)
Symbol | Parametr | Warunek | Min. | Typ. | Max. | Jednostki |
VPOT | Napięcie progowe resetu przy włączaniu zasilania (wzrost) | BOD wyłączone | 1,0 | 1,4 | 1,8 | V |
BOD włączone | 1,7 | 2,2 | 2,7 | V | ||
Napięcie progowe resetu przy włączaniu zasilania (spadek) | BOD wyłączone | 0,4 | 0,6 | 0,8 | V | |
BOD włączone | 1,7 | 2,2 | 2,7 | V | ||
VRST | Napięcie progowe końcówki RESET | – | – | 0,85VCC | V | |
VBOT | Napięcie progowe resetu przy spadku napięcia zasilającego | BODLEVEL = 1 | 2,3 | 2,7 | 2,9 | V |
BODLEVEL = 0 | 3,4 | 4,0 | 4,3 | V |
Uwaga: | 1. | Reset przy włączaniu zasilania nie zadziała dopóki napięcie zasilające nie spadnie poniżej progu VPOT. |
BODEN(2) | CKSEL[1:0](2) | Czas startu tTOUT przy VCC=2,7V |
Czas startu tTOUT przy VCC=5,0V |
Zalecane użycie |
x | 00 | 256 ms+18 CK | 64 ms + 18 CK | BOD wyłączone, wolno narastające VCC |
x | 01 | 256 ms+18 CK | 64 ms + 18 CK | BOD wyłączone, wolno narastające VCC |
x | 10 | 16 ms+18 CK | 4 ms + 18 CK | BOD wyłączone, szybko narastające VCC |
1 | 11 | 18 CK + 32 μs | 18 CK + 8 μs | BOD wyłączone |
0 | 11 | 18 CK + 128 μs | 18 CK + 32 μs | BOD włączone |
Uwagi: | 1. | Przy włączeniu zasilania czas startu jest typowo zwiększany o 0,6 ms. |
2. | "0" oznacza bit zaprogramowany, "1" oznacza bit niezaprogramowany |
Tabela powyżej pokazuje czasy startu po resecie. Gdy mikroprocesor wybudza się z trybu wyłączenia zasilania, używana jest tylko część zawierająca liczbę cykli zegarowych (CK) w czasie startu. Do odmierzania części w czasie rzeczywistym czasu startu wykorzystywany jest oscylator licznika zegarowego. Liczba cykli oscylatora licznika zegarowego używanych do każdego z czasów jest pokazana w tabeli poniżej.
Częstotliwość oscylatora licznika zegarowego zależy od napięcia zasilającego, jak pokazano w charakterystykach elektrycznych. Mikrokontroler jest sprzedawany z bitami bezpiecznikowymi CKSEL ustawionymi na "00".
Warunki zasilania | Okres zliczania | Liczba cykli |
2,7V | 32 μs | 8 |
2,7V | 128 μs | 32 |
2,7V | 16 ms | 4K |
2,7V | 256 ms | 64K |
5V | 8 μs | 8 |
5V | 32 μs | 32 |
5V | 4 ms | 4K |
5V | 64 ms | 64K |
Impuls resetu przy włączaniu zasilania (ang. Power-on Reset, POR) jest generowany przez wewnętrzny obwód wykrywania. Poziom wykrywania pokazano w tabeli charakterystyk resetu. POR jest aktywowany zawsze, gdy napięcie zasilania VCC spadnie poniżej poziomu wykrywania. Obwód POR może być użyty do wyzwolenia resetu przy uruchamianiu (ang. the start-up reset) jak również do wykrywania awarii napięcia zasilającego.
Obwód POR zapewnia resetowanie mikrokontrolera przy włączeniu zasilania. Gdy zostanie osiągnięte napięcie progowe resetu przy włączaniu, to uruchamiany jest licznik opóźniający, który określa opóźnienie, w ciągu którego mikrokontroler jest utrzymywany w stanie resetu po wzroście VCC. Okres przewinięcia się licznika opóźniającego może zostać zdefiniowany przez użytkownika poprzez bity bezpiecznikowe CKSEL. Ustawienia tych bitów i związane z nimi czasy opóźnień pokazuje poniższa tabela opóźnień przy resecie. Sygnał resetu jest aktywowany ponownie bez żadnego opóźnienia, gdy VCC spada poniżej poziomu wykrywania.
Start mikrokontrolera,
RESET połączony z Vcc
Start mikrokontrolera,
RESET przedłużony zewnętrznie
Zewnętrzne resetowanie generowane jest przez niski stan na wyprowadzeniu RESET. Impuls resetu dłuższy niż 500 ns wygeneruje reset, nawet jeśli zegar mikrokontrolera nie pracuje. Krótsze impulsy nie dają gwarancji wygenerowania resetu. Gdy zastosowany sygnał osiągnie napięcie progu resetowania VRST (ang. Reset Threshold Voltage) na krawędzi dodatniej (narastającej, 0 → 1), licznik opóźnienia uruchomi mikrokontroler po upływie okresu opóźnienia tTOUT.
Reset zewnętrzny w trakcie pracy mikrokontrolera
ATtiny15L posiada wbudowany obwód wykrywania spadku napięcia zasilającego (ang. brown-out detection circuit, BOD) do monitorowania poziomu VCC podczas pracy. Obwód BOD może zostać włączony/wyłączony za pomocą bitu bezpiecznikowego BODEN. Gdy BODEN jest włączone (bit BODEN zaprogramowany na 0), a napięcie VCC spadnie poniżej poziomu wyzwalania, to zostaje natychmiast aktywowany reset przy spadku napięcia zasilania (ang. brown-out reset). Gdy VCC wzrośnie powyżej poziomu wyzwalania, reset od spadku napięcia zasilania zostaje dezaktywowany po pewnym opóźnieniu, które definiuje użytkownik w ten sam sposób, co opóźnienie sygnału POR. Poziom wyzwalania dla BOD można wybrać bitem bezpiecznikowym BODLEVEL na 2,7V (BODLEVEL niezaprogramowany) lub 4,0V (BODLEVEL zaprogramowany). Poziom wyzwalania ma histerezę 50mV w celu ochrony przed wykryciem szpilkowych spadków napięcia..
Obwód BOD tylko wtedy wykryje spadek VCC, jeśli to napięcie utrzyma się poniżej progu wyzwalania dłużej niż 3 μs dla poziomu wyzwalania 4,0V, 7 μs dla poziomu wyzwalania 2,7V (wartości typowe).
Reset przy spadku napięcia zasilającego w
trakcie pracy
Uwaga: | Histereza dla VBOT: VBOT+ = VBOT + 25 mV, VBOT– = VBOT – 25 mV. |
Gdy licznik zegarowy dojdzie do końca okresu swojego zliczania, wygeneruje krótki impuls reset o czasie trwania równym jednemu cyklowi zegara CK. Przy opadającym zboczu tego impulsu licznik opóźnienia zaczyna zliczać okres opóźnienia tTOUT.
Reset od licznika zegarowego podczas pracy
mikrokontrolera
Rejestr stanu mikrokontrolera udostępnia informację o źródle zresetowania mikrokontrolera.
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0x34 | - | - | - | - | WDRF | BORF | EXTRF | PORF | MCUSR |
Zapis/Odczyt | O | O | O | O | Z/O | Z/O | Z/O | Z/O | |
Wartość początkowa | 0 | 0 | 0 | 0 | Zobacz na opis bitów |
Te bity są zarezerwowane w ATtiny15L i zawsze dają odczyt zero.
Ten bit zostaje ustawiony, gdy występuje reset spowodowany przepełnieniem licznika zegarowego. Bit jest zerowany przez reset przy włączeniu zasilania lub przez zapis logicznego zera do tego znacznika.
Ten bit jest ustawiany, jeśli wystąpi reset przy spadku napięcia zasilania. Bit jest zerowany przez reset przy włączeniu zasilania lub przez zapis logicznego zera do tego znacznika.
Ten bit jest ustawiany, jeśli wystąpi reset zewnętrzny. Bit jest zerowany przez reset przy włączeniu zasilania lub przez zapis logicznego zera do tego znacznika.
Ten bit zostaje ustawiony, jeśli wystąpi reset przy włączeniu zasilania. Bit jest resetowany przez zapis logicznego zera do tego znacznika.
Aby wykorzystać znaczniki resetu do identyfikacji warunku resetu, użytkownik powinien odczytać, a następnie wyzerować rejestr MCUSR najwcześniej jak tylko to możliwe w programie. Jeśli rejestr został wyzerowany przed wystąpieniem kolejnego resetu, to źródło resetu można znaleźć przez zbadanie znaczników resetu.
Napięcie odniesienia posiada pewien czas uruchamiania, który może wpłynąć na sposób używania tego napięcia. Maksymalny czas uruchamiania wynosi 10μs. Aby zaoszczędzić energię, napięcie odniesienia nie zawsze jest włączone. Jest ono włączane w następujących sytuacjach:
W ten sposób, gdy BOD (ang. Brown-out Detection, wykrywanie spadku napięcia zasilającego) nie jest włączone, po ustawieniu bitu AINBG użytkownik zawsze musi odczekać, aż napięcie odniesienia w pełni się uruchomi, zanim będzie można je wykorzystywać wyjście z komparatora analogowego. Obwód napięcia odniesienia pobiera typowo prąd 10 μA, a w celu zmniejszenia poboru energii w trybie wyłączenia zasilania (ang. Power-down mode) użytkownik może wyłączyć to napięcie przed wejściem w tryb uśpienia.
Gdy wystąpi przerwanie, zerowany jest bit I globalnego uaktywnienia przerwań (ang. Global Interrupt Enable I-bit) w rejestrze stanu i wszystkie przerwania zostają zablokowane. Oprogramowanie użytkownika może ustawić z powrotem bit I, aby włączyć przerwania zagnieżdżone. Bit I jest ustawiany, gdy jest wykonywana instrukcja powrotu z przerwania – RETI.
Gdy licznik programu (ang. Program Counter, PC) jest ustawiany na adres wektora w celu wykonania procedury obsługi przerwania, odpowiedni znacznik przerwania zostaje sprzętowo wyzerowany. Niektóre znaczniki przerwań można również wyzerować przez zapis logicznej jedynki na pozycji bitu znacznika do wyzerowania.
Jeśli warunek przerwania wystąpi, gdy odpowiadający mu bit uaktywnienia jest wyzerowany, to znacznik przerwania zostanie ustawiony i zapamiętany aż do uaktywnienia przerwania lub do wyzerowania tego znacznika przez oprogramowanie.
Gdy wystąpi jeden lub więcej warunków przerwania, gdy bit I globalnego uaktywnienia przerwań jest wyzerowany, to odpowiednie znaczniki przerwań zostaną ustawione i zapamiętane, aż do ustawienia bitu I, a następnie zostaną wykonane w kolejności ich priorytetów.
Zwróć uwagę, iż przerwanie od zewnętrznego poziomu nie posiada znacznika i będzie pamiętane tak długo, jak długo aktywny jest warunek przerwania.
Również zauważ, iż rejestr stanu nie jest automatycznie zapamiętywany przy wejściu do procedury obsługującej przerwanie, ani nie zostaje automatycznie odtworzony przy powrocie z tej procedury. Operacje te muszą zostać wykonane programowo.
Czas reakcji na przerwanie dla wszystkich uaktywnionych przerwań AVR wynosi co najmniej 4 cykle zegarowe. Po tym okresie 4 cykli zegarowych licznik programu (9 bitów) jest umieszczany na stosie, po czym wykonany zostaje rozkaz umieszczony w wektorze przerwania, będący najczęściej skokiem względnym RJMP do procedury obsługi przerwania, a skok ten zajmuje dodatkowe dwa cykle zegarowe. Jeśli przerwanie wystąpi podczas instrukcji wielocyklowej, to wykonanie tej instrukcji zostaje doprowadzone do końca przed obsłużeniem przerwania. W ATtiny12, jeśli przerwanie wystąpi w trakcie uśpienia mikrokontrolera, to czas reakcji wydłuża się o 4 dalsze cykle zegarowe.
Powrót z procedury przerwania zajmuje 4 cykle zegarowe, podczas których licznik programu (9 bitów) jest pobierany z powrotem ze stosu, a znacznik I w SREG jest ustawiany. Gdy mikrokontroler AVR wychodzi z przerwania, zawsze powraca do programu, który był wykonywany w momencie wystąpienia przerwania i wykonuje jedną dalszą instrukcję, zanim zostanie obsłużone jakiekolwiek oczekujące przerwanie.
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0x3B | - | INT0 | PCIE | - | - | - | - | - | GIMSK |
Zapis/Odczyt | O | Z/O | Z/O | O | O | O | O | O | |
Wartość początkowa | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Te bity są zarezerwowane w ATtiny15L i przy odczycie zawsze dają wartość 0.
Gdy bit INT0 zostanie ustawiony i bit I w rejestrze stanu (SREG) jest również ustawiony, to zostanie uaktywnione przerwanie zewnętrzne z końcówki INT0. Bity 1:0 sterujące sposobem wykrywania przerwania 0 (ang. Interrupt Sense Control0 bits) (ISC01 i ISC00) w ogólnym rejestrze sterującym mikrokontrolera (ang. MCU general Control Register, MCUCR) definiują, czy przerwanie zewnętrzne będzie aktywowane narastającym/opadającym zboczem sygnału, zmianą stanu końcówki, czy niskim poziomem na końcówce INT0. Aktywność na tej końcówce spowoduje żądanie przerwania nawet, jeśli końcówka INT0 jest skonfigurowana jako wyjście. Procedura obsługi żądania przerwania 0 rozpoczyna się od adresu 0x001.
Gdy bit PCIE zostanie ustawiony i bit I w rejestrze stanu (SREG) jest ustawiony, to zostanie uaktywnione przerwanie przy zmianie stanu końcówki. Jakakolwiek zmiana na końcówkach wejściowych lub końcówkach we/wy spowoduje żądanie przerwania. Procedura obsługi tego przerwania rozpoczyna się od adresu 0x002 w pamięci programu.
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0x3A | - | INTF0 | PCIF | - | - | - | - | - | GIFR |
Zapis/Odczyt | O | Z/O | Z/O | O | O | O | O | O | |
Wartość początkowa | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Te bity są zarezerwowane w ATtiny15L i przy odczycie zawsze dają wartość 0.
Gdy zbocze sygnału na końcówce INT0 wyzwoli żądanie przerwania, to odpowiadający mu znacznik przerwania INTF0 otrzymuje stan wysoki 1. Jeśli bit I w SREG oraz odpowiedni bit uaktywniający INT0 w rejestrze GIMSK są ustawione, to mikrokontroler wykona skok do wektora przerwania. Znacznik ten zostaje wyzerowany, gdy rozpocznie się wykonywanie procedury przerwania. Alternatywnie znacznik można wyzerować przez zapis w nim stanu 1. Znacznik ten jest zawsze wyzerowany, gdy końcówka INT0 zostanie skonfigurowana na przerwanie od poziomu niskiego.
Gdy pewne zdarzenie na dowolnej końcówce wejścia lub końcówce we/wy wyzwoli żądanie przerwania, to bit PCIF jest ustawiany na 1. Jeśli bit I w SREG i bit PCIE w GIMSK są ustawione, to mikrokontroler skoczy do wektora przerwania pod adresem 0x002. Znacznik zostaje wyzerowany, gdy procedura obsługi przerwania zacznie być wykonywana. Alternatywnie znacznik można wyzerować przez zapis do niego logicznej jedynki.
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0x39 | - | OCIE1A | - | - | - | TOIE1 | TOIE0 | - | TIMSK |
Zapis/Odczyt | O | Z/O | O | O | O | Z/O | Z/O | O | |
Wartość początkowa | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Te bity są zarezerwowane w ATtiny15L i przy odczycie zawsze dają wartość 0.
Gdy bit OCIE1A zostanie ustawiony i bit I w rejestrze stanu ma wartość 1, uaktywnione zostaje przerwanie przy zgodności porównania w timerze/liczniku 1. Odpowiadający mu wektor przerwania (pod adresem 0x003) zostanie wykonany, jeśli wystąpi zgodność porównania A w timerze/liczniku 1, tj. gdy zostanie ustawiony na 1 bit OCF1A w rejestrze znaczników przerwań z timerów/liczników (ang. Timer/Counter Interrupt Flag Register, TIFR).
Gdy bit TOIE1 zostanie ustawiony na 1 i bit I w rejestrze stanu ma również stan 1, to zostają uaktywnione przerwanie z przepełnienia w timerze/liczniku 1. Odpowiadający mu wektor przerwania (pod adresem 0x004) zostanie wykonany, jeśli wystąpi przepełnienie w timerze/liczniku 1, tj. gdy zostanie ustawiony bit TOV1 w rejestrze znaczników przerwań timerów/liczników (ang. Timer/Counter Interrupt Flag Register, TIFR).
Gdy bit TOIE0 zostanie ustawiony na 1 i bit I w rejestrze stanu ma również stan 1, to zostają uaktywnione przerwanie z przepełnienia w timerze/liczniku 0. Odpowiadający mu wektor przerwania (pod adresem 0x005) zostanie wykonany, jeśli wystąpi przepełnienie w timerze/liczniku 0, tj. gdy zostanie ustawiony bit TOV0 w rejestrze znaczników przerwań timerów/liczników (ang. Timer/Counter Interrupt Flag Register, TIFR).
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0x38 | - | OCF1A | - | - | - | TOV1 | TOV0 | - | TIFR |
Zapis/Odczyt | O | Z/O | O | O | O | Z/O | Z/O | O | |
Wartość początkowa | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Te bity są zarezerwowane w ATtiny15L i przy odczycie zawsze dają wartość 0.
Bit OCF1A bit jest ustawiany, gdy wystąpi zgodność porównania pomiędzy timerem/licznikiem 1 a wartością danych w rejestrze OCR1A (ang. Output Compare Register 1A – Rejestr Output Compare 1A). Znacznik OCF1A jest zerowany sprzętowo przy wykonaniu odpowiadającego mu wektora obsługi przerwania. Alternatywnie znacznik OCF1A jest zerowany przez zapis "logicznej jedynki" na pozycji tego bitu. Gdy bity I w rejestrze SREG, OCIE1A iOCF1A są wszystkie ustawione na 1, zostaje wykonane przerwanie zgodności porównania A w timerze/liczniku 1 (ang. Timer/Counter1 compare match A).
Bit TOV1 jest ustawiany, gdy pojawi się przepełnienie w timerze/liczniku 1. Znacznik TOV1 jest zerowany sprzętowo przy wykonaniu odpowiadającego mu wektora obsługi przerwania. Alternatywnie znacznik TOV1 jest zerowany przez zapis "logicznej jedynki" na pozycji tego bitu. Gdy bity I w rejestrze SREG, TOIE1 i TOV1 są wszystkie ustawione na 1, zostaje wykonane przerwanie przy przepełnieniu w timerze/liczniku 1 (ang. Timer/Counter1 Overflow Interrupt).
Bit TOV0 jest ustawiany, gdy pojawi się przepełnienie w timerze/liczniku 0. Znacznik TOV0 jest zerowany sprzętowo przy wykonaniu odpowiadającego mu wektora obsługi przerwania. Alternatywnie znacznik TOV0 jest zerowany przez zapis "logicznej jedynki" na pozycji tego bitu. Gdy bity I w rejestrze SREG, TOIE0 i TOV0 są wszystkie ustawione na 1, zostaje wykonane przerwanie przy przepełnieniu w timerze/liczniku 0 (ang. Timer/Counter0 Overflow Interrupt).
Przerwanie zewnętrzne (ang. External Interrupt) jest wyzwalane przez końcówkę INT0. Zwróć uwagę, iż jeśli przerwanie to jest uaktywnione, to zostanie wyzwolone nawet wtedy, gdy końcówka INT0 pracuje jako wyjście. Ta cecha dostarcza sposobu generowania przerwań programowych. Przerwanie zewnętrzne może zostać wyzwolone przez opadające/narastające zbocze, zmianę stanu końcówki lub niski poziom logiczny 0. Ustawia się to w rejestrze sterowania mikrokontrolerem (ang. MCU Control Register – MCUCR). Gdy przerwanie zewnętrzne zostało uaktywnione i skonfigurowane na wyzwalanie poziomem, przerwanie będzie wyzwalane tak długo, jak jego końcówka utrzymywana jest w stanie niskim 0.
Przerwanie przy zmianie stanu końcówki (ang. Pin Change Interrupt) jest wyzwalane przez każdą zmianę na dowolnej końcówce wejścia lub wyjścia. Zmiana na końcówkach PB4:0 zawsze wywoła przerwanie. Zmiana na końcówkach PB5 wywoła przerwanie, jeśli końcówka pracuje jako wejście lub wyjście. Zauważ, iż jeśli przerwanie zostało aktywowane to zostanie wyzwolone nawet wtedy, gdy końcówka pracuje jako wyjście. Ta cecha pozwala generować przerwania programowe. Zauważ również, iż przerwanie od zmiany stanu końcówki zostanie wyzwolone, nawet jeśli aktywność na danej końcówce wyzwala inne przerwanie, np. przerwanie zewnętrzne. Wynika z tego, iż jedno zdarzenie zewnętrzne może spowodować kilka przerwań.
Wartości na końcówkach są próbkowane przed wykrywaniem zboczy. Jeśli przerwanie od zmiany stanu końcówki jest aktywne, to impulsy o czasie trwania dłuższym od okresu zegarowego mikroprocesora wygenerują przerwanie. Krótsze impulsy nie dają pewności wygenerowania przerwania.
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0x35 | - | PUD | SE | SM1 | SM0 | - | ISC01 | ISC00 | MCUCR |
Zapis/Odczyt | O | Z/O | Z/O | Z/O | Z/O | O | Z/O | Z/O | |
Wartość początkowa | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Te bity są zarezerwowane w ATtiny15L i przy odczycie zawsze dają wartość 0.
Bit PUD musi być ustawiony na 1, aby zostały zablokowane wewnętrzne oporniki podciągające portu B.
Bit SE musi być ustawiony na 1, aby mikrokontroler mógł przejść w tryb uśpienia przy wykonywaniu instrukcji SLEEP. Aby uniknąć niezamierzonego wejścia w tryb uśpienia przez mikrokontroler, zaleca sie ustawianie bitu SE tuż przed wykonaniem instrukcji SLEEP.
Bity te wybierają jeden z trzech dostępnych trybów uśpienia wg poniższej tabeli:
Tryby uśpienia
SM1 | SM0 | Tryb uśpienia |
0 | 0 | Tryb bezczynny (ang. Idle mode) |
0 | 1 | Tryb zmniejszania szumów dla przetwornika A/C (ang. ADC Noise Reduction mode) |
1 | 0 | Tryb wyłączenia zasilania (ang. Power-down mode) |
1 | 1 | Zarezerwowane |
Przerwanie zewnętrzne 0 jest aktywowane przez zewnętrzną końcówkę INT0, jeśli są ustawione na 1 bit I w rejestrze SREG oraz odpowiedni bit maski przerwania. Aktywność na zewnętrznej końcówce INT0, która aktywuje to przerwanie jest zdefiniowana w poniższej tabeli:
Sterowanie wykrywaniem przerwania 0(1)
ISC01 | ISC00 | Opis |
0 | 0 | Niski poziom na INT0 generuje przerwanie. |
0 | 1 | Dowolna zmiana na INT0 generuje przerwanie. |
1 | 0 | Opadające zbocze sygnału na INT0 generuje przerwanie. |
1 | 1 | Narastające zbocze sygnału na INT0 generuje przerwanie. |
Uwaga: | 1. | Przy zmianie bitów ISC10/ISC00 przerwanie INT0 musi zostać zablokowane przez wyzerowanie jego bitu uaktywniającego w rejestrze GIMSK. W przeciwnym razie przerwanie może pojawić się, gdy bity te są zmieniane. |
Gdy uaktywnione przerwanie wystąpi podczas uśpienia mikrokontrolera, zostanie on wybudzony. Następnie mikrokontroler jest wstrzymywany przez cztery cykle oprócz czasu uruchamiania, po czym wykonuje on procedurę obsługi przerwania i wznawia wykonywanie programu od następnej instrukcji za SLEEP. Zawartość zestawu rejestrów i pamięci SRAM jest niezmieniona, gdy mikrokontroler wybudza się z uśpienia. Jeśli podczas uśpienia wystąpi reset, to mikrokontroler wybudza się i wykonuje program od wektora Resetu,
Gdy bity SM1/SM0 mają stan “00”, to instrukcja SLEEP wymusi na mikrokontrolerze przejście w tryb bezczynności, wstrzymując mikroprocesor, lecz pozwalając na kontynuowanie pracy przetwornikowi A/C, komparatorowi analogowemu, timerom/licznikom, licznikowi zegarowemu oraz systemowi przerwań. To pozwala mikrokontrolerowi wybudzić się z uśpienia w odpowiedzi na przerwania wyzwolone zewnętrznie lub wewnętrznie, np. przy przerwaniu od przepełnienia timera lub przy resecie od licznika zegarowego. Jeśli przetwornik A/C został włączony, to przetwarzanie rozpoczyna się automatycznie przy wejściu w ten tryb. Jeśli wybudzenie od komparatora analogowego nie jest potrzebne, to komparator analogowy może zostać odłączony od zasilania przez ustawienie bitu ADC w rejestrze sterowania i stanu komparatora analogowego (ang. Analog Comparator Control and Status Register, ACSR). Zredukuje to pobór prądu w trybie bezczynności
Gdy bity SM1/SM0 mają stan “01”, to instrukcja SLEEP wymusi na mikrokontrolerze przejście w tryb zmniejszania zakłóceń dla przetwornika A/C, zatrzymując mikroprocesor, lecz zezwalając na dalszą pracę przetwornikowi A/C, końcówce przerwania zewnętrznego, przerwaniu od zmiany stanu końcówki oraz licznikowi zegarowemu (jeśli jest uaktywniony). Proszę zauważyć, że w tym trybie uśpienia aktywny jest również system zegarowy łącznie z PLL. Takie rozwiązanie zmniejsza szumy tła przy wykonywaniu przetwarzania w przetworniku A/C, co pozwala mu osiągnąć większą dokładność. Jeśli przetwornik A/C jest włączony, to po wejściu w ten tryb automatycznie rozpoczyna się przetwarzanie w przetworniku A/C. Dodatkowo do resetu z przepełnienia licznika zegarowego i resetu zewnętrznego mikrokontroler może zostać wybudzony jedynie przez przerwanie zewnętrzne wyzwalane poziomem, przerwanie od zmiany stanu końcówki lub przerwanie z przetwornika A/C.
Gdy bity SM1/SM0 mają stan “10”, to instrukcja SLEEP wymusi na mikrokontrolerze przejście w tryb wyłączenia zasilania. Mikrokontroler może być wybudzony tylko przez reset zewnętrzny, reset z licznika zegarowego (jeśli został uaktywniony), przerwanie zewnętrzne wyzwalane poziomem lub przerwanie od zmiany stanu końcówki.
Zauważ, że jeśli do wybudzenia z trybu wyłączenia zasilania używane jest przerwanie wyzwalane poziomem lub przerwanie od zmiany stanu końcówki, to zmieniony poziom musi się utrzymać przez pewien czas, aby wybudzić mikrokontroler. To sprawia, iż mikrokontroler staje się mniej czuły na krótkotrwałe zakłócenia. Zmieniony poziom jest próbkowany dwukrotnie przez zegar oscylatora licznika zegarowego, a jeśli stan wejścia posiada wymagany poziom w tym czasie, to mikrokontroler wybudzi się. Okres oscylatora licznika zegarowego jest równy 2,9 μs (nominalnie) przy 3,0V i w temperaturze 25°C. Częstotliwość oscylatora licznika zegarowego jest zależna od napięcia zasilającego, jak pokazano w rozdziale "Parametry elektryczne".
Gdy następuje wybudzenie z trybu wyłączenia zasilania, występuje opóźnienie z warunku wybudzania aż wybudzenie zostanie zakończone. Pozwala to uruchomić się i ustabilizować zegarowi po wcześniejszym zatrzymaniu. Okres wybudzania jest zdefiniowany przez te same bity bezpiecznikowe CKSEL, które definiują okres opóźnienia dla resetu.
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0x31 | CAL7 | CAL6 | CAL5 | CAL4 | CAL3 | CAL2 | CAL1 | CAL0 | OSCCAL |
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 |
Zapis bajtu kalibracyjnego pod ten adres spowoduje wyregulowanie wewnętrznego oscylatora w celu usunięcia odchyłek w generowanej częstotliwości. Gdy OSCCAL ma wartość zero (wartość początkowa), zostaje wybrana najniższa dostępna częstotliwość. Zapis niezerowej wartości do tego rejestru spowoduje wzrost częstotliwości wewnętrznego oscylatora. Zapisanie 0xFF do tego rejestru da najwyższą dostępną częstotliwość.
Pętla PLL jest sprzężona na stałe ze strojonym, wewnętrznym oscylatorem RC i kalibracja tego oscylatora poprzez rejestr OSCCAL spowoduje w tym samym czasie kalibrację częstotliwości szybkiego zegara peryferyjnego. Timer 1 może przestać działać prawidłowo, jeśli częstotliwość wewnętrznego oscylatora RC przekroczy 1,75 MHz.
Nie zaleca się ustawiania poprzez rejestr OSCCAL częstotliwości wyższych niż 1,75 MHz w celu zachowania poprawnego działania wszystkich funkcji układu.
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.