Serwis Edukacyjny
Nauczycieli

w I-LO w Tarnowie
obrazek

  Wyjście       Spis treści       Wstecz       Dalej  

obrazek

Autor artykułu
 mgr Jerzy Wałaszek
Konsultacje:
Wojciech Grodowski
mgr inż. Janusz Wałaszek

©2026 mgr Jerzy Wałaszek

obrazek

Mikrokontrolery

ATmega48A/PA/88A/PA/168A/PA/328/P

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 KONSERWACJA
Podrozdziały

obrazek

Bity blokujące pamięci programu i danych

Mikrokontroler ATmega 48A/48PA udostępnia dwa bity blokujące (ang. Lock Bits), a ATmega88A/88PA/168A/168PA/328/328P udostępnia ich sześć. Można je pozostawić w stanie niezaprogramowanym ("1") lub można je zaprogramować ("0"), aby otrzymać dodatkowe własności wymienione w tabelce poniżej. Bity blokujące  można skasować do stanu "1" tylko przy pomocy rozkazu kasowania układu (ang. Chip Erase).

Mikrokontroler ATmega 48A/48PA nie posiada wydzielonej sekcji boot-loadera, a instrukcja SPM jest włączona dla całej pamięci FLASH, jeśli został zaprogramowany bit bezpiecznikowy SELFPRGEN ("0"). W przeciwnym razie instrukcja SPM jest wyłączona.

Bajt z bitami blokującymi(1)

Nazwa bitu blokującego Numer bitu Opis Standardowa wartość(1)
  7 1 (niezaprogramowany)
  6 1 (niezaprogramowany)
BLB12(2) 5 Bit blokujący boot-loadera 1 (niezaprogramowany)
BLB11(2) 4 Bit blokujący boot-loadera 1 (niezaprogramowany)
BLB02(2) 3 Bit blokujący boot-loadera 1 (niezaprogramowany)
BLB01(2) 2 Bit blokujący boot-loadera 1 (niezaprogramowany)
LB2 1 Bit blokujący 1 (niezaprogramowany)
LB1 0 Bit blokujący 1 (niezaprogramowany)
Uwagi: 1. "1" oznacza bit niezaprogramowany, "0" oznacza bit zaprogramowany.
  2. Tylko w mikrokontrolerze ATmega88A/88PA/168A/168PA/328/328P.

Tryby zabezpieczeń bitów blokujących(1)(2)

Bity blokujące pamięci Rodzaj zabezpieczenia
Tryb LB LB2 LB1  
1 1 1 Cechy blokowania pamięci wyłączone
2 1 0 Dalsze programowanie FLASH i EEPROM jest zablokowane w trybie programowania równoległego i szeregowego. Bity bezpiecznikowe są zablokowane w obu trybach programowania(1).
3 0 0 Dalsze programowanie i weryfikacja FLASH oraz EEPROM są zablokowane w trybie programowania równoległego i szeregowego. Bity bezpiecznikowe są zablokowane w obu trybach programowania(1).

Tryby zabezpieczeń bitów blokujących(1)(2). Tylko dla ATmega88A/88PA/168A/168PA/328/328P.
Bity blokujące pamięci Rodzaj zabezpieczenia
Tryb BLB0 BLB02 BLB01  
1 1 1 Nie ma ograniczeń dostępu instrukcji SPM i LPM do sekcji aplikacji.
2 1 0 Instrukcja SPM nie może zapisywać w sekcji aplikacji.
3 0 0 Instrukcja SPM nie może zapisywać w sekcji aplikacji, a instrukcja LPM wykonywana z sekcji boot-loadera nie może odczytywać z sekcji aplikacji. Jeśli wektory przerwań są umieszczone w sekcji boot-loadera, przerwania są zablokowane podczas wykonywania z sekcji aplikacji.
4 0 1 Instrukcja LPM wykonująca się z sekcji boot-loadera nie może odczytywać z sekcji aplikacji. Jeśli wektory przerwań są umieszczone w sekcji boot-loadera, przerwania są zablokowane podczas wykonywania z sekcji aplikacji.
Tryb BLB1 BLB12 BLB11  
1 1 1 Nie ma ograniczeń dostępu instrukcji SPM i LPM do sekcji boot-loadera.
2 1 0 Instrukcja SPM nie może zapisywać w sekcji boot-loadera.
3 0 0 Instrukcja SPM nie może zapisywać w sekcji boot-loadera, a instrukcja LPM wykonywana z sekcji aplikacji nie może odczytywać z sekcji boot-loadera. Jeśli wektory przerwań są umieszczone w sekcji aplikacji, przerwania są zablokowane podczas wykonywania z sekcji boot-loadera.
4 0 1 Instrukcja LPM wykonująca się z sekcji aplikacji nie może odczytywać z sekcji boot-loadera. Jeśli wektory przerwań są umieszczone w sekcji aplikacji, przerwania są zablokowane podczas wykonywania z sekcji boot-loadera.
Uwagi: 1. Zaprogramuj bity bezpiecznikowe i bity blokujące boot-loadera przed zaprogramowaniem bitów blokujących LB1 i LB2.
  2. "1" oznacza bit niezaprogramowany, "0" oznacza bit zaprogramowany.


do podrozdziału  do strony 

Bity bezpiecznikowe

Mikrokontroler ATmega48A/PA/88A/PA/168A/PA/328/P posiada trzy bajty bitów bezpiecznikowych. Poniższe tabele krótko opisują ich funkcje oraz ich położenia w tych bajtach. Zauważ, iż zaprogramowany bit bezpiecznikowy daje przy odczycie wartość zero, "0".

Rozszerzony bajt bitów bezpiecznikowych w ATmega48A/48PA

Rozszerzony bajt bitów bezpiecznikowych Numer bitu Opis Standardowa wartość
7 1
6 1
5 1
4 1
3 1
2 1
1 1
SELFPRGEN 0 Uaktywnienie samoprogramowania 1 (niezaprogramowane)

Rozszerzony bajt bitów bezpiecznikowych dla ATmega88A/88PA/168A/168PA

