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

©2024 mgr Jerzy Wałaszek
I LO w Tarnowie

obrazek

Mikrokontrolery

ATmega640/1280/1281/2560/2561

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

ATmega640/1280/1281/2560/2561 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/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

Na początek:  podrozdziału   strony 

Bity bezpiecznikowe

Mikrokontroler ATmega640/1280/1281/2560/2561 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
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.

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

Na początek:  podrozdziału   strony 

Bajt kalibracyjny

Mikrokontroler ATmega640/1280/1281/2560/2561 posiada 8-bitową wartość kalibracyjną dla wewnętrznego oscylatora RC. Bajt kalibracyjny przebywa w górnym bajcie słowa spod adresu 0x000. Podczas resetu bajt ten jest automatycznie wpisywany do rejestru OSCCAL, aby zapewnić poprawną częstotliwość kalibrowanego oscylatora RC.

Na początek:  podrozdziału   strony 

Rozmiar strony

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

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 ATmega640/1280/1281/2560/2561. 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 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

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.
  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.
  5. Odczekaj co najmniej 50μs przed wesłaniem następnego rozkazu.

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ęć EEPROM 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 BS2, BS1 na “00”. To wybiera dolny bajt adresu.
  3. Ustaw DATA = dolny bajt adresu (0x00 - 0xFF).
  4. Wyślij dodatni impuls na końcówkę XTAL1. To załaduje dolny bajt adresu.

C. Ładowanie dolnego bajtu danych

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

D. Ładowanie górnego bajtu danych

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

E. Zapamiętanie danych

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

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

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

G. Ładowanie starszego bajtu adresu

  1. Ustaw XA1, XA0 na “00”. To włącza ładowanie adresu.
  2. Ustaw BS2, BS1 na “01”. 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.

G. Ładowanie rozszerzonego starszego bajtu adresu

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

I. Programowanie strony

  1. Ustaw BS2,BS1 na “00”.
  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.

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

K. 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 BS2,BS1 na “00”.
  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,BS2 na “00”.
  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 BS2,BS1 na "01". 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 BS2,BS1 na "00". 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 BS2,BS1 na "10". 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,BS1 na "00". 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. Jeśli jest programowany tryb LB3 (oba bity LB1 i LB2 programowane), to nie będzie możliwe programowanie bitów blokujących bootloadera w żadnym trybie programowania zewnętrznego.
  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 (kasowanie układu).

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, BS1 na “00”. Stan dolnego bajtu bitów bezpiecznikowych można teraz odczytać z linii DATA (“0” oznacza stan zaprogramowany).
  3. Ustaw OE na “0”, BS2, BS1 na “11”. Stan górnego bajtu bitów bezpiecznikowych można teraz odczytać z linii DATA (“0” oznacza stan zaprogramowany).
  4. Ustaw OE na “0”, BS2, BS1 na “10”. Stan rozszerzonego bajtu bitów bezpiecznikowych można teraz odczytać z linii DATA (“0” oznacza stan zaprogramowany).
  5. Ustaw OE na “0”, BS2, BS1 na “01”. 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 baju kalibracyjnego jest następujący:

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

Parametry programowania równoległego

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

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

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

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

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

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

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

Na początek:  podrozdziału   strony 

Ładowanie szeregowe

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)

Uwagi: 1. Jeśli mikrokontroler jest taktowany wewnętrznym oscylatorem, to nie ma potrzeby podłączania żadnego źródła zegarowego do końcówki XTAL1.
  2. VCC - 0,3 < AVCC < VCC + 0,3, jednakże AVCC powinno być zawsze w zakresie 1,8V - 5,5V. Przy programowaniu EEPROM cykl automatycznego kasowania jest wbudowany w samotaktującą się operację programowania (tylko przy trybie szeregowym) i nie ma potrzeby wcześniejszego wykonywania instrukcji Chip Erase. Operacja Chip Erase (kasowanie układu) zamienia zawartość każdej komórki w obu pamięciach FLASH i EEPROM na 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 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:

  1. Sekwencja włączania zasilania:
    Przyłóż napięcie zasilające pomiędzy końcówki VCC i GND. podczas gdy RESET i SCK są wysterowane stanem zero. W niektórych systemach programator nie gwarantuje utrzymywania SCK w stanie niskim podczas uruchamiania. W takich przypadkach na końcówkę RESET należy przesłać dodatni impuls o czasie trwania co najmniej dwóch taktów zegara mikroprocesora po ustawieniu SCK na "0".
  2. Odczekaj przynajmniej  20 ms i włącz programowanie szeregowe przez wysłanie szeregowej instrukcji włączania programowania na końcówkę PDI.
  3. Instrukcje programowania szeregowego nie będą działały, jeśli komunikacja nie jest zsynchronizowana. Przy zsynchronizowaniu drugi bajt (0x53) wróci jako echo przy wysyłaniu trzeciego bajtu instrukcji włączania programowania. Bez względu na poprawność tego echa należy wytransmitować wszystkie cztery bajty instrukcji. Jeśli nie wróciło echo 0x53, prześlij dodatni impuls na RESET i wyślij nowy rozkaz włączenia programowania.
  4. Pamięć FLASH jest programowana strona po stronie. Strona pamięci jest ładowana bajt po bajcie przez dostarczenie 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 liniami adresu 15:8. Przed wysłaniem tego rozkazu upewnij się, iż użyto instrukcji ładowania rozszerzonego górnego bajtu adresu (ang. Load Extended Address Byte) w celu zdefiniowania MSB adresu. Rozszerzony górny bajt adresu jest przechowywany aż do ponownego wydania tego rozkazu, to jest rozkaz musi być wydany tylko dla pierwszej strony oraz przy przekraczaniu granicy 64K słów. Jeśli nie jest używane sprawdzanie przez podgląd (RDY/BSY), to użytkownik musi odczekać co najmniej przez czas tWD_FLASH, przed zapisem następnej strony (zobacz do tabelki poniżej). Dostęp do szeregowego interfejsu programowania przed zakończeniem operacji zapisu FLASH może spowodować błędne zaprogramowanie.
  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 nie jest używany podgląd, użytkownik musi odczekać co najmniej przez czas tWD_EEPROM (tabelka poniżej) przed wysłaniem następnego bajtu. Jeśli układ mikrokontrolera został skasowany, to nie ma potrzeby programowania komórek, które mają zawierać wartość 0xFF.
  6. Każdą komórkę pamięci można zweryfikować za pomocą instrukcji odczytu, która zwraca zawartość z wybranego adresu na wyjściu szeregowym PDO. Przy odczycie pamięci FLASH użyj instrukcji ładowania rozszerzonego górnego bajtu adresu (ang. Load Extended Address Byte instruction) w celu zdefiniowania górnej części adresu, a której nie ma w instrukcji odczytu pamięci programu (ang. Read Program Memory instruction). Rozszerzony górny bajt adresu jest przechowywany aż do ponownego wydania tego rozkazu, to jest rozkaz musi być wydany tylko dla pierwszej strony oraz przy przekraczaniu granicy 64K słów.
  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.
