Serwis Edukacyjny
w I-LO w Tarnowie
obrazek

Materiały dla uczniów liceum

  Wyjście       Spis treści       Wstecz       Dalej  

obrazek

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

©2021 mgr Jerzy Wałaszek
I LO w Tarnowie

obrazek

Mikrokontrolery

ATmega64

Programowanie pamięci

obrazek

Educational and Non-Profit Use of Copyrighted Material:

If you use Microchip copyrighted material solely for educational (non-profit) purposes falling under the “fair use” exception of the U.S. Copyright Act of 1976 then you do not need Microchip’s written permission. For example, Microchip’s permission is not required when using copyrighted material in: (1) an academic report, thesis, or dissertation; (2) classroom handouts or textbook; or (3) a presentation or article that is solely educational in nature (e.g., technical article published in a magazine).

https://www.microchip.com/about-us/legal-information/copyright-usage-guidelines

SPIS TREŚCI
Podrozdziały

obrazek

Bity blokujące pamięci programu i danych

ATmega64 udostępnia sześć bitów blokujących, które można pozostawić w stanie niezaprogramowanym (“1”) lub można je zaprogramować (“0”), aby otrzymać dodatkowe cechy mikrokontrolera opisane poniżej w tabelce. Bity blokujące mogą być skasowane do stanu "1" tylko przy pomocy rozkazu kasowania układu (ang. Chip Erase command).

Bajt z bitami blokującymi

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)
Uwaga: 1. "1" oznacza bit niezaprogramowany, "0" oznacza bit zaprogramowany

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
Na początek:  podrozdziału   strony 

Bity bezpiecznikowe

Mikrokontroler ATmega64 posiada trzy bajty bitów bezpiecznikowych. Poniższe tabelki krótko opisują ich funkcje oraz położenia w tych bajtach. Zauważ, iż zaprogramowany bit bezpiecznikowy daje przy odczycie wartość zero, "0".

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)
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 1MHz.

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.

Na początek:  podrozdziału   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 ATmega64 bajty sygnaturowe są następujące:

  1. 0x000: 0x1E (oznacza produkt firmy Atmel)
  2. 0x001: 0x96 (oznacza 64KB pamięci FLASH)
  3. 0x002: 0x02 (oznacza mikrokontroler ATmega64, gdy bajt 0x001 ma wartość 0x96)
Na początek:  podrozdziału   strony 

Bajt kalibracyjny

Mikrokontroler ATmega64 przechowuje cztery różne wartości dla wewnętrznego oscylatora RC. Bajty te przebywają w rzędzie górnych bajtów adresów sygnaturowych 0x0000, 0x0001, 0x0002 i  0x0003 odpowiednio dla częstotliwości 1MHz, 2MHz, 4MHz i 8Mhz. Podczas resetu wartość dla 1MHz jest automatycznie ładowana do rejestru OSCCAL. Jeśli używane są inne częstotliwości, to wartość kalibracyjna musi być załadowana przez program użytkownika.
Na początek:  podrozdziału   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 ATmega64. 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 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
Na początek:  podrozdziału   strony 

Programowanie równoległe

Wejście w tryb programowania

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

  1. Przyłóż napięcie 4,5...5,5V pomiędzy końcówki VCC i GND, a następnie odczekaj przynajmniej 100μs.
  2. Ustaw stan "0" na końcówce RESET i zmień stan na przeciwny na końcówce XTAL1 przynajmniej 6 razy.
  3. Ustaw końcówki Prog_enable wymienione w poprzednim podrozdziale w tabelce na "0000" i odczekaj co najmniej 100ns.
  4. Przyłóż napięcie 11,5...12,5V do końcówki RESET. Jakakolwiek aktywność na końcówkach Prog_enable w ciągu 100ns po przyłożeniu napięcia +12V do końcówki RESET spowoduje niepowodzenie wejścia mikrokontrolera w tryb programowania.

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:

  1. Ustaw końcówki Prog_enable na "0000".
  2. Przyłóż napięcie 4,5...5,5V pomiędzy końcówki VCC i GND, a jednocześnie przyłóż 11,5...12,5V do końcówki RESET.
  3. Odczekaj 100μs.
  4. Ponownie zaprogramuj bity bezpiecznikowe, aby zapewnić wybór zegara zewnętrznego jako źródła zegarowego (CKSEL3:0 = 0’b0000). Jeśli zostały zaprogramowane bity blokujące, to musi zostać wykonany rozkaz kasowania układu, zanim będzie można zmienić bity bezpiecznikowe.
  5. Wyjdź z trybu programowania przez wyłączenie zasilania lub zresetowanie mikrokontrolera stanem niskim na końcówce RESET.
  6. Wejdź w tryb programowania wg pierwszego algorytmu.

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 lud 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 BS2 na "0". To wybiera dolny bajt danych.

 

