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

ATmega640/1280/1281/2560/2561

Pamięci 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

Ten rozdział opisuje różne pamięci w mikrokontrolerze ATmega640/1280/1281/2560/2561. Architektura AVR posiada dwie główne przestrzenie pamięciowe: przestrzeń pamięci danych (ang. data memory space) oraz przestrzeń pamięci programu (ang. program memory space). Dodatkowo mikrokontroler ATmega640/1280/1281/2560/2561 jest wyposażony w nieulotną pamięć EEPROM (ang. Electrically Erasable and Programmable Read-Only Memory) na przechowywanie danych. Wszystkie przestrzenie pamięciowe są liniowe i regularne.

Reprogramowalna pamięć FLASH dla programu

Mikrokontroler ATmega640/1280/1281/2560/2561 zawiera 64/128/256 KB reprogramowalnej w systemie pamięci FLASH do przechowywania programu. Ponieważ wszystkie instrukcje AVR mają długość 16 lub 32 bity, pamięć FLASH jest zorganizowana jako 32.768/65.536/131.072 komórek 16-bitowych. Dla bezpieczeństwa oprogramowania przestrzeń pamięci FLASH programu została podzielona na dwie sekcje: sekcję programu boot-loadera i sekcję programu aplikacji.

Trwałość pamięci FLASH wynosi co najmniej 10.000 cykli zapisu/kasowania. Licznik rozkazów (ang. Program Counter, PC) w ATmega640/1280/1281/2560/2561 jest 15/16/17-bitowy, co pozwala mu na zaadresowanie 32.768/65.536/131.072 komórek pamięci programu. Działanie sekcji programu boot-loadera wraz z powiązanymi bitami blokującymi dla bezpieczeństwa oprogramowania jest opisane szczegółowo w rozdziale "Wsparcie bootloadera – odczyt przy zapisie – samoprogramowanie".

W rozdziale "Programowanie pamięci" znajdziesz szczegółowy opis szeregowego ładowania programu do pamięci FLASH za pomocą końcówek interfejsu SPI (ang. Serial Programming Interface), JTAG lub trybu programowania równoległego.

Tablice ze stałymi mogą być umieszczane w całej przestrzeni adresowej pamięci programu (zobacz na opis instrukcji LPM/ELPM).

Mapa pamięci programu


Na początek:  podrozdziału   strony 

Pamięć SRAM dla danych

Poniższy rysunek pokazuje organizację pamięci SRAM w ATmega640/1280/1281/2560/2561:

ATmega640/1280/1281/2560/2561 jest złożonym mikrokontrolerem posiadającym więcej modułów peryferyjnych niż może być obsługiwane przez 64 komórki zarezerwowane w kodach operacyjnych dla instrukcji IN i OUT. Do rozszerzonej przestrzeni we/wy w SRAM od adresu 0x60 do 0xFF można stosować tylko instrukcje LD/LDS/LDD i ST/STS/STD.

Pierwsze 4608/8704 adresy pamięci danych odnoszą się do zestawu rejestrów ogólnego przeznaczenia, pamięci we/wy, rozszerzonej pamięci we/wy oraz wewnętrznej pamięci SRAM. Pierwsze 32 adresy obejmują zestaw rejestrów, następne 64 obejmują standardową pamięć we/wy, dalej występuje 416 komórek rozszerzonej pamięci we/wy i następne 8192 adresy obejmują wewnętrzną pamięć danych SRAM.

Z ATmega640/1280/1281/2560/2561 można używać opcjonalnej, zewnętrznej pamięci danych SRAM. Pamięć ta zajmie obszar pozostałych adresów w 64K przestrzeni adresowej. Obszar ten rozpoczyna się za wewnętrzną pamięcią SRAM. Zestaw rejestrów, we/wy, rozszerzone we/wy i wewnętrzna pamięć SRAM zajmują najniższe 4608/8704 bajty, zatem w trakcie używania 64KB (65536 B) pamięci zewnętrznej, dostępne jest  60,478/56,832 bajty tej pamięci. Więcej szczegółów na temat korzystania z pamięci zewnętrznej znajdziesz w rozdziale "Interfejs pamięci zewnętrznej".

