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

ATtiny24/44/84

Programowanie pamięci

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

Bity blokujące pamięci programu i danych

Mikrokontroler ATtiny24/44/84 udostępnia dwa bity blokujące (ang. lock bits), które można pozostawić w stanie niezaprogramowanym (“1”) lub zaprogramować je (“0”) w celu uzyskania dodatkowych zabezpieczeń, co przedstawiają poniższe tabele. Bity blokujące można wymazać do stanu “1” tylko za pomocą polecenia kasowania zawartości mikrokontrolera (ang. Chip Erase command). Gdy bit bezpiecznikowy DWEN jest zaprogramowany, to pamięć programu można odczytać poprzez interfejs debugWIRE nawet wtedy, gdy bity blokujące zostały ustawione. Dlatego, gdy wymagane jest zabezpieczenie blokujące, interfejs debugWIRE powinien zawsze być wyłączany przez wyczyszczenie bitu bezpiecznikowego DWEN.

Bajt bitów blokujących

Bit blokujący Numer bitu Opis Wartość standardowa(1)
  7 1 (niezaprogramowany)
  6 1 (niezaprogramowany)
  5 1 (niezaprogramowany)
  4 1 (niezaprogramowany)
  3 1 (niezaprogramowany)
  2 1 (niezaprogramowany)
LB2 1 Bit blokujący 1 (niezaprogramowany)
LB1 0 Bit blokujący 1 (niezaprogramowany)

Uwaga: 1. "1" oznacza stan niezaprogramowany, "0" oznacza stan zaprogramowany.

Tryby zabezpieczeń bitów blokujących

Bity blokowania pamięci(1)(2) Rodzaj zabezpieczenia
Tryb LB LB2 LB1
1 1 1 Brak funkcji pamięci blokowania.
2 1 0 Dalsze programowanie pamięci FLASH i EEPROM jest zablokowane w trybach programowania wysokonapięciowego oraz szeregowego. Bity bezpiecznikowe zostają zablokowane w trybach programowania wysokonapięciowego i szeregowego. Interfejs debugWire jest zablokowany.
3 0 0 Dalsze programowanie i weryfikacja pamięci FLASH i EEPROM są zablokowane w trybach programowania wysokonapięciowego oraz szeregowego. Bity bezpiecznikowe zostają zablokowane
w trybach programowania wysokonapięciowego i szeregowego(1). Interfejs debugWire jest zablokowany.
Uwagi: 1. Zaprogramuj bity bezpiecznikowe przed bitami blokującymi.
  2.  "1" oznacza stan niezaprogramowany, "0" oznacza stan zaprogramowany.

Na początek:  podrozdziału   strony 

Bity bezpiecznikowe

Mikrokontroler ATtiny24/44/84 posiada trzy bajty bezpiecznikowe, które krótko opisują poniższe tabele wraz z bitami bezpiecznikowymi. Zauważ, iż bity bezpiecznikowe dają odczyt logicznego zera, "0", jeśli zostały zaprogramowane.

Rozszerzony bajt bitów bezpiecznikowych

Bit bezpiecznikowy Numer bitu Opis Wartość standardowa
7 1 (niezaprogramowane)
6 1 (niezaprogramowane)
5 1 (niezaprogramowane)
4 1 (niezaprogramowane)
3 1 (niezaprogramowane)
2 1 (niezaprogramowane)
1 1 (niezaprogramowane)
SELFPRGEN(1) 0 Uaktywnienie samoprogramowania 1 (niezaprogramowane)
Uwagi: 1. Uaktywnia instrukcję SPM. Zobacz do rozdziału "Samoprogramowanie FLASH"

Górny bajt bitów bezpiecznikowych

Bit bezpiecznikowy Numer bitu Opis Wartość standardowa
RSTDISBL (1) 7 Zablokowanie zewnętrznego resetu 1 (niezaprogramowane)
DWEN (2) 6 Uaktywnienie DebugWIRE 1 (niezaprogramowane)
SPIEN (3) 5 Uaktywnienie programowania szeregowego i ładowania danych 0 (zaprogramowane)
WDTON (4) 4 Licznik zegarowy zawsze włączony 1 (niezaprogramowane)
EESAVE 3 Zachowanie zawartości EEPROM przy kasowaniu układu 1 (niezaprogramowane)
BODLEVEL2 (5) 2 Poziom wyzwalania w detektorze spadku napięcia zasilającego 1 (niezaprogramowane)
BODLEVEL1 (5) 1 Poziom wyzwalania w detektorze spadku napięcia zasilającego 1 (niezaprogramowane)
BODLEVEL0 (5) 0 Poziom wyzwalania w detektorze spadku napięcia zasilającego 1 (niezaprogramowane)
Uwagi: 1. Zobacz do podrozdziału "Alternatywne funkcje portów", gdzie opisano funkcje bitów bezpiecznikowych RSTDISBL i DWEN. Po zaprogramowaniu bitu bezpiecznikowego RSTDISBL do zmiany bitów bezpiecznikowych i w celu dalszego programowania mikrokontrolera niezbędne jest użycie wysokonapięciowego programowania szeregowego.
  2. DWEN nie może być zaprogramowany gdy są wymagane zabezpieczenia bitami blokującymi. Zobacz do podrozdziału "Bity blokujące pamięci programu i danych".
  3. Bit bezpiecznikowy SPIEN nie jest dostępny w trybie programowania SPI.
  4. Zaprogramowanie tego bitu wyłączy przerwanie od licznika zegarowego.
  5. Zobacz do rozdziału "Parametry elektryczne".

Dolny bajt bitów bezpiecznikowych

