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

©2024 mgr Jerzy Wałaszek
I LO w Tarnowie

obrazek

Mikrokontrolery

ATmega128

Przegląd, 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

Przegląd ogólny

Mikrokontroler ATmega128 jest 8-bitowym mikrokontrolerem CMOS o niskim poborze prądu opartym na rozszerzonej architekturze AVR RISC. Przez wykonywanie mocnych instrukcji w pojedynczym takcie zegarowym ATmega128 osiąga wydajność bliską 1 MIPS (1 miliona instrukcji na sekundę) na MHz, co pozwala projektantowi systemu zoptymalizować pobór energii w funkcji prędkości przetwarzania.

Schemat blokowy

Rdzeń AVR łączy bogaty zbiór instrukcji z 32 roboczymi rejestrami ogólnego przeznaczenia. Wszystkie 32 rejestry są bezpośrednio połączone z Jednostką Arytmetyczno Logiczną JAL (ang. Arithmetic Logic Unit ALU), umożliwiając jednoczesny dostęp do dwóch niezależnych rejestrów w pojedynczej instrukcji wykonywanej w ciągu jednego cyklu zegarowego. Wynikowa architektura jest bardziej efektywna, a jednocześnie osiąga wydajność do dziesięciu razy większą od typowych mikrokontrolerów CISC (ang. Complex Instruction Set Computer – komputer o liście złożonych rozkazów).

ATmega128 posiada następujące cechy: 128KB pamięci FLASH programowanej poprzez ISP z możliwością jednoczesnego programowania i odczytywania kodu, 4KB EEPROM, 4KB SRAM, 53 linie we/wy ogólnego przeznaczenia, 32 robocze rejestry ogólnego przeznaczenia, licznik czasu rzeczywistego (ang. Real Time Counter, RTC), cztery elastyczne timery/liczniki z trybami porównań i PWM, dwa układy USART, zorientowany na bajty 2-przewodowy interfejs szeregowy, 8-kanałowy, 10-bitowy przetwornik A/C z opcjonalnym różnicowym stopniem wejściowym o programowanym wzmocnieniu, programowalny licznik zegarowy (ang. Watchdog Timer) z wewnętrznym oscylatorem, port szeregowy SPI, interfejs testowy JTAG do skanowania ścieżki krawędziowej zgodny ze standardem IEEE 1149.1. używany również przy dostępie do wbudowanego systemu debugowania oraz przy programowaniu i sześć wybieranych programowo trybów oszczędzania energii. Tryb bezczynny (ang. Idle Mode) zatrzymuje mikroprocesor, pozwalając jednak na pracę pamięci SRAM, timerów/liczników, modułu USART, portu SPI, przetwornika A/C i systemu przerwań. Tryb wyłączenia zasilania (ang. Power-down Mode) zachowuje zawartość rejestrów i zatrzymuje oscylator, wyłączając wszystkie funkcje układu aż do momentu następnego przerwania lub sprzętowego resetu. W trybie oszczędzania energii (ang. Power-save Mode) asynchroniczny timer kontynuuje pracę, pozwalając użytkownikowi utrzymać podstawę timera, natomiast reszta mikrokontrolera jest uśpiona. Tryb zmniejszania zakłóceń dla przetwornika A/C (ang. ADC Noise Reduction Mode) zatrzymuje mikroprocesor i wszystkie moduły we/wy za wyjątkiem asynchronicznego timera i przetwornika A/C w celu zminimalizowania szumu od przełączeń w sieciach logicznych mikrokontrolera podczas przetwarzania napięć wejściowych w przetworniku A/C. W trybie gotowości/czuwania (ang. Standby Mode) oscylator kwarcowy/rezonatorowy pracuje, natomiast reszta mikrokontrolera jest uśpiona. Pozwala to na szybkie uruchomienie w połączeniu z niskim poborem prądu. W rozszerzonym trybie gotowości/czuwania (ang. Extended Standby Mode) pracują zarówno główny oscylator jak i timer asynchroniczny.