Gdy adresy odnoszące się do przestrzeni pamięci SRAM wykraczają poza komórki wewnętrznej pamięci danych, to następuje dostęp do pamięci zewnętrznej SRAM w obrębie tej samej instrukcji mikroprocesora (pamięć zewnętrzna nie wymaga osobnych instrukcji przy dostępie do niej z poziomu programu). Przy dostępie do pamięci wewnętrznych końcówki strobowe odczytu i zapisu (PG0 i PG1) są nieaktywne przez cały cykl dostępu. Pamięć zewnętrzna SRAM jest uaktywniana ustawieniem bitu SRE w rejestrze XMCRA.

Dostęp do pamięci zewnętrznej zabiera jeden dodatkowy takt na bajt w porównaniu z dostępem do wewnętrznej pamięci SRAM. Oznacza to, iż rozkazy LD, ST, LDS, STS, LDD, STD, PUSH i POP wykonują się o jeden dodatkowy takt zegara dłużej. Jeśli stos zostanie umieszczony w pamięci zewnętrznej SRAM, to przerwania, wywołania podprogramów i powroty zajmują trzy dodatkowe takty zegara, ponieważ 3-bajtowy licznik rozkazów jest zapisywany na stos i odczytywany ze stosu, a dostęp do pamięci zewnętrznej nie korzysta z zakładkowego dostępu w pamięci wewnętrznej. Gdy zewnętrzna pamięć SRAM jest używana z taktami oczekiwania, to jednobajtowy dostęp zewnętrzny zabiera dwa, trzy lub cztery dodatkowe takty zegarowe odpowiednio dla jednego, dwóch lub trzech taktów oczekiwania. Przerwania, wywołania podprogramów i powroty będą potrzebowały pięć, siedem lub dziewięć taktów zegarowych więcej niż określono w opisie rozkazów AVR dla jednego, dwóch lub trzech taktów oczekiwania.

Pięć różnych trybów adresowania pamięci danych pokrywa: adresowanie bezpośrednie (ang. Direct Addressing Mode), adresowanie pośrednie z przesunięciem (ang. Indirect with Displacement Addressing Mode), adresowanie pośrednie (ang. Indirect Addressing Mode)adresowanie pośrednie z predekrementacją (ang. Indirect with Pre-decrement Addressing Mode) oraz adresowanie pośrednie z  postinkrementacją (ang. Indirect with Post-increment Addresing Mode). W zestawie rejestrów rejestry od R26 do R31 pełnią dodatkową funkcję rejestrów wskaźnikowych do pośredniego adresowania pamięci.

Adresowanie bezpośrednie obejmuje całą przestrzeń danych.

Adresowanie pośrednie z przesunięciem obejmuje 63 komórki od adresu bazowego danego w rejestrze Y lub Z.

Gdy jest używane pośrednie adresowanie z automatyczną predekrementacją lub postinkrementacją, rejestry adresowe X, Y lub Z są zwiększane lub zmniejszane.

Wszystkie te tryby adresowania w ATmega640/1280/1281/2560/2561 pozwalają na dostęp do każdej komórki w przestrzeni danych: do zestawu 32 rejestrów ogólnego przeznaczenia, 64 rejestrów we/wy oraz 4096/8192 bajtów wewnętrznej pamięci danych SRAM. Opis zestawu rejestrów znajdziesz w podrozdziale "Zestaw rejestrów ogólnego przeznaczenia".

Czasy dostępu do 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ęć EEPROM dla danych

