Elektronika     Programator mikrokontrolerów AVR v2 (74HC244)        




Jest to klasyczny programator ISP (In-System Programming) 8-bitowych mikrokontrolerów AVR (kom-
patybilny z STK200/300), podłączany do portu równoległego (LPT) komputera PC i zasilany napięciem
Vcc = 2.7-5.5V z programowanego systemu. Został wykonany z pasywnych elementów SMD w obudo-
wach typu 1206 (notacja calowa) lub 3216 (notacja metryczna). Współpracuje z następującymi pro-
gramami sterującymi: "ISP Programmer 1.2.0.56", "AVRdude 6.3", "PonyProg2000 2.08d", "AVR-ISP
5.6.0.1" oraz "Bascom AVR 2.0.7.1".
Sercem konstrukcji jest układ 74HC244 (U1) zawierający 8-buforów trójstanowych, który zabezpiecza
port LPT komputera przed uszkodzeniem, separując go od programowanego systemu. Dodatkową och-
ronę stanowią rezystory R1-R10 i R13, które ograniczają maksymalny prąd Imax pobierany z wyprowa-
dzeń portu LPT oraz układu U1. Rezystory R1-R10 (330 omów) zapewniają optymalną wartość prądu
Imax dla całego zakresu napięcia zasilania Vcc (Imax = 8.18-16.66mA przy Vcc = 2.7-5.5V). Dla rezy-
stora R13 (220 omów) prąd ten jest nieco wyższy (Imax = 12.27-25mA), ponieważ jest to sygnał RESET
generowany przez 3 połączone równolegle bufory. Rezystory R14-R16 (47k) zapobiegają przypadko-
wemu uaktywnieniu sygnałów programujących (np. przy programatorze odłączonym od portu LPT, ale
podłączonym do systemu docelowego). Zamiast nich można użyć rezystorów 51-100k.
Ponieważ sygnały programujące SCK/MOSI/MISO są szybkozmienne, to pojawiają się w nich wysokie
częstotliwości składowe. Powodują one, że w długich i niedopasowanych falowo przewodach łączących
programator z systemem docelowym, pojawiają się odbicia. Mogą one spowodować nawet to, że pro-
gramowany mikrokontroler odbierze za dużo taktów zegarowych (SCK) i synchronizacja zostanie utra-
cona. Problem ten można rozwiązać na dwa sposoby. Pierwszy to używanie do programowania krótkich
przewodów, o długości do 30cm. Drugi polega na zmniejszeniu szybkości narastania i opadania zboczy
sygnałów programujących. Spowoduje to wyeliminowanie składowych wysokich częstotliwości i jedno-
cześnie odbić, które wystąpią tylko w bardzo długich przewodach. Do tego celu służą trzy filtry RC o
stałej czasowej T = 0.1us (T = R*C): R10+C4 (SCK), R9+C3 (MOSI) i R8+C2 (MISO). Rezystory R8-
R10 muszą być wlutowane, natomiast montaż kondensatorów C2-C4 (330pF) jest opcjonalny i zależy
od tego, czy potrzebujemy możliwości używania długich przewodów programujących. W praktyce kon-
ieczne jest filtrowanie tylko sygnału zegarowego SCK, ponieważ zmiany sygnałów MOSI/MISO nastę-
pują w takim momencie, że w chwili aktywnego zbocza sygnału SCK, jakiekolwiek odbicia nie mają na
nie wpływu. Jednak dodanie filtrów również dla sygnałów MOSI/MISO, zmniejszy zakłócenia genero-
wane podczas programowania (np. w paśmie radiowym). W modelowym programatorze zamontowałem
kondensatory C2-C4.
Rezystory R11/R12 (330 omów) ograniczają prąd przewodzenia If diod LED (If = 2.42-10.91mA przy Vcc
= 2.7-5.5V i napięciu przewodzenia Vf = 1.9V). W przypadku braku rezystorów 330 omów, zamiast nich
można użyć dwóch połączonych równolegle rezystorów (lutowanych jeden na drugim), o wartościach
1k/470 = 319.7 omów lub 680/680 = 340 omów.
Programator może być całkowicie odporny na odwrotne podłączenie polaryzacji napięcia zasilania Vcc
z programowanego systemu. Zabezpieczenie takie można zrealizować na dwa sposoby. Pierwszy to wl-
utowanie diody Shottky D1 (LL5817 w obudowie MELF/LL-41/DO-213AB lub LL103C w obudowie mini-
MELF/LL-34/DO-213AA/SOD-80). Wtedy nie należy montować tranzystora T1. Wadą diody D1 jest wpr-
owadzany przez nią spadek napięcia (przy prądzie 100mA: 0.25V dla LL5817 lub 0.38V dla LL103C).
Nie należy używać diod krzemowych, które wprowadzają duży spadek napięcia (przy prądzie 100mA:
0.93V dla LL4148/4448). Drugim i lepszym sposobem jest wlutowanie tranzystora MOSFET-P T1 (Si23-
05 w obudowie SOT-23/TO-236). Wtedy nie należy montować diody D1. Musi to być model, który zacz-
yna przewodzić już przy napięciu bramki Vgs = 1.8V - ma to znaczenie, jeśli programator będzie zasilany
niskim napięciem (np. 2.7V). Jako zamienników T1 można użyć, m.in. następujących tranzystorów: DM-
P1045, FDN306, Si2315, IRLML6401. Zaletą tranzystora T1 jest wprowadzany przez niego praktycznie
zerowy spadek napięcia.
W przypadku braku odpowiedniej diody D1 lub tranzystora T1 można całkowicie zrezygnować z tego za-
bezpieczenia - wtedy trzeba wlutować zworkę zamiast diody D1. Nie polecam takiego rozwiązania, gdyż
pomylenie polaryzacji napięcia zasilania Vcc, spowoduje uszkodzenie układu U1 (potencjalnie także
portu LPT). W modelowym programatorze zamontowałem diodę D1, ale przeprowadziłem również testy
z tranzystorem T1 oraz bez żadnego zabezpieczenia (zworka zamiast diody D1).
Zielona dioda (LED1) sygnalizuje obecność napięcia zasilania Vcc, a czerwona (LED2) transmisję dany-
ch podczas programowania. Sygnały programujące są wyprowadzone na standardowe 10-pinowe złą-
cze ISP (CON2) i powinny być połączone z systemem docelowym przewodami (taśmą), o długości do
30cm. Dłuższe przewody mogą powodować problemy z komunikacją i błędy podczas przesyłania dany-
ch (chyba że wlutujemy opcjonalne kondensatory C2-C4). Wszystkie wyprowadzenia GND powinny być
połączone z masą systemu docelowego, aby zapewnić właściwe ekranowanie sygnałów programują-cych.
Wyprowadzenia 2/12 i 3/11 w złączu portu LPT (CON1) są ze sobą połączone (zwarte) co powoduje, że
programator jest rozpoznawany przez program sterujący, jako model odpowiednio STK200 i STK300.
W stanie spoczynku (świeci dioda LED1) modelowy programator pobierał prąd 2.36-11.89mA (przy Vcc
= 2.7-5.5V). Montaż należy rozpocząć od wlutowania wszystkich elementów SMD (Rx/C1, T1/D1), a na-
stępnie podstawki U1, diod LEDx i złącz CONx. Programator zmontowałem na płytce jednostronnej
o wymiarach 53x53mm, wykonanej metodą transferu chemicznego.

