<html> <?xml version=“1.0” encoding=“UTF-8” standalone=“no”?> <!– Created with Inkscape (http://www.inkscape.org/) –>
</html> AVR jest rodziną 8 bitowych mikrokontrolerów RISC opartych na zmodyfikowanej architekturze harwardzkiej stworzonych przez firmę Atmel w 1996 roku. Mikrokontrolery te bardzo szybko stały się popularne, ponieważ zawierały pamięć flash co wówczas było rzadkością.
uC firmy Atmel są popularne w Polsce a więc: łatwo dostępne, stosunkowo tanie*, sporo projektów na elektrodzie jest oparte na avr'ach i stosunkowo dużo informacji na ich temat jest po polsku. Czasopisma branżowe również mocno wpłynęły na popularność akurat tych układów. Pomimo różnic w budowie wewnętrznej większość mikroprocesorów jest podobnych a więc wiedza zdobyta na avr'ach będzie wykorzystywana przy innych układach.
Układy z rodziny avr występują w przyrodzie w następujących wariantach (od największej mocy obliczeniowej, pamięci, częstotliwości taktowania):
Podczas pracy z układem będziemy korzystać z zestawu narzędzi gnu avr-gcc. Konkretnie WinAVR (windows) oraz edytora eclipse.
Strona projektu WinAVR
Strona pobierania eclipse dla C/C++
Strona rozszerzenia eclipse AVR Eclipse
Układy AVR posiadają możliwość programowania w systemie (ang. ISP In-system programming) Jeżeli ktoś posiada komputer ze złączem LPT (szeregowym) to może programować avr'y wprost z tego portu (programator szeregowy), jednak najlepiej zrealizować programator USB np. bardzo dobry AVRISPMKII lub USBasp. Programator pełni rolę “tłumacza interfejsów” pomiędzy komputerem (USB) a układem docelowym (SPI).
Zdjęcie przedstawia standardowe złącze programowania używane przy mikrokontrolerach AVR. Jest to złącze wprowadzone przez firmę Kanda stąd często nazywa się je złączem Kanda lub złączem ISP od funkcji jaką pełni. Warto wiedzieć że wtyk nazywa się złączem IDC a gniazdo nazywamy “gniazdem wannowym” lub “wanienkowym”. Programowanie odbywa się przez interfejs SPI który składa się z następujących sygnałów:
Dodatkowo w złączu występują następujące sygnały:
<html> <?xml version=“1.0” encoding=“UTF-8” standalone=“no”?>
</html>
Uwaga! Zasilanie przez programator może nie wystarczyć (Ograniczenie prądowe na USB do 50mA wynikające z konfiguracji USBasp!), mi nie udało się zaprogramować układu korzystając z zasilania z szyny. Układ należy zasilać tylko napięciem stabilizowanym 5V. W przypadku korzystania z zewnętrznego napięcia zasilania najlepiej odłączyć linię zasilającą programatora!
Avrdude (AVR Downloader/UploaDEr) jest programem wchodzącym w skład pakietu WinAVR (gnu avr-gcc). Jest to aplikacja konsolowa (chociaż istnieją niezbyt dobre nakładki graficzne) i warto poznać sposób pracy z tym programem, pomimo iż pracując w środowisku eclipse jego praca nie będzie widoczna.
Użycie komendy avrdude w konsoli wyświetli nam listę argumentów jakie on przyjmuje. Ponieważ skupimy się na programowaniu układu ATmega8 programatorem AVRISPmkII należy zapamiętać podstawową listę argumentów:
avrdude -pm8 -cavrispmkii -Pusb
(Lub dla USBasp):
avrdude -pm8 -cusbasp
Co powinno nam zwrócić następującą informację:
avrdude: AVR device initialized and ready to accept instructions Reading | ################################################## | 100% 0.02s avrdude: Device signature = 0x1e9307 avrdude: safemode: Fuses OK avrdude done. Thank you.
Informacja ta oznacza że układ odpowiedział i jest prawidłowo rozpoznany. Parametr -p służy do wyboru układu jaki programujemy a -c programatora.
Mogą się jednak zdarzyć błędy np:
avrdude: error: programm enable: target doesn't answer. 1 avrdude: initialization failed, rc=-1 Double check connections and try again, or use -F to override this check.
Lub:
avrdude: Device signature = 0x000000 avrdude: Yikes! Invalid device signature. Double check connections and try again, or use -F to override this check.
Takie komunikaty najczęściej oznaczają problem z połączeniem pomiędzy programatorem a układem docelowym.
Kolejnym ważnym parametrem jest -U który definiuje zadanie dla programu.
avrdude -pm8 -cavrispmkii -Pusb -U flash:r:PLIKPROGRAMUfl.hex avrdude -pm8 -cavrispmkii -Pusb -U eeprom:w:PLIKPROGRAMUee.hex avrdude -pm8 -cavrispmkii -Pusb -U hfuse:w:0x{wartość}:m -U lfuse:w:0x{wartość}:m
Pierwsza linijka odczytuje zawartość pamięci flash uC i zapisuje ją w pliku PLIKPROGRAMUfl.hex. Druga linijka zapisuje zawartość pliku PLIKPROGRAMUee.hex do pamięci EEPROM mikrokontrolera. Trzecia linijka zapisuje górne (hfuse) i dolne (lfuse) fusebity do uC. Jak widać możemy definiować więcej niż jedno zadanie na raz. AVRdude podczas zapisu dodatkowo sprawdza jego poprawność (odczytuje to co zapisał i porównuje). Podczas zapisu fusebitów warto kożystać z gotowego tekstu generowanego przez skrypt na stronie fusecalc.
Wielu początkujących nieświadomie (z niewiedzy) blokuje sobie układy więc warto zwrócić uwagę na kwestię fusebitów.
Fusebity to po polsku bity konfiguracyjne. Służą do zmiany parametrów pracy układu takich jak:
Podkreślone parametry są bardzo ważne, jeżeli ustawimy źródło sygnału zegarowego na zewnętrzne to jeżeli nie mamy kwarcu, nasz układ nie ruszy (i nie będzie się dało go programować!). Jeżeli pin nr.1 zostanie ustawiony jako pin logiczny a nie reset to programowanie przez ISP nie będzie w ogóle możliwe! (Istnieją inne metody programowania dzięki którym można odblokować taki zablokowany reset np programatorem szeregowym wysokonapięciowym)
Na szczęście fusebity możemy policzyć za pomocą skryptu na stronie fusecalc. Polecam zajrzeć choćby żeby zobaczyć o co chodzi z tymi fusebitami. Problematyka fusebitów jest przedstawiona w artykule na stronie elportalu jednak przedstawione tam rozwiązania praktyczne dotyczą programatora szeregowego.