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

©2025 mgr Jerzy Wałaszek
I LO w Tarnowie

obrazek

Mikrokontrolery

ATtiny13

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 ATtiny13 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. Interfejs debugWire jest zablokowany.
Uwagi: 1. Zaprogramuj bity bezpiecznikowe przed bitami blokującymi.
  2.  "1" oznacza stan niezaprogramowany, "0" oznacza stan zaprogramowany.

do podrozdziału  do strony 

Bity bezpiecznikowe

Mikrokontroler ATtiny13 posiada dwa 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.

Górny bajt bitów bezpiecznikowych

Bit bezpiecznikowy Numer bitu Opis Wartość standardowa
7 1 (niezaprogramowane)
6 1 (niezaprogramowane)
5 1 (niezaprogramowane)
SELFPRGEN(1) 4 Uaktywnienie samoprogramowania 1 (niezaprogramowane)
DWEN(2) 3 Uaktywnienie interfejsu debugWIRE 1 (niezaprogramowane)
BODLEVEL1(3) 2 Poziom wyzwalania detektora spadku napięcia 1 (niezaprogramowane)
BODLEVEL0(3) 1 1 (niezaprogramowane)
RSTDISBL(4) 0 Zablokowanie zewnętrznego resetu 1 (niezaprogramowane)
Uwagi: 1. Uaktywnia instrukcję SPM. Zobacz do rozdziału "Samoprogramowanie FLASH"
  2. DWEN musi zostać odprogramowany, gdy jest potrzebne zabezpieczenie bitami blokującymi. Zobacz do podrozdziału "Bity blokujące pamięci programu i danych".
  3. Zobacz do podrozdziału "Parametry systemu i resetu".
  4. Zobacz do podrozdziału "Funkcje alternatywne portu B".

Dolny bajt bitów bezpiecznikowych

Bit bezpiecznikowy Numer bitu Opis Wartość standardowa
SPIEN(1) 7 Włączenie interfejsu programowania szeregowego i ładowania danych 0 (zaprogramowane)
EESAVE 6 Zachowanie zawartości EEPROM podczas kasowania zawartości układu 1 (niezaprogramowane)
WDTON(2) 5 Licznik zegarowy zawsze włączony 1 (niezaprogramowane)
CKDIV8(3) 4 Podział częstotliwości zegara systemowego przez 8 0 (zaprogramowane)
SUT1(4) 3 Wybór czasu uruchamiania 1 (niezaprogramowane)
SUT0(4) 2 0 (zaprogramowane)
CKSEL1(5) 1 Wybór źródła zegarowego 1 (niezaprogramowane)
CKSEL0(5) 0 0 (zaprogramowane)
Uwagi: 1. Bit bezpiecznikowy SPIEN jest niedostępny w trybie programowania SPI.
  2. Zaprogramowanie tych bitów wyłącza przerwanie z licznika zegarowego. Zobacz do podrozdziału "Timer licznika zegarowego".
  3. Szczegóły w podrozdziale "Preskaler zegara systemowego".
  4. Standardowa wartość bitów SUT1..0 daje maksymalny czas uruchamiania dla standardowego źródła zegara.
  5. Standardowe ustawienie bitów CKSEL1..0 daje częstotliwość wewnętrznego oscylatora RC równą 9.6 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.


do podrozdziału  do strony 

Bajty kalibracyjne

Obszar sygnaturowy mikrokontrolera ATtiny13 zawiera dwa bajty danych kalibracyjnych dla wewnętrznego oscylatora. Dane kalibracyjne w górnym bajcie słowa pod adresem 0x00 są używane z oscylatorem ustawionym do pracy z częstotliwością 9,6 MHz. Podczas resetu bajt ten jest automatycznie wpisywany do rejestru OSCCAL w celu zapewnienia poprawnej częstotliwości oscylatora.

Istnieje oddzielny bajt kalibracyjny dla wewnętrznego oscylatora pracującego w trybie 4,8 MHz, lecz dane te nie są wpisywane automatycznie. Podczas resetu sprzętowo zawsze ładowane są dane kalibracyjne dla 9,6 MHz. Aby wykorzystać oddzielne dane kalibracyjne dla oscylatora pracującego w trybie 4,8 MHz, rejestr OSCCAL musi zostać uaktualniony programowo. Dane kalibracyjne dla pracy z częstotliwością 4,8 MHz są umieszczone w górnym bajcie słowa pod adresem 0x01 obszaru sygnaturowego.


do podrozdziału  do strony 

Bajty sygnaturowe

Wszystkie mikrokontrolery firmy Atmel posiadają trójbajtowy kod sygnatury, który identyfikuje poszczególne modele. Kod ten może zostać odczytany zarówno w trybie programowania szeregowego jak i wysokonapięciowego, nawet jeśli mikrokontroler jest zablokowany. Te trzy bajty przebywają w oddzielnej przestrzeni adresowej.

Dla ATtiny13 bajty sygnaturowe są następujące:


do podrozdziału  do strony 

Rozmiar strony

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