Rozszerzony bajt bitów bezpiecznikowych Numer bitu Opis Standardowa wartość
7 1
6 1
5 1
4 1
3 1
BOOTSZ1 2 Wybór rozmiaru obszaru boot-loadera 0 (zaprogramowane)(1)
BOOTSZ0 1 Wybór rozmiaru obszaru boot-loadera 0 (zaprogramowane)(1)
BOOTRST 0 Wybór wektora resetu 1 (niezaprogramowane)
Uwaga: 1. Standardowa wartość  BOOTSZ[1:0] daje w wyniku maksymalny rozmiar obszaru boot-loadera..

Rozszerzony bajt bitów bezpiecznikowych dla ATmega328/328P

Rozszerzony bajt bitów bezpiecznikowych Numer bitu Opis Standardowa wartość
7 1
6 1
5 1
4 1
3 1
BODLEVEL2(1) 2 Poziom wyzwalania dla detektora spadku napięcia zasilającego 1 (niezaprogramowane)
BODLEVEL1(1) 1 Poziom wyzwalania dla detektora spadku napięcia zasilającego 1 (niezaprogramowane)
BODLEVEL0(1) 0 Poziom wyzwalania dla detektora spadku napięcia zasilającego 1 (niezaprogramowane)
Uwagi: 1. Opis dekodowania bitów bezpiecznikowych BODLEVEL znajdziesz w podrozdziale  "Parametry systemu i resetu".

Górny bajt bitów bezpiecznikowych dla ATmega48A/48PA/88A/88PA/168A/168PA

Górny bajt bitów bezpiecznikowych Numer bitu Opis Standardowa wartość
RSTDISB(1) 7 Wyłączenie zewnętrznego resetu 1 (niezaprogramowane)
DWEN 6 Uaktywnienie systemu debugWIRE 1 (niezaprogramowane)
SPIEN(2) 5 Włączenie szeregowego programowania i odczytu pamięci 0 (zaprogramowane)
WDTON(3) 4 Timer licznika zegarowego zawsze włączony 1 (niezaprogramowane)
EESAVE 3 Zachowanie zawartości pamięci EEPROM podczas kasowania układu 1 (niezaprogramowane)
BODLEVEL2(4) 2 Poziom wyzwalania dla detektora spadku napięcia zasilającego 1 (niezaprogramowane)
BODLEVEL1(4) 1 Poziom wyzwalania dla detektora spadku napięcia zasilającego 1 (niezaprogramowane)
BODLEVEL0(4) 0 Poziom wyzwalania dla detektora spadku napięcia zasilającego 1 (niezaprogramowane)
Uwagi: 1. Opis bitu bezpiecznikowego RSTDISBL znajdziesz w podrozdziale "Alternatywne funkcje portu C".
  2. Bit bezpiecznikowy SPIEN jest niedostępny w trybie programowania szeregowego.
  3. Szczegóły znajdziesz w opisie rejestru WDTCSR.
  4. Opis dekodowania bitów bezpiecznikowych BODLEVEL znajdziesz w podrozdziale  "Parametry systemu i resetu".

Górny bajt bitów bezpiecznikowych dla ATmega328/328P

Górny bajt bitów bezpiecznikowych Numer bitu Opis Standardowa wartość
RSTDISB(1) 7 Wyłączenie zewnętrznego resetu 1 (niezaprogramowane)
DWEN 6 Uaktywnienie systemu debugWIRE 1 (niezaprogramowane)
SPIEN(2) 5 Włączenie szeregowego programowania i odczytu pamięci 0 (zaprogramowane)
WDTON(3) 4 Timer licznika zegarowego zawsze włączony 1 (niezaprogramowane)
EESAVE 3 Zachowanie zawartości pamięci EEPROM podczas kasowania układu 1 (niezaprogramowane)
BOOTSZ1 2 Wybór rozmiaru obszaru boot-loadera 0 (zaprogramowane)(4)
BOOTSZ0 1 Wybór rozmiaru obszaru boot-loadera 0 (zaprogramowane)(4)
BOOTRST 0 Wybór wektora resetu 1 (niezaprogramowane)
Uwagi: 1. Opis bitu bezpiecznikowego RSTDISBL znajdziesz w podrozdziale "Alternatywne funkcje portu C".
  2. Bit bezpiecznikowy SPIEN jest niedostępny w trybie programowania szeregowego.
  3. Szczegóły znajdziesz w opisie rejestru WDTCSR.
  4. Standardowa wartość  BOOTSZ[1:0] daje w wyniku maksymalny rozmiar obszaru boot-loadera.

Dolny bajt bitów bezpiecznikowych

Dolny bajt bitów bezpiecznikowych Numer bitu Opis Standardowa wartość
CKDIV8(4) 7 Poziom wyzwalania detektora spadku napięcia zasilającego 0 (zaprogramowane)
CKOUT(3) 6 Włączenie detektora spadku napięcia zasilającego (BOD) 1 (niezaprogramowane)
SUT1 5 Wybór czasu uruchamiania się mikrokontrolera 1 (niezaprogramowane)(1)
SUT0 4 Wybór czasu uruchamiania się mikrokontrolera 0 (zaprogramowane)(1)
CKSEL3 3 Wybór źródła zegarowego 0 (zaprogramowane)(2)
CKSEL2 2 Wybór źródła zegarowego 0 (zaprogramowane)(2)
CKSEL1 1 Wybór źródła zegarowego 1 (NIEzaprogramowane)(2)
CKSEL0 0 Wybór źródła zegarowego 0 (niezaprogramowane)(2)
Uwagi: 1. Standardowe ustawienie bitów bezpiecznikowych SUT1..0 daje maksymalny czas uruchamiania mikrokontrolera.
  2. Standardowe ustawienie bitów bezpiecznikowych CKSEL3..0 daje w wyniku taktowanie wewnętrznym oscylatorem RC przy 8MHz.
  3. Bit bezpiecznikowy CKOUT Fuse umożliwia wyprowadzenie zegara systemowego na końcówkę PB0.
  4. Szczegóły znajdziesz w podrozdziale "Preskaler zegara systemowego".

Stan bitów bezpiecznikowych nie jest zmieniany przez kasowanie układu (ang. Chip Erase). Zauważ, iż bity bezpiecznikowe są zablokowane, jeśli został zaprogramowany bit blokujący LB1. Zaprogramuj bity bezpiecznikowe przed zaprogramowaniem bitów blokujących.

Zapamiętywanie stanu bitów bezpiecznikowych

