<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=29&amp;t=20664&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2018-04-29T19:38:35+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=29&amp;t=20664&amp;mode</id>
<entry>
<author><name><![CDATA[Seba319]]></name></author>
<updated>2018-04-29T19:38:35+01:00</updated>
<published>2018-04-29T19:38:35+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20664&amp;p=207274#p207274</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20664&amp;p=207274#p207274"/>
<title type="html"><![CDATA[WinAVR, makefile, programator i symulacja w Atmel Studio 7.0]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20664&amp;p=207274#p207274"><![CDATA[
<strong>Witam wszystkich forumowiczy zainteresowanych tematem 8-bitowych mikrokontrolerów AVR w moim poradniku!!</strong><br /><br />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 <em>&quot;Zaczynajmy&quot;</em>.) 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 <strong>eclipse</strong>, jednak problem jest z symulatorem. W <a href="http://forum.atnel.pl/topic956.html"  class="postlink"><strong><span style="text-decoration: underline">tym wątku</span></strong></a> opisane jest jak podpiąć <strong>debugger sprzętowy</strong> oraz <strong>simulavr</strong> do eclipse, jednak przydatność samego symulatora z pakiety <strong>WinAVR</strong> jest prawie zerowa. Miałem dłuższą przerwę w kontakcie z uC, a swoje projekty tworzyłem głownie przy użyciu <strong>toolchain WinAVR</strong>. Korzystałem też z symulatora w <strong>AVR Studio 4</strong>, 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 <strong>Programmers Notepad</strong> 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 <strong>Atmel Studio</strong>. 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 <em>makefile</em>, 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.<br /><br /><span style="font-size: 150%; line-height: normal"><strong>Toolchain WinAVR i makefile</strong></span><br /><br />Jak powszechnie wiadomo w pliku <strong>makefile</strong> znajdują się instrukcje dla programu <strong>meke</strong> 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 <strong>toolchain WinAVR</strong> mamy program o nazwie <strong>MFile</strong>, który pozwala nam na generowanie takiego pliku, gdzie możemy go później dowolnie modyfikować.<br /><br /><a href="https://obrazkiforum.atnel.pl/19131/54a84b11dd409e3b8987ec2be6b479c6.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/19131/54a84b11dd409e3b8987ec2be6b479c6.jpg" alt="Obrazek" /></a><br /><br />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.<br /><br />[syntax=makefile]#---------------- Programming Options (avrdude) ----------------<br />AVRDUDE_PROGRAMMER = stk500v2<br /><br /># com1 = serial port. Use lpt1 to connect to parallel port.<br />AVRDUDE_PORT = avrdoper # programmer connected to serial device<br /><br />AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex<br /># AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep[/syntax]<br />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.<br /><br />[syntax=makefile]AVRDUDE_WRITE_FUSE = -U lfuse:w:0x2E:m -U hfuse:w:0xC9:m<br />AVRDUDE_WRITE_LOCK = -V -U lock:w:0xFC:m[/syntax]<br />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.<br /><br />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.<br /><br />[syntax=makefile]# Available device type<br /># _3360 for PCB_V1.5-3360_12V_A/B<br /># _Acr1 for PCB_Acr1_361/Acr1_362<br />DEVICE = _3360<br /># DEVICE = _Acr1[/syntax]<br />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.<br /><br />Samo wywołanie programu <strong>make</strong> z odpowiednimi parametrami odbywa się w środowisku w jakim tworzymy kod. Domyślnie dla toolchain WinAVR jest to odpowiednio skonfigurowany <strong>Programmers Notepad</strong>. W zakładce <strong><em>Tool</em></strong> mamy trzy komendy.<br /><br /><a href="https://obrazkiforum.atnel.pl/19131/e5e0584bcada3619a25bc334a1bd28a9.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/19131/e5e0584bcada3619a25bc334a1bd28a9.jpg" alt="Obrazek" /></a><br /><br />Jest to: <strong><em>Make All</em></strong> - służąca do skompilowania projektu, <strong><em>Make Clean</em></strong> - przeznaczona do czyszczenia projektu oraz <strong><em>Make Program</em></strong> - 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 &quot;wstępnych&quot; wyjaśnieniach możemy w końcu przejść do meritum! <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /><br /><br /><span style="font-size: 150%; line-height: normal"><strong>Zaczynajmy - Konfiguracja Atmel Studio 7.0</strong></span><br /><br />Zakładam, że mamy projekt przygotowany w języku C za pomocą <strong>toolchain WinAVR</strong> wraz z plikiem <strong>makefile</strong> i chcemy go przenieść bezboleśnie do <strong>Atmel Studio 7.0</strong>, tak aby móc uruchomić symulacje, czy skorzystać z dowolnego programatora wspieranego przez <strong>AVRDUDE</strong>. W moim przykładzie mamy do czynienia z <strong>ATmega32A</strong>, projekt nazywa się <strong>led_blink</strong>, a kod źródłowy znajduje się w pliku o nazwie <strong>led_blink.c</strong> (w wielu przypadkach będzie to domyślny <em>main.c</em>). Jest to swoisty <em>&quot;hello world&quot;</em> w postaci mijającej LED. Korzystam z systemy Windows 10, Atmel Studio 7.0.1645 oraz WinAVR 20100110.<br /><br /><strong>1. Podpięcie toolchain WinAVR pod Atmel Studio</strong><br /><br />W pieszej kolejność musimy dodać naszego toolchain-a, więc wybieramy <strong><em>Tools-&gt;Options...</em></strong>, gdzie przechodzimy do opcji <strong><em>Toolchain-&gt;Package Configuration [1]</em></strong>. W polu <strong><em>Toolchains:</em></strong> wybieramy <strong><em>Atmel AVR 8-bit (C language) [2]</em></strong> i klikamy <strong><em>Add Flavour [3]</em></strong>.<br /><br /><a href="https://obrazkiforum.atnel.pl/19131/afed28d20e2feece47e37ef1d708b7c3.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/19131/afed28d20e2feece47e37ef1d708b7c3.jpg" alt="Obrazek" /></a><br /><br />W oknie, które się pojawi, w polu <strong><em>Package Name [4]</em></strong> wpisujemy (dowolną) nazwę. Natomiast w polu <strong><em>Package Base Path [5]</em></strong> podajemy ścieżkę do plików bin dla <strong>WinAVR</strong>, w moim przypadku jest to <em>C:\WinAVR\bin</em>. Klikamy <strong><em>Add [6]</em></strong>, a następnie <strong><em>OK [7]</em></strong>. Pierwszy etap mamy z głowy.<br /><br /><a href="https://obrazkiforum.atnel.pl/19131/721ff9492efc1bc1f7a2129043d7a559.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/19131/721ff9492efc1bc1f7a2129043d7a559.jpg" alt="Obrazek" /></a><br /><br /><strong>2. Tworzenie nowego projektu</strong><br /><br />Aby stworzyć nowy projekt wybieramy <strong><em>File-&gt;New-&gt;Project...</em></strong>, 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 <em>led_blink</em>. 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ć <strong><em>Create directory for solution [4]</em></strong>. Na koniec klikamy <strong><em>OK</em></strong>.<br /><br /><a href="https://obrazkiforum.atnel.pl/19131/b00287bab8ccf861632166386d316273.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/19131/b00287bab8ccf861632166386d316273.jpg" alt="Obrazek" /></a><br /><br />W okienku <strong><em>Device Selection</em> </strong>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.<br /><br /><a href="https://obrazkiforum.atnel.pl/19131/b7007d15bf9b54e2d7856c6798f6bfa7.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/19131/b7007d15bf9b54e2d7856c6798f6bfa7.jpg" alt="Obrazek" /></a><br /><br />Po utworzeniu nowego projektu powinniśmy mieć widok jak poniżej.<br /><br /><a href="https://obrazkiforum.atnel.pl/19131/97ac389cf46443540959d58b2811c1fd.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/19131/97ac389cf46443540959d58b2811c1fd.jpg" alt="Obrazek" /></a><br /><br />Jeśli nasz plik z kodem źródłowym nosi inną nazwę niż <em>main.c</em>, to musimy ją zmienić również tutaj, gdyż w innym przypadku symulacja nie zadziała. W tym celu klikamy prawym klawiszem na plik <em>main.c</em>, wybieramy <strong><em>Rename</em></strong> i zmieniamy nazwę na odpowiednią, w tym przykładzie jest to <em>led_blink.c</em>. Na koniec zapisujemy wszystko <img src="https://obrazkiforum.atnel.pl/19131/3b6f720545759df3d2998159ada8739f.jpg" alt="Obrazek" /> i zamykamy Atmel Studio.<br /><br /><strong>3. Podmiana plików</strong><br /><br />Następnym krokiem jest podmiana plików utworzonych przez Atmel Studio na nasz projekt stworzony w WinAVR. Domyślnie Atmel Studio wrzuca projekty do katalogu <em>C:\Users\&lt;users_name&gt;\Documents\Atmel Studio\7.0\&lt;nazwa_projektu&gt;</em>, gdzie należy skopiować całą zawartość projektu z WinAVR nadpisując plik z kodem źródłowym programu.<br /><br /><strong>4. Konfiguracja projektu</strong><br /><br />Po wykonaniu zabiegu opisanego w pkt 3 przechodzimy do konfiguracji projektu w Atmel Studio. W tym celu klikamy prawym na projekt i wybieramy <strong><em>Properties</em></strong>.<br /><br /><a href="https://obrazkiforum.atnel.pl/19131/087919eb0cf6df519058c911eef7e429.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/19131/087919eb0cf6df519058c911eef7e429.jpg" alt="Obrazek" /></a><br /><br />W zakładce <strong><em>Build [1]</em></strong>, w polu <strong><em>Configuration:</em></strong> wybieramy profil <strong><em>Debug [2]</em></strong>, zaznaczamy pole <strong><em>Use External Makefile[4]</em></strong>, klikamy <strong><em>Browse [4]</em></strong> i wskazujemy właściwy plik <em>makefile</em>.<br /><br /><a href="https://obrazkiforum.atnel.pl/19131/048a8d8c6921be881285c4429008f8b1.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/19131/048a8d8c6921be881285c4429008f8b1.jpg" alt="Obrazek" /></a><br /><br />Zmieniamy profil na <strong><em>Release [5]</em></strong> i postępujemy analogicznie jak w przypadku profilu <em>Debug</em>.<br /><br /><a href="https://obrazkiforum.atnel.pl/19131/667054244a356da059fddbabec842bc3.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/19131/667054244a356da059fddbabec842bc3.jpg" alt="Obrazek" /></a><br /><br />W kolejnym kroku przechodzimy do zakładki <strong><em>Build Events [6]</em></strong>, w polu <strong><em>Configuration:</em></strong> wybieramy profil <strong><em>Release</em></strong>, po czym w polu tekstowym <strong><em>Post-build event command line:</em></strong> wpisujemy komendę <strong><em>&quot;make.exe&quot; program [8]</em></strong>. Wpisana komenda spowoduje, że po wykonaniu polecenia <strong><em>Build</em></strong>, gdy aktywny jest profil <strong><em>Release</em></strong> 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 <strong><em>Debag</em></strong>, 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 <em>&quot;Toolchain WinAVR i makefile&quot;</em>, może to być dowolny programator współpracujący z <strong>AVRDUDE</strong>.<br /><br /><a href="https://obrazkiforum.atnel.pl/19131/1500ea7c02aad7150e6e1421b72e6a43.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/19131/1500ea7c02aad7150e6e1421b72e6a43.jpg" alt="Obrazek" /></a><br /><br />Następnie przechodzimy do zakładki <strong><em>Tool [9]</em></strong>, gdzie w sekcji <strong><em>Selected debugger/programmer</em></strong> wybieramy <strong><em>Simulator [10]</em></strong><br /><br /><a href="https://obrazkiforum.atnel.pl/19131/837da526ed1b56c598124c9ce3ae24a3.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/19131/837da526ed1b56c598124c9ce3ae24a3.jpg" alt="Obrazek" /></a><br /><br />Zostaje nam ostatnia zakładka <strong><em>Advanced [11]</strong></em>, gdzie w polu <strong><em>Toolchain Flavour:</em></strong> wybieramy skonfigurowany w pkt 1 toolchain. W naszym przykładzie nosi on nazwę <strong><em>WinAVR [12]</em></strong><br /><br /><a href="https://obrazkiforum.atnel.pl/19131/6289c6055f9fdf01d48fa53b1e58a9f2.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/19131/6289c6055f9fdf01d48fa53b1e58a9f2.jpg" alt="Obrazek" /></a><br /><br />Na koniec zapisujemy wszystkie zmian <img src="https://obrazkiforum.atnel.pl/19131/3b6f720545759df3d2998159ada8739f.jpg" alt="Obrazek" /> i <strong>GOTOWE!</strong><br /><br /><strong>5. Uruchomienie symulatora</strong><br /><br />Aby uruchomić symulator przechodzimy do karty z kodem programy, w naszym przypadku <em>led_blink.c</em>, wybieramy profil <strong><em>Debug</em></strong>, po czym klikamy na ikonę <strong><em>Start Debugging and Break</em></strong>.<br /><br /><a href="https://obrazkiforum.atnel.pl/19131/d07dc0daa3bbaeed5b34b2899f9138c5.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/19131/d07dc0daa3bbaeed5b34b2899f9138c5.jpg" alt="Obrazek" /></a><br /><br />Poniżej załączam zrzut ekrany z pięknie działającego symulatora <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br /><a href="https://obrazkiforum.atnel.pl/19131/5a321759792a88da933fc4abc7e65e66.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/19131/5a321759792a88da933fc4abc7e65e66.jpg" alt="Obrazek" /></a><br /><br /><strong>6. Programowanie mikrokontrolera</strong><br /><br />Jeśli w symulacji wszystko działa jak należy i chcemy zaprogramować nasz uC, to zmieniamy profil na <strong><em>Release</em></strong> i klikamy w ikonę <strong><em>Build</em></strong>. Na załączonym zrzucie, w oknie <strong><em>Output</em></strong> widać, że zawartość pliku <em>led_blink.hex</em> została wgrano i poprawnie zweryfikowana. Wszystko to z poziomu Atmel Studio, bez dodatkowych narzędzi i to &quot;niewspieranym&quot; programatorem <img src="https://forum.atnel.pl/images/smilies/icon_cool.gif" alt="8-)" title="Cool" /><br /><br /><a href="https://obrazkiforum.atnel.pl/19131/c7df03428d915e4282d8e6db88505255.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/19131/c7df03428d915e4282d8e6db88505255.jpg" alt="Obrazek" /></a><br /><br />Oczywiście nic nie szkodzi, żeby wgrać korzystać z programatora wspieranego przez Atmel Studio. Trzeba tylko odpowiednio skonfigurować opcje w zakładce <strong><em>Selected debugger/programmer</em></strong>. W takim przypadku flash, eeprom, fuse-bit oraz lock-bit programuje się normalnie z poziomu Atmel Studio, a nie przez makefile.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=19131">Seba319</a> — 29 kwi 2018, o 19:38</p><hr />
]]></content>
</entry>
</feed>