Bit bezpiecznikowy Numer bitu Opis Wartość standardowa
CKDIV8 (1) 7 Podział zegara przez 8 0 (zaprogramowane)
CKOUT (2) 6 Włączenie wyjścia zegarowego 1 (niezaprogramowane)
SUT1 (3) 5 Wybór czasu uruchamiania 1 (niezaprogramowane)
SUT0 (3) 4 Wybór czasu uruchamiania 0 (zaprogramowane)
CKSEL3 (4) 3 Wybór źródła zegarowego 0 (zaprogramowane)
CKSEL2 (4) 2 Wybór źródła zegarowego 0 (zaprogramowane)
CKSEL1 (4) 1 Wybór źródła zegarowego 1 (niezaprogramowane)
CKSEL0 (4) 0 Wybór źródła zegarowego 0 (zaprogramowane)
Uwagi: 1. Szczegóły znajdziesz w rozdziale "System zegarowy".
  2. Pozwala wyprowadzać zegar systemowy na końcówce zewnętrznej CKOUT.
  3. Standardowy wybór daje w wyniku maksymalny czas uruchamiania przy standardowym źródle zegarowym.
  4. Standardowym wyborem jest wewnętrzny oscylator RC przy częstotliwości 8,0 MHz.

Zauważ, iż bity bezpiecznikowe zostają zablokowane, jeśli bit blokujący LB1 jest zaprogramowany. Programuj bity bezpiecznikowe przed bitami blokującymi. Stan bitów bezpiecznikowych nie jest zmieniany przez kasowanie zawartości układu (ang. Chip Erase).

Bity bezpiecznikowe można odczytać również z poziomu oprogramowania. Zobacz do podrozdziału "Programowy odczyt bitów bezpiecznikowych i blokujących".

Zatrzaskiwanie stanu bitów bezpiecznikowych

Wartości bitów bezpiecznikowych są zatrzaskiwane, gdy mikrokontroler wchodzi w tryb programowania, a zmiany ich stanów nie będą obowiązywały aż do wyjścia z trybu programowania. Nie odnosi się to do bitu bezpiecznikowego EESAVE, który funkcjonuje natychmiast po zaprogramowaniu. Bity bezpiecznikowe są również zatrzaskiwane przy uruchamianiu w trybie normalnym.


Na początek:  podrozdziału   strony 

Tablica sygnaturowa mikrokontrolera

Tablica sygnaturowa jest dedykowanym obszarem pamięci używanym do przechowywania różnych informacji na temat mikrokontrolera, takich jak sygnatura i dane do kalibracji oscylatora. Większość tego obszaru jest zarezerwowana do użytku wewnętrznego.

Zawartość tablicy sygnaturowej

Adres Górny bajt
0x00 Bajt sygnaturowy 0
0x01 Dane kalibracyjne dla wewnętrznego oscylatora (2)
0x02 Bajt sygnaturowy 1
0x03 Zarezerwowane na wewnętrzny użytek
0x04 Bajt sygnaturowy 2
0x05...0x2A Zarezerwowane na wewnętrzny użytek

Bajty sygnaturowe

Wszystkie mikrokontrolery Atmel posiadają trzy-bajtowy kod sygnatury, który je identyfikuje. Kod ten można odczytać w trybie programowania szeregowego i w trybie programowania wysokonapięciowego, nawet gdy mikrokontroler został zablokowany bitami blokującymi.

Bajty sygnatury można również odczytać programowo, zobacz do podrozdziału "Programowy odczyt bitów bezpiecznikowych i blokujących".

Te trzy bajty sygnaturowe przebywają w oddzielnej przestrzeni adresowej zwanej tablicą sygnaturową mikrokontrolera (ang. device signature imprint table). Poniższa tabelka podaje bajty sygnaturowe dla ATtiny24/44/84:

Mikrokontroler Bajt 0 Bajt 1 Bajt 1
ATtiny24 0x1E 0x91 0x0B
ATtiny44 0x1E 0x92 0x07
ATtiny84 0x1E 0x93 0x0C

Bajt kalibracyjny

Tablica sygnaturowa mikrokontrolera ATtiny24/44/84 zawiera jeden bajt danych kalibracyjnych dla wewnętrznego oscylatora. Podczas resetu bajt ten jest automatycznie zapisywany w rejestrze OSCCAL, aby zapewnić poprawną częstotliwość pracy kalibrowanego oscylatora. Bajt kalibracyjny można również odczytać programowo, zobacz do podrozdziału "Programowy odczyt bitów bezpiecznikowych i blokujących".


Na początek:  podrozdziału   strony 

Rozmiar strony

Liczba słów na stronę oraz liczba stron pamięci FLASH

Mikrokontroler Rozmiar FLASH Rozmiar strony PCWORD Liczba stron PCPAGE PCMSB
ATtiny24 1K słów
(2 KB)
16 słów PC[3:0] 64 PC[9:4] 9
ATtiny44 2K słów
(4 KB)
32 słowa PC[4:0] 64 PC[10:5] 10
ATtiny84 4K słów
(8 KB)
32 słowa PC[4:0] 128 PC[11:5] 11
PC bity adresu słowa w pamięci programu
PCWORD bity adresu słowa na stronie FLASH
PCPAGE bity adresu strony FLASH
PCMSB numer najstarszego bitu w adresie

Liczba słów na stronę oraz liczba stron pamięci EEPROM

Mikrokontroler Rozmiar EEPROM Rozmiar strony EEAWORD Liczba stron EEAPAGE EEAMSB
ATtiny24 128 B 4 bajty EEA[1:0] 32 EEA[6:2] 6
ATtiny44 256 B 4 bajty EEA[1:0] 64 EEA[7:2] 7
ATtiny84 512 B 4 bajty EEA[1:0] 128 EEA[8:2] 8
EEA bity adresu bajtu w pamięci EEPROM
EEAWORD bity adresu bajtu na stronie EEPROM
EEAPAGE bity adresu strony EEPROM
EEAMSB numer najstarszego bitu w adresie

