Uwaga! Ta strona wysyła Ci "ciasteczko".
Użytkowników online:
2
Artykuły>Mikrokontrolery i PLD>Szybki start z WinAVR
printer_icon

Szybki start z WinAVR

30.11.08 ABXYZ

Pakiet programów WinAVR zawiera niezłej jakości, całkowicie darmowy (GPL) kompilator języka C (AVR GCC) wraz z kompletem narzędzi do tworzenia programów dla 8-bitowych mikroprocesorów AVR ATMEL. Jednak, w odróżnieniu od programów komercyjnych, jak np. CodeVisionAVR, WinAvr nie dostarcza żadnego IDE (ang. Integrated Development Environment) - zintegrowanego środowiska programistycznego, tj. aplikacji pozwalającej: edytować teksty źródłowe programów, kompilować, debugować (szukać błędów śledząc instrukcja po instrukcji wykonanie programu), programować pamięć układu AVR. Po instalacji WinAvr otrzymujemy w katalogu zbiór programów, z których większość działa w konsoli tekstowej (w wierszu poleceń), i z którymi nie wiadomo co dalej zrobić. W artykule opisałem jak, wykorzystując programy z pakietu WinAVR, szybko skompilować przykładowy program w języku C i zaprogramować układ AVR.

Instalacja WinAVR

Zaczynamy od pobrania z Internetu i instalacji najnowszej wersji WinAVR, szukać należy pod adresem: http://winavr.sourceforge.net/download.html Obecnie najnowszą wersją jest 20090313. Pobrany plik instalacyjny WinAVR-20090313-install.exe ma rozmiar 22 MB, instalowane pliki zajmą na twardym dysku 123 MB. Program instalujący zapyta między innymi o nazwę katalogu na dysku gdzie WinAVR ma być zamontowany i które komponenty pakietu mają być zainstalowane. Możemy tu nic nie zmieniać i przyjąć domyślne opcje jakie proponuje instalator. Ja skróciłem nazwę katalogu docelowego do "C:\WinAVR", ponieważ zwykle w tym miejscu inne programy (programy wykorzystujące kompilator avrgcc) poszukują pakietu WinAVR.

Instalator WinAVR
Instalator pakietu WinAVR.

Dodatkowo, jeśli używamy programatora przyłączanego do portu równoległego komputera, należy uruchomić skrypt:

C:\WinAVR\bin\install_giveio.bat

Więcej szczegółowych informacji na temat instalowanych programów można znaleźć przeglądając plik:

C:\WinAVR\WinAVR-user-manual.html

Wraz z kompilatorem AVR-GCC, jako biblioteka standardowa, dołączona jest specjalna biblioteka Avr-Libc, jej szczegółowa dokumentacja dostępna jest też w katalogu:

C:\WinAVR\doc

W tym katalogu znajdują się też dokumentacje i instrukcje obsługi wszystkich programów z  pakietu WinAVR, warto tam zajrzeć.

Kompilacja przykładowego programu

Poniżej znajduje się przykładowy programik w języku C, efektem jego działania będzie miganie dwóch diod LED przyłączonych do portów we/wy AVRa. Skompilujemy przykładowy program, następnie, wykorzystując programator ISP załadujemy go do pamięci Flash układu AVR.

/* Programik do testowania środowiska WinAVR
 układ ATmega 
 PB0,PB1 - diody LED (PBx->R->LED->GND); 
 PD0 - przycisk (PD0->Button->GND)  */


#include <avr/io.h>
#include <util/delay.h>               

int main(void)
{
    DDRB  |= _BV(0)|_BV(1);
    PORTB |=  _BV(0);
    PORTB &= ~_BV(1);
    DDRD  &= ~_BV(0);
    PORTD |=  _BV(0);

    while (1) 
    {
        PORTB ^=_BV(0);
        PORTB ^=_BV(1);
        _delay_ms((PIND & _BV(0))? 1000: 200);
    }
}
Listing przykładowego programu w języku C, programik powoduje migotanie dwóch diod LED przyłączonych do portów we/wy AVRa

Sprzęt. Użyty sprzęt to płytka stykowa z układem atmega16 oraz dwa popularne (schematy z Internetu) typy programatorów ISP: stk200 i usbasp. Niektóre programatory wymagają instalacji sterowników oraz dodatkowej konfiguracji, więc należy zapoznać się dokładnie z instrukcją obsługi programatora lub opisem schematu. Jeśli brak instrukcji i potrzebnego oprogramowania (sterowników), można poszukać w Internecie, na stronie producenta/sprzedawcy sprzętu.