Informacje dodatkowe
Port LPT nie został zaprojektowany i przygotowany do podłączania urządzeń przy włączonym zasilaniu komputera. Takie
działanie może potencjalnie doprowadzić do jego uszkodzenia. Prawidłowo i zgodnie z zasadami bezpieczeństwa, pro-
gramator powinno się podłączać do portu LPT wyłączonego komputera, a następnie włączyć komputer i podłączyć pro-
gramator do systemu docelowego. Przy prawidłowym odłączaniu, najpierw powinno się odłączyć programator od sys-
temu docelowego, wyłączyć komputer i odłączyć programator od portu LPT.
W praktyce mało kto postępuje w taki sposób i programator podłącza się do portu LPT włączonego komputera, a nastę-
pnie do systemu docelowego. Przy odłączaniu, najpierw odłącza się programator od systemu docelowego, a później od
portu LPT. Dzięki zastosowaniu rezystorów zabezpieczających na wszystkich liniach, podłączanie/odłączanie programa-
tora do/od portu LPT włączonego komputera jest nieco bezpieczniejsze.
Ponadto należy unikać sytuacji, gdy programator jest zasilany z systemu docelowego i jednocześnie podłączony do portu
LPT wyłączonego komputera. Może to spowodować przepływ prądu przez linię ACK portu LPT i jej uszkodzenie (chroni
przed tym rezystor R7).
Porty LPT w większości aktualnie dostępnych komputerów pracują w standardzie 3.3V zamiast typowych 5V (TTL). Moż-
na to sprawdzić mierząc napięcie na wyprowadzeniu nr 1 portu LPT: 3.3-4.4V = 3.3V, 4.7-5.0V = 5V. W przypadku wię-
kszości starych sprzętów (np. drukarek, skanerów) nie powoduje to żadnych problemów w ich działaniu. Programator
również powinien działać prawidłowo, bo ma pewne możliwości konwertowania poziomu napięć sygnałów wejściowych.
Każdy bufor układu U1 posiada na wejściu dwie diody zabezpieczające (clamping diodes) o spadku napięcia 0.5V, któ-
re chronią go przed za wysokim/niskim napięciem wejściowym Vin w stosunku do jego napięcia zasilania Vcc. Utrzymu-
ją one wszystkie sygnały trafiające do bufora w zakresie jego maksymalnych napięć wejściowych (od GND-0.5V do Vcc
+0.5V), wymienionych w nocie katalogowej. Katoda górnej diody zabezpieczającej jest połączona z plusem napięcia za-
silania Vcc, a jej anoda do sygnału wejściowego Vin. Z kolei katoda dolnej diody zabezpieczającej jest połączona z syg-
nałem wejściowym Vin, a jej anoda z masą zasilania (GND).
Podanie napięcia Vin o wartości wyższej niż Vcc+0.5V, spowoduje przepływ prądu przez górną diodę zabezpieczającą
do plusa zasilania, a w rezultacie zmniejszenie napięcia Vin do wartości Vcc+0.5V. Z kolei podanie napięcia Vin o war-
tości niższej niż GND-0.5V, spowoduje przepływ prądu przez dolną diodę zabezpieczającą do masy zasilania, a w rezu-
ltacie zmniejszenie napięcia Vin do wartości GND-0.5V. Dzięki temu napięcie na wyjściu bufora utrzymuje się w zakre-
sie od GND (0V) do Vcc.
Jedynym ograniczeniem jest maksymalny prąd wejściowy Iin płynący przez wewnętrzne diody zabezpieczające (clamping
current), który wynosi 20mA. Większy prąd spowoduje uszkodzenie diody zabezpieczającej i wejścia bufora. Prąd ten
jest ograniczany przez rezystory R1-R6.
Konwersja poziomu napięć w programatorze może zachodzić w dwóch przypadkach. Pierwszy występuje, gdy port LPT
generuje sygnały wyjściowe o napięciu wyższym (3.3/5V), niż napięcie zasilania Vcc układu U1 (od 2.7V). Wtedy górna
dioda zabezpieczająca bufor zaczyna przewodzić przy napięciu Vin wyższym niż Vcc+0.5V i płynie przez nią prąd Iin o
wartości Vin-(Vcc+0.5V)/330 (Iin = 0.3-5.45mA przy Vcc = 2.7V i Vin = 3.3-5V). Dlatego napięcie na wyjściu bufora U1
nie będzie wyższe, niż jego napięcie zasilania Vcc.
Drugi przypadek występuje, gdy port LPT generuje sygnały wyjściowe o napięciu niższym (3.3V), niż napięcie zasilania
Vcc układu U1 (do 5.5V). Wtedy to, czy bufor poprawnie zinterpretuje napięcie sygnału wejściowego Vin, zależy od jego
napięcia zasilania Vcc. Dzieje się tak dlatego, że każdy bufor układu U1 jest wykonany w technologii CMOS i wartości
napięć odpowiadające progom wykrywanych przez niego stanów logicznych, są bezpośrednio zależne od jego napięcia
zasilania Vcc. Według noty katalogowej, maksymalne wejściowe napięcie niskiego stanu logicznego (VILmax) wynosi
0.5/0.9/1.35/1.8V, a minimalne wejściowe napięcie wysokiego stanu logicznego (VIHmin) wynosi 1.5/2.1/3.15/4.2V -
przy Vcc = 2.0/3.0/4.5/6.0V. Wartości te odpowiadają ogólnym zależnościom, które dotyczą poziomu stanów logicznych
układów CMOS: VILmax = 0.3*Vcc, VIHmin = 0.7*Vcc. Poniższe wykresy przedstawiają dokładnie te zależności dla
układu 74HC244.





