Bootloadery – pierwsze kroki na przykładzie Arduino

Bootloadery – pierwsze kroki na przykładzie Arduino

Bootloader w mikrokontrolerach, to mini program zagnieżdżony w pewnym sektorze pamięci uC. Dzięki niemu możliwe jest wgrywanie programu z pominięciem programatora.

Rozwiązanie takie stosowane jest coraz częściej np.: dla ułatwienia aktualizacji oprogramowania. Bootloader użyty jest również w każdym Arduino.

Kiedy chcemy zaprogramować mikrokontroler, to najczęściej myślimy o podstawowych interfejsach służących do komunikacji z programatorem. W przypadku AVR będzie to ISP, a dla STM32  użyjemy SWD. Dzięki bootloaderowi program możemy przesyłać bezpośrednio przez USB, RS232 (UART) oraz z użyciem wielu innych sposobów takich jak IrDA, czy karta SD.

Pozwala to między innymi na redukcję ilości przewodów do programowania i debugowania. Co więcej, po wgraniu bootloadera praktycznie nie potrzeba już programatora.

Niezbędny sprzęt

Jeśli chcemy wgrać bootloader, a następnie korzystać z tego ułatwienia, to musimy przygotować sobie niezbędne narzędzia:

  • programator ISP - używany tylko raz, do wgrania bootloadera i ustawienia Fusebitów,
  • przejściówka USB <-> RS232ttl - bardzo przydatne narzędzie, które pozwala na komunikację przez USB przy wykorzystaniu sprzętowego interfejsu UART w mikrokontrolerze.
  • konwerter sygnałów RS232 (±12V) na TTL (0-5V) – MAX232 i kilka kondensatorów. Jest to rozwiązanie dla tych, którzy nie chcą kupować przejściówki USB<->RS232, bo dostęp do RS232 mają zapewniony w komputerze.

Wybór bootloadera

Jako pierwszemu przyjrzymy się bootloaderom, które korzystają z UART. Poniższy opis omawia trzy najpopularniejsze, które możemy wykorzystać np.: z ATmegą8.

Megaload – charakteryzuje się bardzo małym rozmiarem (w podstawowej wersji 256 bajtów, w nieco bardziej rozbudowanej - lock bity i możliwość programowania eeprom - 512 bajtów) możemy go używać z bardzo dużą grupą AVR (konkretnie ATmeg). Działa z prędkościami 9600, 19200, 38400, 57600 i 115200 bodów (8kB programu w 3 sekundy). Megaload jest też naszpikowany zabezpieczeniami na wypadek utraty danych w trakcie komunikacji.

Bootloader Arduino – Prawdę mówiąc jest duży i nieoptymalny, ale ma dość przydatną cechę – podszywa się pod programator STK500, co pozwala na używanie go w praktycznie każdym środowisku programistycznym (bez używania dodatkowych programów). Co więcej IDE Arduino całkowicie automatycznie potrafi zapisać bootloader w odpowiedniej sekcji i poustawiać odpowiednie fusebity.

MCS Bootloader - prosty bootloader, ze wsparciem bezpośrednio z IDE Bascoma. Znajduje się w katalogu Samples (BOOT\Bootloader.bas) Podobnie jak z Megaload, bootloader ten wspiera uC pracujące w szerokim zakresie częstotliwości taktowania i transmisji.

Wykonanie przejściówki

Dobrze, wiemy już jakich bootloaderów będziemy używali, teraz pora na sprzęt. Musimy wykonać przejściówkę z jednego z poniższych schematów.

Poniższy układ przeznaczony jest dla osób, które nie mają dostępu do prawdziwego RS232. Przy tej przejściówce koniecznym będzie zaprogramowanie mikrokontrolera odpowiednim wsadem. Szczegółowe informacje jak wykonać tę przejściówkę znaleźć można na powyższej stronie oraz na Elektrodzie.

schemat_przejsciowka

Kolejny schemat należy wykorzystać w sytuacji, gdy do dyspozycji mamy sprzętowy RS232 wbudowany w płytę główną komputera. Jest to bardzo popularny konwerter poziomów logicznych wykonany w oparciu układ scalony MAX232.

