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.