Symbol Minimalne opóźnienie przy oczekiwaniu
tWD_FLASH 4.5ms
tWD_EEPROM 3.6ms
tWD_ERASE 9.0ms

Instrukcje programowania szeregowego (szesnastkowo)

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
Uwagi: 1. Nie wszystkie instrukcje dotyczą wszystkich mikrokontrolerów.
  2. a = adres.
  3. Stan "0" oznacza bit zaprogramowany, "1" niezaprogramowany.
  4. Aby zapewnić kompatybilność w przyszłości, nieużywane bity bezpiecznikowe  i blokujące powinny być niezaprogramowane ("1").

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.


Na początek:  podrozdziału   strony 

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

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:

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:

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, c = rozszerzone 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
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 bajtu danych FLASH

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.

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ń 0b1010_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ń 0b000_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 (ang. Chip Erase)

  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 ATmega640/1280/1281/2560/2561).

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 rozszerzony górny bajt adresu za pomocą instrukcji programowania 2b.
  4. Załaduj górny bajt adresu za pomocą instrukcji programowania 2c.
  5. Załaduj dolny bajt adresu za pomocą instrukcji programowania 2d.
  6. Ładuj dane za pomocą instrukcji programowania 2e, 2f i 2g.
  7. Powtarzaj kroki 5 i 6 dla wszystkich słów instrukcji na tej stronie.
  8. Zapisz stronę za pomocą instrukcji programowania 2h.
  9. Sprawdzaj zakończenie zapisu FLASH za pomocą instrukcji programowania 2i lub odczekaj czas tWLRH (3,7 ... 4,5 ms dla ATmega640/1280/1281/2560/2561).
  10. Powtarzaj kroki od 3 do 9 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, 2c i 2d. 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. Użyj stanu Update-DR do skopiowania zawartości rejestru bajtu danych FLASH do komórki strony FLASH i do automatycznego zwiększenia licznika programu przed każdym nowym słowem.
  6. Wprowadź instrukcję JTAG PROG_COMMANDS.
  7. Zapisz stronę za pomocą instrukcji programowania 2h.
  8. Sprawdzaj zakończenie zapisu FLASH za pomocą instrukcji programowania 2i lub odczekaj czas tWLRH (3,7 ... 4,5 ms dla ATmega640/1280/1281/2560/2561).
  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, 3c i 3d.
  4. Odczytaj dane za pomocą instrukcji programowania 3e.
  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, 3c i 3d. 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ąc na najstarszym bicie MSB ostatniej instrukcji na stronie. Stan Capture-DR zarówno przechwytuje dane z FLASH jak również automatycznie zwiększa stan licznika programu  przy każdym odczytanym słowie. Zauważ, iż stan Capture-DR występuje przed stanem shift-DR. Stąd pierwszy wysunięty bajt zawiera ważne dane.
  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 ATmega640/1280/1281/2560/2561 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 górny 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 ATmega640/1280/1281/2560/2561 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 dolny 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 ATmega640/1280/1281/2560/2561 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 ATmega640/1280/1281/2560/2561 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 8e.
    Aby odczytać tylko górny bajt bitów bezpiecznikowych, użyj instrukcji programowania 8b.
    Aby odczytać tylko dolny bajt bitów bezpiecznikowych, użyj instrukcji programowania 8c.
    Aby odczytać tylko bajt bitów blokujących, użyj instrukcji programowania 8d.

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 0x00 za pomocą instrukcji programowania 9b.
  4. Odczytaj pierwszy bajt sygnatury za pomocą instrukcji programowania 9c.
  5. Powtarzaj kroki 3 i 4 z adresem 0x01 i z adresem 0x02, 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 0x00 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
©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: i-lo@eduinf.waw.pl

Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.

Informacje dodatkowe.