|
Wyjście Spis treści Wstecz Dalej
Autor artykułu |
©2026 mgr Jerzy Wałaszek
|

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:
https://www.microchip.com/about-us/legal-information/copyright-usage-guidelines
Mikrokontroler ATtiny15L udostępnia dwa bity blokujące, które można pozostawić w stanie niezaprogramowanym "1" lub można je zaprogramować w stan "0", aby otrzymać dodatkowe opcje wymienione w poniższej tabeli. Bity blokowania mogą zostać wyzerowane tylko rozkazem kasowania układu (ang. Chip Erase command).
| Bity blokowania pamięci | Typ ochrony | ||
| Tryb | LB1 | LB2 | |
| 1 | 1 | 1 | Brak ochrony pamięci |
| 2 | 0 | 1 | Zablokowanie programowania FLASH i EEPROM |
| 3 | 0 | 0 | Jak w trybie 2, lecz zablokowana weryfikacja |
ATtiny15 posiada sześć bitów bezpiecznikowych (BODLEVEL, BODEN, SPIEN, RSTDSBL i CKSEL1:0). Wszystkie bity bezpiecznikowe można programować zarówno w trybie wysokonapięciowym jak i niskonapięciowym programowania szeregowego. Programowanie bitów bezpiecznikowych nie zmienia ich funkcji w trakcie programowania.
Stan bitów bezpiecznikowych nie jest zmieniany podczas kasowania układu (ang. Chip Erase).
| Uwaga: | Jeśli zostanie zaprogramowany bit RSTDISBL, to programator powinien przyłożyć napięcie +12V do końcówki PB5, gdy ATtiny znajduje się w trybie resetu przy włączaniu (ang. Power-on Reset). Jeśli tego nie zrobi, to mikrokontroler może nie wejść w tryb programowania z powodu konfliktu bufora na końcówce PB0 i/lub PB5. |
Wszystkie mikrokontrolery firmy Atmel posiadają trzybajtowy kod sygnatury, który identyfikuje dany model. Te trzy bajty są umieszczone w oddzielnej przestrzeni adresowej i dla ATtiny15L posiadają następujące wartości:
ATtiny15L posiada jednobajtową wartość kalibracyjną dla wewnętrznego oscylatora RC. Bajt ten jest umieszczony w górnym bajcie słowa pod adresem 0x000 w przestrzeni adresowej sygnatur. Aby skorzystać z tego bajtu, należy go odczytać z tego miejsca i wpisać do normalnej pamięci programu FLASH. Przy starcie oprogramowanie użytkownika musi odczytać tę komórkę FLASH i zapisać jej zawartość w rejestrze OSCCAL.
Mikrokontroler ATtiny15L oferuje 1KB reprogramowalnej pamięci FLASH dla programu oraz 64 B reprogramowalnej pamięci EEPROM dla danych. Układy ATtiny15L są sprzedawane z wyzerowanymi pamięciami FLASH i EEPROM (wszystkie ich bajty mają stan 0xFF), które są gotowe do zaprogramowania. Mikrokontroler ten obsługuje programowanie szeregowe w trybie wysoko- i niskonapięciowym. Napięcie +12V używane jest tylko do aktywacji trybu programowania wysokonapięciowego i nie jest przy tym pobierany prawie żaden prąd (mniej niż 100 μA). Niskonapięciowy tryb programowania szeregowego udostępnia wygodny sposób ładowania programu i danych do ATtiny15L w systemie użytkownika.
W obu trybach programowania pamięci programu i danych w ATtiny15L są programowane bajt po bajcie. Pamięć EEPROM posiada automatyczny cykl kasowania poprzedniej zawartości, który jest wykonywany podczas instrukcji zapisu w trybie szeregowego programowania niskonapięciowego. Podczas programowania napięcie zasilania musi być zgodne z poniższą tabelą:
| Układ | Niskonapięciowe programowanie szeregowe |
Wysokonapięciowe programowanie szeregowe |
| ATtiny15L | 2,7...5,5V | 4,5...5,5V |
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 ATtiny15L.

W celu zaprogramowania i weryfikacji ATtiny15L w trybie programowania wysokonapięciowego zaleca się następujący ciąg operacji (zobacz do tabeli z formatami instrukcji, którą znajdziesz poniżej):
Przy zapisie lub odczycie danych szeregowych z ATtiny15L dane są taktowane od ósmego narastającego zbocza 16 cykli zewnętrznego zegara potrzebnych do generacji zegara wewnętrznego. Przeanalizuj podane niżej przebiegi czasowe.

