Witam wszystkich forumowiczy zainteresowanych tematem 8-bitowych mikrokontrolerów AVR w moim poradniku!!Na początku parę słów na temat przyczyny oraz celu, jaki skłoniła mnie do napisania poradnika. (Niezainteresowanych proszę o przejście od razu do sekcji
"Zaczynajmy".) Chciałbym zaznaczyć, że nie mam na celu dyskutować nad wyższością, czy porównywać jakiekolwiek środowiska do programowania AVR-ów! Sama przyczyna jest dość prosta, zwyczajnie miałem potrzebę zaimportowania swoich projektów do nowego środowiska. Oczywiście można skorzystać z
eclipse, jednak problem jest z symulatorem. W
tym wątku opisane jest jak podpiąć
debugger sprzętowy oraz
simulavr do eclipse, jednak przydatność samego symulatora z pakiety
WinAVR jest prawie zerowa. Miałem dłuższą przerwę w kontakcie z uC, a swoje projekty tworzyłem głownie przy użyciu
toolchain WinAVR. Korzystałem też z symulatora w
AVR Studio 4, który w tamtych czasach bardzo mi się podobał. Jakiś czas temu pojawił się potrzeba szybkiego napisania programu do chińskiego urządzane celem poprawienia jego funkcjonalności, aby nie tracić czasu na adaptacje i przenoszenie moich bibliotek do nowego środowiska postanowiłem wykorzystać to, co dobrze znam. Oczywiście klepanie programów w
Programmers Notepad nie jest zbyt wygodne, zwłaszcza w porównaniu z tym, co oferują współczesne platformy. Nie jestem zwolennikiem posiadania kilku środowisk i przeskakiwaniu między nimi, a symulator może być bardzo przydatny, dlatego postanowiłem znaleźć sposób na przeniesienie projektów bezpośrednio do najnowszego
Atmel Studio. Mogą się tutaj pojawić opinie, że łatwiej było by przenieść sam kod do nowego projektów. Niestety nie jest to takie proste, pomijając nawet kłopoty przy ponownej kompilacji. Jeszcze większe schody pojawiają się, gdy korzysta się z rozbudowanego pliku
makefile, gdzie w zależności od jednego z parametrów, dokonuje się kompilacji warunkowej aby wygenerować wsad dla odpowiedniego urządzenia. Więcej na ten temat poniżej.
Toolchain WinAVR i makefileJak powszechnie wiadomo w pliku
makefile znajdują się instrukcje dla programu
meke decydujące o sposobie i przebiegu kompilacji. W platformach jak Atmel Studio generowany jest on automatycznie, a jego struktura wynika z konfiguracji jakiej dokonujemy podczas tworzenia nowego projektu. Natomiast w
toolchain WinAVR mamy program o nazwie
MFile, który pozwala nam na generowanie takiego pliku, gdzie możemy go później dowolnie modyfikować.
Za pomocą odpowiednie opcji wybieramy nazwę pliku z programem, typ uC, częstotliwość taktowania, rodzaju programatora itd. Tak wygenerowany plik dołączamy do katalogu z naszym projektem. Jego zwartość może wydawać się dość skomplikowana, zwłaszcza dla początkujących, jednak nie będę się tutaj rozwodził nad samą składnią. Takie rozwiązanie pozwala na duża elastyczność, co wykorzystamy do podpięcia dowolnego programatora w Atmel Studio. Poniższy fragment kodu z wygenerowanego pliku makefile definiuje typ programatora oraz ścieżkę do plików .hex z zawartością flash i eeprom.
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Uzupełniając go o dwie linijki przedstawione poniżej, możemy za jednym zamachem przy wgrywaniu programu, zaprogramować również fuse-bits oraz lock-bits.
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Po jednorazowym wyliczeniu, nie potrzebujemy dodatkowego narzędzia, zapisujemy ich wartość każdorazowo i mamy pewność, że po zaprogramowaniu nawet nowego uC zawsze są poprawnie ustawione.
Elastyczność składni pliku makefile pozwala dodatkowo na kompilacje warunkową, o czym wspominałem we wstępie. Możemy w ten sposób za pomocą jednego parametru, zdecydować z jaką wersją urządzenia mamy do czynienia i wygenerować odpowiednie wsady.
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Dodatkowo w pliku makefile mamy możliwość podpięcia skryptów, które przykładowo mogą generować licznik kompilacji. Taki licznik można przekazać do programu, czy nawet dołączyć do wersji programu i zapisać w pamięci eeprom. Jeśli będzie ktoś zainteresowany, to mogę załączyć przykłady takich skrypt oraz opisać sposób na automatyczne generowanie daty/czasu kompilacji programu i zapis tych informacji do pamięci flash/eeprom. Jeśli nie wykorzystujemy całej zawartości pamięci flash/eeprom, to możemy wrzucić tam te dane. Zapisanie nr kompilacji może być przydatne w przypadku identyfikacji wersji oprogramowania wgranego do urządzenia.
Samo wywołanie programu
make z odpowiednimi parametrami odbywa się w środowisku w jakim tworzymy kod. Domyślnie dla toolchain WinAVR jest to odpowiednio skonfigurowany
Programmers Notepad. W zakładce
Tool mamy trzy komendy.
Jest to:
Make All - służąca do skompilowania projektu,
Make Clean - przeznaczona do czyszczenia projektu oraz
Make Program - do programowania. Odpowiednio przygotowany plik makefile sprawia, że te trzy komendy wystarczają w zupełności do zaprogramowania mikrokontrolera . Cała konfiguracja zawiera się w tym pliku, a przykładowa zmiana programatora sprowadza się do edycji dwóch linii kodu. Przeniesienie tak przygotowanego projektu nie jest takie proste, dlatego powstał ten poradnik! Po "wstępnych" wyjaśnieniach możemy w końcu przejść do meritum!
Zaczynajmy - Konfiguracja Atmel Studio 7.0Zakładam, że mamy projekt przygotowany w języku C za pomocą
toolchain WinAVR wraz z plikiem
makefile i chcemy go przenieść bezboleśnie do
Atmel Studio 7.0, tak aby móc uruchomić symulacje, czy skorzystać z dowolnego programatora wspieranego przez
AVRDUDE. W moim przykładzie mamy do czynienia z
ATmega32A, projekt nazywa się
led_blink, a kod źródłowy znajduje się w pliku o nazwie
led_blink.c (w wielu przypadkach będzie to domyślny
main.c). Jest to swoisty
"hello world" w postaci mijającej LED. Korzystam z systemy Windows 10, Atmel Studio 7.0.1645 oraz WinAVR 20100110.
1. Podpięcie toolchain WinAVR pod Atmel StudioW pieszej kolejność musimy dodać naszego toolchain-a, więc wybieramy
Tools->Options..., gdzie przechodzimy do opcji
Toolchain->Package Configuration [1]. W polu
Toolchains: wybieramy
Atmel AVR 8-bit (C language) [2] i klikamy
Add Flavour [3].
W oknie, które się pojawi, w polu
Package Name [4] wpisujemy (dowolną) nazwę. Natomiast w polu
Package Base Path [5] podajemy ścieżkę do plików bin dla
WinAVR, w moim przypadku jest to
C:\WinAVR\bin. Klikamy
Add [6], a następnie
OK [7]. Pierwszy etap mamy z głowy.
2. Tworzenie nowego projektuAby stworzyć nowy projekt wybieramy
File->New->Project..., a następnie jak na rysunku poniżej, wybieramy nowy projekt GCC dla języka C ([1] i [2]). Nadajemy odpowiednią nazwę w polu [3], w tym przykładzie jest to
led_blink. Jeśli nie tworzymy projektu składającego się z kilku podprojektów, lub nie do końca wiemy do czego służy ta opcja, to zalecam odznaczyć
Create directory for solution [4]. Na koniec klikamy
OK.
W okienku
Device Selection wybieramy uC z jakiego korzystamy, musi on być taki sam jak w pliku makefile! Polecam skorzystać z pola do wyszukiwania [5], a następnie wybrać odpowiedni model z listy [6], po czym klikamy OK.
Po utworzeniu nowego projektu powinniśmy mieć widok jak poniżej.
Jeśli nasz plik z kodem źródłowym nosi inną nazwę niż
main.c, to musimy ją zmienić również tutaj, gdyż w innym przypadku symulacja nie zadziała. W tym celu klikamy prawym klawiszem na plik
main.c, wybieramy
Rename i zmieniamy nazwę na odpowiednią, w tym przykładzie jest to
led_blink.c. Na koniec zapisujemy wszystko
i zamykamy Atmel Studio.
3. Podmiana plikówNastępnym krokiem jest podmiana plików utworzonych przez Atmel Studio na nasz projekt stworzony w WinAVR. Domyślnie Atmel Studio wrzuca projekty do katalogu
C:\Users\<users_name>\Documents\Atmel Studio\7.0\<nazwa_projektu>, gdzie należy skopiować całą zawartość projektu z WinAVR nadpisując plik z kodem źródłowym programu.
4. Konfiguracja projektuPo wykonaniu zabiegu opisanego w pkt 3 przechodzimy do konfiguracji projektu w Atmel Studio. W tym celu klikamy prawym na projekt i wybieramy
Properties.
W zakładce
Build [1], w polu
Configuration: wybieramy profil
Debug [2], zaznaczamy pole
Use External Makefile[4], klikamy
Browse [4] i wskazujemy właściwy plik
makefile.
Zmieniamy profil na
Release [5] i postępujemy analogicznie jak w przypadku profilu
Debug.
W kolejnym kroku przechodzimy do zakładki
Build Events [6], w polu
Configuration: wybieramy profil
Release, po czym w polu tekstowym
Post-build event command line: wpisujemy komendę
"make.exe" program [8]. Wpisana komenda spowoduje, że po wykonaniu polecenia
Build, gdy aktywny jest profil
Release automatycznie zostanie zaprogramowany nasz uC. Odpowiada to sekwencji poleceń Make All oraz Make Program wywołanej w Programmers Notepad. Jeśli aktywny będzie profil
Debag, to Atmel Studio wygeneruje wyłącznie pliki .hex, bez programowania uC. Sama konfiguracja programatora znajduje się w pliku makefile, co zostało opisane w rozdziale
"Toolchain WinAVR i makefile", może to być dowolny programator współpracujący z
AVRDUDE.
Następnie przechodzimy do zakładki
Tool [9], gdzie w sekcji
Selected debugger/programmer wybieramy
Simulator [10]Zostaje nam ostatnia zakładka
Advanced [11], gdzie w polu
Toolchain Flavour: wybieramy skonfigurowany w pkt 1 toolchain. W naszym przykładzie nosi on nazwę
WinAVR [12]Na koniec zapisujemy wszystkie zmian
i
GOTOWE!5. Uruchomienie symulatoraAby uruchomić symulator przechodzimy do karty z kodem programy, w naszym przypadku
led_blink.c, wybieramy profil
Debug, po czym klikamy na ikonę
Start Debugging and Break.
Poniżej załączam zrzut ekrany z pięknie działającego symulatora
6. Programowanie mikrokontroleraJeśli w symulacji wszystko działa jak należy i chcemy zaprogramować nasz uC, to zmieniamy profil na
Release i klikamy w ikonę
Build. Na załączonym zrzucie, w oknie
Output widać, że zawartość pliku
led_blink.hex została wgrano i poprawnie zweryfikowana. Wszystko to z poziomu Atmel Studio, bez dodatkowych narzędzi i to "niewspieranym" programatorem
Oczywiście nic nie szkodzi, żeby wgrać korzystać z programatora wspieranego przez Atmel Studio. Trzeba tylko odpowiednio skonfigurować opcje w zakładce
Selected debugger/programmer. W takim przypadku flash, eeprom, fuse-bit oraz lock-bit programuje się normalnie z poziomu Atmel Studio, a nie przez makefile.