Na początek:  podrozdziału   strony 

Programowanie szeregowe

Obie pamięci FLASH i EEPROM można programować korzystając z szeregowej magistrali SPI, gdy końcówka RESET jest wysterowana stanem niskim GND.

Interfejs szeregowy składa się z końcówek SCK (zegar), MOSI (wejście) i MISO (wyjście).

Uwaga: Jeśli mikrokontroler jest taktowany przez wewnętrzny oscylator, to nie ma potrzeby dołączania do niego źródła zegarowego przez końcówkę CLKI.

Po ustawieniu RESET w stan niski, należy wysłać do mikrokontrolera instrukcję włączającą programowanie zanim operacje programowania/wymazywania będą mogły być wykonywane.

Odwzorowanie końcówek przy programowaniu szeregowym

Symbol Końcówki we/wy Opis
MOSI PA6 we Wejście danych szeregowych
MISO PA5 wy Wyjście danych szeregowych
SCK PA4 we Wejście zegara szeregowego

Przy programowaniu EEPROM w operacji programowania wbudowany jest cykl samokasowania (TYLKO w trybie szeregowym) i nie ma potrzeby wcześniejszego wykonywania instrukcji kasowania układu (ang. Chip Erase instruction). Operacja kasowania układu zamienia zawartość każdej komórki w obu pamięciach programu i EEPROM w 0xFF.

W zależności od bitów bezpiecznikowych CKSEL musi być obecny poprawny sygnał zegarowy. Minimalne okresy stanu niskiego i wysokiego dla wejścia zegara szeregowego (SCK) są zdefiniowane następująco:

Niski: > 2 cykle zegara mikroprocesora dla fck < 12 MHz, 3 cykle zegara mikroprocesora dla fck >= 12 MHz
High: > 2 cykle zegara mikroprocesora dla fck < 12 MHz, 3 cykle zegara mikroprocesora dla fck >= 12 MHz

Algorytm programowania szeregowego

Gdy dane szeregowe są zapisywane do ATtiny24/44/84, ich odczyt przez mikroprocesor następuje na narastającym zboczu sygnału zegarowego SCK. Gdy dane są odczytywane z ATtiny24/44/84, ich próbkowanie następuje przy opadającym zboczu sygnału SCK.

Aby zaprogramować i zweryfikować mikrokontroler ATtiny24/44/84 w trybie programowania szeregowego, zaleca się następujący ciąg operacji:

  1. Sekwencja włączenia zasilania (ang. power-up sequence):
    Przyłóż napięcie zasilające pomiędzy końcówki VCC i GND, jednocześnie wymuszając stan niski "0" na końcówkach RESET i SCK. W niektórych systemach programator nie może zagwarantować utrzymania końcówki SCK w stanie niskim. W takim przypadku na wejście RESET należy podać dodatni impuls po ustawieniu SCK na "0". Długość tego impulsu nie może być niższa od tRST (minimalna szerokość impulsu na końcówce RESET) plus dwa cykle zegarowe mikroprocesora.
  2. Odczekaj co najmniej 20 ms i uaktywnij programowanie szeregowe przez wysłanie instrukcji włączającej je na końcówkę MOSI.
  3. Instrukcje programowania szeregowego nie będą działać, jeśli komunikacja nie zostanie zsynchronizowana. Gdy nastąpi synchronizacja, to drugi bajt (0x53) zostanie zwrócony w trakcie przesyłania trzeciego bajtu instrukcji włączającej programowanie. Bez względu na to, czy zwrócony bajt jest poprawny lub nie, wszystkie cztery bajty instrukcji muszą zostać przesłane. Jeśli nie zostanie zwrócone 0x53, wyślij na RESET dodatni impuls i ponów przesłanie instrukcji włączającej. Jeśli po 32 próbach bajt 0x53 nie zostanie zwrócony poprawnie, to do programatora nie podłączono działającego mikrokontrolera.
  4. Pamięć FLASH programowana jest strona po stronie. Strona pamięci jest ładowana bajt po bajcie przez podanie 4 najmłodszych bitów adresu i danych razem z instrukcją ładowania strony pamięci programu. Aby zapewnić poprawne załadowanie strony, dolny bajt danych musi zostać załadowany przed górnym bajtem danych dla danego adresu. Strona zostaje zapisana przez załadowanie instrukcji zapisu strony pamięci programu z 5 najstarszymi bitami adresu.  Jeśli nie jest używany podgląd danych  (RDY/BSY), to użytkownik musi odczekać przez czas równy co najmniej tWD_FLASH przed wysłaniem kolejnej strony. Dostęp do interfejsu programowania szeregowego przed zakończeniem operacji zapisu we FLASH może doprowadzić do jej błędnego zaprogramowania.
  5. A: pamięć EEPROM jest programowana bajt po bajcie przez dostarczenie adresu i danych wraz z odpowiednią instrukcją zapisu. Komórka EEPROM zostaje najpierw automatycznie wymazana przed zapisaniem w niej nowych danych. Jeśli nie jest używany podgląd danych (RDY/BSY), to użytkownik musi odczekać przez czas równy co najmniej tWD_EEPROM przed wysłaniem następnego bajtu. W wykasowanym układzie nie ma potrzeby programowania bajtów o wartościach 0xFF.
    B: pamięć EEPROM można programować stronami. Strona pamięci jest ładowana bajt po bajcie przez dostarczenie 2 najmłodszych bitów adresu i danych wraz z instrukcją ładowania strony pamięci EEPROM. Strona EEPROM jest zapisywana przez załadowanie instrukcji zapisu strony EEPROM z 4 najstarszymi bitami adresu. Gdy stosowany jest dostęp do EEPROM stronami, to zmieniane są tylko bajty załadowane za pomocą instrukcji ładowania strony pamięci EEPROM. Pozostałe bajty pozostają niezmienione. Jeśli nie jest używany podgląd danych (RDY/BSY), to użytkownik musi odczekać przez czas równy co najmniej tWD_EEPROM przed wysłaniem następnej strony. W wykasowanym układzie nie ma potrzeby programowania bajtów o wartościach 0xFF.
  6. Dowolna pozycja w pamięci może zostać zweryfikowana przez instrukcję odczytu, która zwraca zawartość pod wybranym adresem poprzez szeregowe wyjście MISO.
  7. Na końcu sesji programowania końcówka RESET może zostać ustawiona w stan wysoki, aby przywrócić normalne działanie mikrokontrolera.
  8. Sekwencja wyłączenia zasilania (jeśli jest potrzebna):
    Ustaw RESET na "1".
    Wyłącz napięcie VCC.