Programowanie bitów bezpiecznikowych

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.

Bity blokujące można skasować jedynie rozkazem Chip Erase.

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 bajtów kalibracyjnych 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”.

Charakterystyki 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.

Charakterystyki 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.
Na początek:  podrozdziału   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).

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.

Na początek:  podrozdziału   strony 

Programowanie szeregowe, przydział końcówek

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)

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 2,7V - 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 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:

  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". Alternatywą użycia sygnału RESET jest wymuszenie stanu niskiego na końcówce PEN podczas resetu przy włączaniu zasilania, gdy SCK jest utrzymywane w stanie "0". W tym przypadku tylko wartość PEN przy resetowaniu przy włączaniu zasilania jest istotna. Jeśli programista nie może zagwarantować, iż SCK jest utrzymywane w stanie niskim przy włączaniu zasilania, to metoda z PEN nie może być użyta. Mikrokontroler musi zostać wyłączony w celu rozpoczęcia normalnej pracy, gdy jest używana ta metoda.
  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. Rozmiar strony dla ATmega64 wynosi 128 słów (256 bajtów). Strona pamięci jest ładowana bajt po bajcie przez dostarczenie 7 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 8 MSB adresu. Jeśli podgląd nie jest wykorzystywany, to użytkownik musi odczekać co najmniej przez czas tWD_FLASH przed wysłaniem następnej strony.
    Uwaga: Jeśli zostaną użyte inne rozkazy niż podgląd danych przed zakończeniem dowolnej operacji zapisu (FLASH, EEPROM, Bity blokujące, Bity bezpiecznikowe), to programowanie może zostać błędnie wykonane.
  5. 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 układ mikrokontrolera został skasowany, to nie ma potrzeby programowania komórek, które mają zawierać wartość 0xFFs.
  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 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.

Na początek:  podrozdziału   strony 

Programowanie poprzez interfejs JTAG

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.

Instrukcje JTAG specyficzne dla programowania

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.

AVR_RESET (0xC)

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:

PROG_ENABLE (0x4)

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:

PROG_COMMANDS (0x5)

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:

PROG_PAGELOAD (0x6)

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.

PROG_PAGEREAD (0x7)

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

Rejestry danych są wybierane przez instrukcję JTAG, co opisuje poprzedni rozdział. Rejestrami danych istotnymi dla operacji programowania są:

Rejestr resetu

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

Rejestr włączania programowania

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

Rejestr rozkazów 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
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 = bez znaczenia

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 wirtualnego ładowania strony FLASH

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 wirtualnego odczytu 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

Algorytm programowania

Wszystkie odwołania poniżej typu "1a", "1b", itd. odnoszą się do tabelki kodów JTAG.

Wejście do trybu programowania

  1. Wprowadź instrukcję JTAG AVR_RESET i wsuń 1 do rejestru resetu.
  2. Wprowadź instrukcję PROG_ENABLE i wsuń 1010_0011_0111_0000 do rejestru włączania programowania.

Opuszczenie trybu programowania

  1. Wprowadź instrukcję JTAG PROG_COMMANDS.
  2. Wyłącz wszystkie instrukcje programowania za pomocą instrukcji pustej 11a.
  3. Wprowadź instrukcję PROG_ENABLE i wsuń 0000_0000_0000_0000 do rejestru włączania programowania.
  4. Wprowadź instrukcję JTAG AVR_RESET i wsuń 0 do rejestru resetu.

Wykonanie kasowania układu mikrokontrolera

  1. Wprowadź instrukcję JTAG PROG_COMMANDS.
  2. Rozpocznij kasowanie układu za pomocą instrukcji programowania 1a.
  3. Sprawdzaj zakończenie operacji kasowania za pomocą instrukcji 1b lub odczekaj czas tWLRH_CE (7,5 ... 9 ms dla ATmega64).

Programowanie pamięci FLASH