Microchip oferuje bibliotekę QTouch® do obsługiwania pojemnościowych przycisków dotykowych, suwaków i potencjometrów. Opatentowana technologia pobierania sygnałów z ładunków elektrostatycznych oferuje wydajne czujniki dotykowe oraz zawiera procedury raportowania o dotyku klawiszy z tłumieniem klawiszy sąsiednich (ang. Adjacent Key Suppression®, AKS™) w celu jednoznaczności wykrywania dotyku. Łatwy w użyciu zestaw procedur narzędziowych QTouch Suite pozwala na badanie, rozwijanie i debugowanie własnych aplikacji opartych na dotyku.

Układ mikrokontrolera jest wytwarzany z wykorzystaniem technologii wysokiej gęstości pamięci nieulotnej, którą opracowała firma ATMEL. Wewnętrzna, programowalna poprzez ISP pamięć FLASH pozwala na zaprogramowanie w systemie za pomocą zwykłego programatora pamięci nieulotnych lub za pomocą wbudowanego kodu startowego uruchomionego na rdzeniu AVR. Kod lądujący (ang. boot-loader) może korzystać z dowolnego interfejsu do załadowania programu aplikacji do pamięci FLASH programu. Oprogramowanie w sekcji chronionej FLASH (ang. Boot FLASH Section) może normalnie pracować podczas programowania sekcji kodu aplikacji (ang. Application FLASH Section), cecha ta nosi nazwę Read-While-Write (odczyt podczas zapisu). Przez połączenie 8-bitowego mikroprocesora RISC z samoprogramowalną w systemie pamięcią FLASH w monolitycznym układzie scalonym mikrokontroler ATmega128 staje się potężnym mikrokontrolerem dostarczającym wysoko elastycznego i efektywnego kosztowo rozwiązania dla wielu wbudowanych w urządzenia aplikacji sterujących.

Mikrokontrolery ATmega128 są wspierane przez komplet narzędzi do tworzenia systemów oraz ich oprogramowywania, łącznie z makroasemblerami, kompilatorami języka C oraz zestawami uruchomieniowymi.


Na początek:  podrozdziału   strony 

Kompatybilność ATmega103 i ATmega128

ATmega128 jest wysoce skomplikowanym mikrokontrolerem, w którym liczba komórek we/wy wykracza poza obszar 64 komórek we/wy zarezerwowanych w zbiorze instrukcji AVR. Aby zapewnić wsteczną kompatybilność z ATmega103, wszystkie komórki we/wy obecne w ATmega103 posiadają te same położenie w ATmega128. Większość dodatkowych komórek we/wy została umieszczona w rozszerzonej przestrzeni we/wy rozciągającej się od adresu 0x60 do 0xFF (tj. w przestrzeni wewnętrznej pamięci RAM w ATmega103). Komórki te są dostępne jedynie przy pomocy instrukcji LD/LDS/LDD i ST/STS/STD, a nie poprzez użycie instrukcji IN i OUT.

Relokacja wewnętrznej przestrzeni RAM może wciąż stanowić problem dla użytkowników ATmega103. Również problemem może być zwiększona liczba wektorów przerwań, jeśli kod wykorzystuje adresy bezwzględne. Aby rozwiązać te problemy, można wybrać tryb kompatybilności z ATmega103 przez zaprogramowanie bitu bezpiecznikowego M103C. W tym trybie nieużywana jest żadna z funkcji w rozszerzonej przestrzeni we/wy, zatem wewnętrzna pamięć RAM jest położona tak samo jak w ATmega103. Również usunięte zostają rozszerzone wektory przerwań. Wyprowadzenia ATmega128 są w 100% kompatybilne z wyprowadzeniami ATmega103, co pozwala zastępować ATmega103 na płytkach drukowanych.

Tryb kompatybilności z ATmega103

Po zaprogramowaniu bitu bezpiecznikowego M103C mikrokontroler ATmega128 staje się kompatybilny z mikrokontrolerem ATmega103 pod względem pamięci RAM, końcówek we/wy oraz wektorów przerwań, jak opisano wyżej. Jednakże w tym trybie kompatybilności jest niedostępne kilka nowych cech mikrokontrolera ATmega128. Wymieniono je poniżej:


Na początek:  podrozdziału   strony 

Zasoby

Firma Atmel, oryginalny producent mikrokontrolerów AVR, została wykupiona w roku 2016 przez Microchip Technology, producenta mikrokontrolerów PIC. Pomimo przejęcia mikrokontrolery AVR są wciąż produkowane i dostępne w handlu. Oryginalne zasoby internetowe Atmela są teraz dostępne w witrynie firmy Microchip:

https://www.microchip.com

Do programowania mikrokontrolerów AVR stosowane jest kilka pakietów IDE. Szczególnie polecam Atmel Studio 7, które umożliwia programowanie w języku C oraz w asemblerze. Opis instalacji tego środowiska znajdziesz w tym rozdziale:

Instalacja Atmel Studio 7

Równie popularnym środowiskiem programowania jest Eclipse z uwagi na to, iż może pracować w systemie Linux. Zaletą tego rozwiązania jest to, iż Eclipse pozwala na wykorzystanie tanich programatorów USBasp:

Instalacja Eclipse z AVRDude

Również środowisko MPLAB X firmy Microchip posiada możliwość programowania mikrokontrolerów AVR:

https://www.microchip.com/mplab/mplab-x-ide/avr-support


Na początek:  podrozdziału   strony 

Przykładowe kody programów

Ta dokumentacja zawiera proste przykłady kodów programów, które krótko pokazują sposób użycia różnych elementów mikrokontrolera. W przykładach tych zakłada się, iż do programu zostały dołączone odpowiednie pliki nagłówkowe przed kompilacją. Bądź jednak świadomy faktu, iż nie wszyscy producenci kompilatorów języka C dołączają definicje bitów w plikach nagłówkowych, a obsługa przerwań zależy od wybranego kompilatora C. Więcej szczegółów znajdziesz w dokumentacji swojego kompilatora.

Dla rejestrów we/wy znajdujących się w rozszerzonej pamięci we/wy należy zastąpić instrukcje IN, OUT, SBIS, SBIC, CBI i SBI instrukcjami, które umożliwiają dostęp do rozszerzonej pamięci we/wy. Zwykle oznacza to instrukcje LDS i STS połączone z SBRS, SBRC, SBR i CBR. Nie wszystkie mikrokontrolery AVR zawierają rozszerzoną pamięć we/wy.


Na początek:  podrozdziału   strony 

Trwałość danych

Wyniki badania niezawodności pokazują, że dane są tracone z częstotliwością dużo mniejszą od 1 PPM (ang. parts per million – części na milion) przez 20 lat w temperaturze 85°C lub przez 100 lat w temperaturze 25°C.

Na początek:  podrozdziału   strony 

Pojemnościowe wykrywanie dotyku

Biblioteka QTouch opracowana przez ATMEL'a udostępnia łatwe w użyciu rozwiązanie dla interfejsów dotykowych na mikrokontrolerach Atmel AVR. Biblioteka ta zawiera wsparcie dla metod pobierania danych QTouch® i QMatrix®.

Wykrywanie dotyku (ang. touch sensing) można w prosty sposób dołączyć do dowolnej aplikacji przez połączenie z jej kodem biblioteki QTouch i użycie funkcji interfejsu API udostępnianego przez tę bibliotekę w celu zdefiniowania kanałów dotykowych i czujników dotyku. Aplikacja następnie wywołuje funkcje API do pobrania informacji z kanałów i określania stanu czujnika dotyku.

Biblioteka QTouch jest bezpłatna i można ją pobrać z witryny Microchip'a (w 2016 firma Microchip przejęła swojego konkurenta Atmel i obecnie udostępnia wszystkie materiały pierwotnie udostępniane w sieci przez Atmela), na której znajdziesz również dokumentację oraz przewodniki dla użytkownika.


Na początek:  podrozdziału   strony 

Przegląd architektury

W celu zmaksymalizowania osiągów oraz współbieżności AVR wykorzystuje 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 jest wstępnie pobierana z pamięci programu. Takie rozwiązanie pozwala wykonywać instrukcje w każdym cyklu zegara. Pamięć programu jest pamięcią FLASH, którą można programować za pomocą mechanizmów wewnętrznych mikrokontrolera.

Szybkodostępny zestaw rejestrów zawiera 32 8-bitowe rejestry robocze ogólnego przeznaczenia z czasem dostępu równym pojedynczemu cyklowi zegara. Pozwala to na wykonanie operacji w jednostce arytmetyczno-logicznej JAL (ang. Arithmetic Logic Unit, ALU) w jednym cyklu zegarowym. W typowej operacji JAL z zestawu rejestrów pobierana jest zawartość dwóch rejestrów, wykonywana operacja, a wynik umieszczany z powrotem w zestawie rejestrów – w jednym cyklu zegarowym.