Minimalne czasy opóźnienia przed zapisem następnej komórki FLASH lub EEPROM

Symbol Opis Minimalny czas opóźnienia
tWD_FLASH Opóźnienie dla zapisu FLASH 4,5 ms
tWD_EEPROM Opóźnienie dla zapisu EEPROM 4,0 ms
tWD_ERASE Opóźnienie dla kasowania 9,0 ms
tWD_FUSE Opóźnienie dla zapisu bitu bezpiecznikowego 4,5 ms

Zbiór instrukcji programowania szeregowego

Instrukcja/operacja(1) Format instrukcji
Bajt 1 Bajt 2 Bajt 3 Bajt 4
Programming Enable
Włączenie programowania
0xAC 0x53 0x00 0x00
Chip Erase
Kasowanie (pamięć programu/EEPROM)
0xAC 0x80 0x00 0x00
Poll RDY/BSY
Podgląd stanu RDY/BSY
0xF0 0x00 0x00 wyjściowy
bajt danych
Instrukcje ładowania
Load Extended Address Byte
Ładowanie bajtu rozszerzonego adresu
 0x4D 0x00 rozszerzony
adres
0x00
Load Program Memory Page, High Byte
Ładowanie strony pamięci programu, górny bajt
0x48 MSB
adresu
LSB
adresu
wejściowy górny
bajt danych
Load Program Memory Page, Low Byte
Ładowanie strony pamięci programu, dolny bajt
0x40 MSB
adresu
LSB
adresu
wejściowy dolny
bajt danych
Load EEPROM Memory Page
Ładowanie strony pamięci EEPROM (dostęp do strony)
0xC1 0x00 LSB
adresu
wejściowy
bajt danych
Instrukcje odczytu
Read Program Memory, High Byte
Odczyt pamięci programu, górny bajt
0x28 MSB
adresu
LSB
adresu
wyjściowy górny
bajt danych
Read Program Memory, Low Byte
Odczyt pamięci programu, dolny bajt
0x20 MSB
adresu
LSB
adresu
wyjściowy dolny
bajt danych
Read EEPROM Memory
Odczyt pamięci EEPROM
0xA0 0x00 LSB
adresu
wyjściowy
bajt danych
Read Lock Bits
Odczyt bitów blokujących
0x58 0x00 0x00 wyjściowy
bajt danych
Read Signature Byte
Odczyt bajtu sygnatury
0x30 0x00 LSB
adresu
wyjściowy
bajt danych
Read Fuse Bits
Odczyt bitów bezpiecznikowych, dolny bajt
0x50 0x00 0x00 wyjściowy
bajt danych
Read Fuse High Bits
Odczyt bitów bezpiecznikowych, górny bajt
0x58 0x08 0x00 wyjściowy
bajt danych
Read Extended Fuse Bits
Odczyt bitów bezpiecznikowych, rozszerzony bajt
0x50 0x08 0x00 wyjściowy
bajt danych
Read Calibration Byte
Odczyt bajtu kalibracyjnego
0x38 0x00 0x00 wyjściowy
bajt danych
Instrukcje zapisu(2)
Write Program Memory Page
Zapis strony pamięci programu
0x4C MSB
adresu
LSB
adresu
0x00
Write EEPROM Memory
Zapis pamięci EEPROM
0xC0 0x00 LSB
adresu
wejściowy
bajt danych
Write EEPROM Memory Page
Zapis strony pamięci EEPROM (dostęp do strony)
0xC2 0x00 LSB
adresu
0x00
Write Lock Bits
Zapis bitów blokujących
0xAC 0xE0 0x00 wejściowy
bajt danych
Write Fuse Bits
Zapis dolnego bajtu bitów bezpiecznikowych
0xAC 0xA0 0x00 wejściowy
bajt danych
Write Fuse High Bits
Zapis górnego bajtu bitów bezpiecznikowych
0xAC 0xA8 0x00 wejściowy
bajt danych
Write Extended Fuse Bits
Zapis rozszerzonego bajtu bitów bezpiecznikowych
0xAC 0xA4 0x00 wejściowy
bajt danych
Uwagi: 1. Nie wszystkie instrukcje obecne są we wszystkich mikrokontrolerach
  2. Instrukcje uzyskujące dostęp do pamięci programu używają adresu słowa. Adres ten może być swobodny w obrębie danej strony.

Przykład instrukcji programowania szeregowego

Jeśli najmłodszy bit w wyjściowym bajcie danych RDY/BSY ma wartość "1", to operacja programowania nie została jeszcze zakończona. Odczekaj, aż bit ten przejdzie do stanu 0 przed wykonaniem następnej instrukcji.