Wartości bitów bezpiecznikowych zostają zapamiętane, gdy mikrokontroler wchodzi w tryb programowania i zmiany ich wartości zaczną obowiązywać dopiero po wyjściu z trybu programowania . Nie odnosi się to do bitu bezpiecznikowego EESAVE, którego funkcja rozpoczyna działania zaraz po zaprogramowaniu. Bity bezpiecznikowe są również zapamiętywane przy uruchamianiu w trybie normalnym.


do podrozdziału  do strony 

Bajty sygnaturowe

Wszystkie mikrokontrolery firmy Atmel posiadają 3-bajtowy kod sygnaturowy, który służy do identyfikacji mikrokontrolera. Kod ten można odczytać zarówno w trybie szeregowym jak i równoległym, także gdy mikrokontroler został zablokowany bitami blokującymi. Trzy bajty sygnatury przebywają w oddzielnej przestrzeni adresowej.

Dla ATmega48A/PA/88A/PA/168A/PA/328/P bajty sygnaturowe są następujące:

Mikrokontroler Adres bajtu sygnatury
0x000 0x001 0x002
ATmega48A 0x1E 0x92 0x05
ATmega48PA 0x1E 0x92 0x0A
ATmega88A 0x1E 0x93 0x0A
ATmega88PA 0x1E 0x93 0x0F
ATmega168A 0x1E 0x94 0x06
ATmega168PA 0x1E 0x94 0x0B
ATmega328 0x1E 0x95 0x14
ATmega328P 0x1E 0x95 0x0F

do podrozdziału  do strony 

Bajt kalibracyjny

Mikrokontroler ATmega48A/PA/88A/PA/168A/PA/328/P posiada wartość bajtu kalibracyjnego dla wewnętrznego oscylatora RC. Bajt ten przechowywany jest w górnym bajcie słowa pod adresem 0x000 w przestrzeni adresowej sygnatur. Podczas resetu bajt kalibracyjny jest automatycznie ładowany do rejestru OSCCAL, aby zapewnić poprawną częstotliwość pracy kalibrowanego oscylatora RC.

do podrozdziału  do strony 

Rozmiar strony

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

Mikrokontroler Rozmiar FLASH Rozmiar strony PCWORD Liczba stron PCPAGE PCMSB
ATmega48A 2K słów (4KB) 32 słowa PC[4:0] 64 PC[10:5] 10
ATmega48PA 2K słów (4KB) 32 słowa PC[4:0] 64 PC[10:5] 10
ATmega88A 4K słów (8KB) 32 słowa PC[4:0] 128 PC[11:5] 11
ATmega88PA 4K słów (8KB) 32 słowa PC[4:0] 128 PC[11:5] 11
ATmega168A 8K słów (16KB) 64 słowa PC[5:0] 128 PC[12:6] 12
ATmega168PA 8K słów (16KB) 64 słowa PC[5:0] 128 PC[12:6] 12
ATmega328 16K słów (32KB) 64 słowa PC[5:0] 256 PC[13:6] 13
ATmega328P 16K słów (32KB) 64 słowa PC[5:0] 256 PC[13:6] 13

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

Mikrokontroler Rozmiar EEPROM Rozmiar strony PCWORD Liczba stron PCPAGE EEAMSB
ATmega48A 256B 4B EEA[1:0] 64 EEA[7:2] 7
ATmega48PA 256B 4B EEA[1:0] 64 EEA[7:2] 7
ATmega88A 512B 4B EEA[1:0] 128 EEA[8:2] 8
ATmega88PA 512B 4B EEA[1:0] 128 EEA[8:2] 8
ATmega168A 512B 4B EEA[1:0] 128 EEA[8:2] 8
ATmega168PA 512B 4B EEA[1:0] 128 EEA[8:2] 8
ATmega328 1024B 4B EEA[1:0] 256 EEA[9:2] 9
ATmega328P 1024B 4B EEA[1:0] 256 EEA[9:2] 9

do podrozdziału  do strony 

Parametry programowania równoległego, przydział końcówek i rozkazy

Rozdział ten opisuje, w jaki sposób programować równolegle i weryfikować pamięć programu FLASH, pamięć EEPROM, pamięć danych, bity blokujące pamięci i bity bezpiecznikowe w ATmega48A/PA/88A/PA/168A/PA/328/P. Zakłada się, o ile nie zaznaczono inaczej, iż impulsy mają długość co najmniej 250ns.

Nazwy sygnałów

W tym rozdziale niektóre końcówki mikrokontrolera ATmega48A/PA/88A/PA/168A/PA/328/P nazwane są wg nazw sygnałów opisujących ich funkcje podczas programowania równoległego. Do końcówek nieopisanych w poniższej tablicy odwołujemy się przez ich normalne nazwy.

Przydział nazw do końcówek

Nazwa sygnału w trybie programowania Nazwa końcówki we/wy Funkcja
RDY/BSY PD1 wy 0: mikrokontroler jest zajęty programowaniem, 1: mikrokontroler jest gotowy na nowy rozkaz
OE PD2 we Uaktywnienie wyjścia (aktywne w stanie niskim)
WR PD3 we Impuls zapisu  (aktywne w stanie niskim)
BS1 PD4 we Wybór bajtu 1 ("0" wybiera dolny bajt, "1" wybiera górny bajt)
XA0 PD5 we Bit 0 działania XTAL
XA1 PD6 we Bit 1 działania XTAL
PAGEL PD7 we Ładowanie strony pamięci programu i danych EEPROM
BS2 PC2 we Wybór bajtu 2 ("0" wybiera dolny drugi bajt, "1" wybiera górny drugi bajt)
DATA {PC[1:0]: PB[5:0]} we/wy Dwukierunkowa szyna danych (wyjście, gdy OE jest w stanie niskim)

Wartości końcówek używane do wejścia w tryb programowania

Końcówka Symbol Wartość
PAGEL Prog_enable[3] 0
XA1 Prog_enable[2] 0
XA0 Prog_enable[1] 0
BS1 Prog_enable[0] 0

Końcówki XA1/XA0 określają wykonywane działania, gdy na końcówce XTAL1 pojawi się dodatni impuls. Kodowanie bitów przedstawia poniższa tabelka.

Kodowanie XA1 i XA0