schemat_przejsciowka2

Koszty przejściówek powinny zamknąć się w kwocie 10zł dla konwertera na MAX232 lub 15zł dla konwertera wykorzystującego ATmegę8. Obie można wykonać bez problemu na kawałku płytki uniwersalnej lub stykowej.

Wgrywanie bootloadera Arduino

Jako układ testowy wykorzystamy ATmegę8 taktowaną 16MHz, co jest maksymalną prędkością dla tego mikrokontrolera. Schemat połączeń przejściówka – uC z bootloaderem przedstawiony jest na schemacie poniżej (znajdują się tam też diody wykorzystywane później do zweryfikowania, czy program wgrany działa poprawnie):

schemat_botloader

Jako pierwszego użyjemy bootloadera Arduino. W tym celu ze strony pobieramy IDE (będzie to najprostsza, najbardziej pewna metoda wgrania bootloadera). Na dobry początek po rozpakowaniu Arduino wchodzimy do jego folderu, wyszukujemy katalog hardware, następnie Arduino i w końcu otwieramy plik programmers.

Teraz, w zależności od tego, jakim programatorem dysponujemy, dopisujemy na przykład dla BSD:

Dla USBasp:

Dla STK200/300:

Możemy dopisać praktycznie każdy programator wspierany przez AVRdude. Następnie włączamy Arduino IDE. W zakładce Tools (u góry) wybieramy Board, a następnie Arduino NG Or Older w/ Atmega8. Podłączamy nasz programator do ATmegi8.

Za pomocą oprogramowania, którego używamy do ustawiania fusebitów (polecam avrdude i AVR Burn-O-Mat) ustawiamy kwarc zewnętrzny 16Mhz i rozmiar obszaru pamięci przeznaczonego na bootloader na 1024 słowa:

botloader_2

Następnie zapisujemy je do mikrokontrolera. Uwaga! złe ustawienia mogą prawie całkowicie zablokować układ!

Teraz wracamy do Arduino. Ponownie zakładka Tools, następnie Burn Bootloader i wybieramy swój programator. W tym momencie do naszej ATmegi8 powinien zostać przesłany bootloader Arduino, oraz odpowiednie lock bity.

Gdy jesteśmy już w Arduino możemy wejść w File→Examples→Digital→Blink. W pierwszej linijce programu zamieniamy:

Na:

Następnie klikamy przycisk Verify, gdy kompilacja zakończy się powodzeniem (Done Compiling), na naszej płytce naciskamy reset, a następnie Upload. Po kilkunastu sekundach dioda powinna zacząć mrugać – wgraliśmy program za pomocą bootloadera.

Wgrywanie bootloadera USB

Teraz pora na USBAspLoader. Do jego wykorzystania potrzebna nam jest tylko wtyczka USB połączona z mikrokontrolerem oraz zworka na płytce (chociaż można przekompilować bootloader, aby uruchamiał się po spełnieniu innego warunku). Poniżej przedstawiony jest minimalny schemat podłączenia potrzebnego do uruchomienia bootloadera USB:

botloader_3

Wybrałem kwarc 16 MHz, chociaż można wybrać inny. Do ATmegi8 musimy wgrać program odpowiadającego naszemu procesorowi i prędkości z jaką go taktujemy - w tym celu ściągamy dedykowane archiwum ze strony projektu.

Dobrze jest ustawić sobie wszystkie fusebity na standardowe, wyczyścić flash procesora i dopiero wtedy wgrać .hex z bootloaderem. Następnie ustawiamy fusebity na kwarc 16MHz, a dalej lockbity. Używając avrdude będzie to wyglądało następująco:

Od teraz możemy cieszyć się działającym bootloaderem na USB, który nie wymaga żadnych przejściówek. Jak go używać? Bardzo prosto - podłaczmy procesor do USB, zamykamy zworkę i klikamy przycisk resetu. W tym momencie nasz procesor powinien przedstawić się w systemie, jako USBAsp - sterowniki i programowanie przeprowadzamy jak w wypadku tego programatora.

Autor: Bobby
Redakcja: Damian (Treker)

arduino, avr, bootloader, programowanie USBAsp

Trwa ładowanie komentarzy...