Serwis Edukacyjny w I-LO w Tarnowie Materiały dla uczniów liceum |
Wyjście Spis treści Wstecz Dalej Autor artykułu: mgr Jerzy Wałaszek |
©2024 mgr Jerzy Wałaszek |
https://www.microchip.com/about-us/legal-information/copyright-usage-guidelines
Nazwa bitu blokującego | Numer bitu | Opis | Standardowa wartość(1) |
7 | – | 1 (niezaprogramowany) | |
6 | – | 1 (niezaprogramowany) | |
BLB12 | 5 | Bit blokujący boot-loadera | 1 (niezaprogramowany) |
BLB11 | 4 | Bit blokujący boot-loadera | 1 (niezaprogramowany) |
BLB02 | 3 | Bit blokujący boot-loadera | 1 (niezaprogramowany) |
BLB01 | 2 | Bit blokujący boot-loadera | 1 (niezaprogramowany) |
LB2 | 1 | Bit blokujący | 1 (niezaprogramowany) |
LB1 | 0 | Bit blokujący | 1 (niezaprogramowany) |
Tryby zabezpieczeń bitów blokujących(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). |
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 przed zaprogramowaniem bitów blokujących |
2. | "1" oznacza bit niezaprogramowany, "0" oznacza bit zaprogramowany |
Rozszerzony bajt bitów bezpiecznikowych
Rozszerzony bajt bitów bezpiecznikowych | Numer bitu | Opis | Standardowa wartość |
– | 7 | – | 1 |
– | 6 | – | 1 |
– | 5 | – | 1 |
– | 4 | – | 1 |
– | 3 | – | 1 |
– | 2 | – | 1 |
M103C(1) | 1 | Tryb kompatybilności z ATmega103 | 0 (zaprogramowany) |
WDTON(2) | 0 | Timer licznika zegarowego zawsze włączony | 1 (niezaprogramowany) |
Uwagi: | 1. | Zobacz do podrozdziału "Tryb kompatybilności z ATmega103". |
2. | Zobacz do opisu rejestru WDTCR. |
Górny bajt bitów bezpiecznikowych
Górny bajt bitów bezpiecznikowych | Numer bitu | Opis | Standardowa wartość |
OCDEN | 7 | Włącza wewnątrzukładowy system debugowania, OCD. | 1 (niezaprogramowane, OCD wyłączone) |
JTAGEN(4) | 6 | Włącza JTAG | 0 (zaprogramowane, JTAG włączony) |
SPIEN(1) | 5 | Włączenie szeregowego ładowania programu i danych | 0 (zaprogramowane, programowanie szeregowe włączone) |
CKOPT(2) | 4 | Opcje oscylatora | 1 (niezaprogramowane) |
EESAVE | 3 | Pamięć EEPROM jest zachowywana przy kasowaniu układu | 1 (niezaprogramowane, pamięć EEPROM nie jest zachowywana) |
BOOTSZ1 | 2 | Wybór rozmiaru obszaru boot-loadera | 0 (zaprogramowane)(3) |
BOOTSZ0 | 1 | Wybór rozmiaru obszaru boot-loadera | 0 (zaprogramowane)(3) |
BOOTRST | 0 | Wybór wektora resetu | 1 (niezaprogramowane) |
Uwagi: | 1. | Bit bezpiecznikowy SPIEN nie jest dostępny w trybie programowania szeregowego. |
2. | Działanie bitu bezpiecznikowego CKOPT zależy od ustawień bitów CKSEL, zobacz do podrozdziału "Źródła zegarowe". | |
3. | Standardowa wartość bitów BOOTSZ1..0 daje maksymalny rozmiar obszaru boot-loadera. | |
4. | Jeśli interfejs JTAG zostanie pozostawiony bez podłączenia, to bit bezpiecznikowy JTAGEN powinien być w miarę możliwości wyłączony. Zapobiegnie to statycznemu prądowi na końcówce TDO w interfejsie JTAG. |
Dolny bajt bitów bezpiecznikowych
Dolny bajt bitów bezpiecznikowych | Numer bitu | Opis | Standardowa wartość |
BODLEVEL | 7 | Poziom wyzwalania detektora spadku napięcia zasilającego | 1 (niezaprogramowane) |
BODEN | 6 | Włączenie detektora spadku napięcia zasilającego (BOD) | 1 (niezaprogramowane, BOD wyłączony) |
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 | 0 (zaprogramowane)(2) |
CKSEL0 | 0 | Wybór źródła zegarowego | 1 (niezaprogramowane)(2) |
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.
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.
Dla ATmega64 bajty sygnaturowe są następujące:
W tym rozdziale niektóre końcówki mikrokontrolera ATmega64 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 | PA0 | we | Wybór bajtu 2 ("0" wybiera dolny drugi bajt, "1" wybiera górny drugi bajt) |
DATA | PB[7: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 |
Liczba słów na stronę i liczba stron w pamięci FLASH
Rozmiar FLASH | Rozmiar strony | PCWORD | Liczba stron | PCPAGE | PCMSB |
32K słów (64KB) | 128 słów | PC[6:0] | 256 | PC[14:7] | 14 |
Liczba słów na stronę i liczba stron w pamięci EEPROM
Rozmiar EEPROM | Rozmiar strony | PCWORD | Liczba stron | PCPAGE | EEAMSB |
2 KB | 8 B | EEA[2:0] | 256 | EEA[10:3] | 10 |
Poniższy algorytm wprowadza mikrokontroler w tryb programowania równoległego:
Jeśli wybrano na źródło zegarowe zewnętrzny kwarc lub zewnętrzne elementy RC, to nie można wysłać na końcówkę XTAL1 odpowiednich impulsów. W takich przypadkach należy postępować wg następującego algorytmu:
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.
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:
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.
Adresowanie
pamięci FLASH, która jest zorganizowana w strony
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 |
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:
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 |
Algorytm odczytywania pamięci FLASH jest następujący:
Algorytm odczytywania pamięci EEPROM jest następujący:
Algorytm programowania dolnych bitów bezpiecznikowych jest następujący:
Algorytm programowania górnych bitów bezpiecznikowych jest następujący:
Algorytm programowania rozszerzonych bitów bezpiecznikowych jest następujący:
Programowanie bitów
bezpiecznikowych
Algorytm programowania bitów blokujących jest następujący:
Bity blokujące można skasować jedynie rozkazem Chip Erase.
Algorytm odczytywania bitów bezpiecznikowych i blokujących jest następujący:
Odwzorowanie pomiędzy BS1, BS2
a bitami bezpiecznikowymi i bitami blokującymi podczas odczytywania
Algorytm odczytywania bajtów sygnaturowych jest następujący:
Algorytm odczytywania bajtów kalibracyjnych jest następujący:
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)
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. |
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).
Uwaga: W mikrokontrolerze ATmega64 przy programowaniu szeregowym końcówka MOSI to końcówka PDI, a końcówka MISO to końcówka PDO. Nie myl ich z końcówkami portu B przeznaczonymi dla wewnętrznej magistrali SPI.
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.
Chociaż interfejs programowania SPI wykorzystuje moduł we/wy SPI, zachodzi ważna różnica: W mikrokontrolerze ATmega64 końcówki MOSI/MISO przydzielone do PB2 i PB3 w module we/wy SPI nie są używane przez interfejs programowania. Zamiast nich używane są końcówki PE0 i PE1 dla danych w trybie programowania SPI, co pokazuje poniższa tabelka.
Przydział końcówek dla programowania szeregowego
Symbol | Końcówka | We/wy | Opis |
MOSI(PDI) | PE0 | We | Wejście danych szeregowych |
MISO(PDO) | PE1 | Wy | Wyjście danych szeregowych |
SCK | PB1 | We | Zegar szeregowy |
Programowanie szeregowe i
weryfikacja(1)
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
Gdy dane szeregowe są zapisywane w mikrokontrolerze ATmega64, ich taktowanie następuje przy narastającym zboczu sygnału SCK. Gdy dane są odczytywane z ATmega64, taktowanie odbywa się przy opadającym zboczu SCK.
Do programowania i weryfikacji mikrokontrolera ATmega64 zalecana jest następująca
sekwencja operacji:
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ąć.
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 | 9,0ms |
tWD_ERASE | 9,0ms |
Instrukcje programowania szeregowego (szesnastkowo)
xxx
Instrukcja(1)/operacja | Format instrukcji | Operacja | |||
Bajt 1 | Bajt 2 | Bajt 3 | Bajt 4 | ||
Programming Enable Włączenie programowania |
1010 1100 |
0101 0011 |
xxxx xxxx |
xxxx xxxx |
Włączenie programowania szeregowego SPI po przejściu końcówki RESET w stan niski. |
Chip Erase Kasowanie mikrokontrolera |
1010 1100 |
100x xxxx |
xxxx xxxx |
xxxx xxxx |
Kasowanie zawartości pamięci EEPROM i FLASH. |
Read Program Memory Odczyt pamięci programu |
0010 H000
|
xaaa aaaa
|
bbbb bbbb
|
oooo oooo
|
Odczyt bajtu danych H (górnego lub dolnego) z pamięci programu pod adresem a:b. |
Load Program Memory Page Ładowanie strony pamięci programu |
0100 H000
|
xxxx xxxx |
xbbb bbbb
|
iiii iiii
|
Zapis bajtu danych H (górnego lub dolnego) do strony pamięci programu pod adres słowa b. Dolny bajt danych musi zostać załadowany przed górnym bajtem w obrębie tego samego adresu. |
Write Program Memory Page Zapis strony pamięci programu |
0100 1100 |
xaaa aaaa
|
bxxx xxxx
|
xxxx xxxx |
Zapis strony pamięci programu pod adresem a:b. |
Read EEPROM Memory Odczyt pamięci EEPROM |
1010 0000 |
xxxx xaaa
|
bbbb bbbb
|
oooo oooo
|
Odczyt danych o z pamięci EEPROM spod adresu a:b. |
Write EEPROM Memory Zapis pamięci EEPROM |
1100 0000 |
00xx xaaa
|
bbbb bbbb
|
iiii iiii
|
Zapis danych i do pamięci EEPROM pod adres a:b. |
Read Lock Bits Odczyt bitów blokowania |
0101 1000 |
0000 0000 |
xxxx xxxx |
xxoo oooo
|
Odczyt bitów blokujących. "0" = zaprogramowany, "1" = niezaprogramowany. Szczegóły znajdziesz w tej tabelce. |
Write Lock Bits Zapis bitów blokowania |
1010 1100 |
111x xxxx |
xxxx xxxx |
11ii iiii
|
Zapis bitów blokowania. Bity ustawiane = "0". Szczegóły znajdziesz w tej tabelce. |
Read Signature Byte Odczyt bajtu sygnatury |
0011 0000 |
xxxx xxxx |
xxxx xxbb
|
oooo oooo
|
Odczyt bajtu sygnatury spod adresu b. |
Write Fuse Bits Zapis bitów bezpiecznikowych |
1010 1100 |
1010 0000 |
xxxx xxxx |
iiii iiii
|
Zapis bitów bezpiecznikowych. Bity ustawiane = "0". Szczegóły znajdziesz w tej tabelce. |
Write Fuse High Bits Zapis górnych bitów bezpiecznikowych |
1010 1100 |
1010 1000 |
xxxx xxxx |
iiii iiii
|
Zapis górnych bitów bezpiecznikowych. Bity ustawiane = "0". Szczegóły znajdziesz w tej tabelce. |
Write Extended Fuse Bits Zapis rozszerzonych bitów bezpiecznikowych |
1010 1100 |
1010 0100 |
xxxx xxxx |
xxxx xxii
|
Zapis rozszerzonych bitów bezpiecznikowych. Bity ustawiane = "0". Szczegóły znajdziesz w tej tabelce. |
Read Fuse Bits Odczyt bitów bezpiecznikowych |
0101 0000 |
0000 0000 |
xxxx xxxx |
oooo oooo
|
Odczyt bitów bezpiecznikowych. "0" = zaprogramowany, "1" = niezaprogramowany. Szczegóły znajdziesz w tej tabelce. |
Read Fuse High Bits Odczyt górnych bitów bezpiecznikowych |
0101 0000 |
0000 1000 |
xxxx xxxx |
oooo oooo
|
Odczyt górnych bitów bezpiecznikowych. "0" = zaprogramowany, "1" = niezaprogramowany. Szczegóły znajdziesz w tej tabelce. |
Read Extendend Fuse Bits Odczyt rozszerzonych bitów bezpiecznikowych |
0101 0000 |
0000 0100 |
xxxx xxxx |
xxxx xxoo
|
Odczyt rozszerzonych bitów bezpiecznikowych. "0" = zaprogramowany, "1" = niezaprogramowany. Szczegóły znajdziesz w tej tabelce. |
Read Calibration Byte Odczyt bajtu kalibracyjnego |
0011 1000 |
00xx xxxx |
0000 00bb
|
oooo oooo
|
Odczyt bajtu kalibracyjnego spod adresu b. |
Uwagi: | 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ść nieistotna |
Jeśli w odczytywanym bajcie danych RDY/BSY najmłodszy bit LSB ma stan "1", to operacja programowania wciąż trwa. Poczekaj, aż bit ten zmieni stan na "0", zanim zaczniesz wykonywać następną instrukcję.
W obrębie tej samej strony dolny bajt danych musi być załadowany przed górnym bajtem danych.
Po załadowaniu danych do bufora strony, zaprogramuj stronę EEPROM, zobacz na poniższy rysunek.
Programowanie poprzez interfejs JTAG wymaga kontrolowania czterech specyficznych końcówek JTAG: TCK, TMS, TDI i TDO. Kontrola nad końcówkami resetu i zegara nie jest wymagana.
Aby można było używać interfejsu JTAG, należy zaprogramować bit bezpiecznikowy JTAGEN. Mikrokontroler ATmega64 sprzedawany jest z zaprogramowanym tym bitem. Dodatkowo należy wyzerować bit JTD w rejestrze MCUCSR. Alternatywnie, jeśli bit JTD jest ustawiony, to zewnętrzny reset może zostać wymuszony w stan niski. Wtedy bit JTD zostanie wyzerowany po dwóch taktach zegara układu i końcówki JTAG staną się dostępne do programowania. Daje to możliwość używania końcówek JTAG jako normalnych końcówek portu w trybie pracy oprogramowania, jednocześnie pozwalając na programowanie w układzie aplikacyjnym poprzez interfejs JTAG. Zauważ, iż techniki tej nie można używać, gdy końcówki JTAG używane są do skanowania ścieżki krawędziowej lub do wewnątrzukładowego debugowania. W tych przypadkach końcówki JTAG muszą być przeznaczone tylko do tego celu.
Z definicji dla tej instrukcji, najmłodszy bit LSB jest wsuwany i wysuwany jako pierwszy ze wszystkich rejestrów przesuwających.
Rejestr instrukcji ma długość 4 bitów i wspiera do 16 instrukcji. Poniżej wymieniono instrukcje JTAG przydatne do programowania. Kod operacyjny każdej instrukcji jest pokazany obok instrukcji w formacie szesnastkowym. Tekst opisuje, który rejestr danych jest wybrany jako ścieżka pomiędzy TDI i TDO dla każdej instrukcji. Stan Run-Test/Idle kontrolera TAP jest używany do generowania wewnętrznych zegarów. Można go również wykorzystywać jako stan bezczynności pomiędzy sekwencjami JTAG. Sekwencja maszyny stanu do zmiany słowa instrukcji pokazana jest na poniższym rysunku.
Publiczna instrukcja JTAG specyficzna dla AVR do wprowadzania mikrokontrolera w tryb resetu lub do wyprowadzania go z trybu resetu. Kontroler TAP nie jest resetowany przez tę instrukcję. Jako rejestr danych zostaje wybrany jednobitowy rejestr resetu (ang. Reset Register). Zauważ, iż reset będzie aktywny tak długo, jak w łańcuchu resetu znajduje się logiczna jedynka. Wyjście z tego łańcucha nie jest zapamiętywane w przerzutniku latch. Aktywny stan:
Publiczna instrukcja JTAG specyficzna dla AVR do uaktywniania programowania poprzez port JTAG. Jako rejestr danych zostaje wybrany 16-bitowy rejestr włączania programowania (ang. Programming Enable Register). Aktywne stany:
Publiczna instrukcja JTAG specyficzna dla AVR do wprowadzania rozkazów programowania poprzez port JTAG. Jako rejestr danych jest wybierany 15-bitowy rejestr rozkazu programowania (ang. Programming Command Register). Aktywne stany:
Publiczna instrukcja JTAG specyficzna dla AVR do ładowania bezpośrednio danych strony FLASH poprzez port JTAG. Jako rejestr danych zostaje wybrany 1024-bitowy rejestr ładowania wirtualnej strony FLASH, Jest to wirtualny łańcuch skanowania o długości równej liczbie bitów w jednej stronie FLASH. Wewnętrznie rejestr przesuwający jest 8-bitowy. W przeciwieństwie do większości instrukcji JTAG stan Update-DR nie jest używany do przenoszenia danych z rejestru przesuwającego. Dane te są automatycznie przenoszone do bufora strony FLASH bajt po bajcie w stanie Shift-DR przez wewnętrzny automat stanów. Jest to jedyny stan aktywny:
Uwaga: Instrukcja JTAG PROG_PAGELOAD może być stosowana tylko, jeśli mikrokontroler AVR jest pierwszym układem w łańcuchu skanowania JTAG. Jeśli tak nie jest, to należy użyć bajtowego algorytmu programowania.
Publiczna instrukcja JTAG specyficzna dla AVR do odczytu jednej pełnej strony danych FLASH poprzez port JTAG. Jako rejestr danych zostaje wybrany 132 bitowy rejestr odczytu wirtualnej strony FLASH. Jest to wirtualny łańcuch skanowania posiadający długość równą liczbie bitów w jednej stronie FLASH plus 8. Wewnętrznie rejestr przesuwający jest 8-bitowy. W przeciwieństwie do większości instrukcji JTAG stan Capture-DR nie jest używany do przenoszenia danych do rejestru przesuwającego. Dane te są automatycznie przenoszone z bufora strony FLASH bajt po bajcie w stanie Shift-DR przez wewnętrzny automat stanów. Jest to jedyny stan aktywny:
Uwaga: Instrukcja JTAG PROG_PAGEREAD może być stosowana tylko, jeśli mikrokontroler AVR jest pierwszym układem w łańcuchu skanowania JTAG. Jeśli tak nie jest, to należy użyć bajtowego algorytmu programowania.
Rejestry danych są wybierane przez instrukcję JTAG, co opisuje poprzedni rozdział. Rejestrami danych istotnymi dla operacji programowania są:
Rejestr resetu jest rejestrem danych testowych używanym do resetowania programowanego mikrokontrolera. Przed wejściem w tryb programowania mikrokontroler należy zresetować. Wysoka wartość w rejestrze resetu odpowiada wymuszeniu stanu niskiego na zewnętrznej końcówce RESET. Mikrokontroler jest resetowany tak długo, jak wysoka wartość jest obecna w rejestrze resetu. Zależnie od ustawień bitów bezpiecznikowych dla opcji zegarowych układ mikrokontrolera pozostanie w stanie resetu przez czas upływu resetu (ang. Reset Time-out Period, zobacz do rozdziału "Zegar systemowy i opcje zegarowe") po zwolnieniu rejestru resetu. Wyjście z tego rejestru danych nie jest zapamiętywane w przerzutniku latch, zatem reset wystąpi natychmiast, jak pokazuje poniższy rysunek.
Rejestr resetu
Jest to rejestr 16-bitowy. Jego zawartość jest porównywana z sygnaturą włączenia programowania o kodzie binarnym 1010_0011_0111_0000. Gdy zawartość rejestru jest równa tej sygnaturze, zostaje włączone programowanie poprzez port JTAG. Rejestr ten jest resetowany na 0 w czasie resetu przy włączaniu (ang. Power-on Reset) i powinien zawsze być zresetowany przy wychodzeniu z trybu programowania.
Rejestr włączania programowania
Jest to rejestr 15-bitowy, używany do szeregowego wsuwania rozkazów programowania i do szeregowego wysuwania ewentualnego wyniku poprzedniego rozkazu. Zbiór instrukcji programowania JTAG jest pokazany w tabelce poniżej. Sekwencja stanu przy wsuwaniu rozkazów programowania jest zilustrowana na poniższym rysunku.
Rejestr rozkazów programowania
Zbiór rozkazów programowania dla JTAG
Instrukcja | Sekwencja TDI | Sekwencja TDO | Uwagi |
1a. Chip erase 1a. Kasowanie układu |
0100011_10000000 0110001_10000000 0110011_10000000 0110011_10000000 |
xxxxxxx_xxxxxxxx xxxxxxx_xxxxxxxx xxxxxxx_xxxxxxxx xxxxxxx_xxxxxxxx |
|
1b. Poll for chip erase
complete 1b. Podgląd zakończenia kasowania układu |
0110011_10000000 | xxxxxox_xxxxxxxx | (2) |
2a. Enter FLASH Write 2a. Wejście w zapis FLASH |
0100011_00010000 | xxxxxxx_xxxxxxxx | |
2b. Load Address High
Byte 2b. Załadowanie górnego bajtu adresu |
0000111_aaaaaaaa | xxxxxxx_xxxxxxxx | (10) |
2c. Load Address Low
Byte 2c. Załadowanie dolnego bajtu adresu |
0000011_bbbbbbbb | xxxxxxx_xxxxxxxx | |
2d. Load Data Low Byte 2d. Załadowanie dolnego bajtu danych |
0010011_iiiiiiii | xxxxxxx_xxxxxxxx | |
2e. Load Data High Byte 2e. Załadowanie górnego bajtu danych |
0010111_iiiiiiii | xxxxxxx_xxxxxxxx | |
2f. Latch Data 2f. Zatrzaśnięcie danych |
0110111_00000000 1110111_00000000 0110111_00000000 |
xxxxxxx_xxxxxxxx xxxxxxx_xxxxxxxx xxxxxxx_xxxxxxxx |
(1) |
2g. Write FLASH Page 2g. Zapis strony FLASH |
0110111_00000000 0110101_00000000 0110111_00000000 0110111_00000000 |
xxxxxxx_xxxxxxxx xxxxxxx_xxxxxxxx xxxxxxx_xxxxxxxx xxxxxxx_xxxxxxxx |
(1) |
2h. Poll for Page Write
complete 2h. Podgląd zakończenia zapisu strony |
0110111_00000000 | xxxxxox_xxxxxxxx | (2) |
3a. Enter FLASH Read 3a. Wejście w odczyt FLASH |
0100011_00000010 | xxxxxxx_xxxxxxxx | |
3b. Load Address High
Byte 3b. Załadowanie górnego bajtu adresu |
0000111_aaaaaaaa | xxxxxxx_xxxxxxxx | (10) |
3c. Load Address Low
Byte 3c. Załadowanie dolnego bajtu adresu |
0000011_bbbbbbbb | xxxxxxx_xxxxxxxx | |
3d. Read Data Low and
High Byte 3d. Odczyt dolnego i górnego bajtu danych |
0110010_00000000 0110110_00000000 0110111_00000000 |
xxxxxxx_xxxxxxxx xxxxxxx_oooooooo xxxxxxx_oooooooo |
Dolny bajt górny bajt |
4a. Enter EEPROM Write 4a. Wejście w zapis EEPROM |
0100011_00010001 | xxxxxxx_xxxxxxxx | |
4b. Load Address High
Byte 4b. Załadowanie górnego bajtu adresu |
0000111_aaaaaaaa | xxxxxxx_xxxxxxxx | (10) |
4c. Load Address Low
Byte 4c. Załadowanie dolnego bajtu adresu |
0000011_bbbbbbbb | xxxxxxx_xxxxxxxx | |
4d. Load Data Byte 4d. Załadowanie bajtu danych |
0010011_iiiiiiii | xxxxxxx_xxxxxxxx | |
4e. Latch Data 4e. Zatrzaśnięcie danych |
0110111_00000000 1110111_00000000 0110111_00000000 |
xxxxxxx_xxxxxxxx xxxxxxx_xxxxxxxx xxxxxxx_xxxxxxxx |
(1) |
4f. Write EEPROM Page 4f. Zapis strony EEPROM |
0110011_00000000 0110001_00000000 0110011_00000000 0110011_00000000 |
xxxxxxx_xxxxxxxx xxxxxxx_xxxxxxxx xxxxxxx_xxxxxxxx xxxxxxx_xxxxxxxx |
(1) |
4g. Poll for Page Write
complete 4g. Podgląd zakończenia zapisu strony |
0110011_00000000 | xxxxxox_xxxxxxxx | (2) |
5a. Enter EEPROM Read 5a. Wejście w odczyt EEPROM |
0100011_00000011 | xxxxxxx_xxxxxxxx | |
5b. Load Address High
Byte 5b. Załadowanie górnego bajtu adresu |
0000111_aaaaaaaa | xxxxxxx_xxxxxxxx | (10) |
5c. Load Address Low
Byte 5c. Załadowanie dolnego bajtu adresu |
0000011_bbbbbbbb | xxxxxxx_xxxxxxxx | |
5d. Read Data Byte 5d. Odczyt bajtu danych |
0110011_bbbbbbbb 0110010_00000000 0110011_00000000 |
xxxxxxx_xxxxxxxx xxxxxxx_xxxxxxxx xxxxxxx_oooooooo |
|
6a. Enter Fuse Write 6a. Wejście w zapis bitów bezpiecznikowych |
0100011_01000000 | xxxxxxx_xxxxxxxx | |
6b. Load Data Low Byte 6b. Załadowanie dolnego bajtu danych |
0010011_iiiiiiii | xxxxxxx_xxxxxxxx | (3) |
6c. Write Fuse Extended
Byte(6) 6c. Zapis rozszerzonego bajtu bitów bezpiecznikowych |
0111011_00000000 0111001_00000000 0111011_00000000 0111011_00000000 |
xxxxxxx_xxxxxxxx xxxxxxx_xxxxxxxx xxxxxxx_xxxxxxxx xxxxxxx_xxxxxxxx |
(1) |
6d. Poll for Fuse Write
complete 6d. Podgląd zakończenia zapisu bitów bezpiecznikowych |
0110111_00000000 | xxxxxox_xxxxxxxx | (2) |
6e. Load Data Low Byte 6e. Załadowanie dolnego bajtu danych |
0010011_iiiiiiii | xxxxxxx_xxxxxxxx | (3) |
6f. Write Fuse High byte(7) 6f. Zapis górnego bajtu bitów bezpiecznikowych |
0110111_00000000 0110101_00000000 0110111_00000000 0110111_00000000 |
xxxxxxx_xxxxxxxx xxxxxxx_xxxxxxxx xxxxxxx_xxxxxxxx xxxxxxx_xxxxxxxx |
(1) |
6g. Poll for Fuse Write
complete 6g. Podgląd zakończenia zapisu bitów bezpiecznikowych |
0110111_00000000 | xxxxxox_xxxxxxxx | (2) |
6h. Load Data Low Byte 6h. Załadowanie dolnego bajtu danych |
0010011_iiiiiiii | xxxxxxx_xxxxxxxx | (3) |
6i. Write Fuse Low byte(8) 6i. Zapis dolnego bajtu bitów bezpiecznikowych |
0110011_00000000 0110001_00000000 0110011_00000000 0110011_00000000 |
xxxxxxx_xxxxxxxx xxxxxxx_xxxxxxxx xxxxxxx_xxxxxxxx xxxxxxx_xxxxxxxx |
(1) |
6j. Poll for Fuse Write
complete 6j . Podgląd zakończenia zapisu bitów bezpiecznikowych |
0110111_00000000 | xxxxxox_xxxxxxxx | (2) |
7a. Enter Lock Bit Write 7a. Wejście w zapis bitów blokujących |
0100011_00100000 | xxxxxxx_xxxxxxxx | |
7b. Load Data Byte 7b. Załadowanie bajtu danych |
0010011_11iiiiii | xxxxxxx_xxxxxxxx | (4) |
7c. Write Lock Bits 7c. Zapis bitów blokujących |
0110011_00000000 0110001_00000000 0110011_00000000 0110011_00000000 |
xxxxxxx_xxxxxxxx xxxxxxx_xxxxxxxx xxxxxxx_xxxxxxxx xxxxxxx_xxxxxxxx |
(1) |
7d. Poll for Lock Bit
Write complete 7d. Podgląd zakończenia zapisu bitów blokujących |
0110011_00000000 | xxxxxox_xxxxxxxx | (2) |
8a. Enter Fuse/Lock Bit
Read 8a. Wejście w zapis bitów bezpiecznikowych/blokujących |
0100011_00000100 | xxxxxxx_xxxxxxxx | |
8b. Read Fuse Extended Byte(6) 8b. Odczyt rozszerzonego bajtu bitów bezpiecznikowych |
0111010_00000000 0111111_00000000 |
xxxxxxx_xxxxxxxx xxxxxxx_oooooooo |
|
8c. Read Fuse High Byte(7) 8c. Odczyt górnego bajtu bitów bezpiecznikowych |
0111110_00000000 0111111_00000000 |
xxxxxxx_xxxxxxxx xxxxxxx_oooooooo |
|
8d. Read Fuse Low Byte(8) 8d. Odczyt dolnego bajtu bitów bezpiecznikowych |
0110010_00000000 0110011_00000000 |
xxxxxxx_xxxxxxxx xxxxxxx_oooooooo |
|
8e. Read Lock Bits(9) 8e. Odczyt bitów blokujących |
0110110_00000000 0110111_00000000 |
xxxxxxx_xxxxxxxx xxxxxxx_xxoooooo |
(5) |
8f. Read Fuses and Lock
Bits 8f. Odczyt bitów bezpiecznikowych i blokujących |
0111010_00000000 0111110_00000000 0110010_00000000 0110110_00000000 0110111_00000000 |
xxxxxxx_xxxxxxxx xxxxxxx_oooooooo xxxxxxx_oooooooo xxxxxxx_oooooooo xxxxxxx_oooooooo |
(5) Rozszerzony bajt bezpieczników Górny bajt bezpieczników Dolny bajt bezpieczników Bity blokujące |
9a. Enter Signature Byte
Read 9a. Wejście w odczyt bajtów sygnatury |
0100011_00001000 | xxxxxxx_xxxxxxxx | |
9b. Load Address Byte 9b. Załadowanie bajtu adresu |
0000011_bbbbbbbb | xxxxxxx_xxxxxxxx | |
9c. Read Signature Byte 9c. Odczyt bajtu sygnatury |
0110010_00000000 0110011_00000000 |
xxxxxxx_xxxxxxxx xxxxxxx_oooooooo |
|
10a. Enter Calibration
Byte Read 10a. Wejście w odczyt bajtu kalibracyjnego |
0100011_00001000 | xxxxxxx_xxxxxxxx | |
10b. Load Address Byte 10b. Załadowanie bajtu adresu |
0000011_bbbbbbbb | xxxxxxx_xxxxxxxx | |
10c. Read Calibration
Byte 10c. Odczyt bajtu kalibracyjnego |
0110110_00000000 0110111_00000000 |
xxxxxxx_xxxxxxxx xxxxxxx_oooooooo |
|
11a. Load No Operation
Command 11a. Załadowanie rozkazu pustego |
0100011_00000000 0110011_00000000 |
xxxxxxx_xxxxxxxx xxxxxxx_xxxxxxxx |
Uwagi: | 1. | Sekwencja rozkazowa nie jest wymagana, jeśli te siedem najstarszych bitów zostało ustawione przez poprzednią sekwencję rozkazową (co zwykle się dzieje). |
2. | Powtarzaj, aż o = "1". | |
3. | Ustaw bity na "0", aby zaprogramować odpowiadające im bity bezpiecznikowe, ustaw na "1", aby skasować. | |
4. | Ustaw bity na "0", aby zaprogramować odpowiadające im bity blokujące, ustaw na "1", aby pozostawić bity bez zmiany. | |
5. | "0" = zaprogramowane, "1" = niezaprogramowane. | |
6. | Odwzorowanie rozszerzonego bajtu bitów bezpiecznikowych pokazano w tej tabelce. | |
7. | Odwzorowanie górnego bajtu bitów bezpiecznikowych pokazano w tej tabelce. | |
8. | Odwzorowanie dolnego bajtu bitów bezpiecznikowych pokazano w tej tabelce. | |
9. | Odwzorowanie bitów blokujących pokazano w tej tabelce. | |
10. | Bity adresowe wykraczające poza PCMSB i EEAMSC są ignorowane (tabelka dla FLASH i tabelka dla EEPROM) |
Sekwencja automatu stanu dla
zmiany/odczytu słowa danych
Rejestr ten jest wirtualnym łańcuchem skanowania o długości równej liczbie bitów w jednej stronie pamięci FLASH. Wewnętrznie rejestr przesuwający jest 8-bitowy, a dane są automatycznie przenoszone bajt po bajcie do bufora strony FLASH. Wsuń wszystkie słowa instrukcji w stronie, rozpoczynając od najmłodszego bitu LSB pierwszej instrukcji na stronie i kończąc najstarszym bitem MSB ostatnie instrukcji na stronie. Dostarcza to efektywnego sposobu załadowania całego bufora strony FLASH przed wykonaniem zapisu strony.
Rejestr wirtualnego ładowania strony FLASH
Rejestr ten jest wirtualnym łańcuchem skanowania o długości równej liczbie bitów w jednej stronie FLASH plus 8. Wewnętrznie rejestr przesuwający jest 8-bitowy, a dane zostają automatycznie przeniesione bajt po bajcie ze strony danych FLASH. Pierwsze 8 cykli używane jest do przeniesienia pierwszego bajtu do wewnętrznego rejestru przesuwającego, a bity wysuwane podczas tych 8 cykli powinny być ignorowane. Po tej inicjalizacji dane są wysuwane poczynając od LSB pierwszej instrukcji na tej stronie i kończąc na MSB ostatniej instrukcji. Dostarcza to efektywnego sposobu odczytu pełnej strony FLASH przy weryfikacji programowania.
Rejestr wirtualnego odczytu strony FLASH
Wszystkie odwołania poniżej typu "1a", "1b", itd. odnoszą się do tabelki kodów JTAG.
Przed programowaniem FLASH należy wykonać kasowanie układu (ang. Chip Erase).
Bardziej efektywny przesył danych można osiągnąć przy użyciu instrukcji PROG_PAGELOAD:
Bardziej efektywny przesył danych można osiągnąć przy użyciu instrukcji PROG_PAGEREAD:
Przed programowaniem EEPROM musi zostać wykonane kasowanie układu. Zobacz do podrozdziału “Wykonanie kasowania układu mikrokontrolera".
Zwróć uwagę, iż instrukcji PROG_PAGELOAD nie można używać w czasie programowania EEPROM.
Zwróć uwagę, iż instrukcji PROG_PAGEREAD nie można używać w czasie odczytywania EEPROM.
Aby odczytać tylko
rozszerzony bajt
bitów bezpiecznikowych, użyj
instrukcji programowania
8b.
Aby odczytać tylko górny bajt
bitów bezpiecznikowych, użyj
instrukcji programowania
8c.
Aby odczytać tylko dolny bajt
bitów bezpiecznikowych, użyj
instrukcji programowania
8d.
Aby odczytać tylko bajt bitów
blokujących, użyj instrukcji
programowania 8e.
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:
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.