Sześć z 32 rejestrów można wykorzystywać jako trzy 16 bitowe rejestry wskaźnikowe do adresowania pośredniego w przestrzeni danych – co umożliwia efektywne wyliczanie adresów. Jeden z tych wskaźników adresowych może również być używany jako wskaźnik adresu dla tablic umieszczonych w pamięci programu FLASH. Te rejestry z dodanymi funkcjami to rejestry 16-bitowe X, Y i Z, opisane dalej w tym rozdziale.

JAL wspiera operacje arytmetyczne i logiczne pomiędzy dwoma rejestrami lub pomiędzy stałą i rejestrem. Operacje na pojedynczych rejestrach również mogą być wykonywane w JAL. Po operacji arytmetycznej uaktualniany jest rejestr stanu (ang. Status Register), aby odzwierciedlać informację o wyniku tej operacji.

Sterowanie przebiegiem wykonywania programu jest wykonywane poprzez instrukcje skoków i wywołań warunkowych oraz bezwarunkowych, które są w stanie bezpośrednio zaadresować całą przestrzeń adresową. Większość instrukcji AVR posiada pojedynczy format słowa 16-bitowego. Komórki pamięci programu są 16-bitowe. Pojedyncza instrukcja AVR mieści się w jednej (16-bitów) lub w dwóch (32-bity) komórkach pamięci programu.

Pamięć FLASH programu podzielona jest na dwie sekcje: sekcję boot-loadera i sekcję programu aplikacji. Obie sekcje posiadają dedykowane bity blokujące dla ochrony przed zapisem i odczytem/zapisem. Instrukcja SPM zapisująca do pamięci FLASH aplikacji musi znajdować się w sekcji programu ładującego.

Podczas przerwań i wywołań podprogramów adres powrotny dla rejestru licznika programu (ang. Program Counter, PC) jest umieszczany na stosie (ang. Stack). Stos jest tworzony w ogólnej pamięci danych SRAM, a w konsekwencji jego rozmiar jest ograniczony jedynie całkowitym rozmiarem pamięci SRAM i stopniem jej wykorzystania. Wszystkie programy użytkownika muszą zainicjować rejestr SP w procedurze resetu (zanim będą wykonywane podprogramy lub przerwania). Wskaźnik stosu (ang, Stack Pointer, SP) jest dostępny do odczytu/zapisu w przestrzeni we/wy. Dostęp do pamięci danych SRAM można w łatwy sposób uzyskać poprzez pięć różnych trybów adresowania, które wspiera architektura AVR.

Przestrzenie pamięci w architekturze AVR są wszystkie liniowymi i regularnymi odwzorowaniami.

Elastyczny moduł przerwań posiada swoje rejestry sterujące w przestrzeni we/wy z dodatkowym bitem globalnego uaktywniania przerwań (ang. Global Interrupt Enable bit) w rejestrze stanu. Każde przerwanie posiada osobny wektor przerwania w tablicy wektorów przerwań (ang. Interrupt Vector table). Przerwania posiadają priorytety zgodne z położeniem swoich wektorów przerwań w tej tablicy. Im niższy jest adres wektora przerwania, tym wyższy priorytet posiada to przerwanie.

Pamięć we/wy zawiera 64 adresy dla funkcji peryferyjnych mikroprocesora, takich jak rejestry sterujące, SPI i inne funkcje we/wy. Dostęp do pamięci we/wy może być bezpośredni lub jako dostęp do komórek przestrzeni danych za zestawem rejestrów, 0x20 - 0x5F. Dodatkowo mikrokontroler ATmega128 posiada rozszerzoną przestrzeń we/wy w obszarze SRAM od adresu 0x60 do 0xFF, w której można używać tylko instrukcji LD/LDS/LDD i ST/STS/STD.


Na początek:  podrozdziału   strony 

JAL – Jednostka Arytmetyczno Logiczna