Wewnątrz tej samej strony dolny bajt danych musi zostać załadowany przed górnym bajtem danych.

Po załadowaniu danych do bufora strony, zaprogramuj stronę EEPROM, zobacz na powyższy rysunek.


Na początek:  podrozdziału   strony 

Wysokonapięciowe programowanie szeregowe

Ten podrozdział opisuje sposób programowania i weryfikacji pamięci programu FLASH, pamięci danych EEPROM, bitów blokujących oraz bitów bezpiecznikowych w ATtiny24/44/84.

Znaczenie nazw końcówek w programowaniu wysokonapięciowym

Nazwa sygnału Końcówka We/Wy Funkcja
SDI PA6 We Szeregowe wejście danych (ang. Serial Data Input)
SII PA5 We Szeregowe wejście instrukcji (ang. Serial Instruction Input)
SDO PA4 Wy Szeregowe wyjście danych (ang. Serial Data Output)
SCI PB0 We Szeregowe wejście zegara (ang. Serial Clock Input)

Minimalny okres szeregowego wejścia zegarowego (SCI) podczas wysokonapięciowego programowania szeregowego wynosi 220 ns.

Wartości końcówek przy wejściu w tryb programowania

Końcówka Symbol Wartość
PA0 Prog_enable[0] 0
PA1 Prog_enable[1] 0
PA2 Prog_enable[2] 0

Na początek:  podrozdziału   strony 

Algorytm programowania wysokonapięciowego

Aby zaprogramować i zweryfikować ATtiny24/44/84 w trybie wysokonapięciowego programowania szeregowego zalecany jest poniższy ciąg operacji:

Wejście w tryb wysokonapięciowego programowania szeregowego

Następujący algorytm wprowadza mikrokontroler w tryb wysokonapięciowego programowania szeregowego:

  1. Ustaw końcówki Prog_enable na “000”, końcówkę RESET na “0” i VCC na 0V.
  2. Przyłóż napięcie 4,5...5,5V pomiędzy VCC a GND. Upewnij się, że VCC osiągnie co najmniej 1,8V w ciągu następnych 20μs.
  3. Odczekaj 20...60μs i przyłóż 11,5...12,5V do RESET.
  4. Utrzymaj niezmieniony stan na końcówkach Prog_enable przez co najmniej 10μs po przyłożeniu wysokiego napięcia, aby zapewnić zatrzaśnięcie sygnatury Prog_enable.
  5. Zwolnij końcówkę Prog_enable[2] po upływie czasu tHVRST.
  6. Odczekaj co najmniej 300μs przed wysłaniem jakiejkolwiek instrukcji szeregowej na końcówki SDI/SII.
  7. Wyjdź z trybu programowania przez wyłączenie zasilania lub przez wysterowanie końcówki RESET na 0V.

Jeśli czas narastania napięcia zasilającego VCC nie jest w stanie spełnić powyższych wymagań, można użyć alternatywnego algorytmu:

  1. Ustaw końcówki Prog_enable na “000”, końcówkę RESET na “0” i VCC na 0V.
  2. Przyłóż napięcie 4,5...5,5V pomiędzy VCC a GND.
  3. Monitoruj napięcie VCC i gdy tylko osiągnie 0,9...1,1V, przyłóż 11,5...12,5V do RESET.
  4.  Utrzymaj niezmieniony stan na końcówkach Prog_enable przez co najmniej 10μs po przyłożeniu wysokiego napięcia, aby zapewnić zatrzaśnięcie sygnatury Prog_enable.
  5. Zwolnij końcówkę Prog_enable[2], aby zapobiec konfliktowi wysterowania wyjścia Prog_enable[2]/SDO.
  6. Odczekaj, aż VCC rzeczywiście osiągnie poziom 4,5...5,5V przed wysłaniem jakiejkolwiek instrukcji szeregowej na końcówki SDI/SII.
  7. Wyjdź z trybu programowania przez wyłączenie zasilania lub przez wysterowanie końcówki RESET na 0V.
Charakterystyka końcówki RESET w programowaniu wysokonapięciowym
Napięcie zasilania Próg napięcia programowania
na końcówce RESET
Minimalny czas zatrzaskiwania
stanu końcówek Prog_enable
VCC VHVRST tHVRST
4,5V 11,5V 100ns
5,5V 11,5V 100ns

Uwagi na temat efektywnego programowania

Załadowany rozkaz i adres są przechowywane w mikrokontrolerze podczas programowania. Przy efektywnym programowaniu powinno się rozważyć, co następuje:

Kasowanie układu (ang. Chip Erase)

Rozkaz Chip Erase skasuje zawartość pamięci FLASH i EEPROM (zawartość EEPROM zostaje zachowana podczas kasowania, jeśli został zaprogramowany bit bezpiecznikowy EESAVE) plus bity blokowania. Bity blokowania (ang. lock bits) nie są resetowane aż cała pamięć programu nie zostanie całkowicie skasowana. Bity bezpiecznikowe nie są zmieniane.

Rozkaz Chip Erase musi być wykonany przed przeprogramowaniem pamięci FLASH i/lub EEPROM.

  1. Załaduj rozkaz "Chip Erase".
  2. Zaczekaj po Inst. 3 aż SDO powróci do stanu wysokiego, aby zakończył się pełny cykl kasowania układu.
  3. Załaduj rozkaz “No Operation”.

Programowanie FLASH