Tworzymy gdzieś na dysku katalog projektu, na przykład: "Moje dokumenty\winavr\start\". Następnie uruchamiamy "ulubiony" edytor tekstu; ja najchętniej używam gvim'a, lecz tym razem użyjemy dołączonego do WinAVR edytor pn (Programmers Notepad).

Start->Programy->WinAvr->Programmers Notepad [WinAVR]

Programmers Notepad
Programmers Notepad jest niewielkim edytorem tekstu, posiada podświetlanie składni wielu języków programowania, możliwość tworzenia projektów i pracy z wieloma plikami jednocześnie, ma szerokie możliwości konfiguracji.

Wklejamy tekst przykładowego programu do edytora i zapisujemy plik pod nazwą "main.c" w katalogu naszego projektu.

File->Save As

Aby skompilować przykładowy program, potrzebujemy w katalogu projektu plik Makefile; jest to specjalny plik tekstowy z regułami dla programu make. Program make automatyzuje proces kompilacji programów. By utworzyć odpowiedni dla naszego projektu plik Makefile, posłużę się dołączonym do WinAVR programem MFile.

Start->Programy->WinAvr->MFile [WinAVR]

MFile
Program MFile jest kreatorem-edytorem plików Makefile, z jego pomocą, szybko i łatwo, wygenerujemy gotowy plik Makefile wybierając odpowiednie opcje z menu; bez konieczności poznania reguł tworzenia takich plików.

W programie MFile, w kolejnych pozycjach menu "Makefile" ustawiamy parametry jak poniżej:

  • Main file name: main
    Po kliknięciu w pozycję menu "Main file name" pokaże się okienko z polem tekstowym, gdzie należy wpisać nazwę pliku programu, w którym znajduje się funkcja main programu; nazwę pliku należy wpisać bez rozszerzenia ".c" .
  • MCU type: ATmega16
    Z listy wybiera się typ mikrokontrolera AVR.
  • Output format: ihex
    Wybiera się format pliku wynikowego, można wybrać: plik w formacie hex, plik binarny lub plik z kodem w asemblerze.
  • Optimization level: s
    Optymalizacja kodu, można wybrać jeden z trzech poziomów(1,2,3) lub wyłączyć optymalizację(0) albo wybrać optymalizacja względem rozmiaru kodu(s).
  • C Standard level: gnu99
    Wybór standardu języka C, pozostawiamy bez zmian.
  • Debugging format: ELF/stabs
    Wybór formatu pliku do debugowania, pozostawiamy bez zmian.
  • C/C++ source file(s): (pomijamy, program składa się tylko z jednego pliku)
    Jeśli tekst program podzielony jest na wielu plików, to należy wpisać nazwy wszystkich plików z wyjątkiem pliku zawierającego funkcje "main". Nazwy plików trzeba rozdzielić spacją i tym razem należy wpisać je wraz z rozszerzeniami.
  • Assembler source file(s): (pomijamy)
    Wpisuje się nazwy plików z kodem w asemblerze.
  • printf() options: none/standart (nie używamy funkcji "printf" )
    Funkcja printf ze standardowej biblioteki jest bardzo rozbudowana i może zająć znaczną część pamięci programu uC. Dla zaoszczędzenia pamięci można zrezygnować z użycia funkcji "printf" lub wybrać jej wersję okrojoną.
  • scanf() options: none/standart (nie używamy funkcji "scanf")
    Podobnie jak z funkcją printf.
  • Programmer: stk200 (użyjemy programator zgodny z popularnym STK200)
    Wybiera się typ programatora. Jeśli używanego typu programatora brak liście (MFile go nie zna), można wpisać go ręcznie - patrz dalej w tekście.
  • Port: lpt2 (programator podłączony do portu drukarki lpt2)
    Wybiera się rodzaj i numer portu we/wy komputera do którego przyłączono programator. Ja mam w komputerze dwa porty równoległe: LPT1 i LPT2.

Mfile działa jak zwykły edytor tekstu, by móc ręcznie edytować treść tworzonego pliku Makefile trzeba zaznaczyć w menu "Makefile" opcję "Enable Editing of Makefile". Wiec robimy to, bo dodatkowo chcemy wpisać z jaką częstotliwością ma pracować mikrokontroler, a także kilka innych informacji, a czego nie można zrobić poprzez menu.

Będziemy programować nowego ATmega16, który domyślnie skonfigurowany jest do pracy z wewnętrznym oscylatorem RC 1MHz. Jeśli trzeba podać częstotliwość sygnału taktującego procesor, na przykład użyjemy w programie funkcji _delay_ms, to też najlepiej wpisać tę informację w pliku Makefile. Odnajdujemy w nowo tworzonym pliku Makefile fragment tekstu zaczynającym się od:

#Processor frequency

i zaraz po nim dopisujemy linię

F_CPU = 1000000
MFile
Mfile działa jak zwykły edytor tekstu, więc można "ręcznie" edytować tworzony plik Makefile.

Jeśli używamy programatora przyłączanego do portu równoległego komputera, warto wymusić by avrdude(program sterujący programatorem) zawsze po zakończeniu działania pozostawiał wyłączony sygnał RESET. Dzięki temu, natychmiast po zakończeniu operacji programowania Flash, mikrokontroler będzie mógł rozpocząć wykonanie nowego programu. Normalnie avrdude, po zakończeniu działania, przywraca port równoległy do stanu jaki zastał przed rozpoczęciem pracy.

Odnajdujemy w naszym Makefile sekcję z parametrami dla avrdude

#---------------- Programming Options (avrdude) ----------------

I dopisujemy dwie linie, te na początku i na końcu poniższego fragmentu:

AVRDUDE_EXITMODE = noreset AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY) AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE) AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER) AVRDUDE_FLAGS += -E $(AVRDUDE_EXITMODE)
MFile
Avrdude będzie uruchamiany z opcją "-E noreset", co, po zakończeniu programowania układu AVR, wymusi wyłączenie sygnału RESET.

Jeśli naszego programatora brakuje na liście - w menu programu MFile, a avrdude go obsługuje, to oczywiście wpisujemy typ programatora ręcznie. Listę obsługiwanych przez avrdude typów programatrów uzyskamy wpisując w wierszu poleceń systemu Windows komendę:

avrdude -c ?
MFile
MFile nie zna popularnego programatora usbasp, ten bardzo pomocny programik nie jest od kilku lat rozwijany, więc wpisałem ręcznie typ progamatora.

Gotowy plik Makefile zapisujemy w katalogu projektu pod nazwą "Makefile":

File->Save As

Gdy już mamy w katalogu projektu odpowiedni plik Makefile, możemy powrócić do edytora tekstu Programmers Notepad i uruchomić kompilacje:

Tools->[WinAVR]Make All

Programmers Notepad
PN dołączony do WinAVR został odpowiednio skonfigurowany do współpracy z programami pakietu, można uruchomić kompilacje edytowanego programu lub zaprogramować Flash układ AVR wybierając w menu Tools edytora odpowiednią opcję.

W trakcie kompilacji pojawi się okienko "Output" z informacjami o jej przebiegu, pod koniec wypisany zostanie komunikat:

> Process Exit Code: 0

Zwrócona wartość zero oznacza, że kompilacja przebiegła bez błędów. Istotną informacją jest też ile kod programu zajmie w pamięci uC.

Programmers Notepad
W okienku "Output" edytora drukują się komunikaty z informacjami o przebiegu kompilacji. Wartość "Process Exit Code" równa zero oznacza brak błędów.

Programowanie pamięci Flash układu AVR

Gdy kompilacja przebiegła bez błędów i w katalogu projektu mamy gotowy plik main.hex, można spróbować zaprogramować Flash AVRa.

Tools->[WinAVR] Program

Uruchomiony zostanie program avrdude i w okienku Output wypisane zostaną komunikaty o przebiegu programowania pamięci układu AVR. Wcześniej, jeśli w katalogu brak aktualnego pliku hex, make uruchomi kompilacja plików projektu.

Programmers Notepad
W okienku "Output" drukują się komunikaty z informacjami o przebiegu programowania pamięci Flash AVRa.

Jeśli podczas programowania pamięci pokaże się komunikat:

avrdude: can't open divice "giveio"

należy uruchomić skrypt:

C:\WinAVR\bin\install_giveio.bat

Programmers Notepad
Do obsługi programatorów przyłączanych poprzez port równoległy komputera avrdude potrzebuje sterownika "giveio".

Graficzny interfejs dla Avrdude