| Instrukcja | Format Instrukcji | Uwagi na temat operacji | ||||
| Instr.1 | Instr.2 | Instr.3 | Instr.4 | |||
| Chip Erase Kasowanie układu |
PB0 PB1 PB2 |
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 |
0_0000_0000_00 0_0100_1100_00 x_xxxx_xxxx_xx |
Po instr.3 czekaj, aż PB2 przejdzie w stan wysoki, aby cykl kasowania się zakończył. |
| Write FLASH
High and Low Address Zapis górnego i dolnego bajtu adresu |
PB0 PB1 PB2 |
0_0001_0000_00 0_0100_1100_00 x_xxxx_xxxx_xx |
0_0000_000a_00 0_0001_1100_00 x_xxxx_xxxx_xx |
0_bbbb_bbbb_00 0_0000_1100_00 x_xxxx_xxxx_xx |
Powtarzaj Instr.2 dla
nowej 256-bajtowej strony. Powtarzaj Instr.3 dla każdego nowego adresu. |
|
| Write FLASH Low Byte Zapis dolnego bajtu FLASH |
PB0 PB1 PB2 |
0_ i i i i_i
i i i _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 0_0000_0000_00 |
Po Instr.3 czekaj, aż PB2 przejdzie w stan wysoki. Powtarzaj Instr.1,2 i 3 dla każdego nowego adresu. |
|
| Write FLASH High Byte Zapis górnego bajtu FLASH |
PB0 PB1 PB2 |
0_ i i i i_i
i i i _00 0_0011_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 0_0000_0000_00 |
Po Instr.3 czekaj, aż PB2 przejdzie w stan wysoki. Powtarzaj Instr.1,2 i 3 dla każdego nowego adresu. |
|
| Read FLASH
High and Low Address Odczyt górnego i dolnego bajtu adresu |
PB0 PB1 PB2 |
0_0000_0010_00 0_0100_1100_00 x_xxxx_xxxx_xx |
0_0000_000a_00 0_0001_1100_00 x_xxxx_xxxx_xx |
0_bbbb_bbbb_00 0_0000_1100_00 x_xxxx_xxxx_xx |
Powtarzaj Instr.2 i 3
dla każdego nowego adresu. |
|
| Read FLASH Low Byte Odczyt dolnego bajtu FLASH |
PB0 PB1 PB2 |
0_0000_0000_00 0_0110_1000_00 x_xxxx_xxxx_xx |
0_0000_0000_00 0_0110_1100_00 o_oooo_ooox_xx |
Powtarzaj Instr.1 i 2
dla każdego nowego adresu. |
||
| Read FLASH High Byte Odczyt górnego bajtu FLASH |
PB0 PB1 PB2 |
0_0000_0000_00 0_0111_1000_00 x_xxxx_xxxx_xx |
0_0000_0000_00 0_0110_1100_00 o_oooo_ooox_xx |
Powtarzaj Instr.1 i 2
dla każdego nowego adresu. |
||
| Write EEPROM Low Address Zapis dolnego bajtu adresu EEPROM |
PB0 PB1 PB2 |
0_0001_0001_00 0_0100_1100_00 x_xxxx_xxxx_xx |
0_00bb_bbbb_00 0_0000_1100_00 x_xxxx_xxxx_xx |
Powtarzaj Instr.2 dla
każdego nowego adresu. |
||
| Write EEPROM
Byte Zapis bajtu EEPROM |
PB0 PB1 PB2 |
0_ i i i i_i
i i i _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 0_0000_0000_00 |
Po Instr.3 czekaj, aż PB2 przejdzie w stan wysoki. |
|
| Read EEPROM Low Address Odczyt dolnego bajtu adresu EEPROM |
PB0 PB1 PB2 |
0_0000_0011_00 0_0100_1100_00 x_xxxx_xxxx_xx |
0_00bb_bbbb_00 0_0000_1100_00 x_xxxx_xxxx_xx |
Powtarzaj Instr.2 dla
każdego nowego adresu. |
||
| Read EEPROM
Byte Odczyt bajtu EEPROM |
PB0 PB1 PB2 |
0_0000_0000_00 0_0110_1000_00 x_xxxx_xxxx_xx |
0_0000_0000_00 0_0110_1100_00 o_oooo_ooox_xx |
Powtarzaj Instr.2 dla
każdego nowego adresu. |
||
| Write Fuse
Bits Zapis bitów bezpiecznikowych |
PB0 PB1 PB2 |
0_0100_0000_00 0_0100_1100_00 x_xxxx_xxxx_xx |
0_8765_1143_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 0_0000_0000_00 |
Po Instr.4 czekaj, aż PB2 przejdzie w stan wysoki. Ustaw bity 8...3 na 0, aby je zaprogramować. |
| Write Lock
Bits Zapis bitów blokujących |
PB0 PB1 PB2 |
0_0010_0000_00 0_0100_1100_00 x_xxxx_xxxx_xx |
0_0000_0210_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 0_0000_0000_00 |
Po Instr.4 czekaj, aż PB2 przejdzie w stan wysoki. Ustaw bity 2...1 na 0, aby je zaprogramować. |
| Read Fuse
Bits Odczyt bitów bezpiecznikowych |
PB0 PB1 PB2 |
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 8_765x_x43x_xx |
Odczyt bitów 8...3 = 0 oznacza, że bity te są zaprogramowane. |
|
| Read Lock
Bits Odczyt bitów blokujących |
PB0 PB1 PB2 |
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_21xx_xx |
Odczyt bitów 2...1 = 0 oznacza, że bity te są zaprogramowane. |
|
| Read
Signature Bytes Odczyt bajtów sygnaturowych |
PB0 PB1 PB2 |
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 o_oooo_ooox_xx |
Powtarzaj Instr.2,3 i 4
dla każdego adresu bajtu sygnatury. |
| Read
Calibration Byte Odczyt bajtu kalibracyjnego |
PB0 PB1 PB2 |
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 o_oooo_ooox_xx |
|
| Uwaga: | a = górne
bity adresu b = dolne bity adresu i = dane wejściowe o = dane wyjściowe x= stan bez znaczenia 1 = Bit blokujący 1 2 = Bit blokujący 2 3 = Bit bezpiecznikowy CKSEL0 4 = Bit bezpiecznikowy CKSEL1 5 = Bit bezpiecznikowy RSTDSBL 6 = Bit bezpiecznikowy SPIEN 7 = Bit bezpiecznikowy BODEN 8 = Bit bezpiecznikowy BODLEVEL Bity blokujące można skasować tylko rozkazem Chip Erase. |