Mikrokontroler ATmega640/1280/1281/2560/2561 posiada 4096 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. EEPROM posiada wytrzymałość co najmniej 100.000 cykli zapisu/kasowania. Dostęp mikroprocesora do danych zapisanych w pamięci EEPROM dokonywany jest poprzez rejestr adresu EEPROM, rejestr danych EEPROM oraz rejestr sterowania EEPROM. Istnieje również możliwość zapisu/odczytu zawartości EEPROM poprzez interfejs SPI, JTAG i w trybie programowania równoległego. Szczegóły znajdziesz w rozdziale "Programowanie pamięci".

Zapis/Odczyt EEPROM

Rejestry dostępu do EEPROM znajdują się w przestrzeni we/wy.

Czasy dostępu dla EEPROM są podane przy opisie rejestru sterującego pamięcią EEPROM EECR (ang. EEPROM Control Register). Jednakże funkcja odmierzająca samoczynnie czas pozwala wykryć oprogramowaniu użytkownika, kiedy można zapisać następny bajt. Jeśli kod użytkownika zawiera instrukcje, które zapisują pamięć EEPROM, należy podjąć pewne środki ostrożności. W mocno filtrowanych źródłach zasilania napięcie VCC może wzrastać lub opadać wolno przy włączaniu/wyłączaniu. Powoduje to, iż mikrokontroler przez pewien okres czasu pracuje przy napięciu niższym od określonego jako minimalne dla używanej częstotliwości zegarowej. Zobacz do podrozdziału "Zapobieganie uszkodzeniu danych w EEPROM", gdzie znajdziesz więcej informacji o tym, jak unikać problemów w takich sytuacjach.

Aby zapobiec niezamierzonym zapisom w EEPROM, należy zastosować specjalną procedurę zapisu. Zobacz do opisu rejestru EECR.

Gdy odczytywana jest pamięć EEPROM, to mikroprocesor zostaje wstrzymany przez cztery takty zegarowe przed wykonaniem następnej instrukcji. Gdy zapisywana jest pamięć EEPROM, mikroprocesor jest wstrzymywany przez dwa takty zegara przed wykonaniem następnej instrukcji.

Czas dostępu do pamięci EEPROM jest kontrolowany przez kalibrowany oscylator. Poniższa tabelka przedstawia typowe czasy programowania przy dostępie do EEPROM z poziomu mikroprocesora.

Symbol Liczba taktów kalibrowanego oscylatora RC Typowy czas programowania
Zapis EEPROM przez mikroprocesor 26.368 3,3 ms

Poniższe przykłady kodów pokazują po jednej funkcji w asemblerze i w języku C dla 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. Założono również, iż oprogramowanie nie korzysta z boot-loadera. Jeśli kod programu ładującego jest obecny, to funkcja zapisu EEPROM musi również czekać na zakończenie każdego wykonywanego rozkazu SPM.
Przykład w kodzie maszynowym
EEPROM_write:
    ; Czekaj na zakończenie poprzedniego zapisu
    sbic EECR,EEWE
    rjmp EEPROM_write
    ; Ustaw adres (r18:r17) w rejestrze adresowym
    out EEARH, r18
    out EEARL, r17
    ; Zapisz dane (r16) do rejestru danych
    out EEDR,r16
    ; Zapisz logiczną jedynkę w bicie EEMWE
    sbi EECR,EEMWE
    ; Rozpocznij zapis EEPROM przez ustawienie EEWE
    sbi EECR,EEWE
    ret
Przykład w języku C
void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
    /* Czekaj na zakończenie poprzedniego zapisu */
    while(EECR & (1<<EEWE))
    ;
    /* Ustaw rejestry adresu i danych */
    EEAR = uiAddress;
    EEDR = ucData;
    /* Zapisz logiczną jedynkę w bicie EEMWE */
    EECR |= (1<<EEMWE);
    /* Rozpocznij zapis EEPROM przez ustawienie EEWE */
    EECR |= (1<<EEWE);
}

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:
    ; Czekaj na zakończenie poprzedniego zapisu
    sbic EECR,EEWE
    rjmp EEPROM_read
    ; Ustaw adres (r18:r17) w rejestrze adresowym
    out EEARH, r18
    out EEARL, r17
    ; Rozpocznij odczyt EEPROM przez zapis bitu EERE
    sbi EECR,EERE
    ; Odczytaj dane z rejestru danych
    in r16,EEDR
    ret