Wysoko wydajna jednostka arytmetyczno-logiczna AVR (ang. arithmetic logic unit, ALU) pracuje z bezpośrednim połączeniem z 32 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 rozkazów”, gdzie znajdziesz więcej szczegółów.

Na początek:  podrozdziału   strony 

Rejestr Stanu

SREG – Status Register – Rejestr stanu

Rejestr stanu zawiera informację o wyniku ostatnio wykonanej instrukcji arytmetycznej lub logicznej. Informacja ta może zostać wykorzystana do zmiany przebiegu programu w celu wykonania operacji warunkowych. Zauważ, iż rejestr stanu jest uaktualniany po wszystkich operacjach JAL, jak określono w rozdziale “Zestaw rozkazów”. Ta cecha w wielu przypadkach usuwa potrzebę stosowania dedykowanych instrukcji porównań, dając w wyniku szybszy i bardziej zwarty kod.

Rejestr stanu nie jest automatycznie zachowywany przy wejściu do procedury przerwania, ani nie jest automatycznie odtwarzany przy powrocie z przerwania. Musi to być zrobione programowo.

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 (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 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 rozkazów").

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 rozkazów").

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 rozkazów").

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 rozkazów").

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 rozkazów").

Bit 1 – Z: Znacznik zera

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

Bit 0 – C: Znacznik przeniesienia

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


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 rozkazów")


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.


SPH i SPL — Stack Pointer Register — Rejestr wskaźnika stosu

Bit 15 14 13 12 11 10 9 8  
0x3E (0x5E) SP15 SP14 SP13 SP12 SP11 SP10 SP9 SP8 SPH
0x3D (0x5D) 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  
  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  
  0 0 0 0 0 0 0 0  

RAMPZ – RAM Page Z Select Register – Rejestr wyboru strony pamięci RAM wskazywanej przez wskaźnik Z

Bit 7 6 5 4 3 2 1 0  
0x3B (0x5B) RAMPZ0 RAMPZ
Zapis/Odczyt O O O O O O O Z/O  
Wartość początkowa 0 0 0 0 0 0 0 0  

Bity 7...1 – Zarezerwowane

Te bity są zarezerwowane i przy odczycie zawsze zwracają wartość zero. Dla kompatybilności z przyszłymi mikrokontrolerami zapisuj je zerami przy zmianie zawartości rejestru RAMPZ.

Bit 0 – RAMPZ0: Extended RAM Page Z-pointer – Bit rozszerzonego wskaźnika Z strony RAM

Rejestr RAMPZ jest zwykle używany do wyboru 64KB strony pamięci RAM dostępnej dla wskaźnika Z. Ponieważ mikrokontroler nie obsługuje naraz więcej niż 64KB pamięci SRAM, to ten rejestr jest używany tylko do określania, która strona  w pamięci programu będzie dostępna dla instrukcji ELPM/SPM. Ustawienia bitu RAMPZ0 dają następujące efekty:

RAMPZ0 = 0: Instrukcje ELPM/SPM posiadają dostęp do adresów pamięci programu od 0x0000 do 0x7FFF (dolne 64 KB)
RAMPZ0 = 1: Instrukcje ELPM/SPM posiadają dostęp do adresów pamięci programu od 0x8000 do 0xFFFF (wyższe 64 KB)

Zauważ, iż ustawienie rejestru RAMPZ nie wpływa na instrukcję LPM.


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 zmniejszania 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. W zależności od wartości licznika programu przerwania mogą zostać automatycznie zablokowane, gdy będą zaprogramowane bity blokujące loadera BLB02 lub BLB12. Cecha ta poprawia bezpieczeństwo oprogramowania. Szczegóły znajdziesz w rozdziale "Programowanie pamięci".

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). Wektory przerwań mogą zostać przesunięte ma początek sekcji FLASH programu ładującego przez ustawienie bitu wyboru wektorów przerwań (ang. Interrupt Vector Select bit, IVSEL) w ogólnym rejestrze sterowania przerwaniami (ang. General Interrupt Control Register, GICR). Wektor resetu również może zostać przesunięty na początek sekcji FLASH programu ładującego, zobacz do rozdziału "Wsparcie bootloadera – odczyt przy zapisie – samoprogramowanie".

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
__SEI();   /* 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 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
©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: i-lo@eduinf.waw.pl

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

Informacje dodatkowe.