| Symbol | Parametr | Min | Typ. | Max | Jednostka |
| tSHSL | Szerokość impulsu wysokiego SCI (PB3) | 25,0 | ns | ||
| tSLSH | Szerokość impulsu niskiego SCI (PB3) | 25,0 | ns | ||
| tIVSH | Ważność SDI (PB0) i SII (PB1) względem ósmego zbocza narastającego SCI (PB3) | 50,0 | ns | ||
| tSHIX | Podtrzymanie SDI (PB0) i SII (PB1) po ósmym zboczu narastającym SCI (PB3) | 50,0 | ns | ||
| tSHOV | Ważność SDO (PB2) po dziewiątym zboczu narastającym SCI (PB3) | 10,0 | 16,0 | 32,0 | ns |
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, MOSI (wejście) i MISO (wyjście).

Po ustawieniu RESET w stan niski, należy wykonać instrukcję włączającą programowanie zanim operacje programowania/wymazywania będą mogły być wykonywane.
Przy programowaniu EEPROM w operacji programowania wbudowany jest cykl samokasowania 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.
Mikrokontroler jest taktowany z wewnętrznego zegara przy minimalnej, nieskalibrowanej częstotliwości (0,8 ... 1,6 MHz). Minimalne czasy trwania okresów niskich i wysokich dla wejściowego zegara szeregowego (SCK) są zdefiniowane następująco:
| Stan niski: > 2 cykle zegarowe
mikrokontrolera Stan wysoki: > 2 cykle zegarowe mikrokontrolera |
Gdy dane szeregowe są zapisywane do ATtiny15L, ich odczyt przez mikroprocesor następuje na narastającym zboczu sygnału zegarowego SCK. Gdy dane są odczytywane z ATtiny15L, ich próbkowanie następuje przy opadającym zboczu sygnału SCK. Szczegóły znajdziesz poniżej.
Aby zaprogramować i zweryfikować mikrokontroler ATtiny15L w trybie programowania szeregowego, zaleca następujący ciąg operacji:
Gdy bajt jest programowany w pamięci FLASH lub EEPROM, odczyt komórki pod tym adresem da wartość 0xFF. Gdy będzie można zapisać następny bajt, odczyt zwróci poprawną wartość. W ten sposób można określić, czy pamięci są gotowe na nowe dane. Nie zadziała to dla wartości 0xFF, zatem przy programowaniu tej wartości należy odczekać przynajmniej przez okres tWD_PROG_FL przed zapisem nowego bajtu w pamięci FLASH lub tWD_PROG_EE przed zapisem nowego bajtu w pamięci EEPROM. Ponieważ po skasowaniu układu wszystkie komórki obu pamięci zawierają wartość 0xFF, zatem programowanie komórek z tą zawartością można pominąć. Nie ma to zastosowania, jeśli EEPROM jest ponownie programowana bez kasowania układu. W takim przypadku nie można użyć podglądu danych i należy odczekać przez okres co najmniej tWD_PROG_EE przed zaprogramowaniem następnego bajtu.