Przykład w języku C
unsigned char EEPROM_read(unsigned int uiAddress)
{
    /* Czekaj na zakończenie poprzedniego zapisu
    while(EECR & (1<<EEWE))
    ;
    /* Ustaw rejestr adresowy */
    EEAR = uiAddress;
    /* Rozpocznij odczyt EEPROM przez zapis bitu EERE */
    EECR |= (1<<EERE);
    /* Zwróć dane z rejestru danych */
    return EEDR;
}

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.


Na początek:  podrozdziału   strony 

Pamięć wejścia/wyjścia

Definicja przestrzeni we/wy mikrokontrolera ATmega640/1280/1281/2560/2561 pokazana jest w rozdziale "Podsumowanie rejestrów".

Wszystkie układy we/wy ATmega640/1280/1281/2560/2561 obsługiwane są poprzez rejestry w przestrzeni we/wy. Dostęp do wszystkich rejestrów we/wy wykonywany jest przez instrukcje LD/LDS/LDD i ST/STS/STD, przesyłające dane pomiędzy 32 rejestrami ogólnego przeznaczenia a przestrzenią we/wy. Rejestry we/wy o adresach w zakresie 0x00 – 0x1F są bezpośrednio dostępne bitowo przy pomocy instrukcji SBI i CBI. W rejestrach tych wartość pojedynczych bitów można sprawdzać instrukcjami SBIS i SBIC. Gdy są używane dedykowane instrukcje IN i OUT, należy używać adresów we/wy 0x00 – 0x3F. Gdy rejestry we/wy są adresowane w przestrzeni danych za pomocą instrukcji LD i ST, należy do tych adresów dodać 0x20. Mikrokontroler ATmega640/1280/1281/2560/2561 jest złożonym układem posiadającym więcej modułów peryferyjnych niż można obsłużyć w 64-bajtowej przestrzeni we/wy zarezerwowanej w kodzie operacyjnym instrukcji IN i OUT. Dostęp do rozszerzonej przestrzeni we/wy od 0x60 do 0x1FF w SRAM uzyskuje się przy pomocy instrukcji LD/LDS/LDD i ST/STS/STD.

Dla kompatybilności z przyszłymi mikrokontrolerami zarezerwowane bity powinny być zapisywane stanami 0 przy dostępie do rejestrów. Zarezerwowanych adresów w pamięci we/wy nie należy nigdy zapisywać.

Niektóre ze znaczników stanu są zerowane przez zapis w nich stanu 1. Zwróć uwagę, iż w przeciwieństwie do większości innych mikrokontrolerów AVR instrukcje CBI i SBI działają tylko na określonym bicie i można je z tego powodu używać na rejestrach zawierających takie znaczniki stanu. Instrukcje CBI i SBI pracują jedynie na rejestrach od 0x00 do 0x1F.

Rejestry we/wy oraz sposoby sterowania modułów peryferyjnych opisane są w dalszych rozdziałach tej instrukcji.

Rejestry we/wy ogólnego przeznaczenia

Mikrokontroler ATmega640/1280/1281/2560/2561 zawiera trzy rejestry we/wy ogólnego przeznaczenia. Można ich używać do przechowywania dowolnej informacji, a szczególnie są przydatne do zmiennych globalnych i znaczników stanu. Rejestry we/wy ogólnego przeznaczenia położone w obszarze adresowym 0x00 – 0x1F są bezpośrednio dostępne bitowo przy pomocy instrukcji CBI, SBI, SBIS i SBIC.


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.