XA1 XA0 Działanie przy impulsie na końcówce XTAL1
0 0 Załadowanie adresu FLASH lub EEPROM (górny lub dolny bajt adresu określa BS1)
0 1 Załadowanie danych (górny lub dolny bajt danych dla FLASH określa BS1)
1 0 Ładowanie rozkazu
1 1 Brak działania, bezczynność

Gdy impuls pojawia się na końcówce WR lub OE, załadowany rozkaz określa wykonywane działanie. Rozkazy są pokazane w tabelce poniżej.

Kodowanie bitów w bajcie rozkazu

Bajt rozkazu Wykonywany rozkaz
1000 0000 Kasowanie układu
0100 0000 Zapis bitów bezpiecznikowych
0010 0000 Zapis bitów blokujących
0001 0000 Zapis FLASH
0001 0001 Zapis EEPROM
0000 1000 Odczyt bajtów sygnaturowych i bajtu kalibracyjnego
0000 0100 Odczyt bitów bezpiecznikowych i bitów blokujących
0000 0010 Odczyt FLASH
0000 0011 Odczyt EEPROM

do podrozdziału  do strony 

Programowanie równoległe

Wejście w tryb programowania

Poniższy algorytm wprowadza mikrokontroler w tryb wysokonapięciowego programowania równoległego:

  1. Ustaw końcówki Prog_enable w stan "0000", końcówkę RESET na 0V i VCC na 0V.
  2. Przyłóż napięcie 4,5...5,5V pomiędzy VCC i GND.

Upewnij się, iż napięcie na końcówce VCC osiąga co najmniej 1,8V w ciągu następnych 20 μs.

  1. Odczekaj 20 ... 60 μs i przyłóż napięcie 11,5 ... 12,5 V do końcówki RESET.
  2. Utrzymuj w stanie niezmienionym końcówki Prog_enable przez co najmniej 10 μs po przyłożeniu wysokiego napięcia, aby upewnić się, iż sygnatura Prog_enable została zapamiętana.
  3. Odczekaj co najmniej 300 μs przed wydaniem jakiegokolwiek rozkazu programowania równoległego.
  4. Wyjdź z trybu programowania przez wyłączenie zasilania lub przyłożenie do końcówki RESET napięcia 0V.

Jeśli wzrost napięcia zasilania na końcówce VCC nie jest w stanie spełnić powyższych wymagań, można użyć zastępczo następującego algorytmu:

  1. Ustaw końcówki Prog_enable na "0000", końcówkę RESET na 0V i końcówkę VCC na 0V.
  2. Przyłóż napięcie 4,5...5,5V pomiędzy VCC i GND.
  3. Monitoruj VCC i gdy tylko osiągnie 0,9 ... 1,1V, przyłóż do końcówki RESET napięcie 11,5 ... 12,4V.
  4. Utrzymuj w stanie niezmienionym końcówki Prog_enable przez co najmniej 10 μs po przyłożeniu wysokiego napięcia, aby upewnić się, iż sygnatura Prog_enable została zapamiętana.
  5. Poczekaj, aż VCC naprawdę osiągnie 4,5 ... 5,5V przed wydaniem jakiegokolwiek rozkazu programowania równoległego.
  6. Wyjdź z trybu programowania przez wyłączenie zasilania lub przyłożenie do końcówki RESET napięcia 0V.

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.

Uwaga: 1. Pamięć EEPRPOM jest zachowywana podczas kasowania układu, jeśli zaprogramowano bit bezpiecznikowy EESAVE.

  1. Ustaw XA1, XA0 na “10”. To uaktywnia ładowanie rozkazu.
  2. Ustaw BS1 na “0”.
  3. Ustaw DATA na “1000 0000”. To jest rozkaz kasowania układu (ang. Chip Erase).
  4. Wyślij dodatni impuls na końcówkę XTAL1. To załaduje ten rozkaz.
  5. Wyślij ujemny impuls na końcówkę WR. To rozpocznie operację kasowania. Końcówka RDY/BSY przejdzie w stan niski.
  6. Poczekaj na powrót końcówki RDY/BSY do stanu wysokiego przed załadowaniem nowego rozkazu.

Programowanie pamięci FLASH

Pamięć FLASH zorganizowana jest w strony. Przy programowaniu dane programu są zapamiętywane w buforze strony. Pozwala to na jednoczesne zaprogramowanie jednej strony z danymi programu. Poniższa procedura opisuje sposób zaprogramowania całej pamięci FLASH:

A. Załadowanie rozkazu “Write FLASH” (Zapis FLASH)

  1. Ustaw XA1, XA0 na “10”. To uaktywnia ładowanie rozkazu.
  2. Ustaw BS1 na “0”.
  3. Ustaw DATA na “0001 0000”. To jest rozkaz zapisu FLASH.
  4. Wyślij dodatni impuls na końcówkę XTAL1. To załaduje ten rozkaz.

B. Ładowanie dolnego bajtu adresu

  1. Ustaw XA1, XA0 na “00”. To włącza ładowanie adresu.
  2. Ustaw BS1 na “0”. To wybiera dolny bajt adresu.
  3. Ustaw DATA = dolny bajt adresu (0x00 - 0xFF).
  4. Wyślij dodatni impuls na końcówkę XTAL1. To załaduje dolny bajt adresu.

C. Ładowanie dolnego bajtu danych

  1. Ustaw XA1, XA0 na “01”. To włącza ładowanie danych.
  2. Ustaw DATA = dolny bajt danych (0x00 - 0xFF).
  3. Wyślij dodatni impuls na końcówkę XTAL1. To załaduje dolny bajt danych.

D. Ładowanie górnego bajtu danych

  1. 1. Ustaw BS1 na “1”. To wybiera górny bajt danych.
  2. Ustaw XA1, XA0 na “01”. To włącza ładowanie danych.
  3. Ustaw DATA = górny bajt danych (0x00 - 0xFF).
  4. Wyślij dodatni impuls na końcówkę XTAL1. To załaduje górny bajt danych.

E. Zapamiętanie danych

  1. Ustaw BS1 na “1”. To wybiera górny bajt danych.
  2. Wyślij dodatni impuls na końcówkę PAGEL. To zapamiętuje bajty danych.

F. Powtarzaj kroki od B do E aż do wypełnienia całego bufora lub do załadowania wszystkich danych w obrębie danej strony

