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/ELPM 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/ELPM 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/ELPM 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/ELPM 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/ELPM 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/ELPM 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 LB1 i LB2 |
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 |
BODLEVEL2(1) | 2 | Poziom wyzwalania BOD(2) | 1 (niezaprogramowane) |
BODLEVEL1(1) | 1 | Poziom wyzwalania BOD(2) | 1 (niezaprogramowane) |
BODLEVEL0(1) | 0 | Poziom wyzwalania BOD(2) | 1 (niezaprogramowane) |
Uwagi: | 1. | Zobacz do podrozdziału "Charakterystyki systemu i resetu", gdzie opisano dekodowanie bitów bezpiecznikowych BODLEVELn. |
2. | BOD (ang. Brown-Out Detector) – detektor spadku napięcia zasilania |
Górny bajt bitów bezpiecznikowych
Górny bajt bitów bezpiecznikowych | Numer bitu | Opis | Standardowa wartość |
OCDEN(4) | 7 | Włącza wewnątrzukładowy system debugowania, OCD. | 1 (niezaprogramowane, OCD wyłączone) |
JTAGEN | 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) |
WDTON(3) | 4 | Timer licznika zegarowego zawsze włączony | 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)(2) |
BOOTSZ0 | 1 | Wybór rozmiaru obszaru boot-loadera | 0 (zaprogramowane)(2) |
BOOTRST | 0 | Wybór wektora resetu | 1 (niezaprogramowane) |
Uwagi: | 1. | Bit bezpiecznikowy SPIEN nie jest dostępny w trybie programowania szeregowego. |
2. | Standardowa wartość bitów BOOTSZ1..0 daje maksymalny rozmiar obszaru boot-loadera. | |
3. | Szczegóły znajdziesz w opisie rejestru sterującego timerem licznika zegarowego WDTCSR. | |
4. | Nigdy nie wypuszczaj produktu z zaprogramowanym bitem bezpiecznikowym OCDEN bez względu na ustawienia bitów blokujących oraz bitu bezpiecznikowego JTAGEN. Zaprogramowany bit bezpiecznikowy OCDEN uaktywnia niektóre części systemu zegarowego, aby pracowały we wszystkich trybach uśpienia, co może zwiększyć pobór prądu. |
Dolny bajt bitów bezpiecznikowych
Dolny bajt bitów bezpiecznikowych | Numer bitu | Opis | Standardowa wartość |
CKDIV8(4) | 7 | Dzielenie zegara przez 8 | 0 (zaprogramowane) |
CKOUT(3) | 6 | Wyprowadzanie zegara | 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 | 0 (zaprogramowane)(2) |
CKSEL0 | 0 | Wybór źródła zegarowego | 1 (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 umożliwia wyprowadzanie zegara systemowego na końcówce PORTE7. | |
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.
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 mikrokontrolerów ATmega640/1280/1281/2560/2561 bajty sygnaturowe przedstawia poniższa tabelka:
Mikrokontroler | Adres bajtów sygnatury | JTAG | |||
0x000 | 0x001 | 0x002 | Numer | Producent | |
ATmega640 | 0x1E | 0x96 | 0x08 | 9608 | 0x1F |
ATmega1280 | 0x1E | 0x97 | 0x03 | 9703 | 0x1F |
ATmega1281 | 0x1E | 0x97 | 0x04 | 9704 | 0x1F |
ATmega2560 | 0x1E | 0x98 | 0x01 | 9801 | 0x1F |
ATmega2561 | 0x1E | 0x98 | 0x02 | 9802 | 0x1F |
Liczba słów na stronę i liczba stron w pamięci FLASH
Rozmiar FLASH | Rozmiar strony | PCWORD | Liczba stron | PCPAGE | PCMSB |
128K słów (256KB) | 128 słów | PC[6:0] | 1024 | PC[16:7] | 16 |
Liczba słów na stronę i liczba stron w pamięci EEPROM
Rozmiar EEPROM | Rozmiar strony | PCWORD | Liczba stron | PCPAGE | EEAMSB |
4KB | 8 B | EEA[2:0] | 512 | EEA[11:3] | 11 |
W tym rozdziale niektóre końcówki mikrokontrolera ATmega640/1280/1281/2560/2561 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) |
Dekodowanie stanów BS2 i BS1
BS2 | BS1 | Adres FLASH/EEPROM | Ładowanie/odczyt danych FLASH | Programowanie bitów bezpiecznikowych | Odczyt bitów bezpiecznikowych i blokujących |
0 | 0 | dolny bajt | dolny bajt | dolny bajt | dolny bajt bitów bezpiecznikowych |
0 | 1 | górny bajt | górny bajt | górny bajt | bajt bitów blokujących |
1 | 0 | rozszerzony bajt górny | zarezerwowane | bajt rozszerzony | Rozszerzony bajt bitów bezpiecznikowych |
1 | 1 | zarezerwowane | zarezerwowane | zarezerwowane | Górny bajt bitów bezpiecznikowych |
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.
Dekodowanie 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 |
Poniższy algorytm wprowadza mikrokontroler w tryb programowania równoległego:
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ęć EEPROM 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 (kasowanie układu).
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 baju kalibracyjnego 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. |
Przy użyciu magistrali programowania szeregowego można programować obie pamięci FLASH i EEPROM, gdy końcówka RESET zostanie ściągnięta do poziomu masy GND. Interfejs programowania szeregowego składa się z końcówek SCK, PDI (wejście) i PDO (wyjście). Po ustawieniu stanu niskiego na końcówce RESET należy najpierw wykonać instrukcję włączającą programowanie zanim operacje programowania/wymazywania będą mogły być wykonywane. Zwróć uwagę na przydział końcówek mikrokontrolera do programowania szeregowego podany w tabelce poniżej, ponieważ mikrokontrolery w obudowach 100-nóżkowych i 64-nóżkowych używają innych końcówek dla sygnałów PDI i PDO.
Przydział końcówek dla programowania szeregowego
Symbol | Końcówki dla TQFP-100 | Końcówki dla TQFP-64 | We/wy | Opis |
PDI | PB2 | PE0 | We | Wejście danych szeregowych |
PDO | PB3 | PE1 | Wy | Wyjście danych szeregowych |
SCK | PB1 | PB1 | We | Zegar szeregowy |
Programowanie szeregowe i
weryfikacja(1)
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 ATmega640/1280/1281/2560/2561, 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:
Symbol | Minimalne opóźnienie przy oczekiwaniu |
tWD_FLASH | 4.5ms |
tWD_EEPROM | 3.6ms |
tWD_ERASE | 9.0ms |
Instrukcja(1)/operacja | Format instrukcji | |||
Bajt 1 | Bajt 2 | Bajt 3 | Bajt 4 | |
Programming Enable Włączenie programowania |
0xAC | 0x53 | 0x00 | 0x00 |
Chip Erase
(Program Memory/EEPROM) Kasowanie układu |
0xAC | 0x80 | 0x00 | 0x00 |
Poll RDY/BSY Podgląd linii RDY/BSY |
0xF0 | 0x00 | 0x00 | wyjściowy bajt danych |
Instrukcje ładowania | ||||
Load Extended Address byte(1) Ładowanie rozszerzonego bajtu adresu |
0x4D | 0x00 | Rozszerzony bajt adresu | 0x00 |
Load Program Memory Page,
High byte Ładowanie strony pamięci, górny bajt |
0x48 | 0x00 | LSB adresu | wejściowy górny bajt danych |
Load Program Memory Page, Low
byte Ładowanie strony pamięc programui, dolny bajt |
0x40 | 0x00 | LSB adresu | wejściowy dolny bajt danych |
Load EEPROM Memory Page
(page access) Ładowanie strony pamięci EEPROM (dostęp stronami) |
0xC1 | 0x00 | 0000 0aaa | wejściowy bajt danych |
Instrukcje odczytu | ||||
Read Program Memory, High
byte Odczyt pamięci programu, górny bajt |
0x28 | MSB adresu | LSB adresu | wyjściowy górny bajt danych |
Read Program Memory, Low byte Odczyt pamięci programu, dolny bajt |
0x20 | MSB adresu | LSB adresu | wyjściowy dolny bajt danych |
Read EEPROM Memory Odczyt pamięci EEPROM |
0xA0 | 0000 aaaa | 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 sygnatury |
0x30 | 0x00 | 0000 00aa | wyjściowy bajt danych |
Read Fuse 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 Extended Fuse 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 | ||||
Write Program Memory Page Zapis strony pamięci programu |
0x4C | MSB adresu | LSB adresu | 0x00 |
Write EEPROM Memory Zapis pamięci EEPROM |
0xC0 | 0000 aaaa | aaaa aaaa | wejściowy bajt danych |
Write EEPROM Memory Page
(page access) Zapis pamięci EEPROM (dostęp stronami) |
0xC2 | 0000 aaaa | aaaa a000 | 0x00 |
Write Lock Bits Zapis bitów blokujących |
0xAC | 0xE0 | 0x00 | wejściowy bajt danych |
Write Fuse Bits Zapis dolnych bitów bezpiecznikowych |
0xAC | 0xA0 | 0x00 | wejściowy bajt danych |
Write Fuse High Bits Zapis górnych bitów bezpiecznikowych |
0xAC | 0xA8 | 0x00 | wejściowy bajt danych |
Write Extended Fuse Bits Zapis rozszerzonych bitów bezpiecznikowych |
0xAC | 0xA4 | 0x00 | wejściowy bajt danych |
Jeśli w odczytywanym bajcie danych RDY/BSY najmłodszy bit 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 ATmega640/1280/1281/2560/2561 sprzedawany jest z zaprogramowanym tym bitem. Dodatkowo należy wyzerować bit JTD w rejestrze MCUCR. 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.
Podczas programowania częstotliwość zegarowa na wejściu TCK powinna być niższa od maksymalnej częstotliwości dla mikrokontrolera. Preskaler zegara systemowego nie może być użyty do podziału zegara wejścia TCK do wystarczająco niskiej częstotliwości.
Z definicji w tejj 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:
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:
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 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 Podgląd zakończenia kasowania układu |
0110011_10000000 |
xxxxxox_xxxxxxxx
|
(2) |
2a. Enter Flash Write Wejście w zapis FLASH |
0100011_00010000 |
xxxxxxx_xxxxxxxx |
|
2b. Load Address Extended High Byte Ładowanie rozszerzonego górnego bajtu adresu |
0001011_cccccccc
|
xxxxxxx_xxxxxxxx |
|
2c. Load Address High Byte Ładowanie górnego bajtu adresu |
0000111_aaaaaaaa
|
xxxxxxx_xxxxxxxx |
|
2d. Load Address Low Byte Ładowanie dolnego bajtu adresu |
0000011_bbbbbbbb
|
xxxxxxx_xxxxxxxx |
|
2e. Load Data Low Byte Ładowanie dolnego bajtu danych |
0010011_iiiiiiii
|
xxxxxxx_xxxxxxxx |
|
2f. Load Data High Byte Ładowanie górnego bajtu danych |
0010111_iiiiiiii
|
xxxxxxx_xxxxxxxx |
|
2g. Latch Data Zatrzaśnięcie (zapamiętanie) danych |
0110111_00000000 1110111_00000000 0110111_00000000 |
xxxxxxx_xxxxxxxx xxxxxxx_xxxxxxxx xxxxxxx_xxxxxxxx |
(1) |
2h. Write Flash Page Zapis strony FLASH |
0110111_00000000 0110101_00000000 0110111_00000000 0110111_00000000 |
xxxxxxx_xxxxxxxx xxxxxxx_xxxxxxxx xxxxxxx_xxxxxxxx xxxxxxx_xxxxxxxx |
(1) |
2i. Poll for Page Write Complete Podgląd zakończenia zapisu strony |
0110111_00000000 |
xxxxxox_xxxxxxxx
|
(2) |
3a. Enter Flash Read Wejście w odczyt FLASH |
0100011_00000010 |
xxxxxxx_xxxxxxxx |
|
3b. Load Address Extended High Byte Ładowanie rozszerzonego górnego bajtu adresu |
0001011_cccccccc
|
xxxxxxx_xxxxxxxx |
(10) |
3c. Load Address High Byte Ładowanie górnego bajtu adresu |
0000111_aaaaaaaa
|
xxxxxxx_xxxxxxxx |
|
3d. Load Address Low Byte Ładowanie dolnego bajtu adresu |
0000011_bbbbbbbb
|
xxxxxxx_xxxxxxxx |
|
3e. Read Data Low and High Byte Odczyt dolnego i górnego bajtu danych |
0110010_00000000 0110110_00000000 0110111_00000000 |
xxxxxxx_xxxxxxxx xxxxxxx_oooooooo xxxxxxx_oooooooo |
Bajty: dolny górny |
4a. Enter EEPROM Write Wejście w zapis EEPROM |
0100011_00010001 |
xxxxxxx_xxxxxxxx |
|
4b. Load Address High Byte Ładowanie górnego bajtu adresu |
0000111_aaaaaaaa
|
xxxxxxx_xxxxxxxx |
(10) |
4c. Load Address Low Byte Ładowanie dolnego bajtu adresu |
0000011_bbbbbbbb
|
xxxxxxx_xxxxxxxx |
|
4d. Load Data Byte Ładowanie bajtu danych |
0010011_iiiiiiii
|
xxxxxxx_xxxxxxxx |
|
4e. Latch Data Zatrzaśnięcie danych |
0110111_00000000 1110111_00000000 0110111_00000000 |
xxxxxxx_xxxxxxxx xxxxxxx_xxxxxxxx xxxxxxx_xxxxxxxx |
(1) |
4f. Write EEPROM Page 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 Podgląd zakończenia zapisu strony |
0110011_00000000 |
xxxxxox_xxxxxxxx
|
(2) |
5a. Enter EEPROM Read Wejście do odczytu EEPROM |
0100011_00000011 |
xxxxxxx_xxxxxxxx |
|
5b. Load Address High Byte Ładowanie górnego bajtu adresu |
0000111_aaaaaaaa
|
xxxxxxx_xxxxxxxx |
(10) |
5c. Load Address Low Byte Ładowanie dolnego bajtu adresu |
0000011_bbbbbbbb
|
xxxxxxx_xxxxxxxx |
|
5d. Read Data Byte Odczyt bajtu danych |
0110011_bbbbbbbb
0110010_00000000
0110011_00000000
|
xxxxxxx_xxxxxxxx
xxxxxxx_xxxxxxxx
xxxxxxx_oooooooo
|
|
6a. Enter Fuse Write Wejście w zapis bitów bezpiecznikowych |
0100011_01000000 |
xxxxxxx_xxxxxxxx |
|
6b. Load Data Low Byte(6) Załadowanie dolnego bajtu danych |
0010011_iiiiiiii
|
xxxxxxx_xxxxxxxx |
(3) |
6c. Write Fuse Extended Byte 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 Podgląd zakończenia zapisu bitów bezpiecznikowych |
0110111_00000000 |
xxxxxox_xxxxxxxx
|
(2) |
6e. Load Data Low Byte(7) Ładowanie dolnego bajtu danych |
0010011_iiiiiiii
|
xxxxxxx_xxxxxxxx |
(3) |
6f. Write Fuse High Byte 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 Podgląd zakończenia zapisu bitów bezpiecznikowych |
0110111_00000000 |
xxxxxox_xxxxxxxx
|
(2) |
6h. Load Data Low Byte(7) Ładowanie dolnego bajtu danych |
0010011_iiiiiiii
|
xxxxxxx_xxxxxxxx |
(3) |
6i. Write Fuse Low Byte 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 Podgląd zakończenia zapisu bitów bezpiecznikowych |
0110111_00000000 |
xxxxxox_xxxxxxxx
|
(2) |
7a. Enter Lock Bit Write Wejście w zapis bitów blokujących |
0100011_00100000 |
xxxxxxx_xxxxxxxx |
|
7b. Load Data Byte(9) Ładowanie bajtu danych |
0010011_11iiiiii
|
xxxxxxx_xxxxxxxx |
(4) |
7c. Write Lock Bits 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 Podgląd zakończenia zapisu bitów blokujących |
0110011_00000000 |
xxxxxox_xxxxxxxx
|
(2) |
8a. Enter Fuse/Lock Bit Read Wejście w odczyt bitów bezpiecznikowych/blokujących |
0100011_00000100 |
xxxxxxx_xxxxxxxx |
|
8b. Read Extended Fuse
Byte(6) Odczyt rozszerzonego bajtu bitów bezpiecznikowych |
0111010_00000000 0111011_00000000 |
xxxxxxx_xxxxxxxx
xxxxxxx_oooooooo
|
|
8c. Read Fuse High Byte(7) Odczyt górnego bajtu bitów bezpiecznikowych |
0111110_00000000 0111111_00000000 |
xxxxxxx_xxxxxxxx
xxxxxxx_oooooooo
|
|
8d. Read Fuse Low Byte(8) Odczyt dolnego bajtu bitów bezpiecznikowych |
0110010_00000000 0110011_00000000 |
xxxxxxx_xxxxxxxx
xxxxxxx_oooooooo
|
|
8e. Read Lock Bits(9) Odczyt bitów blokujących |
0110110_00000000 0110111_00000000 |
xxxxxxx_xxxxxxxx
xxxxxxx_oooooooo
|
(5) |
8f. Read Fuses and Lock Bits 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) Bajt rozszerzony Bajt górny Bajt dolny Bity blokujące |
9a. Enter Signature Byte Read Wejście w odczyt bajtów sygnatury |
0100011_00001000 |
xxxxxxx_xxxxxxxx |
|
9b. Load Address Byte Ładowanie bajtu adresowego |
0000011_bbbbbbbb
|
xxxxxxx_xxxxxxxx |
|
9c. Read Signature Byte Odczyt bajtu sygnatury |
0110010_00000000 0110011_00000000 |
xxxxxxx_xxxxxxxx
xxxxxxx_oooooooo
|
|
10a. Enter Calibration Byte Read Wejście w odczyt bajtu kalibracyjnego |
0100011_00001000 |
xxxxxxx_xxxxxxxx |
|
10b. Load Address Byte Ładowanie bajtu adresowego |
0000011_bbbbbbbb
|
xxxxxxx_xxxxxxxx |
|
10c. Read Calibration Byte Odczyt bajtu kalibracyjnego |
0110110_00000000 0110111_00000000 |
xxxxxxx_xxxxxxxx
xxxxxxx_oooooooo
|
|
11a. Load No Operation Command Ładowanie rozkazu pustego NOP |
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) | |
11. | Wszystkie ciągi TDI i TDO są reprezentowane cydrami binarnymi (0b...) |
Sekwencja automatu stanu dla
zmiany/odczytu słowa danych
Rejestr ten udostępnia efektywny sposób ładowania całego bufora strony FLASH przed wykonaniem rozkazu Page Write (zapis strony) lub odczytu/weryfikacji zawartości FLASH. Automat stanu ustawia sygnały sterujące pamięcią FLASH i wykrywa sygnały strobowe z FLASH, zatem jedynie słowa danych muszą być wysuwane/wsuwane.
Rejestr bajtu danych FLASH w rzeczywistości składa się z 8-bitowego łańcucha skanowania oraz z 8-bitowego rejestru tymczasowego. Podczas ładowania strony stan Update-DR kopiuje zawartość łańcucha skanowania do tymczasowego rejestru i inicjuje sekwencję zapisu, która w ciągu 11 taktów TCK ładuje zawartość rejestru tymczasowego do bufora strony FLASH. Mikrokontroler AVR automatycznie przełącza się pomiędzy zapisem dolnego i górnego bajtu przy każdym nowym stanie Update-DR, poczynając od dolnego bajtu przy pierwszym napotkanym stanem Update-DR po wejściu w rozkaz PROG_PAGELOAD. Licznik programu zostaje zwiększony o jeden przed zapisem dolnego bajty za wyjątkiem pierwszego zapisanego bajtu. Daje to gwarancję, iż pierwsze dane będą zapisane pod adresem ustawionym przez PROG_COMMANDS, a ładowanie ostatniej komórki e buforze strony nie spowoduje zwiększenia licznika programu do adresu następnej strony.
Podczas odczytu strony zawartość wybranego bajtu pamięci FLASH jest zapamiętywana w rejestrze bajtu danych FLASH podczas stanu Capture-DR. Mikrokontroler AVR automatycznie przełącza się pomiędzy odczytem dolnego i górnego bajtu przy każdym nowym stanie Capture-DR, poczynając od dolnego bajtu przy pierwszym stanie Capture-DR napotkanym po wejściu w rozkaz PROG_PAGEREAD. Licznik programu jest zwiększany o jeden po odczytaniu każdego górnego bajtu, łącznie zz pierwszym odczytanym bajtem. Zapewnia to, iż pierwsze dane zostaną odczytane z pierwszego adresu ustawionego przez PROG_COMMANDS, a odczyt ostatniej komórki danej strony spowoduje zwiększenie licznika programu do przejścia na następną stronę.
Rejestr bajtu danychFLASH
Automat stanu sterujący rejestrem bajtu danych FLASH jest taktowany przez TCK. Podczas normalnej pracy, w której osiem bitów jest przesuwane dla każdego bajtu FLASH, takty zegarowe potrzebne do nawigowania przez sterownik TAP automatycznie dostarczają automatowi stanu przy pracy z rejestrem bajtu danych FLASH wystarczającej liczby impulsów zegarowych to zakończenia jego pracy w sposób przeźroczysty dla użytkownika. Jednakże jeśli zostanie przesuniętych zbyt mało bitów pomiędzy każdym stanem Update-DR podczas ładowania strony, to sterownik TAP powinien pozostać w stanie Run-Test/Idle przez kilka taktów TCK, aby zapewnić co najmniej 11 taktów TCK pomiędzy każdym stanem Update-DR state.
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.
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.