W pakiecie WinAVR do obsługi programatora używamy wspomnianego już avrdude, program ten obsługuje większość spotykanych programatorów i oznacza się dużymi możliwości. Ale avrdude jest programem działającym w konsoli, brak wersji okienkowej; jak dla mnie, nie jest to wadą tego programu, a bardziej zaletą; jednak typowy użytkownik komputera PC raczej nigdy nie korzysta z wiersza polecenia. Istnieją specjalne programiki tworzące interfejs graficzny, mające ułatwić pracę z avrdude. Przejrzałem trzy takie programiki: avrdude-gui, SinaProg, AVR8 Burn-O-Mat(Java); nie znajdziemy ich w WinAVR, trzeba dodatkowo pobrać z Internetu. Używając nakładki graficznej dla avrdude możemy przeprowadzać wszystkie operacje z programatorem klikając w okienkach. Można zapisać|odczytać|zweryfikować zawartość pamięci Flash i EEPROM; zapisać|odczytać fusebity i lockbity; odczytać|zapisać bajty kalibracji wewnętrznego oscylatora. SinaProg wyposażony jest dodatkowo w "kalkulator" fusebitów, ta funkcja z pewnością przyda się początkującym programistom AVRów, zwłaszcza do konfigracji częstotliwości pracy mikrokontrolera. Na początek polecam właśnie SinaProg, a w przyszłości używać bezpośrednio avrdude, w konsoli. Obszerna instrukcja do avrdude znajduje się w katalogu C:\WinAVr\doc.

Obsługa programu SinaProg jest zupełnie prosta. Wpierw należy wybrać w polu "Programmer" typ używanego programatora i port(LPTx|COMx|USB), a w polu "Device" wybrać typ układu AVR. Żeby zapisać|weryfikować|odczytać zawartość pamięci Flash|EEPROM, wpisujemy w polu "Hex file" nazwę pliku i w polu Flash|EEPROM klikamy przycisk Program|Verify|Read. SinaProg odczyta|tworzy jedynie pliki w formacie Intel Hex (chyba, bo dokładnie tego nie sprawdzałem), chociaż sam avrdude czyta|tworzy też pliki raw binarne. W ramce, poniżej pola "Hex file" wyświetlane są krótkie komunikaty o rezultacie operacji (sukces|niepowodzenie); kliknięcie przycisku "<" obok ramki powoduje otwarcie lub zamknięcie dodatkowego okienka "Output" z przechwyconymi komunikatami programu avrdude.

SinaProg
Program SinaProg - wygodny interfejs graficzny dla avrdude.

Aby móc zapisywać i odczytać: fusebity, lockbity oraz bajty kalibracji wewnętrznego oscylatora, klikamy w polu "Fuses" przycisk "Advanced"; pokaże się okienko jak na obrazku poniżej. W okienku znajdują się pola: Lock Bits, Calibration, High Fuse, Low Fuse, Ext. Fuse; widnieją tam wartości odczytane z przyłączonego układu AVR. Odczyt mikrokontrolera odbywa się wraz z otwarciem tego okienka oraz po kliknięciu przycisku "Read" poniżej. Odczytane wartości przedstawione mogą być w postaci dwójkowej, ósemkowej, szesnastkowej i dziesiętnej. W polach kontrolki tekstowe możemy ręcznie edytować, wprowadzone dane wysyłane są do AVRa po kliknięciu przycisku "Write".

SinaProg
SinaProg, programowanie fusebitów.

Kliknięcie przycisków "C" powoduje otwarcie okienka "kalkulatora" fusebitów lub lockbitów. Kalkulator fusebitów będzie bardzo użyteczny dla początkujących programistów AVRów.

Nowe (prosto ze sklepu) układy AVR atmega skonfigurowane są do pracy z wewnętrznym oscylatorem RC 1MHz; jeśli chcemy zwiększyć częstotliwość pracy mikrokontrolera, trzeba odpowiednio konfigurować fusebity. W przykładzie poniżej, dla użytego atmega16, z pomocą kalkulatora fusebitów, wyznaczyłem nową wartość dla Low_Fuse: 0xE4. Teraz sygnał taktujący mikroprocesora, od wewnętrznego oscylatora RC, będzie miał częstotliwość 8MHz.

SinaProg
SinaProg, kalkulator fusebitów.

Inne artykuły na podobny temat:

  1. AVR-GCC w Linuksie
  2. Atmel AVR GNU Toolchain


legenda

Komentarze (2)

Sebi
12.01.2015 (00:01)
gość
Ja chciałbym polecić Eclipse C++ + "Eclipse AVR Plugin" - bardzo wygodna alternatywa dla Programmer's notepada.
janzs
22.02.2013 (18:46)
gość
Brawo. Niezwykle pożyteczny artykuł. Moje pierwsze kroki z tym programem to prawie horror (mimo dawnych doświadczeń z assemblerem i dobrej znajomości angielskiego).
WinAVR jest wyjątkowo "user unfriendly" wygląda jakby został napisany dla zawodowych programistów.
Dzięki.
Artykuły>Mikrokontrolery i PLD>Szybki start z WinAVR
Ostatnie artykuły