Podczas gdy dolne bity adresu odwzorowują słowa wewnątrz strony, to starsze bity adresują strony wewnątrz pamięci FLASH. Przedstawiono to na rysunku poniżej. Zauważ, że jeśli do adresowania słów w obrębie strony potrzebne jest mniej niż osiem bitów (rozmiar strony < 256), to najbardziej znaczący bit (lub bity) w dolnym bajcie adresu są używane do adresowania strony, gdy będzie wykonywany zapis strony.

G. Ładowanie starszego bajtu adresu

  1. Ustaw XA1, XA0 na “00”. To włącza ładowanie adresu.
  2. Ustaw BS1 na “1”. To wybiera starszy bajt adresu.
  3. Ustaw DATA = Starszy bajt adresu (0x00 - 0xFF).
  4. Wyślij dodatni impuls na końcówkę XTAL1. To załaduje górny bajt adresu.

H. Programowanie strony

  1. Ustaw BS1 = “0”.
  2. Wyślij ujemny impuls na końcówkę WR. To rozpocznie programowanie całej strony danych. Końcówka RDY/BSY przechodzi w stan niski.
  3. Zaczekaj, aż końcówka RDY/BSY przyjmie stan wysoki.

I. Powtarzaj kroki od B do H aż cała pamięć FLASH zostanie zaprogramowana lub aż wszystkie dane będą zaprogramowane

J. Koniec programowania stron

  1. Ustaw XA1, XA0 na “10”. To włącza ładowanie rozkazu.
  2. Ustaw DATA na “0000 0000”. To jest rozkaz "Brak działania" (ang. No Operation).
  3. Wyślij dodatni impuls na końcówkę XTAL1. To załaduje ten rozkaz i zresetuje wewnętrzne sygnały zapisu.

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

Przebiegi sygnałów w wysokonapięciowym programowaniu szeregowym
Litery odpowiadają krokom w algorytmie
XX oznacza wartość nieistotną

ADDR. LOW dolny bajt adresu
DATA LOW dolny bajt danych
DATA HIGH górny bajt danych
ADDR. HIGH górny bajt adresu

Programowanie pamięci EEPROM

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

  1. A: Załaduj rozkaz “0001 0001”.
  2. G: Załaduj górny bajt adresu (0x00 - 0xFF).
  3. B: Załaduj dolny bajt adresu (0x00 - 0xFF).
  4. C: Załaduj dane (0x00 - 0xFF).
  5. E: Zapamiętaj dane (dodatni impuls na końcówkę PAGEL).
  6. K: Powtarzaj kroki od 3 do 5 aż do wypełnienia całego bufora.

L: Zaprogramuj stronę EEPROM:

  1. Ustaw BS1 na “0”.
  2. Wyślij ujemny impuls na końcówkę WR. Rozpocznie to programowanie strony EEPROM. Końcówka RDY/BSY przyjmie stan niski.
  3. Czekaj na powrót końcówki RDY/BSY do stanu wysokiego przed programowaniem następnej strony.

Przebiegi sygnałów w wysokonapięciowym programowaniu szeregowym
Litery odpowiadają krokom w algorytmie
XX oznacza wartość nieistotną

ADDR. HIGH górny bajt adresu
ADDR. LOW dolny bajt adresu
DATA bajt danych


Odczytywanie FLASH

Algorytm odczytywania pamięci FLASH jest następujący:

  1. A: Załaduj rozkaz “0000 0010”.
  2. G: Załaduj górny bajt adresu (0x00 - 0xFF).
  3. B: Załaduj dolny bajt adresu (0x00 - 0xFF).
  4. Ustaw OE na “0”, a BS1 na “0”. Teraz z linii DATA można odczytać dolny bajt z FLASH.
  5. Ustaw BS1 na “1”. Teraz z linii DATA można odczytać górny bajt z FLASH.
  6. Ustaw OE na “1”.

Odczytywanie EEPROM

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

  1. A: Załaduj rozkaz “0000 0011”.
  2. G: Załaduj górny bajt adresu (0x00 - 0xFF).
  3. B: Załaduj dolny bajt adresu (0x00 - 0xFF).
  4. Ustaw OE na “0”, a BS1 na “0”. Teraz z linii DATA można odczytać bajt z EEPROM.
  5. Ustaw OE na “1”.

Programowanie dolnych bitów bezpiecznikowych

Algorytm programowania dolnych bitów bezpiecznikowych jest następujący:

  1. A: Załaduj rozkaz “0100 0000”.
  2. C: Załaduj dolny bajt danych. Bit n = “0” programuje, a bit n = “1” kasuje dany bit bezpiecznikowy.
  3. Ustaw BS1 i BS2 na “0”.
  4. Wyślij ujemny impuls na końcówkę WR i poczekaj na powrót końcówki RDY/BSY do stanu wysokiego.

Programowanie górnych bitów bezpiecznikowych

Algorytm programowania górnych bitów bezpiecznikowych jest następujący:

  1. A: Załaduj rozkaz “0100 0000”.
  2. C: Załaduj dolny bajt danych. Bit n = “0” programuje, a bit n = “1” kasuje dany bit bezpiecznikowy.
  3. Ustaw BS1 na "1", a BS2 na "0". To wybiera górny bajt danych.
  4. Wyślij ujemny impuls na końcówkę WR i poczekaj na powrót końcówki RDY/BSY do stanu wysokiego.
  5. Ustaw BS1 na "0". To wybiera dolny bajt danych.

Programowanie rozszerzonych bitów bezpiecznikowych

Algorytm programowania rozszerzonych bitów bezpiecznikowych jest następujący:

  1. A: Załaduj rozkaz “0100 0000”.
  2. C: Załaduj dolny bajt danych. Bit n = “0” programuje, a bit n = “1” kasuje dany bit bezpiecznikowy.
  3. Ustaw BS1 na "0", a BS2 na "1". To wybiera rozszerzony bajt danych.
  4. Wyślij ujemny impuls na końcówkę WR i poczekaj na powrót końcówki RDY/BSY do stanu wysokiego.
  5. Ustaw BS1 na "0". To wybiera dolny bajt danych.

Programowanie bitów blokujących

Algorytm programowania bitów blokujących jest następujący:

  1. A: Załaduj rozkaz “0010 0000”.
  2. C: Załaduj dolny bajt danych. Bit n = “0” programuje dany bit bezpiecznikowy (bity bezpiecznikowe można wykasować tylko przez skasowanie całego układu mikrokontrolera).
  3. Wyślij ujemny impuls na końcówkę WR i poczekaj na powrót końcówki RDY/BSY do stanu wysokiego.