Pamięć FLASH zorganizowana jest w strony. Gdy pamięć FLASH jest programowana, dane programu są zapamiętywane w buforze strony. Pozwala to zaprogramować jednocześnie całą stronę danych programu. Poniższa procedura opisuje programowanie całej pamięci FLASH:

  1. Załaduj rozkaz “Write FLASH”.
  2. Załaduj bufor strony FLASH.
  3. Załaduj górny adres i zaprogramuj stronę. Po Inst.3 czekaj aż SDO przejdzie w stan wysoki, aby zakończyć cykl programowania strony.
  4. Powtarzaj operacje od 2 do 3 aż zostanie zaprogramowana cała pamięć FLASH lub wszystkie dane.
  5. Zakończ programowanie strony przez załadowanie rozkazu “No Operation”.

Gdy zapisuje się lub odczytuje dane szeregowe z ATtiny24/44/84, dane są taktowane przy narastającym zboczu zegara szeregowego.

Adresowanie pamięci FLASH, która jest zorganizowana w strony
obrazek

Przebiegi sygnałów w wysokonapięciowym programowaniu szeregowym
obrazek

Programowanie EEPROM

Pamięć EEPROM zorganizowana jest w strony. Gdy pamięć EEPROM jest programowana, dane są zapamiętywane w buforze strony. Pozwala to zaprogramować jednocześnie całą stronę danych. Algorytm programowania pamięci EEPROM jest następujący:

  1. Załaduj rozkaz “Write EEPROM”.
  2. Załaduj bufor strony EEPROM.
  3. Zaprogramuj stronę EEPROM. Po Inst.2 czekaj aż SDO przejdzie w stan wysoki, aby zakończyć cykl programowania strony.
  4. Powtarzaj operacje od 2 do 3 aż zostanie zaprogramowana cała pamięć EEPROM lub wszystkie dane.
  5. Zakończ programowanie strony przez załadowanie rozkazu “No Operation”.

Odczyt pamięci FLASH

Algorytm odczytu pamięci FLASH jest następujacy:

  1. Załaduj rozkaz "Read FLASH".
  2. Odczytaj z FLASH dolny i górny bajt. Zawartość wybranego adresu jest dostępna na wyjściu szeregowym SDO.

Odczyt pamięci EEPROM

Algorytm odczytu pamięci EEPROM jest następujący:

  1. Załaduj rozkaz “Read EEPROM”.
  2. Odczytaj bajt z EEPROM. Zawartość wybranego adresu jest dostępna na wyjściu szeregowym SDO.

Programowanie i odczyt bitów bezpiecznikowych i blokujących

Algorytmy programowania i odczytu bitów bezpiecznikowych i blokujących opisane są w tabeli instrukcji dla wysokonapięciowego programowania szeregowego.

Odczyt bajtów sygnaturowych i bajtu kalibracyjnego

Algorytmy są opisane w tabeli instrukcji dla wysokonapięciowego programowania szeregowego.

Sekwencja wyłączania zasilania

Ustaw SCI na "0". Ustaw RESET na "1". Wyłącz napięcie zasilania VCC.


Zestaw instrukcji wysokonapięciowego programowania szeregowego

Instrukcja Format Instrukcji Uwagi na temat operacji
Instr.1/5 Instr.2/6 Instr.3/7 Instr.4
Chip Erase
Kasowanie układu
SDI
SII
SDO
0_1000_0000_00
0_0100_1100_00
x_xxxx_xxxx_xx
0_0000_0000_00
0_0110_0100_00
x_xxxx_xxxx_xx
0_0000_0000_00
0_0110_1100_00
x_xxxx_xxxx_xx
  Po instrukcji 3 czekaj aż SDO wróci do stanu 1, aby cykl kasowania układu się zakończył.
Load “Write FLASH” Command
Ładowanie rozkazu "Zapis FLASH"
SDI
SII
SDO
0_0001_0000_00
0_0100_1100_00
x_xxxx_xxxx_xx
      Wprowadzenie kodu programowania FLASH.
Load FLASH Page Buffer
Ładowanie bufora strony FLASH
SDI
SII
SDO
0_ bbbb_bbbb _00
0_0000_1100_00
x_xxxx_xxxx_xx
0_eeee_eeee_00
0_0010_1100_00
x_xxxx_xxxx_xx
0_0000_0000_00
0_0110_1101_00
x_xxxx_xxxx_xx
0_0000_0000_00
0_0110_1100_00
x_xxxx_xxxx_xx
Powtarzaj instr. 1 - 7, aż cały bufor strony zostanie wypełniony lub aż zostaną wypełnione wszystkie dany w obrębie strony.(2)
SDI
SII
SDO
0_dddd_dddd_00
0_0011_1100_00
x_xxxx_xxxx_xx
0_0000_0000_00
0_0111_1101_00
x_xxxx_xxxx_xx
0_0000_0000_00
0_0111_1100_00
x_xxxx_xxxx_xx
  Instr. 5 - 7.
Load FLASH High Address
and Program Page

Ładowanie górnego adresu FLASH
i programowanie strony
SDI
SII
SDO
0_0000_000a_00
0_0001_1100_00
x_xxxx_xxxx_xx
0_0000_0000_00
0_0110_0100_00
x_xxxx_xxxx_xx
0_0000_0000_00
0_0110_1100_00
x_xxxx_xxxx_xx
  Po instr. 3 czekaj, aż SDO wróci do stanu wysokiego. Powtarzaj instr. 2 - 3 dla każdej załadowanej strony FLASH, aż cała pamięć FLASH lub wszystkie dane zostaną zaprogramowane.
Powtarzaj. instr. 1 dla nowej 256-bajtowej strony.(2)
Load “Read FLASH” Command
Ładowanie rozkazu "Odczyt FLASH"
SDI
SII
SDO
0_0000_0010_00
0_0100_1100_00
x_xxxx_xxxx_xx
      Wejście w tryb odczytu FLASH