| Instrukcja | Format instrukcji | Operacja | |||
| Bajt 1 | Bajt 2 | Bajt 3 | Bajt 4 | ||
| Programming
Enable Uaktywnienie programowania |
1010 1100 | 0101 0011 | xxxx xxxx | xxxx xxxx | Uaktywnienie programowania szeregowego, gdy RESET jest w stanie niskim. |
| Chip Erase Kasowanie układu |
1010 1100 | 100x xxxx | xxxx xxxx | xxxx xxxx | Kasowanie zawartości FLASH i EEPROM. |
| Read Program
Memory Odczyt pamięci programu |
0010 H000 | xxxx xxxa | bbbb bbbb | oooo oooo | Odczyt
(górnego:H=1, lub dolnego:H=0) bajtu o z pamięci programu spod adresu a:b. |
| Write Program
Memory Zapis pamięci programu |
0100 H000 | xxxx xxxa | bbbb bbbb | i i i i i i i i | Zapis
(górnego:H=1, lub dolnego:H=0) bajtu i w pamięci programu pod adres a:b. |
| Read EEPROM
Memory Odczyt pamięci EEPROM |
1010 0000 | xxxx xxxx | xxbb bbbb | oooo oooo | Odczyt bajtu o z pamięci EEPROM spod adresu b. |
| Write EEPROM
Memory Zapis pamięci EEPROM |
1100 0000 | xxxx xxxx | xxbb bbbb | i i i i i i i i | Zapis bajtu i w pamięci EEPROM pod adres b. |
| Write Lock
Bits Zapis bitów blokujących |
1010 1100 | 1111 1211 | xxxx xxxx | xxxx xxxx | Ustaw bity 1,2 na 0, aby je zaprogramować. |
| Read Lock
Bits Odczyt bitów blokujących |
0101 1000 | xxxx xxxx | xxxx xxxx | xxxx x21x | "0" oznacza bit
zaprogramowany. "1" oznacza bit niezaprogramowany. |
| Read
Signature Bytes Odczyt bitów sygnaturowych |
0011 0000 | xxxx xxxx | 0000 00bb | oooo oooo | Odczyt bajtu sygnaturowego o spod adresu b. |
| Write Fuse
Bits Zapis bitów bezpiecznikowych |
1010 1100 | 101x xxxx | xxxx xxxx | 8765 1143 | Ustaw bity 8...3 na 0, aby je zaprogramować. |
| Read Fuse
Bits Odczyt bitów bezpiecznikowych |
0101 0000 | xxxx xxxx | xxxx xxxx | 8765 xx43 | "0" oznacza bit
zaprogramowany. "1" oznacza bit niezaprogramowany. |
| Read
Calibration Byte Odczyt bajtu kalibracyjnego |
0011 1000 | xxxx xxxx | 0000 0000 | oooo oooo | |
| 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ść obojętna 1 = Bit blokujący 1 2 = Bit blokujący 2 3 = Bit bezpiecznikowy CKSEL0 4 = Bit bezpiecznikowy CKSEL1 5 = Bit bezpiecznikowy RSTDISBL 6 = Bit bezpiecznikowy SPIEN 7 = Bit bezpiecznikowy BODEN 8 = Bit bezpiecznikowy BODLEVEL |

| Symbol | Parametr | Min | Typ. | Max | Jednostka |
| 1/tCLCL | Częstotliwość oscylatora RC (VCC = 2,7 ... 5,5V) | 0,8 | 1,6 | MHz | |
| tCLCL | Okres oscylatora RC (VCC = 2,7 ... 5,5V) | 625,0 | 1250,0 | ns | |
| tSHSL | Szerokość impulsu wysokiego SCK | 2,0tCLCL | ns | ||
| tSLSH | Szerokość impulsu niskiego SCK | 2,0tCLCL | ns | ||
| tOVSH | Ustalanie MOSI do zbocza narastającego SCK | tCLCL | ns | ||
| tSHOX | Utrzymanie MOSI po zboczu narastającym SCK | 2,0tCLCL | ns | ||
| tSLIV | Zbocze opadające SCK do ważności MISO | 10,0 | 16,0 | 32,0 | ns |
| Symbol | Minimalne opóźnienie |
| tWD_ERASE | 8,2ms |
| Symbol | Minimalne opóźnienie |
| tWD_PROG_FL | 4,1ms |
| tWD_PROG_EE | 8,2ms |
![]() |
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2026 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:
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.