Przed programowaniem FLASH należy wykonać kasowanie układu (ang. Chip Erase).

  1. Wprowadź instrukcję JTAG  PROG_COMMANDS.
  2. Włącz zapis do FLASH za pomocą instrukcji programowania 2a.
  3. Załaduj górny bajt adresu za pomocą instrukcji programowania 2b.
  4. Załaduj dolny bajt adresu za pomocą instrukcji programowania 2c.
  5. Ładuj dane za pomocą instrukcji programowania 2d, 2e i 2f.
  6. Powtarzaj kroki 4 i 5 dla wszystkich słów instrukcji na tej stronie.
  7. Zapisz stronę za pomocą instrukcji programowania 2g.
  8. Sprawdzaj zakończenie zapisu FLASH za pomocą instrukcji programowania 2h lub odczekaj czas tWLRH (3,7 ... 4,5 ms dla ATmega64).
  9. Powtarzaj kroki od 3 do 8 aż do zaprogramowania wszystkich danych.

Bardziej efektywny przesył danych można osiągnąć przy użyciu instrukcji PROG_PAGELOAD:

  1. Wprowadź instrukcję JTAG  PROG_COMMANDS.
  2. Włącz zapis do FLASH za pomocą instrukcji programowania 2a.
  3. Załaduj adres strony za pomocą instrukcji programowania 2b i 2c. PCWORD (zobacz do tabelki) jest używane do adresowania wewnątrz jednej strony i musi być zapisane jako 0.
  4. Wprowadź instrukcję JTAG PROG_PAGELOAD.
  5. Załaduj całą stronę przez wsuwanie wszystkich słów instrukcji do strony, poczynając od najmłodszego bitu LSB pierwszej instrukcji na tej stronie i kończąc najstarszym bitem MSB ostatniej instrukcji na stronie.
  6. Wprowadź instrukcję JTAG PROG_COMMANDS.
  7. Zapisz stronę za pomocą instrukcji programowania 2g.
  8. Sprawdzaj zakończenie zapisu FLASH za pomocą instrukcji programowania 2h lub odczekaj czas tWLRH (3,7 ... 4,5 ms dla ATmega64).
  9. Powtarzaj kroki od 3 do 8 aż do zaprogramowania wszystkich danych.

Odczyt FLASH

  1. Wprowadź instrukcję JTAG  PROG_COMMANDS.
  2. Włącz odczyt z FLASH za pomocą instrukcji programowania 3a.
  3. Załaduj adres strony za pomocą instrukcji programowania 3b i 3c.
  4. Odczytaj dane za pomocą instrukcji programowania 3d.
  5. Powtarzaj kroki 3 i 4 aż do odczytania wszystkich danych.

Bardziej efektywny przesył danych można osiągnąć przy użyciu instrukcji PROG_PAGEREAD:

  1. Wprowadź instrukcję JTAG  PROG_COMMANDS.
  2. Włącz odczyt z FLASH za pomocą instrukcji programowania 3a.
  3. Załaduj adres strony za pomocą instrukcji programowania 3b i 3c. PCWORD (zobacz do tabelki) jest używane do adresowania wewnątrz jednej strony i musi być zapisane jako 0.
  4. Wprowadź instrukcję JTAG PROG_PAGEREAD.
  5. Odczytaj całą stronę przez wysuwanie na zewnątrz wszystkich słów instrukcji zawartych na tej stronie, rozpoczynając od najmłodszego bitu LSB pierwszej instrukcji i kończąć na najstarszym bicie MSB ostatniej instrukcji na stronie. Pamiętaj, że pierwsze 8 bitów wysunięte na zewnątrz należy zignorować.
  6. Wprowadź instrukcję JTAG PROG_COMMANDS.
  7. Powtarzaj kroki od 3 do 6 aż wszystkie dane będą odczytane.

Programowanie EEPROM

Przed programowaniem EEPROM musi zostać wykonane kasowanie układu. Zobacz do podrozdziału “Wykonanie kasowania układu mikrokontrolera".

  1. Wprowadź instrukcję JTAG PROG_COMMANDS.
  2. Włącz zapis do EEPROM za pomocą instrukcji programowania 4a.
  3. Załaduj górny bajt adresu za pomocą instrukcji programowania 4b.
  4. Załaduj dolny bajt adresu za pomocą instrukcji programowania 4c.
  5. Załaduj dane za pomocą instrukcji programowania 4d i 4e.
  6. Powtarzaj kroki 4 i 5 dla wszystkich bajtów danych na tej stronie.
  7. Zapisz dane za pomocą instrukcji programowania 4f.
  8. Sprawdzaj zakończenie zapisu EEPROM za pomocą instrukcji programowania 4g, lub odczekaj przez czas tWLRH (dla ATmega64 3,7...4,5 ms).
  9. Powtarzaj kroki od 3 do 8 aż do zaprogramowania wszystkich danych.

Zwróć uwagę, iż instrukcji PROG_PAGELOAD nie można używać w czasie programowania EEPROM.

