ATmega 128 Wojciech Glądała Tomasz Kopeć Łukasz Przepióra Tomasz Tokarski Piotr Zych
CECHY o Wysoka wydajność, niski pobór mocy AVR 8 bitowy mikrokontroler o Zaawansowana architektura RISC o 133 rozkazy większość wykonywana w czasie jednego cyklu maszynowego o 32 x 8 rejestry ogólno dostępne + rejestr kontroli zewnętrznej o statyczne operacje o do 16 MIPS przy 16MHz o wbudowany dwu cyklowy mnożnik o trwała pamięć programu i danych o 128KB wewnętrznej reprogramowalnej Flash o wytrzymałości 1000 cykli zapisy/wymazania o opcjonalna sekcja programu ładującego z niezależnymi bitami blokującymi, wewnętrzne programowanie oraz operacje odczytu podczas zapisu o 4KB EEPROM o wytrzymałości 100 000 cykli zapisu/wymazania o 4KB wewnętrznego SRAM o do 64KB opcjonalnej zewnętrznej przestrzeni pamięci o blokada programowania dla bezpieczeństwa programów o interfejs SPI dla systemowego programowania o interfejs JTAG o skanowanie graniczne w poszukiwaniu zgodności ze standardem JTAG o rozległe wbudowane wsparcie debugera o programowanie Flash, EEPROM, bezpieczników i bitów blokujących przez interfejs JTAG o cechy peryferyjne o dwa 8 bitowe liczniki/stopery z oddzielnymi prescalerami i trybami porównywania o dwa rozszerzone 16 bitowe liczniki/stopery z oddzielnymi prescalerami, trybami porównywania i trybami schwytania o licznik czasu rzeczywistego z oddzielnym oscylatorem o dwa 8 bitowe kanały PWM o 6 kanałów PWM z programowalną rozdzielczością od 2 do 16 bitów o wyjściowy modulator porównujący o 8 kanałowy 10 bitowy ACD 8 sygnałów zakończenia kanału 7 różnych kanałów 2 różne kanały z programowalnym przyrostem 1x, 10x lub 200x o bajtowo zorientowany dwuprzewodowy szeregowy interfejs o podwójny programowalny szeregowy USART o interfejs szeregowy SPI podrzędny/nadrzędny o programowalny licznik Watchdog a z wbudowanym oscylatorem o wbudowany analogowy komparator o specjalne cechy mikrokontrolera o reset przy włączaniu zasilania, programowalny detektor obniżonego napięcia sieciowego o wewnętrzny wzorcowy oscylator RC o wewnętrzne i zewnętrzne źródła przerwań
o sześć trybów snu: Idyl, redukcja szumów ADC, oszczędność mocy, obniżony pobór mocy, oczekiwanie i rozszerzone oczekiwanie o częstotliwość zegara wybierana przez oprogramowanie o tryb kompatybilności z ATmega103 wybierany poprzez bezpiecznik o globalne zablokowanie podciągania o I/O i packages o 53 programowalnych linii I/O o 64- TQFP o napięcia pracy o 2.7 5.5 dla ATmega128L o 4.5 5.5 dla ATmega128 o klasa szybkości o 0-8 MHz ATmega128L o 0 16 MHz ATmega128 KONFIGURACJA NÓŻEK KRÓTKI OPIS ATmega128 jest 8 bitowym mikrokontrolerem o niskim poborze mocy opartym na architekturze AVR z rozszerzonym RISC. Poprzez wykonywanie instrukcji w jednym cyklu zegarowym, ATmega128 osiąga rezultat w okolicy 1MIPS na MHz, co pozwala poprzez projektowanie systemu zoptymalizować pobór mocy z jednoczesnym przyspieszeniem działania
o Diagram blokowy Rdzeń AVR zawiera bogaty zestaw instrukcji z 32 rejestrami dostępnymi do różnych celów. Wszystkie 32 rejestry są bezpośrednio podłączone do Jednostki Arytmetyczno Logicznej (ALU), co pozwala na jednoczesny dostęp do dwóch niezależnych rejestrów w jednej instrukcji jednego taktu maszynowego. Taka architektura jest bardzie efektywna dla kodu obsługi oraz pozwala nawet na dziesięciokrotnie szybszą pracę w porównaniu z konwencjonalnymi mikrokontrolerami CISC owymi.
Atmega128 zapewnia następujące elementy: 128K bajtów wewnętrznej programowalnej pamięci typu FLASH z dopasowaniem odczytu podczas zapisu, 4K bajty EEPROM, 4K bajty SRAM, 53 linie wejścia/wyjścia, 32 robocze rejestry, Licznik rzeczywistego czasu(rtc), cztery liczniki z trybami porównywania i PWM, dwa USART, bajtów zorientowany dwu-kablowy równoległy interfejs, 8 kanałów, 10 bitowy ADC z opcjonalnym różnicowym progiem wejściowym z programowalnym przyrostem, programowalny licznik Watchdog z wewnętrznym oscylatorem, SPI równoległy port, IEEE standard 1149,1 ze zgodnym JTAG testowym interfejsem, również używanym przy dostępie do wbudowanego systemu debugowania i z sześcioma programowalnymi trybami oszczędności mocy. Tryb nieaktywny (Idle) zatrzymuje CPU pozwalając SRAM, licznikom, portom SPI i systemowi przerwań funkcjonować. Tryb obniżonego poboru mocy (Power-Down) zachowuje zawartość rejestrów, ale zatrzymuje Oscylator, uniemożliwiając wykonywanie innych funkcji aż do następnego przerwania lub resetu sprzętu. Tryb oszczędzający moc (Power save) asynchroniczny zegar nie przestaje działać podczas, gdy reszta sprzętu jest nieaktywna. Redukcja zakłóceń ADC zatrzymuje CPU i wszystkie wyjściowo-wejściowe moduły z wyjątkiem asynchronicznego zegara i ADC w celu zmniejszenia hałasów podczas konwersji ADC. W trybie oczekiwania (Standby) zarówno oscylator jak i asynchroniczny licznik działają. Urządzenie to zostało wyprodukowane przy użyciu Atmelowskiej najnowszej wysoko upakowanej trwałej technologii tworzenia pamięci. Wbudowany ISP FLASH pozwala na reprogramowanie w systemie pamięci mikrokontrolera poprzez szeregowy interfejs SPI, poprzez tradycyjne trwałe programowanie pamięci, lub poprzez wbudowany program ładujący działający na rdzeniu AVR. Program ładujący może korzystać ze wszystkich tych interfejsów w celu załadowania programu do pamięci FLASH. Oprogramowanie w ładowalnej części Flash będzie działało podczas aktualizacji części programów tej pamięci zapewniającej prawdziwe operacje odczytu podczas zapisu. Poprzez połączenie 8-bitowego RISC owego CPU z wewnętrznym systemowym samo-programowalnej pamięci FLASH na jednej płytce, Atmelowski Atmega128 jest mikrokontrolerem, który zapewnia łatwą dopasowalność wraz z efektywnymi rozwiązaniami wiążącymi kontrole aplikacji. Atmega128 AVR jest zaopatrzony w pełną gamę programów wspomagających rozwój: kompilatory C, assembler makro, debuger, emulatory itp. DOPASOWANIE ATMEGA103 DO ATMEGA128 ATmega128 jest kompleksowym mikrokontrolerem gdzie liczba umiejscowień I/O została zastąpiona 64- oma lokalizacjami I/O zarezerwowanymi dla zbioru rozkazów AVR. W celu zapewnienia kompatybilności z ATmega103, wszystkie I/O lokalizacje obecne w ATmega103 są w tym samym miejscu w ATmega128. Większość dodatkowych lokalizacji I/O zastała dodana w rozszerzonej przestrzeni adresowej od $60 do $FF. Do tych miejsc pamięci można się odwoływać tylko poprzez instrukcje LD/LDS/LDD oraz ST/STS/STD, a nie prze rozkazy IN i OUT. Ta wewnętrzna realokacja przestrzeni pamięci RAM może nadal być problemem dla użytkowników ATmega103. Również zwiększona liczba wektorów przerwań może sprawiać problem dla kodów operujących na bezwzględnym adresowaniu. W celu rozwiązania tego programu tryb dopasowania ATmega103 może zostać wybrany poprzez programowanie bezpiecznika M103C. W tym trybie żadna z funkcji w rozszerzonej przestrzeni adresowej jest niedostępna, jak i wewnętrzna pamięć RAM jest zlokalizowana jak w ATmega103. Również, rozszerzony wektor przerwań jest usunięty. 100% wyjść z ATmega128 jest kompatybilne z wyjściami z ATmega128 i może zastępować ATmega103 na płytkach drukowanych.
TRYBY KOMPATYBILNOŚCI ATMEGA103 Poprzez programowanie bezpiecznika M103C ATmega128 jest kompatybilna z ATmega103 zarówno w stosunku do RAM jak i nóżek I/O, wektorów przerwań. Jednakże, niektóre z tych rzeczy w ATmega103 nie są dostępne w tym trybie dopasowania, są to: - jeden USART zamiast dwóch, tylko w trybie asynchronicznym. Tylko 8 najmniej znaczących bitów w rejestrze szybkości transferu jest dostępne - jeden 16-bitowy licznik z dwoma rejestrami porównawczymi, zamiast dwóch liczników z trzema rejestrami - dwu-drutowy równoległy interfejs nie jest obsłużone - port C jest tylko wyjściowy - port G służy różnym/(alternatywnym ) funkcjom nie jest to całościowo port I/O - port F służy tylko jako bitowy wejściowy port jako dodatek do analogowego wejścia ADC - program ładujący nie jest obsłużony - Nie można dostosować częstotliwość wewnętrznego RP oscylatora - Rozszerzony interfejs pamięci nie może zwolnić żadnych adresów dla I/O, jak również skonfigurować różnych stanów oczekiwania dla różnych sekcji rozszerzonego adresu pamięci W dodatku, jest tu jeszcze parę mniej znacznych różnic, aby zapewnić lepszą kompatybilności z ATmega103: - tylko EXTRF i PORF istnieją w MCUCSR - sekwencje czasowe nie wymagają dla Watchdog a zmiany czasu oczekiwania - Zewnętrzne nóżki przerwań 0-3 służą tylko jako stopnie przerwań - USATR nie ma buforu FIFO, więc do przekroczenia liczby danych dochodzi wcześniej Nieużywane bity I/O w ATmega103 powinny być 0, aby zapewnić takie same operacje w ATmega128. OPIS NÓŻEK VCC zasilanie GND masa Port A (PA0-PA7) 8-bitowy dwukierunkowy port I/O z wewnętrznymi rezystorami podciągającymi (dla każdego bitu). Bufory wyjściowy mają symetryczne charakterystyki sterowników zarówno z wysokim opadającym poziomem i dopasowaniem źródła. Na wyjściu jest stan niski i pobierają prąd jeżeli rezystory podciągające są aktywowane. Wyjścia z portu po wykonaniu resetu są w trzecim stanie nawet jeżeli zegar nie działa. Dodatkowe informacje strona 67. Port B (PB0-PB7) opis jak wyżej. Dodatkowe informacje na stronie 68 Port C(PC0-PC7) opis jak wyżej. Dodatkowe informacje na stronie 71. W trybie dopasowania do ATmega103, jest to wyłącznie port wyjściowy i wyjścia nie są w trzecim stanie dla aktywnego resetu. Port D (PD0-PD7) jak wyżej. Dodatkowe informacje na stronie 72 Port E (PE0-PE7) - jak wyżej. Dodatkowe informacje na stronie 78. Port F (PF0-PF7) służy jako analogowe wejście dla A/D konwertera. Jeśli nie pracuje w tym trybie działa jak powyższe porty. Jeżeli jest załączony interfejs JTAG rezystory podciągające będą uaktywnione dla PF7(TDI), PF5(TMS) i PF4(TCK) nawet jeżeli dla sygnału reset.
W trybie zgodności z Tamega103 jest to tylko port wejściowy. Port G (PG0-PG7) od powyższych portów różni się tym tylko, że jest 5-bitowy W trybie dopasowania do ATmega103 wyjścia te służą tylko jako sygnały do zewnętrznej pamięci zarówno jak wejścia do 32 khz oscylatora. Wyjścia te są inicjalizowane asynchronicznie PG0 = 1, PG1 = 1, PG2 = 0 kiedy zostanie wykonana operacja reset, nawet przy niedziałającym zegarze. Pg3 i PG 4 są wejściami do oscylatora. RESET wejście. Dla sygnału niskiego trwającego dłużej niż minimalny takt cyklu zostanie wygenerowany rozkaz restartu nawet przy niedziałającym zegarze, Długość minimalnego impulsu jest podana w tabeli na stronie 46 w tabeli 19. Krótsze impulsy nie gwarantują wygenerowania restartu. XTAL1 ujemne wejście do wzmacniacza oscylatora, oraz do wewnętrznego zegara. XTAL2 ujemne wyjście ze wzmacniacza oscylatora AVCC zasób napięcia dla portu F i A/D konwertera. Powinien być podłączony do zewnętrznego napięcia, nawet jeżeli ADC nie jest używany. Jeżeli ADC jest używane powinien być podłączony do napięcia przez filtr dolnoprzepustowy. AREF jest to analogowy odpowiednik dla wejścia A/D konwerter. PEN - wejście umożliwiające programowanie dla SPI tryb szeregowego programowania. Przyciskając to wyjście podczas resetu w trybie uruchamiania, urządzenie przejdzie do trybu SPI. W czasie normalnych operacji wejście to nie ma żadnych funkcji. PRZYKŁADY KODU Ten arkusz danych zawiera proste przykłady kodu, które w prosty sposób obrazują jak wykorzystywać różne części urządzenia. Kody te zakładają, że specyficzne nagłówki zostały dołączone przed kompilacją. Należy być świadomym tego, że nie wszystkie sprzedawane kompilatory C zawierając definicje bitów w plikach nagłówkowych i obsługa procedur przerwań w C jest zależna od kompilatora. W celu uzyskania dodatkowych informacji proszę przejrzeć dokumentację kompilatora C. JEDNOSTKA CENTRALNA Architektura:
W celu zwiększenia wydajności i równoległości, AVR korzysta ze architektury Harvard z oddzielnymi pamięciami i magistralami dla programów i danych. Instrukcje w programach są wykonywane w sposób jednopotokowy. W czasie wykonywania jednej instrukcji, następna jest wstępnie pobierana z pamięci programu. W ten sposób umożliwia wykonywanie instrukcji w każdym cyklu maszynowym. Program jest zapisany w wewnętrznej systemowej reprogramowalnej pamięci Flash. Zestaw rejestrów szybkiego dostępu składa się z 32 8-bitowych ogólnych rejestrów roboczych o czasie dostępu równemu jednemu cyklowi maszynowemu. To pozwala na jednocyklowe operacje na Jednostce Arytmetyczno Logicznej (ALU). W typowych operacjach na ALU dwa operandy są pobierane z rejestrów, wykonywana jest operacja i jej rezultat jest zapisywany do jednego ze zestawu rejestrów w jednym takcie maszynowym. Sześć z tych 32 rejestrów może być używanych jako 16-bitowe wskaźniki z adresami pośrednimi do przestrzeni danych co umożliwia efektywne operowanie na adresach. Jeden z tych wskaźników adresów może również być używany jako wskaźnik na adres w tablicy przeglądowej pamięci Flash. Te dodatkowe funkcje dotyczą szesnastobitowych rejestrów X, Y i Z, które zostaną opisane później. ALU wspiera arytmetycznie i logiczne operacje pomiędzy rejestrami lub pomiędzy stałą i rejestrem. Operacje na pojedynczych rejestrach również mogą być wykonywane w ALU. Po operacji arytmetycznej, rejestr stanu jest aktualizowany by odzwierciedlać rezultat operacji. Przepływ programu jest możliwy dzięki warunkowym i bezwarunkowym rozkazom skoku (jump) i przywołania (call) zdolnych do bezpośredniego zaadresowania całej przestrzeni adresowej. Większość rozkazów AVR ma 16-bitówy format słowa. Każdy adres pamięci programu zawiera 16-to lub 32-bitowy rozkaz.
Pamięć programowa Flash jest podzielona na dwie sekcje: Program ładujący i Program użytkowy. Obydwie sekcje mają wydzielone bity dla ochrony zapisu lub zapisu i odczytu. Instrukcja SMP, która zapisuje do części użytkowej pamięci Flash musi rezydować w sekcji Programu ładującego. Podczas przerwań i wywołań programu standardowego adres powrotu z Licznika Program(PC) jest odkładany na stos. Stos jest alokowany w pamięci SRAM i jego rozmiar jest limitowany przez rozmiar tej pamięci. i jej użytkowanie. Wszystkie programy użytkowe muszą inicjalizować wskaźnik stosu (SP) podczas procedury RESET (zanim przerwania lub inne programy zostaną wykonane). Wskaźnik stosu jest dostępny zarówno do odczytu jak i zapisu w przestrzeni I/O. Dane w SRAM mogą być łatwo dostępne poprzez pięć różnych trybów adresowania wspieranych przez architekturę AVR.. Przestrzeń pamięci w architekturze AVR jest linearna i regularna mapa pamięci. Elastyczny moduł przerwań ma swoje rejestry kontrolne w przestrzeni I/O z dodatkowymi globalnymi bitami przerwań w rejestrze stanu. Wszystkie przerwania mają osobny wektor przerwania w tablicy wektorów przerwań. Przerwania mają priorytety zgodnie z rozmieszczeniem ich w tablicy wektorów przerwań. Im niższy adres wektora przerwań tym wyższy jego priorytet. Przestrzeń adresowa I/O zawiera 64 adresów, które mogą być dostępne bezpośrednio lub jako lokacje przestrzeni danych następujące po tych określających zestaw rejestrów, $20 - $4F. Dodatkowo ATmega128 ma rozszerzoną przestrzeń I/O od $60-$FF w SRAM, gdzie dostęp mają tylko rozkazy: ST/STS/STD i LD/LDS.LDD. Jednostka Arytmetyczno Logiczna ALU: Wysokiej klasy ALU pracuje z bezpośrednim połączeniem ze wszystkimi 32 uniwersalnymi roboczymi rejestrami. Podczas jednego cyklu maszynowego wykonywane są operacje arytmetyczne pomiędzy tymi rejestrami lub między rejestrem i stałą. Operacje wykonywane przez ALU można podzielić na trzy główne kategorie: arytmetyczne, logiczne i bitowe. Niektóre implementacje tej architektury zapewniają również mnożenie ze znakiem i format ułamkowy. Dokładny opis w spisie rozkazów. Rejestr Stanu (SR) Rejestr stanu zawiera informacje o rezultacie ostatniej operacji arytmetycznej. Ta informacja może zostać wykorzystana poprzez różne programy do wykonania operacji warunkowych. Należy zwrócić uwagę, że rejestr stanu jest aktualizowany po każdej operacji na ALU. TO w wielu przypadkach sprawia, że niepotrzebne jest używanie wyspecjalizowanych instrukcji porównywania, co wpływa na przyspieszenie działania kodu i bardziej zwięzły kod. Rejestr stanu nie jest automatycznie zapamiętywany kiedy procesor przechodzi do obsługi przerwania i ustawiany podczas powrotu z przerwania. To musi zostać obsłużone przez oprogramowanie. Rejestr stanu SREG jest zdefiniowany jako: Bit 7 6 5 4 3 2 1 0 I T H S V N Z C R/W R/W R/W R/W R/W R/W R/W R/W InVal 0 0 0 0 0 0 0 0 R/W odczyt/zapis InVal wartość inicjująca
a. Bit 7 I: Globalne przerwanie Bit ten musi być ustawiony na 1 dla przerwań. Indywidualna kontrola przerwań jest wtedy wykonywana w oddzielnym rejestrze kontrolnym. Jeżeli globalny rejestr przerwań jest wyzerowany, żadne z przerwań nie może zostać obsłużone niezależnie od indywidualnych ustawień przerwań. I-bit jest wyzerowany sprzętowo po zajściu przerwania i jest ustawiany przez rozkaz RETI, aby można było obsługiwać następne przerwania. I-bit może zostać również programowo wyzerowany poprzez rozkazy SEI i CLI. b. Bit 6 T: odpis pamięci Rozkazy kopiowania bitu BLD i BST korzystają z bitu T jako źródło lub bit docelowy dla zmienianego bitu. Rozkaz BST kopiuje bit z rejestru do bitu T, natomiast rozkaz BLD kopiuje bit T do rejestru w zestawie rejestrów. c. Bit 5 H: flaga połowicznego przeniesienia Flaga ta wskazuje przeniesienie w niektórych operacjach arytmetycznych. Flaga ta jest wykorzystywana przy arytmetyce BCD. d. Bit 4 S: bit znaku S= N + V (+ exclusive or) Bit ten jest zawsze alternatywą pomiędzy zanegowanym N i dwójkowym uzupełnieniem flagi V. e. Bit 3 V: dwójkowe dopełnienie Flaga ta wspiera dwójkową arytmetykę. f. Bit 2 N: flaga zaprzeczenia Flaga ta wskazuje na ujemny rezultat w operacjach logicznych lub arytmetycznych. g. Bit 1 Z: flaga Zero Flaga ta wskazuje zerowy rezultat w operacjach arytmetycznych i logicznych. h. Bit 0 C: flaga przeniesienia Flaga przeniesienia wskazuje na przeniesienie podczas operacji logiczej lub arytmetycznej. Ogólny zestaw rejestrów Zestaw rejestrów jest zoptymalizowany dla AVR zwiększonego zestawu rozkazów RISC. W celu osiągnięcia wymaganej szybkości i dopasowalności następujące I/O schematy są wspierane przez zestaw rejestrów: a. jeden 8-bitowy wyjściowy argument i jeden 8-bitowy wejściowy wynik b. dwa 8-bitowe wyjściowe argumenty i jeden 8-bitowy wejściowy wynik c. dwa 8-bitowe wyjściowe argumenty i jeden 16-bitowy wejściowy wynik d. jeden 16-bitowy wyjściowy argument i jeden 16-bitowy wejściowy rezultat. Rysunek 4 pokazuje strukturę 32 roboczych rejestrów w jednostce centralnej. 7 0 Adres
$00 $01 $0D Zestaw $0E Rejestrów $0F Roboczych $10 R0 R1 R2... R13 R14 R15 R16 R17... R26 R27 R28 R29 R30 R31 $1A X rejestr młodszych bitów X rejestr starszych bitów Y rejestr młodszych bitów Y rejestr starszych bitów Z rejestr młodszych bitów Z rejestr starszych bitów Większość rozkazów operujących na tych rejestrach ma bezpośredni dostęp do wszystkich rejestrów i większość to rozkazy wykonywane w jednym cyklu maszynowym. Jak pokazano na 4 rysunku, każdy z rejestrów ma również adres w pamięci, który umieszcza zestaw rejestrów na pierwszych 32 bajtach przestrzeni danych. Chociaż nie są fizycznie zaimplementowane jako lokacje SRAM, taka organizacja pamięci zapewnia łatwy dostęp do rejestrów. X, Y i Z rejestry mogą być ustawione jako wskaźnik do innych rejestrów w zbiorze. Rejestry R26..R31 mają parę dodatkowych funkcji. Rejestry te są 16-bitowymi wskaźnikami pośrednimi na adres przestrzeni danych. I tak w skład rejestru X wchodzą komórki R26 i R27, Y R28 i R29, Z R30 i R31, gdzie pierwsza komórka określa młodszy bajt. W różnych trybach adresacji rejestry te pełnią funkcje stałego przemieszczenia, automatycznej inkrementacji i dekrementacji (szczegóły dalej). Wskaźnik stosu Stos jest głównie używany do przechowywania tymczasowych danych, lokalnych zmiennych i adresów powrotów z przerwań lub wywołań podprogramów. Rejestr wskaźnika stosu zawsze pokazuje na górę stosu. Stos jest zaimplementowany rosnąco w pamięci od wyższych numerów do niższych. Wpływa to na to, że instrukcja PUSH zmniejsza wartość wskaźnika stosu. Wskaźnik stosu wskazuje na dane w przestrzeni stosu w SRAM, gdzie są ulokowane stosy Przerwań i Wywołań podprogramów. Rozmiar stosu musi być zdefiniowany zanim może dojść do wykonania podprogramów lub przerwań. Wskaźnik stosu musi zostać ustawiony tak aby wskazywał ponad adres $60. Wskaźnik stosu jest dekrementowany o jeden kiedy dane są odkładane na stos przez instrukcję PUSH i
jest dekrementowany o dwa kiedy odkładany jest adres powrotu z przerwania lub podprogramu. Wskaźnik stosu jest inkrementowany o jeden kiedy dane pobierane są przez instrukcję POP a o dwa przy powrotach z podprogramów - RET i przerwań RETI. Wskaźnik stosu w AVR jest zaimplementowany jako dwa 8-bitowe rejestry w przestrzeni I/O. Numer aktualnie używanych bitów jest zależny od implementacji. Należy zauważyć, że przestrzeń danych w niektórych implementacjach architektury AVR jest tak mała, że tylko SPL (młodszy bajt) jest potrzebne, w tym wypadku SPH (starszy bajt) nie będzie obecny. Bit 15 14 13 12 11 10 9 8 SPH SP15 SP14 SP13 SP12 SP11 SP10 SP9 SP8 SPL SP7 SP6 SP5 SP4 SP3 SP2 SP1 SP0 7 6 5 4 3 2 1 0 InVal 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 InVal wartości początkowe Wszystkie bity są do zapisu i odczytu. RAMPZ RAM page Z Select register Bit 7 6 5 4 3 2 1 0 - - - - - - - RAMPZ0 R/W R R R R R R R R/W InVal 0 0 0 0 0 0 0 0 a: bity 7..2 Res: Zarezerwowane bity To są bity zarezerwowane i zawsze będą miały wartość zero. Podczas zapisu do tych lokacji należy zapisywać zero w celu kompatybilności z przyszłymi wersjami sprzętu. b: bit 1 TAMPZ0: rozszerzony stronicowy Z-wskaźnik RAM Rejestr RAMPZ jest normalnie używany do wybrania, które 64k strony RAM jest dostępne przez Z- wskaźnik. Ponieważ ATmega128 nie wspiera więcej niż 64k pamięci SRAM ten rejestr jest używany tylko do wybrania, która strona w pamięci programu jest dostępna podczas korzystania z instrukcji ELPM/SPM. Różne ustawienia tego bitu mają następujące znaczenie: RAMPZ0 = 0 przez ELPM/SPM jest dostępny adres pamięci programu od $0000 - $7FFF RAMPZ0 = 1 przez ELPM/SPM dostępna jest pamięć o adresie $8000-$FFFF. Ustawienie RAMPZ nie wpływa na LPM. Przebiegi czasowe rozkazów Ta sekcja opisuje przebieg czasowy poszczególnych instrukcji. Jednostka centralna AVR jest napędzana przez zegar jednostki centralnej, bezpośrednio wygenerowany ze źródła zegara w układzie scalonym. Żaden wewnętrzny dzielnik zegara nie jest używany.
Rysunek 6 przedstawia równoległy rozkaz pobrania i wykonania. To jest podstawowy potokowy model osiągający do 1 MIPS na MHz. Rysunek 7 przedstawia wewnętrzny model taktowania Zbioru rejestrów. W jednym cyklu maszynowym wykonywana jest operacja pobierająca operandy z dwóch rejestrów do ALU i jej wynik jest zapisywany w rejestrze przeznaczenia. RESET i obsługa przerwań AVR zapewnia wiele różnych źródeł przerwań. Przerwania i oddzielne wektory resetu mają oddzielny wektor programu w przestrzeni pamięci programu. Każde przerwanie ma przypisany bit przerwania, który musi być zapisany zgodnie logicznie z Globalnym bitem przerwań w rejestrze stanu w celu możliwości obsługiwania przerwań. Zależnie od wartości licznika programu (PC) przerwania mogą być automatycznie unieruchamiane kiedy bity blokujące program ładujący BLB02 lub BLB12 są zaprogramowane. To rozwiązanie ulepsza bezpieczeństwo oprogramowania. Szczegółowy opis w sekcji programowanie pamięci 282. Młodsze adresy w przestrzeni pamięci programu są domyślnie zdefiniowane jako wektory RESET u i przerwań. Kompletna lista wektorów jest opisana w sekcji Przerwania 54. Lista ta determinuje priorytet poszczególnych przerwań. Im niższy adres tym wyższy priorytet. RESET ma najwyższy priorytet, następnie INT0. Wektory przerwań mogą zostać przeniesione na początek ładowalnej sekcji pamięci Flash prze ustawienie bitu IVSEL w MCU rejestrze kontroli. Wektor RESET u również może zostać przeniesiony do tej sekcji poprzez programowanie bezpiecznika BOOTRST. Dalsze informacje na stronie 269. W przypadku wystąpienia przerwania, I-bit rejestru globalnych przerwań jest zerowany i wszystkie inne przerwania zostają zablokowane. Oprogramowanie użytkownika może wpisać do tego bitu logiczną jedynkę, aby odblokować zagnieżdżone przerwania. Wtedy wszystkie przerwania mogą przerywać procedurę obsługi przerwania. I-bit jest automatycznie ustawiany przy powrocie z przerwania - RETI.
Wyróżniamy dwa podstawowe rodzaje przerwań. Pierwszy typ jest uruchamiany poprzez zdarzenie, które ustawia flagę przerwań. Dla tych przerwań licznik programu (PC) jest ustawiany na aktualny wektor przerwania w celu wykonania procedury obsługi przerwania i sprzęt zeruje odpowiednią flagę przerwania. Flagi przerwań mogą być zerowane poprzez wpisywanie logicznej jedynki do bitu flagi. Jeśli zajdą wszystkie warunki przerwania podczas obsługi takiego samego przerwania zerującego bit przerwań, flaga zostanie ustawiona i zapamiętana do obsłużenia tego przerwania, lub jest ona wyzerowana przez oprogramowanie. Podobnie, jeżeli zostaną zgłoszone przerwania podczas, gdy bit globalnego przerwania jest wyzerowany, flagi tych przerwań zostaną zapamiętane do czasu ustawienia globalnego bitu przerwania i zostaną wykonane zgodnie z priorytetem. Drugi typ przerwań będzie uruchamiany tak długo, jak warunki na zaistnienie przerwania będą obecne. Takie przerwanie nie muszą koniecznie mieć flag przerwań. Jeśli warunki powodujące przerwanie zakończą się zanim zostanie ono obsłużone, przerwanie to nie zostanie obsłużone. Kiedy AVR wyjdzie z obsługi przerwania zawsze powróci do głównego programu i wykona następną instrukcję przed obsługą oczekującego przerwania. Należy zauważyć, że rejestr stanu nie jest automatycznie odkładany na stos przy przejściu do obsługi przerwania, jak również nie jest z tego stosu pobierany po powrocie z obsługi przerwania. To musi zostać obsłużone programowo. Korzystając z rozkazu CLI możemy natychmiastowo zamaskować przerwanie. Żadne przerwanie nie zostanie obsłużone po tym rozkazie, nawet jeżeli zostało zgłoszone równolegle z wykonywaniem tego rozkazu. Przykład pokazuje jak można wykorzystać ten rozkaż w celu uniknięcia przerwań przy zapisie do EEPROM. Kod w asemblerze: in r16, SREG cli sbi EECR, EEMWE sbi EECR, EEWE out SREG, r16 //rozpoczęcie zapisu do EEPROM Kod w C: char csreg; csreg = SREG; _CLI(); EECR = (1<<EEMWE); /* początek zapisu*/ EECR = (1<<EEWE); SREG = csreg ; Korzystając z rozkazu SEI można odmaskować zamaskowane przerwania. Instrukcja następująca po SEI będzie wykonana przed obsługą przerwania. Czas odpowiedzi na przerwanie Minimalnym czasem oczekiwania na wykonanie przerwania jest czas czterech cykli maszynowych. Po czterech cyklach maszynowych adres programu wskazywany wektorem dla aktualnego obsługi przerwania jest wykonywany. W tym czasie licznik programu jest odkładany na stos. Zwyczajnie wektor jest skokiem do podprogramu obsługi przerwania, i skok ten trwa zazwyczaj trzy cykle maszynowe. Jeżeli dojdzie do zgłoszenia przerwania podczas wykonywania wielocyklowej operacji, operacja jest kończona
przed obsługą przerwania. Jeżeli zostanie zgłoszone przerwanie gdy MCU jest w trybie snu, odpowiedź na przerwanie jest wydłużona o cztery cykle maszynowe. To zwiększenie jest następstwem czasu potrzebnego na rozpoczęcie działania. Powrót z procedury obsługi przerwania trwa cztery cykle maszynowe. W tym czasie ze stosu jest pobierany licznik programu, wskaźnik stosu jest zwiększany o dwa i jest ustawiany I-bit rejestru SREG. PAMIĘCI AVR ATMEGA128 Sekcja ta opisuje różne rodzaje pamięci w ATmega128. Architektura ATmega128 ma dwie główne przestrzenie pamięci: Pamięć Danych i Pamięć Programu. W dodatku, ATmega128 ma pamięć EEPROM służącą przechowywaniu danych. Wszystkie te przestrzenie pamięci są linearne i regularne. Wewnętrzna reprogramowalna pamięć programu typu Flash. ATmega128 zawiera 128k bajtów reprogramowalnej pamięci Flash w strukturze półprzewodnikowej służącej do magazynowania pamięci. Odkąd wszystkie rozkazy są 16-to lub 32 bitowe, pamięć Flash jest zorganizowana jako 64K x 16. Dla bezpieczeństwa oprogramowania pamięć Flash jest podzielona na dwie sekcje: Inicjującą system i dla programów użytkowych. Pamięć Flash ma trwałość ponad 1000 cykli zapisu i odczytu. Licznik programu w ATmega128 jest 16 bitowy, tak więc może zaadresować on 64k pamięci. Szczegóły dotyczące sekcji inicjującej system i związane z nim bity zabezpieczeń zostały opisane na stronie 269. Szczegółowy opis ładowania programu poprzez SPI przy użyciu JTAG interfejs u znajduje się na stronie 282. Stałe tablice mogą być alokowane przy użyciu całej przestrzeni adresowej pamięci programu. Przebiegi czasowe dla instrukcji pobrania i wykonania znajdują się na stronie 13. Pamięć danych SRAM
ATmega128 wspiera dwa rodzaje konfiguracji pamięci SRAM: Konfiguracja Wewnętrzna pamięć SRAM Zewnętrzna pamięć SRAM tryb normalny 4096 Do 64k Tryb kompatybilności z ATmega103 4000 Do 64k ATmega128 jest złożonym mikrokontrolerem z większą ilością jednostek peryferyjnych niż może być obsłużona za pomocą 64 lokacji zarezerwowanych w kodzie operacyjnym dla rozkazów IN i OUT. Dla rozszerzonej przestrzeni pamięci I/O od $60 do $FF w SRAM, tylko rozkazy ST/STS/STD oraz LD/LDS/LDD mogą zostać użyte. Ta przestrzeń adresowa nie istnieje gdy jest włączony tryb kompatybilności z ATmega103. W normalnym trybie pierwszych 4352 lokacji pamięci danych adresuje zarówno zestaw rejestrów jak i pamięć I/O, rozszerzoną pamięć I/O oraz wewnętrzną pamięć SRAM. Pierwsze 32 adresy odpowiadają zestawowi rejestrów, następne 64 adresy to pamięć I/O, potem 160 adresów to rozszerzona pamięć I/O i wreszcie 4096 adresów adresuje przestrzeń danych w SRAM. W trybie kompatybilności z ATmega103, pierwsze 4096 adresów pamięci danych adresuje zarówno zestaw rejestrów jak i pamięć I/O, wewnętrzny SRAM. Pierwsze 32 adresy odnoszą się do zestawu rejestrów, następne 64 do pamięci I/O a pozostałe 4000 do SRAM. Opcjonalna zewnętrzna pamięć danych SRAM może być dołączona do ATmega128. Ta pamięć będzie zajmowała pozostałą przestrzeń adresową 64K. Przestrzeń ta rozpoczyna się po przestrzeni adresowej dla wewnętrznej pamięci SRAM. Zestaw rejestrów, I/O, rozszerzone I/O i wewnętrzna SRAM zajmują 4096 młodszych adresów w trybie kompatybilności z ATmega103, więc korzystając z 64KB zewnętrznej pamięci 61184 bajty zewnętrznej pamięci są dostępne w trybie normalnym a 61440 w trybie kompatybilności z ATmega103. Dalsze szczegóły w Rozszerzonym interfejs ie pamięci na stronie 24. Kiedy adresy dostępu do przestrzeni pamięci SRAM przekroczą adresy wewnętrznej pamięci, pamięć zewnętrzna jest dostępna dla tych samych rozkazów, dla których była dostępna pamięć wewnętrzna. Kiedy wewnętrzna pamięć jest dostępna, wyprowadzenia strobowe do odczytu i zapisu (PG0 PG1) są nieaktywne podczas cyklu dostępu. Zewnętrzna pamięć SRAM jest dostępna poprzez ustawienie bity SRE w rejestrze MCUCR. NA dostęp do zewnętrznej pamięci potrzebny jest dodatkowy cykl maszynowy porównujący bajt dostępu do wewnętrznej SRAM. TO znaczy, że rozkazy: LD, ST, LDS, STS, LDD, STD, PUSH i POP są dłuższe o jeden cykl maszynowy. Jeżeli stos jest umiejscowiony w zewnętrznej pamięci SRAM rozkazy powrotów i wejść do programów obsługi przerwań i podprogramów są o trzy cykle dłuższe ze względu na odkładanie i pobieranie dwubajtowej zawartości licznika rozkazów i adres zewnętrznej pamięci nie korzysta z wewnętrznej linii dostępu do pamięci. Kiedy zewnętrzny interfejs pamięci SRAM jest używany w trybie oczekiwania, jedno bajtowy zewnętrzny dostęp trwa jeden, trzy lub nawet o cztery dodatkowe cykle maszynowe dłużej odpowiednio dla jednego, trzech i czterech stanów oczekiwania. Zgłoszenia przerwań i odwołania do podprogramów i powroty z nich będą potrzebowały o pięć, siedem lub dziewięć cykli maszynowych więcej niż jest to przewidziane w zestawie rozkazów dla stanów oczekiwań. Pięć trybów adresowania dla pamięci danych zawiera: bezpośredni, pośredni z przemieszczeniem, pośredni, pośredni z wcześniejszą dekrementacją i pośredni z późniejszą inkrementacją. W zestawie rejestrów, rejestry R26 R31 występują w roli pośrednich wskaźników do pamięci. Adresowanie bezpośrednie osiąga cała przestrzeń adresową. Adresowanie bezpośrednie z przemieszczeniem osiąga 63 adresy od bazy podanej przez rejestr Y lub Z.
Korzystając z pośredniego adresowania z wcześniejszą dekrementacją lub późniejszą inkrementacją, rejestry adresu X, Y, Z są dekrementowane lub inkrementowane. 32 ogólno dostępne rejestry robocze, 64 rejestrów I/O, i 4096 bajtów wewnętrznej przestrzeni danych SRAM w ATmega128 jest dostępne przez wszystkie tryby adresowania. Czas dostępu do pamięci danych. Sekcja ta opisuje ogólny pojęcie czasu dostępu do pamięci. Dostęp do wewnętrznej pamięci SRAM trwa dwa cykle maszynowe jak opisano na rysunku 10. EEPROM pamięć danych
ATmega128 zawiera 4k bajty pamięci danych EEPROM. Jest ona zorganizowana jako oddzielna przestrzeń pamięci, w której oddzielny bajt może być zapisywany lub odczytywany. EEPROM wytrzymuje ponad 100000 cykli zapisu i wymazania. Dostęp pomiędzy EEPROM i jednostką centralną jest opisany poprzez wyszczególnienie Rejestrów adresów EEPROM, Rejestrów danych EEPROM i rejestru kontroli EEPROM. Szczegółowy opis ładowania pamięci poprzez SPI znajduje się na stronie 296 i 301. EEPROM dostęp do zapisu i odczytu Rejestry dostępu w EEP{ROM są dostępne w przestrzeni I/O. Czas dostępu w przypadku zapisu jest podany w tabeli 2. Samowyzwalające się funkcje, jednakże pozwalają oprogramowaniu użytkownika wykrywać kiedy następny bajt może zostać zapisany. Jeśli program użytkowy zawiera instrukcje zapisując do EEPROM niektóre środki ostrożności muszą zostać zachowane. W silnie filtrowanych zasobach mocy, napięcie V może powoli opadać lub narastać podczas wyłączania lub załączania. To powoduje, że urządzenie pracuje przy niższym zasilaniu niż minimalne potrzebne do utrzymania odpowiedniej częstotliwości zegara. Szczegóły w Zapobieganiu uszkodzeniom EEPROM na stronie 23. W celu uniknięcia niezamierzonych zapisów do EEPROM musi być przestrzegana specjalistyczna procedura zapisu. Szczegółowy opis w rejestrach kontroli EEPROM. Podczas odczytu z EEPROM jednostka centralna jest zatrzymywana na cztery cykle maszynowe zanim następny rozkaz zostanie wykonany. Kiedy EEPROM jest zapisywany jednostka centralna jest zatrzymywana na dwa cykle maszynowe przed wykonaniem następnej instrukcji. Rejestr Adresu EEPROM EEARH, EEARL - - - - EEAR11 EEAR10 EEAR9 EEAR8 EEAR7 EEAR6 EEAR5 EEAR4 EEAR3 EEAR2 EEAR1 EEAR0 R/W R R R R R/W R/W R/W R/W R/W R/W R/W R/W R/W R/W R/W R/W InVal 0 0 0 0 X X X X X X X X X X X X R/W odczyt/zapis InVal wartrości początkowe a: bity15..12 Res: Bity zarezerwowane Te bity są zarezerwowane i zawsze będą odczytywane jako 0. Podczas zapisu pod te adresy należy przypisać tym bitom zera dla kompatybilności z przyszłymi urządzeniami. b: bity 11..0 EEAR11..0: Adresy EEPROM Rejestry adresu EEPROM EEARL, EEARH specyfikują adres w 4k przestrzeni adresów EEPROM. Bajty danych w EEPROM są ułożone linearnie pomiędzy 0 i 4096. Początkowa wartość EEAR jest niezdefiniowana. Jednak odpowiednia wartość musi zostać wpisana nim EEPROM będzie dostępny.
Rejestr danych EEPROM EEDR MSB LSB Wszystkie bity są zarówno do zapisu jak i odczytu. Wszystkie bity są inicjowane wartości logiczną 0. a: bity 7..0 EEDR7..0 : dane EEPROM Dla operacji zapisu w EEPROM, rejestr EEDR zawiera dane, które mają zostać zapisane pod adres podany w rejestrze EEAR. Przy operacji odczytu z EEPROM rejestr EEDR zawiera odczytaną daną z pod adresu podanego przez rejestr EEAR. Rejestr kontroli EEPROM EECR - - - - EERIE EEMWE EEWE EERE R/W R R R R R/W R/W R/W R/W InVal 0 0 0 0 0 0 X 0 a: bity7..4 Res: bity zarezerwowane Te bity są bitami zarezerwowanymi i będą zawsze odczytywane jako zero. b: bit 3 EERIE: bit gotowości do obsłużenia przerwania Wpisanie jeden umożliwia obsługę przerwania jeżeli I-bit w SREG jest ustawiony. Wpisanie zera maskuje przerwania. Bit gotowości przerwania EEPROM generuje stałe przerwanie iedy EEWE jest wyzerowane. c: bit 2 EEMWE: wzorcowy bit umożliwiający zapis Bit ten determinuje czy ustawienie EEWE na jeden powoduje zapis do EEPROM. Jeżeli EEMWE jest ustawione na jeden to zapis jedynki do EEWE w przeciągu czterech cykli maszynowych spowoduje zapis danej do EEPROM pod wybranym adresem. Jeżeli EEMWE jest wyzerowane to wpisanie jedynki do EEWE nie będzie miało żadnego efektu. Jedynkując EEMWE przez oprogramowanie, sprzęt wyzeruje tą wartość po czterech cyklach maszynowych. d: bit 1 EEWE: Bit umożliwiający zapis do EEPROM Kiedy adres i dane są dobirze ustawione bit ten musi być ustawiony aby zapisać wartość do EEPROM. EEMWE musi być ustawione kiedy logiczna jedynka jest wpisywana do EEWE, w przeciwnym wypadku nie nastąpi zapis do EEPROM. Następująca progredura powinna być przestrzegana podczas zapisu do EEPROM: 1. Czekać dopóki EEWE stanie się zerem 2. Czekać, aż SPMEN w SPMCR stanie się zerem 3. Zapisać nowy adres do EEAR opcjonalne 4. Zapisać nową daną do EEDR opcjonalne 5. Zapisać logiczną jedynkę do EEMWE podczas zapisu zera do EEWE i EECR 6. W czasie czterech cykli maszynowych po ustawieniu EEMWE zapisać logiczną jedynkę do EEWE. EEPROM nie może być programowany podczas zapisu CPU do pamięci Flash. Oprogramowanie musi sprawdzić czy programowanie Flash jest skończone nim zacznie przygotowywać zapis do EEPROM. Krok 2 jest zależny od tego czy oprogramowanie zawiera boot loadera pozwalającego jednostce centralnej programować Flash. Jeżeli Flash nigdy nie jest aktualizowane przez CPU krok 2 może zostać pominięty.
UWAGA: Przerwanie między 5 i 6 krokiem spowoduję, że zapis będzie nieudany, ponieważ upłynie czas dla wzorcowego bitu umożliwiającego zapis. Jeśli obsługa przerwania mająca dostęp do EEPROM przerywa inny proces mający dostęp do EEPROM rejestry EEAR i EEDR zostaną zmodyfikowane powodując błąd przy dostępie do EEPROM. Zaleca się, aby globalną flagę przerwań zerować przy wykonywaniu czterech ostatnich kroków w celu uniknięcia tych problemów. Kiedy czas na zapis upłynął bit EEWE jest zerowany przez sprzęt. Oprogramowanie użytkownika może sprawdzać ten bit w oczekiwaniu pojawienia się tam zera przed zapisem następnego bajtu. Kiedy EEWE jest ustawiony, jednostka centralna jest wstrzymywana na dwa cykle i nim następna instrukcja zostanie wykonana. e: bit 0 EERE: bit umożliwiający odczyt z EEPROM Kiedy odpowiedni adres jest ustawiony w rejestrze EEAR bit EERE musi zostać ustawiony na logiczne jeden aby spowodować odczyt z EEPROM. Odczyt z EEPROM zajmuje jedną instrukcję i żądana dana jest dostępna od razu. Kiedy następuje odczyt z EEPROM jednostka centralna jest wstrzymywana na cztery cykle nim zostanie wykonana następna instrukcja. Użytkownik powinien sprawdzać bit EERE przed rozpoczęciem operacji odczytu. Jeśli jest wykonywana instrukcja zapisu, to nie można ani odczytać EEPROM, ani zmienić danych w rejestrze EEAR. Wzorcowy oscylator jest używany do regulacji dostępu do EEPROM. Tabela 2 przedstawia typowe czasy programowania dla dostępu do EEPROM z jednostki cendtralnej. Symbol Numer wzorcowego Typ programowanego RC czasu Cykle oscylatora Zapis EEPROM (z 8448 8.5 ms CPU) Uwaga: Użycie zegara o częstotliwości 1MHz zależnego od ustawień CKSEL-bezpiecznika. Następujące przykłady kodu pokazują funkcje zapisujące do EEPROM. Przykłady zakładają, że przerwania są kontrolowane tak, że nie zajdzie żadne przerwanie podczas wykonywania tych funkcji. Przykłady te zakładaj ą również, że nie ma flash boot loadera obecnego w oprogramowaniu. Jeśli taki kod jest obecny, funkcje zapisu muszą również oczekiwać na rozkaz zakończenia z SPM. Kod w asemblerze: EEPROM_write: ;czekaj, aż zostanie zakończony zapis poprzednich danych sbic EECR, EERE rjmp EEPROM_write ;ustaw adresy r18:r17 w rejestrze adresów out EEARH,r18 out EEARL, r17 ; zapisz dane do rejestru r16 out EEDR, r16 ; ustaw EEMWE na jeden sbi EECR, EEMWE ;rozpocznij zapis