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

©2021 mgr Jerzy Wałaszek
I LO w Tarnowie

obrazek

Mikrokontrolery

ATtiny2313A/4313

Pamięci w mikrokontrolerze ATtiny2313A/4313

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

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.

Pamięć programu FLASH

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.

Na początek:  podrozdziału   strony 

Pamięć danych SRAM i rejestry

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
Noty: 1. Znany również jako adres danych. Ten tryb adresowania pokrywa całą pamięć danych oraz obszar rejestrów. Adres zawarty jest w 16-bitowym obszarze instrukcji 32-bitowych.
  2. Znany również jako bezpośredni adres we/wy. Ten tryb adresowania pokrywa jedynie część obszaru rejestrów. Używany jest przez instrukcje, gdzie adres został osadzony wewnątrz słowa instrukcji.

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.

Rejestry ogólnego przeznaczenia

Pierwsze 32 adresy wskazują rejestry robocze R1...R32. Rejestry te opisano dokładnie w podrozdziale "Zestaw rejestrów ogólnego przeznaczenia".

Obszar rejestrów we/wy

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.

Pamięć danych SRAM

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:

obrazek

Na początek:  podrozdziału   strony 

Pamięć danych EEPROM

Mikrokontroler ATtiny2313A/4313 zawiera 128/256 bajtów pamięci danych EEPROM (ang. Electrically Erasable Programmable Read-Only Memory). Jest ona zorganizowana jako oddzielna przestrzeń danych, w której można zapisywać pojedyncze bajty. Wszystkie rejestry dostępu znajdują się w obszarze we/wy.

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

Metody programowania EEPROM

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.

Odczyt

Aby odczytać komórkę pamięci EEPROM postępuj wg poniższej procedury:

Kasowanie

W celu zapobieżenia niezamierzonym zapisom do EEPROM należy postępować wg specjalnej procedury przy kasowaniu komórek pamięci:

Zapis

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:

Zapobieganie uszkodzeniu danych w EEPROM

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.

Przykładowe programy

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;
}

Na początek:  podrozdziału   strony 

Opis rejestrów

EEAR – EEPROM Address Register – Rejestr adresowy EEPROM

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  

Bit 7 – Zarezerwowane w ATtiny2313
Bit 7 – EEAR7 w ATtiny4313

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.

Bity 6:0 – EEAR[6:0]: EEPROM Address – Adres 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.

EEDR – EEPROM Data Register – Rejestr danych 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  

Bity 7:0 – EEDR7:0: EEPROM Data – Dane EEPROM

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.

EECR – EEPROM Control Register – Rejestr sterujący EEPROM

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  

Bity 7:6 – Zarezerwowane

Te bity są zarezerwowane do użytku w przyszłości i na ATtiny2313A/4313 dają przy odczycie wartość 0.

Bity 5:4 – EEPM[1:0]: EEPROM Programming Mode Bits – Bity trybu programowania EEPROM

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ść

Bit 3 – EERIE: EEPROM Ready Interrupt Enable – Włączenie przerwań przy gotowości EEPROM

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 2 – EEMPE: EEPROM Master Program Enable – Główne uaktywnienie programowania EEPROM

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.

Bit 1 – EEPE: EEPROM Program Enable – Programowanie EEPROM

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.

Bit 0 – EERE: EEPROM Read Enable – Odczyt EEPROM

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.

GPIOR2 – General Purpose I/O Register 2 – Rejestr we/wy ogólnego przeznaczenia nr 2

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  

GPIOR1 – General Purpose I/O Register 1 – Rejestr we/wy ogólnego przeznaczenia nr 1

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  

GPIOR0 – General Purpose I/O Register 0 – Rejestr we/wy ogólnego przeznaczenia nr 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  
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
©2021 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.