Odczyt bitów bezpiecznikowych i blokujących

Algorytm odczytywania bitów bezpiecznikowych i blokujących jest następujący:

  1. A: Załaduj rozkaz “0000 0100”.
  2. Ustaw OE na “0”, BS2 na “0” i BS1 na “0”. Stan dolnego bajtu bitów bezpiecznikowych można teraz odczytać z linii DATA (“0” oznacza stan zaprogramowany).
  3. Ustaw OE na “0”, BS2 na “1” i BS1 na “1”. Stan górnego bajtu bitów bezpiecznikowych można teraz odczytać z linii DATA (“0” oznacza stan zaprogramowany).
  4. Ustaw OE na “0”, BS2 na “1” i BS1 na “0”. Stan rozszerzonego bajtu bitów bezpiecznikowych można teraz odczytać z linii DATA (“0” oznacza stan zaprogramowany).
  5. Ustaw OE na “0”, BS2 na “0” i BS1 na “1”. Stan bitów blokujących można teraz odczytać z linii DATA (“0” oznacza stan zaprogramowany).
  6. Ustaw OE na “1”.

Odwzorowanie pomiędzy BS1, BS2 a bitami bezpiecznikowymi i bitami blokującymi podczas odczytywania

Odczytywanie bajtów sygnaturowych

Algorytm odczytywania bajtów sygnaturowych jest następujący:

  1. A: Załaduj rozkaz “0000 1000”.
  2. B: Załaduj dolny bajt adresu (0x00 - 0x02).
  3. Ustaw OE na “0” i BS1 na “0”. Wybrany bajt sygnatury można teraz odczytać z linii DATA.
  4. Ustaw OE na “1”.

Odczytywanie bajtu kalibracyjnego

Algorytm odczytywania bajtu kalibracyjnego jest następujący:

  1. A: Załaduj rozkaz “0000 1000”.
  2. B: Załaduj dolny bajt adresu (0x00).
  3. Ustaw OE na “0” i BS1 na “1”. Bajt kalibracyjny można teraz odczytać z linii DATA.
  4. Ustaw OE na “1”.

Parametry programowania równoległego

Czasy w programowaniu równoległym, łącznie z niektórymi ogólnymi wymaganiami czasowymi

Czasy w programowaniu równoległym, sekwencja ładowania z wymaganiami czasowymi(1)

Uwaga: 1. Wymagania czasowe z poprzedniego rysunku (tj. tDVXH, tXHXL i tXLDX) odnoszą się również do operacji ładowania.

Czasy w programowaniu równoległym, sekwencja odczytu (wewnątrz tej samej strony) z wymaganiami czasowymi(1)

Uwaga: 1. Wymagania czasowe z pierwszego rysunku (tj. tDVXH, tXHXL i tXLDX) odnoszą się również do operacji odczytu.

Parametry programowania równoległego, VCC = 5V ±10%

Symbol Parametr Min. Typ. Max. Jednostki
VPP Napięcie włączania trybu programowania 11,5   12,5 V
IPP Prąd włączania trybu programowania     250 µA
tDVXH Ustalenie danych i sterowania przed stanem wysokim XTAL1 67     ns
tXLXH Czas pomiędzy stanem niskim XTAL1 a stanem wysokim XTAL1 200    
tXHXL Szerokość stanu wysokiego impulsu XTAL1 150    
tXLDX Utrzymanie danych i sterowania po przejściu XTAL1 w stan niski 67    
tXLWL Czas od stanu niskiego XTAL1 do stanu niskiego WR 0    
tXLPH Czas od stanu niskiego XTAL1 do stanu wysokiego PAGEL 0    
tPLXH Czas od stanu niskiego PAGEL do stanu wysokiego XTAL1 150    
tBVPH Ustalenie BS1 przed stanem wysokim PAGEL 67    
tPHPL Szerokość stanu wysokiego impulsu PAGEL 150    
tPLBX Utrzymanie BS1 po stanie niskim PAGEL 67    
tWLBX Utrzymanie BS2/1 po stanie niskim WR 67    
tPLWL Czas od stanu niskiego PAGEL do stanu niskiego WR 67    
tBVWL Utrzymanie BS1 po stanie niskim WR 67    
tWLWH Szerokość stanu niskiego impulsu WR 150    
tWLRL Czas od stanu niskiego WR do stau niskiego RDY/BSY 0   1 µs
tWLRH Czas od stanu niskiego WR do stanu wysokiego RDY/BSY(1) 3,7   4,5 ms
tWLRH_CE Czas od stanu niskiego WR do stanu wysokiego RDY/BSY dla kasowania układu(2) 7,5   9
tXLOL Czas od stanu niskiego XTAL1 do stanu niskiego OE 0     ns
tBVDV Utrzymanie BS1 do ważności danych DATA 0   250
tOLDV Czas od stanu niskiego OE do ważności danych DATA     250
tOHDZ Czas od stanu wysokiego OE do przejścia DATA w stan wysokiej impedancji     250
Uwagi: 1. tWLRH dotyczy rozkazów zapisu FLASH, zapisu EEPROM, zapisu bitów bezpiecznikowych i zapisu bitów blokujących.
  2. tWLRH_CE dotyczy rozkazu kasowania układu.

do podrozdziału  do strony 

Ładowanie szeregowe

Obie pamięci FLASH i EEPROM można programować przy wykorzystaniu magistrali szeregowej SPI, gdy końcówka RESET zostanie zwarta do masy GND. Interfejs szeregowy składa się z końcówek  SCK, MOSI (wejście) i MISO (wyjście).

Gdy na końcówkę RESET poda się stan niski, należy najpierw wykonać instrukcję włączającą programowanie, zanim będzie można wykonywać operacje wymazywania/programowania.


do podrozdziału  do strony 

Programowanie szeregowe, przydział końcówek

Przydział końcówek dla programowania szeregowego

Symbol Końcówka We/wy Opis
MOSI PB3 We Wejście danych szeregowych
MISO PB4 Wy Wyjście danych szeregowych
SCK PB5 We Zegar szeregowy

Programowanie szeregowe i weryfikacja(1)