Bufor U1 prawidłowo wykryje niski stan logiczny w całym zakresie swojego napięcia zasilania Vcc = 2.7-5.5V. Natomiast
problemy mogą wystąpić przy wykrywaniu wysokiego stanu logicznego. Otóż przy Vcc = 4.75-5.5V napięcie Vin (VIHmin)
musi wynosić 3.325-3.85V, co przy porcie LPT pracującym w standardzie 3.3V nie będzie osiągalne i programator mo-
że nie działać.
Nawet, jeśli port LPT i programator będą pracować przy podobnym napięciu (4.5-5.5V), to i tak teoretycznie mogą wy-
stąpić problemy z wykrywaniem przez bufor wysokiego stanu logicznego (3.15-3.85V). Wszystko zależy od poziomu na-
pięcia sygnałów generowanych przez port LPT. W starych komputerach sygnały te pochodzą z wyjść układów TTL 5V,
których wysoki stan logiczny może teoretycznie wynosić minimalnie 2.4V.
W praktyce programowanie na porcie LPT pracującym w standardzie 3.3/5V, przebiegało bez problemów przy napięciu
zasilania Vcc = 2.7-5.5V (z zamontowaną diodą D1/tranzystorem T1 oraz bez żadnego zabezpieczenia). Zalecany tryb
pracy portu LPT to ECP (Extended Capability Port) lub EPP (Enhanced Parallel Port). W praktyce nie zauważyłem żad-
nych problemów, gdy port pracował w trybie SPP (Standard Parallel Port)/Compatibility Mode.
W razie problemów, należy zmienić w BIOS'ie tryb pracy portu LPT na "Bi-Directional". System Windows XP może spra-
wdzać co jakiś czas, czy do portu LPT nie podłączono drukarki. Sprawdzanie to może powodować nieprawidłową pracę
programatora, podłączonego do tego portu. Aby wyłączyć ciągłe sprawdzanie portu LPT, należy zmodyfikować następu-
jącą wartość w rejestrze systemowym:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Parport\Parameters]
"DisableWarmPoll"=dword:00000001

