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 |
©2023 mgr Jerzy Wałaszek |
https://www.microchip.com/about-us/legal-information/copyright-usage-guidelines
Rozdział ten opisuje różne rodzaje pamięci mikrokontrolera ATtiny2313A/4313. Architektura AVR dokonuje rozróżnienia pomiędzy pamięcią programu a pamięcią danych, umieszczając każdy rodzaj pamięci w oddzielnej przestrzeni adresowej. Kod wykonywalny znajduje się w nieulotnej pamięci programu (FLASH), natomiast dane mogą przebywać w ulotnej (SRAM) lub w nieulotnej (EEPROM) pamięci.
Wszystkie przestrzenie adresowe są liniowe i regularne.
ATtiny2313A/4313 zawiera 2/4KB wbudowanej i programowalnej w systemie pamięci FLASH na przechowywanie programu. Pamięci FLASH są nieulotne, tzn. przechowują umieszczoną w nich informację nawet wtedy, gdy nie są zasilane.
Ponieważ wszystkie instrukcje AVR mają szerokość 16- lub 32 bitów, to FLASH zorganizowana jest jako 1024/2048 × 16 bitów. Licznik rozkazów (ang. Program Counter, PC) ma szerokość 10/11 bitów, co pozwala mu zaadresować wszystkie 1024/2048 komórek pamięci programu. Poniższa tabela przedstawia rozmiar pamięci programu (FLASH).
Mikrokontroler | Rozmiar FLASH | Zakres adresów | |
ATtiny2313A | 2KB | 1024 słów | 0x0000 – 0x03FF |
ATtiny4313 | 4KB | 2048 słów | 0x0000 – 0x07FF |
Tablice stałych mogą być umieszczane wewnątrz całej przestrzeni adresowej pamięci programu. Zobacz na opis instrukcji LPM i SPM. Pamięć programu FLASH może być również programowana przez zewnętrzny programator.
Pamięć FLASH ma wytrzymałość co najmniej 10000 cykli zapisu/kasowania.
Poniższa tabelka pokazuje sposób organizacji pamięci i rejestrów w ATtiny2313A/4313. Obszary te są ulotne, tzn. nie zachowują one wprowadzonej informacji po wyłączeniu zasilania.
Mikrokontroler | Obszar pamięci | Rozmiar | Długi adres(1) | Krótki adres(2) |
ATtiny2313A | Rejestry ogólnego przeznaczenia | 32 B | 0x000 – 0x01F | n/a |
Rejestry we/wy | 64 B | 0x020 – 0x05F | 0x00 – 0x3F | |
Pamięć danych SRAM | 128 B | 0x060 – 0x0E0 | n/a | |
ATtiny4313 | Rejestry ogólnego przeznaczenia | 32 B | 0x000 – 0x01F | n/a |
Rejestry we/wy | 64 B | 0x020 – 0x05F | 0x00 – 0x3F | |
Pamięć danych SRAM | 256 B | 0x060 – 0x160 | n/a |
Adresy dolne 224/352 komórek pamięci odnoszą się do zestawu rejestrów roboczych, pamięci we/wy, rozszerzonej pamięci we/wy oraz do wewnętrznej pamięci danych SRAM.
Pierwsze 32 adresy wskazują rejestry robocze R1...R32. Rejestry te opisano dokładnie w podrozdziale "Zestaw rejestrów ogólnego przeznaczenia".
Po rejestrach ogólnego przeznaczenia następne 64 komórki jest zarezerwowane na rejestry we/wy. Rejestry w tym obszarze używane są głównie do komunikacji z modułami we/wy i peryferyjnymi w mikrokontrolerze. Dane można przenosić pomiędzy przestrzenią we/wy a rejestrami ogólnego przeznaczenia za pomocą takich instrukcji jak IN, OUT, LD, ST oraz ich pochodnych. Do wszystkich rejestrów we/wy w tym obszarze uzyskuje się dostęp przy pomocy instrukcji IN i OUT. Te specyficzne instrukcje we/wy adresują pierwszą komórkę obszaru rejestrów we/wy jako 0x00, a ostatnią jako 0x3F. Dolne 32 rejestry (o adresach w zakresie 0x00...0x1F) są dostępne dla niektórych instrukcji operujących na bitach. W tych rejestrach bity można łatwo ustawiać i kasować za pomocą instrukcji SBI i CBI, natomiast skoki warunkowe bitowo realizuje się bezpośrednio przy użyciu instrukcji SBIC, SBIS, SBRC i SBRS. Dostęp do rejestrów w tym obszarze można również uzyskać przy pomocy instrukcji LD/LDD/LDI/LDS oraz ST/STD/STS. Instrukcje te traktują całą pamięć ulotną jako jedną przestrzeń danych, dlatego adresy rejestrów we/wy rozpoczynają się od 0x20.
ATtiny2313A/4313 zawiera również trzy rejestry we/wy ogólnego przeznaczenia do przechowywania dowolnej informacji: GPIOR0, GPIOR1 i GPIOR2. Rejestry te nadają się szczególnie do przechowywania zmiennych globalnych oraz znaczników stanu, ponieważ są dostępne dla instrukcji działających na bitach takich jak SBI, CBI, SBIC, SBIS, SBRC i SBRS.
Za rejestrami ogólnego przeznaczenia i obszarem rejestrów we/wy pozostałe 128/256 komórek rezerwuje wewnętrzna pamięć danych SRAM.
Jest dostępnych pięć trybów adresowania:
Wszystkie tryby adresowania mogą zostać użyte na całej pamięci ulotnej, łącznie z rejestrami ogólnego przeznaczenia, rejestrami we/wy oraz pamięcią danych.
Dostęp do wewnętrznej pamięci SRAM wykonywany jest w dwóch taktach clkCPU, co pokazuje poniższy rysunek:
Poniższa tabelka podsumowuje układ pamięci EEPROM.
Mikrokontroler | Rozmiar EEPROM | Zakres adresów |
ATtiny2313A | 128 B | 0x00 – 0x7F |
ATtiny4313 | 256 B | 0x00 – 0xFF |
Wewnętrzny oscylator 8MHz jest wykorzystywany do odmierzania
czasu operacji na pamięci EEPROM. Zobacz do opisu rejestru
OSCCAL (ang.
Oscillator Calibration Register, rejestr kalibracyjny
oscylatora).
Przy zasilaniu mikrokontrolera z mocno filtrowanych zasilaczy
napięcie zasilania VCC ma tendencję do wolnego
narastania i opadania przy włączaniu i wyłączaniu. Wolne czasy
narastania i opadania mogą wprowadzić mikrokontroler w stan, w
którym pracuje on przy napięciu zasilającym niższym niż
dozwolone. Aby zapobiec problemom w takich sytuacjach należy
zastosować odpowiednie środki ostrożności, które opisujemy w
rozdziale "Zapobieganie uszkodzeniu danych w
EEPROM".
Pamięć EEPROM wytrzymuje przynajmniej 100,000 cykli
zapisu/kasowania
Są dwie metody programowania pamięci EEPROM:
Metoda programowania jest wybierana przy pomocy bitów trybu programowania EEPROM (ang. EEPROM Programming Mode bits, EEPM1 i EEPM0) w rejestrze sterowania EEPROM (ang. EEPROM Control Register, EECR).
Ponieważ programowanie zajmuje pewien czas, aplikacja musi czekać na zakończenie jednej operacji przed rozpoczęciem następnej. Można to zrobić albo przez sprawdzanie stanu bitu aktywującego programowanie EEPROM (ang. EEPROM Program Enable bit, EEPE) w rejestrze sterującym EEPROM EECR, albo poprzez przerwanie generowane przy gotowości EEPROM (ang. EEPROM Ready Interrupt). Przerwanie to jest kontrolowane przez bit EERIE (ang. EEPROM Ready Interrupt Enable, uaktywnienie przerwań przy gotowości EEPROM) w rejestrze EECR.
Aby odczytać komórkę pamięci EEPROM postępuj wg poniższej procedury:
W celu zapobieżenia niezamierzonym zapisom do EEPROM należy postępować wg specjalnej procedury przy kasowaniu komórek pamięci:
W celu zapobieżenia niezamierzonym zapisom do EEPROM należy postępować wg specjalnej procedury przy zapisie komórek pamięci. Przed zapisaniem danych do EEPROM docelowa komórka musi zostać skasowana. Może to być wykonane albo w tej samej operacji, albo jako część rozdzielonej operacji. Zapis do nieskasowanej komórki EEPROM spowoduje uszkodzenie danych (skasowana komórka ma wszystkie bity ustawione na 1, co pozwala na poprawne zaprogramowanie nowej danej). Aby wykonać zapis do komórki pamięci EEPROM, postępuj wg poniższej procedury:
Podczas okresów niskiego napięcia zasilającego VCC dane w EEPROM mogą ulec uszkodzeniu przy zapisie, ponieważ napięcie zasilające jest zbyt niskie na poprawne funkcjonowanie mikroprocesora oraz EEPROM. Problem ten jest taki sam jak w systemach z zewnętrznymi pamięciami EEPROM i te same rozwiązania powinny być stosowane.
Uszkodzenie danych w EEPROM może być spowodowane przez dwie sytuacje, gdy napięcie jest zbyt niskie. Po pierwsze normalna sekwencja zapisu do EEPROM wymaga minimalnego napięcia, aby zadziałać prawidłowo. Po drugie sam mikroprocesor może nieprawidłowo wykonywać instrukcje, jeśli napięcie zasilania jest zbyt niskie.
Uszkodzeniu danych w EEPROM można łatwo zapobiec, stosując następujące zalecenia projektowe:
Utrzymuj końcówkę AVR RESET w stanie aktywnym (niskim 0) podczas okresów niewystarczającego napięcia zasilania. Można to zrobić, przez uaktywnienie wewnętrznego detektora spadku napięcia (ang. Brown-out Detector, BOD). Jeśli poziom wykrywania wewnętrznego detektora BOD nie odpowiada wymaganemu poziomowi wykrywania, to można użyć zewnętrznego układu resetowania przy niskim napięciu VCC. Jeśli reset wystąpi podczas operacji zapisu, operacja ta zostanie dokończona o ile napięcie zasilania jest wystarczające.
Poniższe przykłady kodów pokazują po jednej funkcji w asemblerze i w języku C dla kasowania, zapisu lub atomowego zapisu EEPROM. Przykłady zakładają globalne wyłączenie przerwań (wyzerowany bit I w rejestrze stanu SREG), aby żadne z przerwań nie wystąpiło podczas wykonywania tych funkcji.
Przykład w kodzie maszynowym |
EEPROM_write: ; Zaczekaj na dokończenie poprzedniego zapisu sbic EECR,EEPE rjmp EEPROM_write ; Ustaw tryb Programowanie ldi r16, (0<<EEPM1)|(0<<EEPM0) out EECR,r16 ; Ustaw adres (r17) w rejestrze adresowym out EEAR,r17 ; Zapisz dane (r16) do rejestru danych out EEDR,r16 ; Wpisz logiczną jedynkę do bitu EEMPE sbi EECR,EEMPE ; Rozpocznij zapis w EEPROM przez ustawienie bitu EEPE sbi EECR,EEPE ret |
Przykład w języku C |
void EEPROM_write(unsigned char ucAddress, unsigned char ucData) { /* Zaczekaj na dokończenie poprzedniego zapisu */ while(EECR & (1<<EEPE)); /* Ustaw tryb Programowanie */ EECR = (0<<EEPM1)|(0>>EEPM0) /* Ustaw rejestry adresu i danych */ EEAR = ucAddress; EEDR = ucData; /* Wpisz logiczną jedynkę do bitu EEMPE */ EECR |= (1<<EEMPE); /* Rozpocznij zapis w EEPROM przez ustawienie bitu EEPE */ EECR |= (1<<EEPE); } |
Następne przykłady kodu pokazują funkcje w asemblerze i w języku C dla odczytu EEPROM. Przykłady zakładają globalne wyłączenie przerwań podczas wykonywania tych funkcji..
Przykład w kodzie maszynowym |
EEPROM_read: ; Zaczekaj na dokończenie poprzedniego zapisu sbic EECR,EEPE rjmp EEPROM_read ; Ustaw adres (r17) w rejestrze adresowym out EEAR,r17 ; Rozpocznij odczyt EEPROM przez zapis EERE sbi EECR,EERE ; Odczytaj dane z rejestru danych in r16,EEDR ret |
Przykład w języku C |
unsigned char EEPROM_read(unsigned char ucAddress) { /* Zaczekaj na dokończenie poprzedniego zapisu */ while(EECR & (1<<EEPE)); /* Ustaw rejestr adresowy */ EEAR = ucAddress; /* Rozpocznij odczyt EEPROM przez zapis EERE */ EECR |= (1<<EERE); /* Zwróć dane z rejestru danych */ return EEDR; } |
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0x1E (0x3E) | EEAR7 | EEAR6 | EEAR5 | EEAR4 | EEAR3 | EEAR2 | EEAR1 | EEAR0 | EEAR |
Zapis/Odczyt | O(2313) Z/O(4313) |
Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | |
Wartość początkowa | 0(2313)/X | X | X | X | X | X | X | X |
Jest to najbardziej znaczący bit adresu EEPROM dla mikrokontrolera ATtiny4313. W układach posiadających mniej pamięci EEPROM, tj. ATtiny2313A, bit ten jest zarezerwowany i przy odczycie zawsze daje wartość 0. Początkowa zawartość rejestru adresowego EEPROM jest niezdefiniowana i należy do niego wpisać poprawną zawartość przed dostępem do EEPROM.
To są dolne bity rejestru adresowego EEOPROM. bajty danych pamięci EEPROM są adresowane liniowo w zakresie 0...128 - 1 (0...256 - dla 4313). Początkowa zawartość rejestru adresowego EEPROM jest niezdefiniowana i należy do niego wpisać poprawną zawartość przed dostępem do EEPROM.
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0x1D (0x3D) | EEDR7 | EEDR6 | EEDR5 | EEDR4 | EEDR3 | EEDR2 | EEDR1 | EEDR0 | EEDR |
Zapis/Odczyt | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | |
Wartość początkowa | X | X | X | X | X | X | X | X |
Dla operacji zapisu w EEPROM rejestr EEDR zawiera dane do zapisania pod adresem podanym przez rejestr EEARL. Dla operacji odczytu z EEPROM rejestr EEDR zawiera dane odczytane z komórki EEPROM o adresie podanym w rejestrze EEARL.
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0x1C (0x3C) | - | - | EEPM1 | EEPM0 | EERIE | EEMPE | EEPE | EERE | EECR |
Zapis/Odczyt | O | O | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | |
Wartość początkowa | 0 | 0 | X | X | X | X | X | 0 |
Te bity są zarezerwowane do użytku w przyszłości i na ATtiny2313A/4313 dają przy odczycie wartość 0.
Bity te ustalają rodzaj programowania, które zostanie wyzwolone przy zapisie do bitu EEPE. Możliwe jest programowanie danych w jednej operacji atomowej (skasowanie starej zawartości i zaprogramowanie nowej) lub rozdzielenie operacji kasowania i zapisu na dwie osobne operacje. Czasy programowania pokazane są w poniższej tabeli. Gdy bit EEPE jest ustawiony, każdy zapis do bitów EEPMn zostanie zignorowany. Podczas resetu bity EEPMn zostaną ustawione na 0b00, chyba że pamięć EEPROM jest zajęta programowaniem.
Bity trybu programowania EEPROM
EEPM1 | EEPM0 | Czas programowania |
Operacja |
0 | 0 | 3,4 ms | Kasowanie i zapis w jednej operacji (operacja atomowa) |
0 | 1 | 1,8 ms | Tylko kasowanie |
1 | 0 | 1,8 ms | Tylko zapis |
1 | 1 | – | Zarezerwowane na przyszłość |
Ustawienie bitu EERIE na 1 uaktywnia przerwania przy gotowości EEPROM, jeśli bit I w SREG jest ustawiony. Wyzerowanie bitu EERIE wyłącza to przerwanie. Przerwanie to jest generowane ciągle, gdy pamięć nieulotna jest gotowa na programowanie.
Bit EEMPE określa, czy zapis jedynki do bitu EEPE odniesie jakiś skutek, czy też nie. Gdy bit EEMPE zostanie ustawiony, to ustawienie EEPE w ciągu czterech cykli zegarowych spowoduje zaprogramowanie komórki EEPROM pod wybranym adresem. Jeśli EEMPE ma wartość zero, to ustawienie EEPE nie będzie miało żadnego skutku. Gdy do bitu EEMPE program wpisał 1, to bit ten zostanie wyzerowany sprzętowo po czterech cyklach zegarowych.
Sygnał EEPE jest sygnałem wyzwalającym programowanie EEPROM. Gdy bit EEPE zostanie zapisany, pamięć EEPROM będzie zapisana zgodnie z ustawieniem bitów EEPMn. Przed zapisem logicznej jedynki do bitu EEPE bit EEMPE musi zostać ustawiony na 1, inaczej zapis do EEPROM nie odbędzie się. Gdy upłynie czas zapisu bit EEPE zostanie wyzerowany sprzętowo. Gdy bit EEPE zostanie ustawiony, mikroprocesor jest wstrzymywany na dwa cykle zegarowe przed wykonaniem następnej instrukcji.
Sygnał EERE jest strobem odczytu dla EEPROM. Gdy poprawny adres zostanie ustawiony w rejestrze EEARL, bit EERE musi być zapisany stanem 1, aby wyzwolić odczyt z EEPROM. Dostęp odczytu z EEPROM zajmuje jedną instrukcję, a zażądane dane są dostępne natychmiast. Gdy pamięć EEPROM jest odczytywana, mikroprocesor zostaje wstrzymany na cztery cykle zegarowe przed wykonaniem następnej instrukcji. Użytkownik powinien sprawdzać stan bitu EEPE przed rozpoczęciem operacji odczytu. Jeśli trwa operacja zapisu, nie jest możliwy odczyt EEPROM, ani zmiana rejestru EEAR.
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0x15 (0x35) | MSB | LSB | GPIOR2 | ||||||
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 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0x14 (0x34) | MSB | LSB | GPIOR1 | ||||||
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 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0x13 (0x33) | MSB | LSB | GPIOR0 | ||||||
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 |
![]() |
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2023 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.