Krótki poradnik przedstawiający proces instalacji, konfiguracji oraz odczytu fusebit'ów z mikrokontrolera AVR za pomocą programatora USBasp w systemie Linux.
Wstępne wymagania
Przed przystąpieniem do procesu konfiguracji programatora należy go podłączyć do komputera wraz z jakimś mikrokontrolerem AVR, który posłuży nam do testów. Osobiście podczas tworzenia tego poradnika wykorzystałem programator ATB-USBASP firmy Atnel w wersji 4.2 oraz mikrokontroler Atmega32.
Instalacja avrdude
Avrdude jest darmowym narzędziem, które pozwala na zarządzanie pamięcią naszego mikrokontrolera za pomocą ISP (ang. In-System Programming) z poziomu naszego komputera wykorzystując przy tym zewnętrzny programator np. USBasp. Proces instalowania avrdude w systemie Linux sprowadza się do wykonania jednej komendy, ponieważ pakiet ten jest dostępny w głównym repozytorium Ubuntu:
sudo apt-get install avrdude
Teraz możemy spróbować odczytać fusebity z naszego mikrokontrolera wykonując poniższą komendę:
avrdude -c usbasp -p m32
Prawdopodobnie w konsoli został wyświetlony komunikat dotyczący błędu, który wystąpił podczas próby odczytu pamięci z naszego mikrokontrolera wynikający z braku uprawnień naszego użytkownika do programatora USBasp.
W celu naprawienia tego błędu należy stworzyć specjalnie spreparowany plik 99-usbasp.rules, który będzie zawierał informacje dotyczące uprawnień.
Nadanie wymaganych uprawnień
Na początku musimy zobaczyć, czy nasz programator USBasp jest widoczny w naszym systemie Linux. W tym celu należy go podłączyć do naszego komputera i wykonać komendę "lsusb" z poziomu terminala.
Jak widzimy na powyższym screenie podłączony programator został poprawnie wykryty przez nasz system. Teraz możemy przystąpić do rozwiązania problemu dotyczącego braku odpowiednich uprawnień.
Rozwiązanie problemu dotyczącego braku wymaganych uprawnień sprowadza się do stworzenia specjalnego pliku 99-usbasp.rules w katalogu /etc/udev/rules.d.
- Tworzymy pusty plik 99-usbasp.rules:
sudo touch /etc/udev/rules.d/99-usbasp.rules
- Przechodzimy do edycji pliku :
sudo nano /etc/udev/rules.d/99-usbasp.rules
- Kopiujemy i wklejamy poniższą zawartość:
SUBSYSTEMS=="usb", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="05dc", ATTRS{idProduct}=="USBasp", GROUP="users", MODE="0666"
Większość programatorów USBasp bazujących na wsadzie autorstwa Thomas Fischl’a posiada ten sam identyfikator "vendor" oraz "product" jednak warto sprawdzić, czy Twój programator nie posiada innych wartości. W tym celu wystarczy wykonać polecenie "lsusb" i odczytać wymagane wartości.
- Na koniec zapisujemy plik:
- ctrl + x
- y
- enter
Ostatni krok sprowadza się do wykonania poniższej komendy:
sudo udevadm trigger
Teraz możemy przejść do testowania naszej konfiguracji.
Odczyt fusebit’ów z mikrokontrolera
W celu przetestowania naszej konfiguracji możemy odczytać fusebity z naszego mikrokontrolera wykonując ponownie poniższą komendę:
avrdude -c usbasp -p m32
Jeśli programator został poprawnie skonfigurowany to naszym oczom powinien ukazać się poniższy rezultat:
W tym poście opisałem jedynie proces konfiguracji programatora USBasp w środowisku Linux, co oznacza, że aby móc pisać i kompilować własne programy na mikrokontrolery z rodziny AVR wymagana jest dodatkowa konfiguracja m.in. instalacja specjalnego kompilatora avr-gcc.
[Ubuntu 20.04.4 LTS, Atnel USBASP 4.1, ATmega16A] Wykonałem wszystko jak powyżej i dostałem: avrdude: error: program enable: target doesn't answer. 1 avrdude: initialization failed, rc=-1 Double check connections and try again, or use -F to override this check.
Pomogło obniżenie baudrate'u komunikacji do 1kHz opcją -B
(ustawia ona okres sygnału zegarowego w mikrosekundach). Czyli zapytanie które u mnie zadziałało wyglądało: avrdude -c usbasp -p m16 -B1000
Cześć, u mnie na linux mint 19 śmiga bez tworzenia pliku konfiguracyjnego :)