AVRDUDE z ATmega8 + fusebity

AVRDUDE to niewielkie narzędzie do programowania mikrokontrolerów AVR. Pozwala na odczyt i zapis pamięci flash, EEPROM, programowanie fusebitów i lockbitów. Jest to konsolowa aplikacja, dlatego użytkowanie może sprawiać problemy zaczynającym przygodę z mikrokontrolerami. Wszelkie opcje i parametry ustawiamy z wiersza poleceń, przez co jesteśmy zmuszeni pamiętać (albo przynajmniej mieć pod ręką) wszelkie "przełączniki". Dokumentacja AVRDUDE jest całkiem pokaźna a na wielu forach można znaleźć różne opisy, ale wertowanie dokumentacji bywa kłopotliwe. Chcąc zaprogramować (zwykle) ten sam typ mikrokontrolera tym samym programatorem co mam na biurku, wygodniej polegać na notatkach. Aby ułatwić sobie zabawę, przygotowałem zestaw najczęściej używanych poleceń, które tylko kopiuję do okna konsoli.

Najczęściej korzystam z ATmega8 i programatora USBASP, dlatego poniższe polecenia "gotowce" będą działały tylko dla takiego zestawu. Zmiana programatora będzie wiązała się tylko z odpowiednim ustawieniem parametrów "-c" oraz "-P".

Ostrzeżenie: zanim zaczniesz przestawiać fusebity zastanów się trzy razy, bo możesz zablokować układ konkretnie i konieczne będzie użycie spcjalnego programatora.

Tyle tytułem wstępu – teraz przejdziemy do konkretów :-) AVRDUDE nie wymaga instalacji – po pobraniu aplikacji ze strony wystarczy ją rozpakować i skopiować plik avrdude.exe do wybranego katalogu. W moim przypadku jest to "C:\avrdude".

1. Test podłączenia:

avrdude -p atmega8 -c usbasp -P usb -t

Jeśli program wyświetli "Device signature" to najprawdopodobniej wszystko jest dobrze.

2. Odczytanie zawartości pamięci flash ATmega8 i zapis do pliku BIN:

avrdude -p m8 -P usb -c usbasp -U flash:r:plik2222.bin:r

3. Odczytanie zawartości pamięci flash ATmega8 i zapis do pliku HEX:

avrdude -p m8 -P usb -c usbasp -U flash:r:plik3333.hex:i

4. Zapis pliku HEX do flasha, czyli właściwe programowanie:

avrdude -p m8 -c usbasp -P usb -U flash:w:plik4444.hex

5. Odczyt fusebitów z zapisanie ich do plików "fuse_high" oraz "fuse_low":

avrdude -p m8 -c usbasp -P usb -U hfuse:r:fuse_high.bin:b -U lfuse:r:fuse_low.bin:b

6. Zapisz fusebity ATmega8 z kwarcem 8 MHz lub 16 MHz:

avrdude -p m8 -c usbasp -P usb -U lfuse:w:0xFF:m -U hfuse:w:0xC9:m

7. Zapisz fusebity ATmega8 z wewn. oscylatorem 1 MHz (ustawienia domyślne):

avrdude -p m8 -c usbasp -P usb -U lfuse:w:0xE1:m -U hfuse:w:0xD9:m

Powyższe polecenia pozwolą zaprogramować układ i powinny wystarczyć na początek. Jeśli chcesz wiedzieć odrobinę więcej, to czytaj dalej.

Koszmar fusebitów

Nie wiem jak dla Ciebie, Drogi Czytelniku, ale dla mnie największym problemem podczas rozpoczynania przygody z mikrokontolerami AVR były fusebity. Można je sobie wyobrazić jako 16 przełączników (dolne osiem i górne osiem), którymi ustawiamy różne opcje układu. Nie ułatwia zadania fakt, że w dokumentacji mikrokontrolera bit zaprogramowany jest oznaczany jako 0, a nie zaprogramowany jako 1. Nie będę szczegółowo omawiał wszystkich bitów bo to jest gruntownie przedstawione w dokumentacji i skupię się tylko na tych najczęściej używanych.

 

RSTDISBL
Tym bitem konfigurujemy, czy PIN PC6 ma być ustawiony jako RESET, czy jako zwykły port I/O. Tego nie zmieniamy, chyba że chcemy się pozbawić możliwości programowania układu poprzez najpopularniejsze SPI, ponieważ programowanie SPI wymaga dostępnego RESETu.

SPIEN
Włączone programowanie poprzez SPI. Także tego nie ruszamy.

CKOPT
Tryb pracy oscylatora kwarcowego. Zaprogramowany (0) ustawia na tryb "full rail-to-rail" dedykowany dla pracy w środowisku z zakłóceniami oraz pracy z częstotliwością powyżej 8 Mhz. Z tej opcji skorzystamy.

CLSEL3,CLSEL2,CLSEL1,CLSEL0
Za pomocą tych bitów ustawiamy źródło zegara. W tabelce poniżej przedstawiłem najczęściej używane ustawienia.

 

CKSEL3

CKSEL2

CKSEL1

CKSEL0

Źródło taktowania

1

1

1

1

Oscylator kwarcowy od 3 do 16 MHz włącznie

1

0

1

1

Oscylator kwarcowy od 0,4 do 0,9 MHz

1

1

0

1

Oscylator kwarcowy od 0,9 do 3 MHz

0

0

0

1

Wewnętrzny oscylator RC, taktowanie 1 Mhz (domyślne)

0

0

0

0

Zewnętrzne źródło taktowania

 

A co, jeśli coś pójdzie nie tak ?

Najgorszą rzeczą (poza uszkodzeniem elektroniki oczywiście) jest przestawienie któregoś z bitów odpowiedzialnych za programowanie poprzez SPI (RSTDISBL,SPIEN). W takim przypadku nie będzie można zaprogramować układu poprzez interfejs popularnych programatorów. Wtedy konieczne będzie podniesienie układu poprzez zewnętrzny programator.

Pisząc ten post dołożyłem starań, aby informacje tu zawarte były maksymalnie proste, a zarazem rzetelne i przydatne. Jeśli tak się nie stało, to proszę o kontakt.