Odczyt EEPROM

  1. Wprowadź instrukcję JTAG  PROG_COMMANDS.
  2. Włącz odczyt z EEPROM za pomocą instrukcji programowania 5a.
  3. Załaduj adres  za pomocą instrukcji programowania 5b i 5c.
  4. Odczytaj dane za pomocą instrukcji programowania 5d.
  5. Powtarzaj kroki 3 i 4 aż wszystkie dane zostaną odczytane.

Zwróć uwagę, iż instrukcji PROG_PAGEREAD nie można używać w czasie odczytywania EEPROM.

Programowanie bitów bezpiecznikowych

  1. Wprowadź instrukcję JTAG PROG_COMMANDS.
  2. Włącz zapis bitów bezpiecznikowych za pomocą instrukcji programowania 6a.
  3. Załaduj dolny bajt danych za pomocą instrukcji programowania 6b. Wartość bitu "0" zaprogramuje odpowiadający mu bit bezpiecznikowy, a "1" odprogramuje go.
  4. Zapisz rozszerzony bajt bitów bezpiecznikowych za pomocą instrukcji programowania 6c.
  5. Sprawdzaj zakończenie zapisu bitów bezpiecznikowych za pomocą instrukcji programowania 6d, albo odczekaj przez czas tWLRH (dla ATmega64 3,7...4,5 ms).
  6. Załaduj dolny bajt danych za pomocą instrukcji programowania 6e. Wartość bitu "0" zaprogramuje odpowiadający mu bit bezpiecznikowy, a "1" odprogramuje go.
  7. Zapisz górny bajt bitów bezpiecznikowych za pomocą instrukcji programowania 6f.
  8. Sprawdzaj zakończenie zapisu bitów bezpiecznikowych za pomocą instrukcji programowania 6g, albo odczekaj przez czas tWLRH (dla ATmega64 3,7...4,5 ms).
  9. Załaduj dolny bajt danych za pomocą instrukcji programowania 6h. Wartość bitu "0" zaprogramuje odpowiadający mu bit bezpiecznikowy, a "1" odprogramuje go.
  10. Zapisz dolny bajt bitów bezpiecznikowych za pomocą instrukcji programowania 6i.
  11. Sprawdzaj zakończenie zapisu bitów bezpiecznikowych za pomocą instrukcji programowania 6j, albo odczekaj przez czas tWLRH (dla ATmega64 3,7...4,5 ms).

Programowanie bitów blokujących

  1. Wprowadź instrukcję JTAG PROG_COMMANDS.
  2. Włącz zapis bitów blokujących za pomocą instrukcji programowania 7a.
  3. Załaduj dane za pomocą instrukcji programowania 7b. Wartość bitu "0" zaprogramuje odpowiadający mu bit blokujący, a "1" pozostawi go bez zmian.
  4. Zapisz bity blokujące za pomocą instrukcji programowania 7c.
  5. Sprawdzaj zakończenie zapisu bitów blokujących za pomocą instrukcji programowania 7d, albo odczekaj przez czas tWLRH (dla ATmega64 3,7...4,5 ms).

Odczyt bitów bezpiecznikowych i bitów blokujących

  1. Wprowadź instrukcję JTAG PROG_COMMANDS.
  2. Włącz odczyt bitów bezpiecznikowych/blokujących za pomocą instrukcji programowania 8a.
  3. Do odczytu wszystkich bitów bezpiecznikowych i bitów blokujących użyj instrukcji programowania 8f.

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.

Odczyt bajtów sygnatury

  1. Wprowadź instrukcję JTAG PROG_COMMANDS.
  2. Włącz odczyt bajtów sygnaturowych za pomocą instrukcji programowania 9a.
  3. Załaduj adres $00 za pomocą instrukcji programowania 9b.
  4. Odczytaj pierwszy bajt sygnatury za pomocą instrukcji programowania 9c.
  5. Powtarzaj kroki 3 i 4 z adresem $01 i z adresem $02, aby odczytać odpowiednio drugi i trzeci bajt sygnatury.

Odczyt bajtu kalibracyjnego

  1. Wprowadź instrukcję JTAG PROG_COMMANDS.
  2. Włącz odczyt bajtu kalibracyjnego za pomocą instrukcji programowania 10a.
  3. Załaduj adres $00 za pomocą instrukcji programowania 10b.
  4. Odczytaj bajt kalibracyjny za pomocą instrukcji programowania 10c.
Na początek:  podrozdziału   strony 

Zespół Przedmiotowy
Chemii-Fizyki-Informatyki

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