Uwagi: 1. Jeśli mikrokontroler jest taktowany wewnętrznym oscylatorem, to nie ma potrzeby podłączania żadnego źródła zegarowego do końcówki XTAL1.
  2. VCC - 0,3 < AVCC < VCC + 0,3, jednakże AVCC powinno być zawsze w zakresie 1,8V - 5,5V

Przy programowaniu pamięci EEPROM cykl samokasowania jest wbudowany w samotaktującą się operację programowania (tylko w trybie szeregowym) i nie ma potrzeby wykonywania najpierw instrukcji kasowania układu (ang. Chip Erase). Operacja kasowania układu zmienia zawartość każdej komórki w pamięci programu FLASH i w pamięci EEPROM w 0xFF.

Zależnie od bitów bezpiecznikowych CKSEL musi być obecny właściwy zegar. Minimalne okresy stanów niskich i wysokich dla zegara szeregowego (SCK) są zdefiniowane następująco:

Stan niski: > 2 taktów zegara mikroprocesora dla fck < 12MHz, 3 taktów zegara mikroprocesora dla fck >= 12MHz
Stan wysoki: > 2 taktów zegara mikroprocesora dla fck < 12MHz, 3 taktów zegara mikroprocesora dla fck >= 12MHz

Algorytm programowania szeregowego

Gdy dane szeregowe są zapisywane w mikrokontrolerze ATmega48A/PA/88A/PA/168A/PA/328/P, ich taktowanie następuje przy narastającym zboczu sygnału SCK. Gdy dane są odczytywane z ATmega48A/PA/88A/PA/168A/PA/328/P, taktowanie odbywa się przy opadającym zboczu SCK.


Do programowania i weryfikacji mikrokontrolera ATmega48A/PA/88A/PA/168A/PA/328/P zalecana jest następująca sekwencja operacji:

  1. Sekwencja włączania zasilania:
    Przyłóż napięcie zasilające pomiędzy końcówki VCC i GND. podczas gdy RESET i SCK są wysterowane stanem zero. W niektórych systemach programator nie gwarantuje utrzymywania SCK w stanie niskim podczas uruchamiania. W takich przypadkach na końcówkę RESET należy przesłać dodatni impuls o czasie trwania co najmniej dwóch taktów zegara mikroprocesora po ustawieniu SCK na "0"".
  2. Odczekaj przynajmniej  20 ms i włącz programowanie szeregowe przez wysłanie szeregowej instrukcji włączania programowania na końcówkę MOSI.
  3. Instrukcje programowania szeregowego nie będą działały, jeśli komunikacja nie jest zsynchronizowana. Przy zsynchronizowaniu drugi bajt (0x53) wróci jako echo przy wysyłaniu trzeciego bajtu instrukcji włączania programowania. Bez względu na poprawność tego echa należy wytransmitować wszystkie cztery bajty instrukcji. Jeśli nie wróciło echo 0x53, prześlij dodatni impuls na RESET i wyślij nowy rozkaz włączenia programowania.
  4. Pamięć FLASH jest programowana strona po stronie. Strona pamięci jest ładowana bajt po bajcie przez dostarczenie 6 najmłodszych bitów adresu i danych wraz z instrukcją ładowania strony pamięci. Aby zapewnić poprawne ładowanie strony, dla danego adresu dolny bajt danych musi być załadowany przed górnym bajtem. Strona pamięci programu jest umieszczana we FLASH przez załadowanie instrukcji zapisu strony pamięci programu z 7 MSB adresu. Jeśli podgląd (RDY/BSY) nie jest wykorzystywany, to użytkownik musi odczekać co najmniej przez czas tWD_FLASH przed wysłaniem następnej strony. Dostęp do interfejsu programowania szeregowego przed zakończeniem operacji zapisu w pamięci FLASH może spowodować błędne zaprogramowanie.
  5. A: Pamięć EEPROM jest programowana bajt po bajcie przez dostarczenie adresu i danych wraz z odpowiednią instrukcją zapisu. Komórka pamięci EEPROM jest najpierw automatycznie kasowana przed zapisem nowych danych. Jeśli podgląd (RDY/BSY) nie jest wykorzystywany, to użytkownik musi odczekać co najmniej przez czas tWD_EEPROM przed wysłaniem następnego bajtu. Jeśli układ mikrokontrolera został skasowany, to nie ma potrzeby programowania komórek, które mają zawierać wartość 0xFF.
    B: Pamięć EEPROM jest programowana po strnie. Strona pamięci jest ładowana bajt po bajcie przez dostarczenie 6 bitów LSB adresu i danych wraz z instrukcją ładowania strony pamięci EEPROM (ang. Load EEPROM Memory Page instruction). Strona pamięci EEPROM zostaje zapamiętana poprzez załadowanie instrukcji zapisu strony pamięci EEPROM (ang. Write EEPROM Memory Page Instruction) z 7 bitami MSB adresu. Gdy wykorzystywany jest dostęp do strony EEPROM, to zmieniane są jedynie komórki ładowane instrukcją ładowania strony pamięci EEPROM. Pozostałe komórki pozostają niezmienione.Jeśli podgląd (RDY/BSY) nie jest wykorzystywany, to użytkownik musi odczekać co najmniej przez czas tWD_EEPROM przed wysłaniem następnego bajtu. Jeśli układ mikrokontrolera został skasowany, to nie ma potrzeby programowania komórek, które mają zawierać wartość 0xFF.
  6. Każdą komórkę pamięci można zweryfikować za pomocą instrukcji odczytu, która zwraca zawartość z wybranego adresu na wyjściu szeregowym MISO.
  7. Po zakończeniu sesji programowania można ustawić końcówkę RESET w stan wysoki, aby rozpocząć normalną pracę.
  8. Sekwencja wyłączania (jeśli jest potrzebna):
    Ustaw końcówkę RESET na “1”.
    Wyłącz napięcie zasilania VCC.

Podgląd danych FLASH

Gdy strona pamięci jest programowana wewnątrz FLASH, odczyt komórki w obrębie tej strony da wartość 0xFF. Gdy mikrokontroler będzie gotowy na nową stronę, programowana wartość zostanie odczytana prawidłowo. Używa się tego do określenia, kiedy można zapisać następną stronę. Zwróć uwagę, iż cała strona jest zapisywana równocześnie i można użyć dowolnej jej komórki do podglądu. Podgląd nie zadziała z wartością 0xFF, zatem przy programowaniu tej wartości użytkownik będzie musiał odczekać przez czas co najmniej tWD_FLASH przed programowaniem następnej strony. Ponieważ skasowany układ zawiera wartości 0xFF we wszystkich komórkach, programowanie ich można pominąć.