Read FLASH Low and High Bytes
Odczyt dolnego i górnego bajtu
z FLASH
SDI
SII
SDO
0_bbbb_bbbb_00
0_0000_1100_00
x_xxxx_xxxx_xx
0_0000_000a_00
0_0001_1100_00
x_xxxx_xxxx_xx
0_0000_0000_00
0_0110_1000_00
x_xxxx_xxxx_xx
0_0000_0000_00
0_0110_1100_00
q_qqqq_qqqx_xx
Powtarzaj instrukcje 1, 3-6 dla każdego nowego adresu. Powtórz instr.2 dla nowej 256-bajtowej strony.
SDI
SII
SDO
0_0000_0000_00
0_0111_1000_00
x_xxxx_xxxx_xx
0_0000_0000_00
0_0111_1100_00
p_pppp_pppx_xx
    Instr.5 - 6.
Load “Write EEPROM” Command
Załadowanie instrukcji "zapisu
do EEPROM"
SDI
SII
SDO
0_0001_0001_00
0_0100_1100_00
x_xxxx_xxxx_xx
      Wejście w tryb programowania EEPROM.
Load EEPROM Page Buffer
Załadowanie bufora strony
EEPROM
SDI
SII
SDO
0_bbbb_bbbb_00
0_0000_1100_00
x_xxxx_xxxx_xx
0_aaaa_aaaa_00
0_0001_1100_00
x_xxxx_xxxx_xx
0_eeee_eeee_00
0_0010_1100_00
x_xxxx_xxxx_xx
0_0000_0000_00
0_0110_1101_00
x_xxxx_xxxx_xx
Powtarzaj Instr.1-5, aż cały bufor będzie wypełniony lub gdy zostaną wypełnione wszystkie dane na stronie(3).
SDI
SII
SDO
0_0000_0000_00
0_0110_1100_00
x_xxxx_xxxx_xx
      Instr. 5.
Program EEPROM Page
Zaprogramowanie strony EEPROM
SDI
SII
SDO
0_0000_0000_00
0_0110_0100_00
x_xxxx_xxxx_xx
0_0000_0000_00
0_0110_1100_00
x_xxxx_xxxx_xx
    Po Instr.2 czekaj aż SDO przejdzie w stan wysoki. Powtarzaj Instr.1-2 dla każdej załadowanej strony, aż zostanie zaprogramowana cała pamięć EEPROM lub wszystkie dane.
Write EEPROM Byte
Zapis bajtu EEPROM
SDI
SII
SDO
0_bbbb_bbbb_00
0_0000_1100_00
x_xxxx_xxxx_xx
0_aaaa_aaaa_00
0_0001_1100_00
x_xxxx_xxxx_xx
0_eeee_eeee_00
0_0010_1100_00
x_xxxx_xxxx_xx
0_0000_0000_00
0_0110_1101_00
x_xxxx_xxxx_xx
Powtarzaj Instr.1-6 dla każdego nowego adresu. Po Instr.6 zaczekaj, aż SDO przejdzie w stan wysoki(4).
SDI
SII
SDO
0_0000_0000_00
0_0110_0100_00
x_xxxx_xxxx_xx
0_0000_0000_00
0_0110_1100_00
x_xxxx_xxxx_xx
    Instr. 5 - 6.
Load “Read EEPROM” Command
Załadowanie instrukcji "odczytu
EEPROM"
SDI
SII
SDO
0_0000_0011_00
0_0100_1100_00
x_xxxx_xxxx_xx
      Wejście w tryb odczytu EEPROM.
Read EEPROM Byte
Odczyt bajtu z EEPROM
SDI
SII
SDO
0_bbbb_bbbb_00
0_0000_1100_00
x_xxxx_xxxx_xx
0_aaaa_aaaa_00
0_0001_1100_00
x_xxxx_xxxx_xx
0_0000_0000_00
0_0110_1000_00
x_xxxx_xxxx_xx
0_0000_0000_00
0_0110_1100_00
q_qqqq_qqq0_00
Powtarzaj Instr.1,3-4 dla każdego nowego adresu. Powtórz Instr.2 dla nowej 256-bajtowej
strony.
Write Fuse Low Bits
Zapis dolnych bitów
bezpiecznikowych
SDI
SII
SDO
0_0100_0000_00
0_0100_1100_00
x_xxxx_xxxx_xx
0_A987_6543_00
0_0010_1100_00
x_xxxx_xxxx_xx
0_0000_0000_00
0_0110_0100_00
x_xxxx_xxxx_xx
0_0000_0000_00
0_0110_1100_00
x_xxxx_xxxx_xx
Po Instr.4 czekaj, aż SDO przejdzie w stan wysoki. Zapisz A-3 stanami "0", aby zaprogramować bity bezpiecznikowe.
Write Fuse High Bits
Zapis górnych bitów
bezpiecznikowych
SDI
SII
SDO
0_0100_0000_00
0_0100_1100_00
x_xxxx_xxxx_xx
0_IHGF_EDCB_00
0_0010_1100_00
x_xxxx_xxxx_xx
0_0000_0000_00
0_0111_0100_00
x_xxxx_xxxx_xx
0_0000_0000_00
0_0111_1100_00
x_xxxx_xxxx_xx
Po Instr.4 czekaj, aż SDO przejdzie w stan wysoki. Zapisz F-B stanami "0", aby zaprogramować bity bezpiecznikowe.
Write Fuse Extended Bits
Zapis rozszerzonych bitów
bezpiezcnikowych
SDI
SII
SDO
0_0100_0000_00
0_0100_1100_00
x_xxxx_xxxx_xx
0_0000_000J_00
0_0010_1100_00
x_xxxx_xxxx_xx
0_0000_0000_00
0_0110_0110_00
x_xxxx_xxxx_xx
0_0000_0000_00
0_0110_1110_00
x_xxxx_xxxx_xx
Po Instr.4 czekaj, aż SDO przejdzie w stan wysoki. Zapisz J stanem "0", aby zaprogramować bit bezpiecznikowy.
Write Lock Bits
Zapis bitów blokujących
SDI
SII
SDO
0_0010_0000_00
0_0100_1100_00
x_xxxx_xxxx_xx
0_0000_0021_00
0_0010_1100_00
x_xxxx_xxxx_xx
0_0000_0000_00
0_0110_0100_00
x_xxxx_xxxx_xx
0_0000_0000_00
0_0110_1100_00
x_xxxx_xxxx_xx
Po Instr.4 czekaj, aż SDO przejdzie w stan wysoki. Zapisz 2-1 stanami "0", aby zaprogramować dany bit blokujący.
Read Fuse Low Bits
Odczyt dolnych bitów
bezpiecznikowych
SDI
SII
SDO
0_0000_0100_00
0_0100_1100_00
x_xxxx_xxxx_xx
0_0000_0000_00
0_0110_1000_00
x_xxxx_xxxx_xx
0_0000_0000_00
0_0110_1100_00
A_9876_543x_xx
  Odczyt A-3="0" oznacza bit bezpiecznikowy zaprogramowany.