Zmiana ta wymaga ponownego uruchomienia komputera, ale dzięki niej Windows XP sprawdzi obecność drukarki tylko
raz, podczas startu systemu (nie wykryje automatycznie drukarki, podłączonej do portu LPT już po załadowaniu systemu).
Aby włączyć ciągłe sprawdzanie portu LPT, należy temu kluczowi ustawić wartość 0 i zrestartować komputer.


Konfiguracja programu ISP Programmer 1.2.0.56
Po instalacji uruchamiamy program. Pojawi się jego główne okno, w którym naciskamy przycisk "Setup". W nowym okie-
nku "ISP Programmer Setup" z rozwijalnej listy "ISP cable pinout:" wybieramy pozycję "STK200/300 Evaluation Board",
a na liście "Port with ISP programmer:" zaznaczamy numer/adres portu równoległego, do którego jest podłączony pro-
gramator. Upewniamy się, że pole wyboru "Inverted RESET" nie jest zaznaczone, a następnie zamykamy okienko naci-
skając przycisk "OK".
Pole wyboru "Autodetect:" musi być zaznaczone, a na rozwijalnej liście obok niego wybrana pozycja "AVR". Druga roz-
wijalna lista "Hz", służy do ustawiania szybkości transmisji danych (16kHz-24MHz). W przypadku braku komunikacji z mi-
krokontrolerem lub błędów podczas programowania, należy wybrać niższą częstotliwość z tej listy. Szybkość transmisji
danych nie powinna być większa niż 1/4 częstotliwości, z jaką pracuje programowany mikrokontroler. Po prawidłowym
podłączeniu programatora do systemu docelowego można nacisnąć przycisk "Read signature", co spowoduje próbę
rozpoznania mikrokontrolera przez odczytanie jego sygnatury. Jeśli nie uda się nawiązać komunikacji lub rozpoznać od-
czytanej sygnatury, to w linii "Device signature:" zostanie wyświetlony napis "NOT KNOWN (FF, FF, FF)", zawierający
wartość odczytanej sygnatury. Natomiast, jeśli uda się rozpoznać sygnaturę mikrokontrolera, to pojawią się podstawowe
informacje o nim (model, pojemność pamięci FLASH i EEPROM). Wtedy uaktywnią się też przyciski, umożliwiające wy-
konywanie takich operacji, jak: odczyt ("Read Flash"/"Read EEPROM"), zapis ("Pgm Flash"/"Pgm EEPROM"), weryfi-
kacja ("Verify Flash"/"Verify EEPROM") i kasowanie ("Erase") pamięci FLASH/EEPROM mikrokontrolera.
Przed odczytem/zapisem/weryfikacją pamięci należy najpierw wybrać pliki, w których zostaną zapisane dane odczytane
z pamięci FLASH/EEPROM (linia "File to read Flash into:"/"File to read EEPROM into:") oraz pliki, które zawierają dane
do zaprogramowania/weryfikacji pamięci FLASH/EEPROM (linia "File for programming Flash:"/"File for programming
EEPROM:") mikrokontrolera.
Program obsługuje następujące formaty plików wejściowych/wyjściowych: szesnastkowe "Intel hex (.hex)", "EEPROM
Intel hex (.eep)", "GCC Intel hex (.rom)", "SDCC Intel hex (.ihx)" oraz pliki binarne. Przycisk "Erase & Program All" służy
do automatycznego kasowania, a następnie programowania z weryfikacją pamięci FLASH/EEPROM mikrokontrolera
wybranymi wcześniej plikami.
Po naciśnięciu przycisku "Fuse and lock bits", pojawi się nowe okno służące do odczytywania, modyfikowania i progra-
mowania ustawień konfiguracyjnych mikrokontrolera, czyli wartości fuse/lock bajtów. Na samej górze znajduje się grupa
"Lock bits", która zawiera opisane pola wyboru do ustawiania wartości poszczególnych lock bitów w lock bajcie. Obok
nich jest przycisk "Program" służący do zaprogramowania w mikrokontrolerze aktualnie ustawionej wartości lock bajtu,
która jest wyświetlana nad tym przyciskiem w postaci szesnastkowej.
Niżej znajduje się grupa "Fuse bits" zawierająca trzy linie opisanych przycisków, służących do ustawiania wartości po-
szczególnych fuse bitów w trzech fuse bajtach (w kolejności od góry): Fuse Low, Fuse High i Fuse Extended. W każdej
linii jest przycisk "Program" służący do zaprogramowania w mikrokontrolerze aktualnie ustawionej wartości danego fuse
bajtu, która jest wyświetlana nad tym przyciskiem w postaci szesnastkowej.
Jeśli poszczególny fuse/lock bit nie jest używany w danym mikrokontrolerze, nie może być lub dla bezpieczeństwa nie
powinien być zmieniany przez interfejs programowania ISP, to jego pole wyboru/przycisk nie będzie aktywny. Jeśli okre-
ślony fuse bajt w ogóle nie jest wykorzystywany w danym mikrokontrolerze, to wszystkie dotyczące go przyciski nie będą
aktywne.
Niżej znajdują się przyciski "Load fuses & locks from file..."/"Save fuses & locks to file...", które odczytują/zapisują z/do
pliku tekstowego sygnaturę mikrokontrolera oraz wartości jego fuse/lock bajtów. Przycisk "Load fuses & locks from file
and program..." służy do automatycznego odczytania sygnatury mikrokontrolera oraz wartości jego fuse/lock bajtów z
pliku, a następnie ich zaprogramowania. Jeśli sygnatura odczytana z pliku nie będzie identyczna z sygnaturą aktualnie
używanego mikrokontrolera, to pojawi się komunikat o błędzie z informacją "This file contains data for ... instead of ...".
Wartości fuse/lock bajtów odczytane z pliku, są automatycznie ustawiane w oknie. Przycisk "Program fuses & locks"
programuje w mikrokontrolerze aktualnie ustawione wartości wszystkich fuse/lock bajtów. W grupie "Internal oscillator
calibration bytes", są wyświetlane wartości do 4 bajtów kalibracyjnych (jeśli dany mikrokontroler ich używa), które służą
do dostrajania częstotliwości pracy wewnętrznego oscylatora RC. Okno fuse/lock bajtów zamykamy naciskając przycisk
"Exit".
Przyciski "Reset ON" i "Reset OFF" umożliwiają włączanie/wyłączanie sygnału RESET na złączu ISP programatora. Ak-
tualny stan tego sygnału jest wyświetlany pod napisem "Current RESET status:". Jeśli widnieje tam zielony napis "OFF"
oznacza to, że sygnał RESET jest wyłączony (zawsze po uruchomieniu programu). Jeśli natomiast widnieje tam czerwo-
ny napis "ON", to sygnał RESET jest włączony (programowany mikrokontroler jest zatrzymany). Przycisk "Restart" służy
do restartowania programu (działa, jak zamknięcie i ponowne jego uruchomienie). Przyciski "Read User Sig", "Pgm
User Sig" i "Verify User Sig" nie są aktywne, a wybieranie plików "File to read User Sig. into:" i "File for programming
User Sig.:" nie jest konieczne przy programowaniu mikrokontrolerów AVR, bo nie posiadają one sygnatury użytkownika.


Konfiguracja programu AVRdude 6.3
Do prawidłowej pracy programatora w systemie Windows XP lub nowszym, konieczne jest zainstalowanie sterownika
GiveIO. Służy do tego plik wsadowy "install.bat" z katalogu "GiveIO", który znajduje się w archiwum. Natomiast plik wsa-
dowy "remove.bat" usuwa z systemu sterownik GiveIO. Sterownik jest domyślnie instalowany w katalogu "C:\Windows\
system32\", który można zmienić edytując wspomniane pliki wsadowe. Aby zainstalować sterownik GiveIO, należy po-
siadać uprawnienia administratora systemu Windows.
Program AVRdude nie wymaga instalacji, jednak do jego działania niezbędna jest obecność biblioteki "libusb0.dll" w
systemie lub w jego głównym katalogu. W przeciwnym razie pojawi się komunikat systemu Windows, informujący o jej
braku. Dwie wersje tej biblioteki znajdują się w archiwum w katalogu "LibUSB\1.2.6.0" oraz "LibUSB\1.2.7.1". Starsza
wersja 1.2.6.0 działa w systemie Windows 2000/XP/Vista/7/8/10, a nowsza 1.2.7.1 nie działa na Windows 2000, ale
zapewnia lepszą obsługę systemu Windows 8/10.
Po instalacji sterownika GiveIO oraz biblioteki "libusb0.dll" uruchamiamy konsolę wiersza poleceń, przechodzimy do ka-
talogu z programem AVRdude i uruchamiamy go wpisując jego nazwę. Wyświetli się lista wszystkich poleceń programu:

-b [baud] - zmienia domyślną szybkość transmisji danych (wartość w B/s) podczas programowania przez port szere-
gowy RS-232, która jest zdefiniowana w pliku konfiguracyjnym "avrdude.conf" dla programatorów podłączanych do tego
portu.

-B [pclk] - ustawia okres (wartość w mikrosekundach) lub częstotliwość (wartość zakończona "Hz"/"kHz"/"MHz") sygnału
zegarowego, taktującego transmisję danych podczas programowania. W przypadku szybkiego komputera PC i/lub pro-
gramowania mikrokontrolera pracującego z niską częstotliwością (np. 128 kHz), konieczne może być podanie większej
wartości okresu lub mniejszej częstotliwości. Szybkość transmisji danych nie powinna być większa niż 1/4 częstotliwości,
z jaką pracuje programowany mikrokontroler. Polecenie to jest obsługiwane tylko przez niektóre programatory (np. AVR
Dragon, JTAG ICE, PICkit2, USBasp).

-c [prog] - określa rodzaj używanego programatora. Listę wszystkich obsługiwanych programatorów można uzyskać,
wpisując polecenie "avrdude -c ?". Są one zdefiniowane w pliku konfiguracyjnym "avrdude.conf", który jest zwykłym
plikiem tekstowym. Można go edytować i dodać obsługę nowego programatora.

-C [file] - definiuje ścieżkę dostępu do pliku konfiguracyjnego "avrdude.conf" (domyślnie znajduje się on w jednym
katalogu razem z programem).

-D - wyłącza kasowanie całej pamięci FLASH mikrokontrolera AT90/ATtiny/ATmega przed jej programowaniem. Domy-
ślnie w przypadku tych mikrokontrolerów jest ona automatycznie kasowana przed zapisem do niej danych. Mikrokontro-
lery ATxmega automatycznie kasują tylko strony pamięci FLASH, do których są zapisywane dane (zawartość pozosta-
łych stron nie zmienia się).

-e - kasuje całą pamięć FLASH, EEPROM i lock bity mikrokontrolera AT90/ATtiny/ATmega (chip erase) przed prog-
ramowaniem. Domyślnie w przypadku tych mikrokontrolerów automatycznie jest kasowana tylko cała pamięć FLASH
przed zapisem do niej danych. Mikrokontrolery ATxmega automatycznie kasują tylko strony pamięci FLASH, do których
są zapisywane dane (zawartość pozostałych stron nie zmienia się). Przy programowaniu pamięci EEPROM mikrokon-
troler automatycznie kasuje tylko te jej komórki, do których są zapisywane dane (zawartość pozostałych komórek nie
zmienia się).

-E [exit] - określa stan linii portu równoległego (LPT) komputera po zakończeniu programowania (wyjściu z programu).
Domyślnie linie te są zostawiane w takim samym stanie, w jakim znajdowały się przed rozpoczęciem programowania
(uruchomieniem programu). Można wymusić ustawienie określonych stanów logicznych na liniach portu LPT, używając
następujących parametrów: "reset" - linia z sygnałem RESET pozostanie aktywna (stan niski), "noreset" - linia z syg-
nałem RESET nie będzie aktywna (stan wysoki), "vcc" - linie mogące zasilać mikrokontroler pozostaną aktywne (stan
wysoki), "novcc" - linie mogące zasilać mikrokontroler nie będą aktywne (stan niski), "d_high" - linie danych (8-bitów)
pozostaną aktywne (stan wysoki), "d_low" - linie danych (8-bitów) nie będą aktywne (stan niski). W jednej linii polecenia
można użyć kilku parametrów "exit" jednocześnie - wtedy trzeba je oddzielić przecinkami.

-F - wyłącza sprawdzanie, czy sygnatura odczytana z programowanego mikrokontrolera zgadza się z sygnaturą modelu,
który został podany w składni polecenia "-p [part]".

-i [dlay] - ustawia opóźnienie (wartość w mikrosekundach) pomiędzy zmianami stanu kolejnych transmitowanych bitów
podczas programowania. W przypadku szybkiego komputera PC i/lub programowania mikrokontrolera pracującego z
niską częstotliwością (np. 128 kHz), konieczne może być podanie większej wartości opóźnienia. Szybkość transmisji
danych nie powinna być większa niż 1/4 częstotliwości, z jaką pracuje programowany mikrokontroler. W przypadku wy-
stępowania błędów podczas programowania, należy zaczynać od małej wartości opóźnienia (np. 50).

-l [file] - komunikaty programu będą zapisywane do pliku o podanej ścieżce dostępu, zamiast wyświetlania w konsoli
wiersza poleceń. Wstępne komunikaty diagnostyczne związane z przetwarzaniem składni poleceń programu, nadal
będą wyświetlane.

-n - wyłącza zapis jakichkolwiek danych do programowanego mikrokontrolera (przydatne do testów).

-O - przeprowadza kalibrację wewnętrznego oscylatora RC programowanego mikrokontrolera, zgodnie z notą aplika-
cyjną AVR053 firmy Atmel. Polecenie jest obsługiwane tylko przez programatory STK500 v2, AVRISP mkII i JTAG ICE
mkII. Wynik kalibracji zostanie zapisany w komórce pamięci EEPROM o adresie 0.

-p [part] - określa model programowanego mikrokontrolera. Listę wszystkich obsługiwanych modeli można uzyskać,
wpisując polecenie "avrdude -p ?". Są one zdefiniowane w pliku konfiguracyjnym "avrdude.conf", który jest zwykłym
plikiem tekstowym. Można go edytować i dodać obsługę brakującego modelu mikrokontrolera na podstawie danych
z jego noty aplikacyjnej.

-P [port] - określa rodzaj portu, do którego jest podłączony programator. Może to być port: szeregowy (np. "com1",
"com2"), równoległy (np. "lpt1" = "0x378", "lpt2" = "0x278", "lpt3" = "0x3BC") lub USB (np. "usb").

-q - wyłącza wyświetlanie informacji o postępie programowania mikrokontrolera. Jedno polecenie "-q" wyłącza pasek
postępu, a dwa polecenia "-q -q" wyłączają również pozostałe informacje.

-s - wyłącza wyświetlanie komunikatów trybu bezpiecznego (safemode). Jeśli tryb ten jest włączony i wykryje, że wartość
jakiegoś fuse bajtu zmieniła się po zakończeniu programowania, to zostanie wyświetlony komunikat z pytaniem, czy
przywrócić początkowe wartości fuse bitów. Użycie tego polecenia spowoduje, że komunikat nie zostanie wyświetlony,
a początkowe wartości fuse bitów zostaną automatycznie przywrócone.

-t - włącza program w interaktywnym trybie terminala. Przy użyciu prostych poleceń umożliwia on wyświetlenie/modyfi-
kację zawartości pamięci przy użyciu znaków ASCII, wyświetlenie sygnatury/parametrów programowanego mikrokon-
trolera, jego kasowanie (chip erase) oraz wysyłanie pojedynczych rozkazów programujących.

-u - wyłącza sprawdzanie, czy odczytane przed programowaniem fuse bajty, mają takie same wartości po zakończeniu
programowania. Jest to tzw. tryb bezpieczny (safemode), który zapobiega przypadkowej zmianie wartości fuse bitów.
Polecenie to musi być użyte, jeśli programujemy fuse bajty. Chyba, że w pliku konfiguracyjnym znajduje się linia "defa-
ult_safemode = no;", która wyłącza tryb bezpieczny. Wtedy użycie polecenia "-u" spowoduje efekt odwrotny, czyli włącze-
nie tego trybu. Tryb bezpieczny jest zawsze wyłączony przy programowaniu mikrokontrolerów z interfejsem TPI, ATxmega
oraz AVR32. W praktyce okazało się, że tryb bezpieczny jest wyłączony po uruchomieniu programu z poziomu konsoli
wiersza poleceń.

-U [mem:op:file:for] - wykonuje określoną operację na danym typie pamięci programowanego mikrokontrolera. W jed-
nej linii można użyć wielu takich poleceń, operujących na różnych typach pamięci (zostaną one wykonane w kolejności
ich wpisania). Parametr "mem" określa typ pamięci: "flash" - pamięć FLASH, "eeprom" - pamięć EEPROM, "fuse" -
fuse bity w mikrokontrolerze posiadającym tylko jeden fuse bajt, "lfuse" - fuse bajt LOW, "hfuse" - fuse bajt HIGH, "efuse"
- fuse bajt EXTENDED, "lock" - lock bajt, "calibration" - jeden lub więcej bajtów kalibracyjnych wewnętrznego oscylatora
RC, "signature" - trzy bajty z sygnaturą mikrokontrolera, "fuseN" - fuse bajt numer N w mikrokontrolerze ATxmega, "boot"
- botowalny obszar w pamięci FLASH mikrokontrolera ATxmega, "application" - obszar programu w pamięci FLASH
mikrokontrolera ATxmega, "apptable" - obszar tabeli programu w pamięci FLASH mikrokontrolera ATxmega, "prodsig"
- sygnatura i bajty kalibracyjne mikrokontrolera ATxmega, "usersig" - sygnatura użytkownika mikrokontrolera ATxmega.
Listę wszystkich typów pamięci, które posiada dany mikrokontroler można uzyskać dodając do linii polecenie "-v".
Parametr "op" określa operację do wykonania: "r" - odczyt pamięci i zapis jej zawartości do pliku "file" (read), "w" - od-
czyt pliku "file" (lub danych bezpośrednich) i zapis jego zawartości do pamięci (write), "v" - odczyt pamięci i pliku "file"
(lub danych bezpośrednich), a następnie porównanie ich zawartości (verify).
Parametr "file" określa ścieżkę dostępu do pliku wejściowego/wyjściowego lub zawiera dane bezpośrednie. Parametr
"for" jest opcjonalny i określa format tego pliku, a także umożliwia wprowadzanie danych bezpośrednich: "i" - plik szes-
nastkowy Intel Hex, "s" - plik szesnastkowy Motorola S-record, "r" - plik binarny, "e" - plik linkera ELF (tylko jako plik wej-
ściowy), "a" - automatyczne wykrywanie formatu pliku wejściowego, "d" - plik z jedną linią wartości dziesiętnych (deci-
mal) oddzielonych przecinkami (tylko jako plik wyjściowy), "h" - plik z jedną linią wartości szesnastkowych (hexadecimal)
z przedrostkiem "0x" i oddzielonych przecinkami (tylko jako plik wyjściowy), "o" - plik z jedną linią wartości ósemkowych
(octal) z przedrostkiem "0" (dla wartości większych niż 7) i oddzielonych przecinkami (tylko jako plik wyjściowy), "b" - plik
z jedną linią wartości dwójkowych (binary) z przedrostkiem "0b" i oddzielonych przecinkami (tylko jako plik wyjściowy),
"m" - dane bezpośrednie, czyli wartości bajtów wpisywane jako parametr "file" i oddzielone przecinkami (w przypadku
zapisu do pamięci FLASH ich liczba musi być parzysta). Wartość z przedrostkiem "0x"/"0" jest traktowana jako szesna-
stkowa/ósemkowa, a bez przedrostka jako dziesiętna.
Domyślnie format "for" plików wejściowych jest wykrywany automatycznie ("a"), a pliki wyjściowe są zapisywane jako
dane binarne ("r"). Jeśli ścieżka dostępu "file" do pliku wejściowego/wyjściowego zawiera dwukropek ":", to parametr
"for" nie jest już opcjonalny i musi zostać podany, aby program prawidłowo zinterpretował wszystkie parametry pole-
cenia.
Po odczycie pamięci FLASH plik wyjściowy z jej zawartością nie będzie zawierał końcowych, pustych bajtów o warto-
ści $FF. Dlatego jeśli cała odczytywana pamięć FLASH jest wykasowana, to plik wyjściowy będzie pusty (plik binarny
o rozmiarze 0 bajtów). Polecenie "-U file" jest równoznaczne z poleceniem "-U flash:w:file:a".

-v - włącza wyświetlanie dodatkowych informacji i komunikatów.

-V - wyłącza weryfikację danych zapisanych w pamięci mikrokontrolera. Aby to polecenie działało musi zostać
wpisane przed poleceniem zapisującym dane do pamięci.

-x [para] - przekazuje dodatkowe i specyficzne dla danego programatora parametry. Programatory obsługujące
dodatkowe ustawienia: JTAG ICE mkII, JTAG ICE 3, AVR Dragon, AVR910, Bus Pirate, Wiring, PICkit2.

Poniższe przykłady przedstawiają odczyt/zapis różnych typów pamięci mikrokontrolera ATmega48, programatorem
podłączonym do portu równoległego LPT1:

1. Odczyt pamięci FLASH do pliku binarnego:
avrdude -p m48 -c pony-stk200 -P lpt1 -U flash:r:file:r
2. Odczyt pamięci EEPROM do pliku szesnastkowego Intel Hex:
avrdude -p m48 -c pony-stk200 -P lpt1 -U eeprom:r:file:i
3. Odczyt fuse bajtu LOW do pliku dwójkowego (ASCII):
avrdude -p m48 -c pony-stk200 -P lpt1 -U lfuse:r:file:b
4. Odczyt sygnatury do pliku szesnastkowego (ASCII):
avrdude -p m48 -c pony-stk200 -P lpt1 -U signature:r:file:h
5. Zapis fuse bajtu LOW z danych bezpośrednich:
avrdude -p m48 -c pony-stk200 -P lpt1 -U lfuse:w:0x62:m
6. Zapis pamięci EEPROM z pliku szesnastkowego Intel Hex:
avrdude -p m48 -c pony-stk200 -P lpt1 -U eeprom:w:file
7. Zapis pamięci FLASH z pliku binarnego przy opóźnieniu 50us:
avrdude -p m48 -c pony-stk200 -P lpt1 -i 50 -U flash:w:file
8. Zapis pamięci FLASH z danych bezpośrednich bez weryfikacji:
avrdude -p m48 -c pony-stk200 -P lpt1 -V -U flash:w:1,2,3,4:m
9. Wyświetlenie szczegółowych informacji o programatorze i mikrokontrolerze:
avrdude -p m48 -c pony-stk200 -P lpt1 -v
10. Kasowanie całej pamięci FLASH, EEPROM i lock bitów:
avrdude -p m48 -c pony-stk200 -P lpt1 -e
Jak widać programator jest zdefiniowany w pliku konfiguracyjnym jako "pony-stk200". Zamiast niego można użyć pro-
gramatora "stk200", ale nie obsługuje on sygnału odpowiedzialnego za świecenie diody (LED2) podczas transmisji
danych. Poniżej znajdują się najczęściej występujące komunikaty o błędach:

1. Pojawia się przy braku zainstalowanego sterownika GiveIO:
avrdude: can't open device giveio
avrdude: failed to open parallel port lpt1.
2. Pojawia się przy błędnym podłączeniu programowanego mikrokontrolera lub braku jego zasilania:
avrdude: AVR device not responding
avrdude: initialization failed, rc=-1
         Double check connections and try again, or use -F to override
         this check.
3. Pojawia się, gdy sygnatura odczytana z programowanego mikrokontrolera jest inna niż sygnatura
    modelu, który został podany w składni polecenia "-p [part]":
avrdude: Device signature = 0x1e9205 (probably m48)
avrdude: Expected signature for ATmega88 is 1E 93 0A
         Double check chip, or use -F to override this check.


SPIS ELEMENTÓW:

Rezystory:
R1-R12 - 330
R13 - 220
R14-R16 - 47k

Kondensatory:
C1 - 100n
C2-C4 - 330p (opcjonalny)
Diody:
D1 - LL5817 (opcjonalna)
LED1 - zielona 5 mm
LED2 - czerwona 5 mm

Tranzystory:
T1 - Si2305 (opcjonalny)
Układy scalone:
U1 - 74HC244

Złącza:
CON1 - DB25M kątowe (męskie)
CON2 - IDC10M proste (męskie)

Inne:
U1 - podstawka DIP20 zwykła