Podgląd danych EEPROM

Gdy nowy bajt został zapisany i jest programowany w EEPROM, odczyt komórki zawierającej go da wartość 0xFF. Gdy pamięć będzie gotowa na nowy bajt, programowana komórka da prawidłowy odczyt. Używa się tego do określenia, kiedy można zapisać następny bajt. Nie zadziała to z wartością 0xFF, lecz użytkownik powinien pamiętać, że skasowane urządzenie zawiera wartości 0xFF w każdej komórce, zatem ich programowanie można pominąć. Nie ma to zastosowania, gdy pamięć EEPROM podlega przeprogramowaniu bez kasowania układu mikrokontrolera. W takim przypadku wartość 0xFF nie może być użyta do podglądu i użytkownik będzie musiał odczekać przez czas co najmniej tWD_EEPROM, przed zaprogramowaniem następnego bajtu.

Minimalne czasy opóźnień przed zapisem następnych komórek we FLASH lub w EEPROM

Symbol Minimalny czas opóźnienia
tWD_FUSE 4,5ms
tWD_FLASH 4,5ms
tWD_EEPROM 3,6ms
tWD_ERASE 9,0ms

Instrukcje programowania szeregowego (wartości szesnastkowe)

Instrukcja Format instrukcji
Bajt 1 Bajt 2 Bajt 3 Bajt 4
Programming Enable
Uaktywnienie programowania
0xAC 0x53 0x00 0x00
Chip Erase (Program Memory/EEPROM)
Kasowanie (pamięci programu/EEPROM)
0xAC 0x80 0x00 0x00
Poll RDY/BSY
Podgląd RDY/BSY
0xF0 0x00 0x00 wyjściowy bajt danych
Instrukcje ładowania
Load Extended Address byte(1)
Ładowanie bajtu rozszerzonego adresu
0x4D 0x00 Rozszerzony adres 0x00
Load Program Memory Page, High byte
Ładowanie strony pamięci programu, górny bajt
0x48 0x00 młodszy bajt adresu wejściowy górny bajt danych
Load Program Memory Page, Low byte
Ładowanie strony pamięci programu, dolny bajt
0x40 0x00 młodszy bajt adresu wejściowy dolny bajt danych
Load EEPROM Memory Page (page access)
Ładowanie strony EEPROM (dostęp do stronamy)
0xC1 0x00 0000 000aa wejściowy bajt danych
Instrukcje odczytu
Read Program Memory, High byte
Odczyt pamięci programu, górny bajt
0x28 starszy bajt adresu młodszy bajt adresu wyjściowy górny bajt danych
Read Program Memory, Low byte
Odczyt pamięci programu, dolny bajt
0x20 starszy bajt adresu młodszy bajt adresu wyjściowy dolny bajt danych
Read EEPROM Memory
Odczyt pamięci EEPROM
0xA0 0000 00aa aaaa aaaa wyjściowy bajt danych
Read Lock bits
Odczyt bitów blokujących
0x58 0x00 0x00 wyjściowy bajt danych
Read Signature Byte
Odczyt bajtu sygnaturowego
0x30 0x00 0000 000aa wyjściowy bajt danych
Read Fuse Low bits
Odczyt dolnych bitów bezpiecznikowych
0x50 0x00 0x00 wyjściowy bajt danych
Read Fuse High bits
Odczyt górnych bitów bezpiecznikowych
0x58 0x08 0x00 wyjściowy bajt danych
Read Fuse Extended bits
Odczyt rozszerzonych bitów bezpiecznikowych
0x50 0x08 0x00 wyjściowy bajt danych
Read Calibration Byte
Odczyt bajtu kalibracyjnego
0x38 0x00 0x00 wyjściowy bajt danych
Instrukcje zapisu(6)
Write Program Memory Page
Zapis strony pamięci programu
0x4C starszy bajt adresu(8) młodszy bajt adresu(8) 0x00
Write EEPROM Memory
Zapis pamięci EEPROM
 0xC0 0000 00aa aaaa aaaa wejściowy bajt danych
Write EEPROM Memory Page (page access)
Zapis strony pamięci EEPROM (dostęp do strony)
0xC2 0000 00aa aaaa aa00 0x00
Write Lock bits
Zapis bitów blokujących
0xAC 0xE0 0x00 wejściowy bajt danych
Write Fuse Low bits
Zapisz dolnych bitów bezpiecznikowych
0xAC 0xA0 0x00 wejściowy bajt danych
Write Fuse High bits
Zapisz górnych bitów bezpiecznikowych
0xAC 0xA8 0x00 wejściowy bajt danych
Write Fuse Extended bits
Zapisz rozszerzonych bitów bezpiecznikowych
0xAC 0xA4 0x00 wejściowy bajt danych
Uwagi: 1. Nie wszystkie instrukcje można stosować z każdym mikrokontrolerem.
  2. a = adres.
  3. Zaprogramowane bity mają stan ‘0’, niezaprogramowane mają stan ‘1’.
  4. Aby zapewnić kompatybilność z przyszłymi modelami mikrokontrolerów, nieużywane bity bezpiecznikowe i blokujące powinny pozostać niezaprogramowane (‘1’) .
  5. Zobacz do podrozdziałów dotyczących bitów bezpiecznikowych, blokujących, bajtów kalibracyjnego i sygnaturowych oraz rozmiaru strony.
  6. Instrukcje dostępu do pamięci programu używają adresów słów. Ten adres może być dowolny w obrębie zakresu strony.
  7. Zobacz na stronę http://www.microchip.com, gdzie znajdziesz informacje o programowaniu i programatorach.
  8. Słowa

Jeśli najmłodszy bit LSB w bajcie danych RDY/BSY ma stan ‘1’, to operacja programowania jest ciągle wykonywana. Odczekaj, aż bit ten zwróci ‘0’, zanim wykonasz następną instrukcję.

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

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

Parametry programowania szeregowego SPI


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
©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: i-lo@eduinf.waw.pl
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.

Informacje dodatkowe.