Rozmiar FLASH Rozmiar strony PCWORD Liczba stron PCPAGE PCMSB
512 słów (1 KB) 16 słów PC[3:0] 32 PC[8:4] 8
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

Rozmiar EEPROM Rozmiar strony EEAWORD Liczba stron EEAPAGE EEAMSB
64 B 4 B EEA[1:0] 16 EEA[5:2] 5
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

do podrozdziału  do 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.

obrazek

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

obrazek

Po ustawieniu RESET w stan niski, należy wykonać 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 PB0 we Wejście danych szeregowych
MISO PB1 wy Wyjście danych szeregowych
SCK PB2 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 ATtiny13, ich odczyt przez mikroprocesor następuje na narastającym zboczu sygnału zegarowego SCK. Gdy dane są odczytywane z ATtiny13, ich próbkowanie następuje przy opadającym zboczu sygnału SCK. Szczegóły znajdziesz w podrozdziale "Parametry programowania szeregowego".

Aby zaprogramować i zweryfikować mikrokontroler ATtiny13 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 Format instrukcji Operacja
Bajt 1 Bajt 2 Bajt 3 Bajt 4
Programming Enable
Uaktywnienie programowania
1010 1100
0101 0011
xxxx xxxx
xxxx xxxx
Uaktywnia programowanie szeregowe
po wysterowaniu końcówki RESET stanem niskim.
Chip Erase
Kasowanie zawartości układu
1010 1100
100x xxxx
xxxx xxxx
xxxx xxxx
Kasowanie zawartości EEPROM i FLASH.
Read Program Memory
Odczyt pamięci programu
0010 H000
0000 000a
bbbb bbbb
oooo oooo
Odczyt danych H (górny lub dolny bajt) z pamięci
programu spod adresu słowa a:b.
Load Program Memory Page
Ładowanie do strony pamięci programu 
0100 H000
000x xxxx
xxxx bbbb
iiii iiii
Zapis danych H (górny lub dolny bajt) do strony
pamięci programu pod adresem słowa b. Dolny
bajt danej musi być zapisany przed górnym bajtem
pod tym samym adresem.
Write Program Memory Page
Zapis strony pamięci programu
0100 1100
0000 000a
bbbb xxxx
xxxx xxxx
Zapis strony pamięci programu pod adresem a:b
Read EEPROM Memory
Odczyt pamięci EEPROM
1010 0000
000x xxxx
xxbb bbbb
oooo oooo
Odczyt danych o z EEPROM pod adresem b.
Write EEPROM Memory
Zapis pamięci EEPROM
1100 0000
000x xxxx
xxbb bbbb
iiii iiii
Zapis danych i do EEPROM pod adres b.
Load EEPROM Memory Page
Ładowanie do strony pamięci EEPROM
1100 0001
0000 0000
0000 00bb
iiii iiii
Zapis danych i do bufora strony pamięci EEPROM.
Po załadowaniu danych zaprogramuj stronę EEPROM.
Write EEPROM Memory Page
Zapis strony pamięci EEPROM
1100 0010
00xx xxxx
xxbb bb00
xxxx xxxx
Zapis strony EEPROM pod adresem b.
Read Lock Bits
Odczyt bitów blokujących
0101 1000
0000 0000
xxxx xxxx
xxoo oooo
Odczyt bitów blokujących. "0" = zaprogramowane,
"1" = niezaprogramowane. Szczegóły w tabelce.
Write Lock Bits
Zapis bitów blokujących
1010 1100
111x xxxx
xxxx xxxx
11ii iiii
Zapis bitów blokujących. "0" = zaprogramowane,
"1" = niezaprogramowane. Szczegóły w tabelce.
Read Fuse Byte
Odczyt bajtu bezpieczników
0101 H000
0000 H000
xxxx xxxx
oooo oooo
Odczyt górnego/dolnego bajtu bezpieczników.
"0" = zaprogramowane, "1" = niezaprogramowane.
Zobacz do podrozdziału "Bity bezpiecznikowe".
Write Fuse Byte
Zapis bajtu bezpieczników
1010 1100
1010 H000
xxxx xxxx
iiii iiii
Zapis górnego/dolnego bajtu bezpieczników.
"0" = zaprogramowane, "1" = niezaprogramowane.
Zobacz do podrozdziału "Bity bezpiecznikowe".
Read Signature Byte
Odczyt bajtu sygnatury
0011 0000
000x xxxx
xxxx xxbb
oooo oooo
Odczyt bajtu sygnatury spod adresu b.
Read Calibration Byte
Odczyt bajtu kalibracyjnego
0011 1000
000x xxxx
0000 000b
oooo oooo
Zobacz do podrozdziału "bajty kalibracyjne".
Poll RDY/BSY
Podgląd RDY/BSY
1111 0000
0000 0000
xxxx xxxx
xxxx xxxo
Jeśli o = "1", to wciąż trwa operacja programowania.
Poczekaj, aż ten bit powróci na "0", zanim wyślesz
kolejny rozkaz.
Uwaga:   a = górne bity adresu, b = dolne bity adresu, H = 0 - dolny bajt, 1 - górny bajt, o = dane wyjściowe, i = dane wejściowe, x = wartości ignorowane