Read Fuse High Bits
Odczyt górnych bitów
bezpiecznikowych
SDI
SII
SDO
0_0000_0100_00
0_0100_1100_00
x_xxxx_xxxx_xx
0_0000_0000_00
0_0111_1010_00
x_xxxx_xxxx_xx
0_0000_0000_00
0_0111_1100_00
I_HGFE_DCBx_xx
  Odczyt I-B="0" oznacza bit bezpiecznikowy zaprogramowany.
Read Fuse Extended Bits
Odczyt rozszerzonych bitów
bezpiecznikowych
SDI
SII
SDO
0_0000_0100_00
0_0100_1100_00
x_xxxx_xxxx_xx
0_0000_0000_00
0_0110_1010_00
x_xxxx_xxxx_xx
0_0000_0000_00
0_0110_1110_00
x_xxxx_xxJx_xx
  Odczyt J="0" oznacza bit bezpiecznikowy zaprogramowany.
Read Lock Bits
Odczyt bitów blokujących
SDI
SII
SDO
0_0000_0100_00
0_0100_1100_00
x_xxxx_xxxx_xx
0_0000_0000_00
0_0111_1000_00
x_xxxx_xxxx_xx
0_0000_0000_00
0_0110_1100_00
x_xxxx_x21x_xx
  Odczyt 2, 1 ="0" oznacza bit blokujący zaprogramowany.
Read Signature Bytes
Odczyt bajtów sygnaturowych
SDI
SII
SDO
0_0000_1000_00
0_0100_1100_00
x_xxxx_xxxx_xx
0_0000_00bb_00
0_0000_1100_00
x_xxxx_xxxx_xx
0_0000_0000_00
0_0110_1000_00
x_xxxx_xxxx_xx
0_0000_0000_00
0_0110_1100_00
q_qqqq_qqqx_xx
Powtórz Instr.2-4 dla każdego adresu bajtu sygnatury.
Read Calibration Byte
Odczyt bajtu kalibracyjnego
SDI
SII
SDO
0_0000_1000_00
0_0100_1100_00
x_xxxx_xxxx_xx
0_0000_0000_00
0_0000_1100_00
x_xxxx_xxxx_xx
0_0000_0000_00
0_0111_1000_00
x_xxxx_xxxx_xx
0_0000_0000_00
0_0111_1100_00
p_pppp_pppx_xx
 
Load “No Operation” Command
Załadowanie instrukcji pustej
SDI
SII
SDO
0_0000_0000_00
0_0100_1100_00
x_xxxx_xxxx_xx
       
Uwagi: 1. a = górne bity adresu
b = dolne bity adresu
d = górne bity danych wejściowych
e = dolne bity danych wejściowych
p = górne bity danych wyjściowych
q = dolne bity danych wyjściowych
x = wartość dowolna
1 = bit blokujący 1
2 = bit blokujący 2
3 = bit bezpiecznikowy CKSEL0
4 = bit bezpiecznikowy CKSEL1
5 = bit bezpiecznikowy CKSEL2
6 = bit bezpiecznikowy CKSEL3
7 = bit bezpiecznikowy SUT0
8 = bit bezpiecznikowy SUT1
9 = bit bezpiecznikowy CKOUT
A = bit bezpiecznikowy CKDIV8
B = bit bezpiecznikowy BODLEVEL0
C = bit bezpiecznikowy BODLEVEL1
D = bit bezpiecznikowy BODLEVEL2
E = bit bezpiecznikowy EESAVE Fuse
F = bit bezpiecznikowy WDTON
G = bit bezpiecznikowy SPIEN
H = bit bezpiecznikowy DWEN
I = bit bezpiecznikowy RSTDISBL
J = bit bezpiecznikowy SELFPRGEN
  2. Jeśli rozmiar strony jest mniejszy od 256 słów, to część adresu (bbbb_bbbb) będzie częścią adresu strony.
  3. Jeśli rozmiar strony jest mniejszy od 256 bajtów, to część adresu (bbbb_bbbb) będzie częścią adresu strony.
  4. Pamięć EEPROM zapisywana jest stronami, lecz tylko bajty załadowane do strony zostaną faktycznie zapisane w EEPROM. Dostęp do EEPROM na poziomie całej strony jest bardziej efektywny, gdy na danej stronie ma zostać zapisane wiele bajtów. Zauważ, iż automatyczne wymazywanie EEPROM nie jest dostępne w trybie wysokonapięciowym, tylko przy programowaniu SPI

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.