do podrozdziału  do 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 ATtiny13.

obrazek

obrazek

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

Nazwa sygnału Końcówka We/Wy Funkcja
SDI PB0 We Szeregowe wejście danych (ang. Serial Data Input)
SII PB1 We Szeregowe wejście instrukcji (ang. Serial Instruction Input)
SDO PB2 Wy Szeregowe wyjście danych (ang. Serial Data Output)
SCI PB3 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ść
SDI Prog_enable[0] 0
SII Prog_enable[1] 0
SDO Prog_enable[2] 0

Algorytm programowania wysokonapięciowego

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

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], aby zapobiec konfliktowi wysterowania wyjścia Prog_enable[2]/SDO.
  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 12V 100ns
5,5V 12V 100ns

Zestaw instrukcji wysokonapięciowego programowania szeregowego

Instrukcja Format Instrukcji Uwagi na temat operacji
Instr.1/5 Instr.2/6 Instr.3 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 instr.3 czekaj, aż SDO przejdzie
w stan wysoki, aby cykl kasowania
się zakończył.
Load “Write FLASH” Command
Załadowanie instrukcji "zapisu
pamięci FLASH"
SDI
SII
SDO
0_0001_0000_00
0_0100_1100_00
x_xxxx_xxxx_xx
      Wprowadzenie kodu programowania
pamięci FLASH.
Load FLASH Page Buffer
Zał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_dddd_dddd_00
0_0011_1100_00
x_xxxx_xxxx_xx
0_0000_0000_00
0_0111_1101_00
x_xxxx_xxxx_xx
Po instrukcjach 1-5 powtarzaj, aż cały bufor
strony zostanie wypełniony lub do wypełnienia
wszystkich danych na stronie.
SDI
SII
SDO
0_0000_0000_00
0_0111_1100_00
x_xxxx_xxxx_xx
      Instr.5.
Load FLASH High Address
and Program Page

Załadowanie górnego bitu adresu
FLASH i zaprogramowanie 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 zaczekaj, aż SDO przejdzie w stan
wysoki. Powtarzaj Instr.2-3 dla każdej
załadowanej strony FLASH, aż wszystkie
dane zostaną zaprogramowane. Powtórz
Instr.1 dla nowej 256-bajtowej strony.
Load “Read FLASH” Command
Załadowanie instrukcji "odczytu
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_00bb_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-4, aż cały bufor będzie
wypełniony lub gdy zostaną wypełnione
wszystkie dane na stronie.
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_00bb_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_0100_00
x_xxxx_xxxx_xx
Powtarzaj Instr.1-5 dla każdego nowego adresu.
Po Instr.5 zaczekaj, aż SDO przejdzie w stan
wysoki.
SDI
SII
SDO
0_0000_0000_00
0_0110_1100_00
x_xxxx_xxxx_xx
      Instr. 5.
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_000F_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 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_1110_00
x_xxFE_DCBx_xx
  Odczyt F-B="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_0111_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_000b_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
       
Uwaga:   a = górne bity adresu
b
= dolne bity adresu
d
= dane wejściowe dla górnych bitów
e
= dane wejściowe dla dolnych bitów
p
= data wyjściowe z górnych bitów
q
= dane wyjściowe z dolnych bitów
x
= ignorowane
1
= bit blokujący 1
2
= bit blokujący 2
3
 = bit bezpiecznikowy CKSEL0
4
= bit bezpiecznikowy CKSEL1
5
= bit bezpiecznikowy SUT0
6
= bit bezpiecznikowy SUT1
7
= bit bezpiecznikowy CKDIV8
8
= bit bezpiecznikowy WDTON
9
= bit bezpiecznikowy EESAVE
A
= bit bezpiecznikowy SPIEN
B
= bit bezpiecznikowy RSTDISBL
C
 = bit bezpiecznikowy BODLEVEL0
D 
= bit bezpiecznikowy BODLEVEL1
E
= bit bezpiecznikowy MONEN
F
= bit bezpiecznikowy SELFPRGEN
Uwaga:   Pamięć EEPROM zapisywana jest stronami. Lecz tylko bajty załadowane do strony są faktycznie zapisywane do EEPROM. Dostęp na poziomie strony EEPROM jest bardziej efektywny, jeśli wiele bajtów ma być zapisane do tej samej strony. W trybie wysokonapięciowego programowania szeregowego nie jest dostępna funkcja automatycznego wymazywania zapisywanej komórki EEPROM, tylko w trybie programowania SPI.
Uwaga:   Zawartość EEPROM zostaje zachowana podczas kasowania mikrokontrolera, jeśli został zaprogramowany bit bezpiecznikowy EESAVE.

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 ATtiny13, 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.


do podrozdziału  do strony 

Zespół Przedmiotowy
Chemii-Fizyki-Informatyki

w I Liceum Ogólnokształcącym
im. Kazimierza Brodzińskiego
w Tarnowie
ul. Piłsudskiego 4
©2025 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.