K U R S
AVR-GCC: kompilator C
mikrokontrolerów AVR, część 2
Kontynuujemy cykl artykułów, których zadaniem jest przedstawienie podstaw
oraz praktycznych zasad programowania mikrokontrolerów AVR w języku C
z użyciem kompilatora avr-gcc. Oczywiście wybór kompilatora AVR-GCC może
się jednym podobać, a innym nie. Postaramy się jednak uzasadnić, że nie
jest to zły wybór.
Środowisko avrside cie realizacji kolejnych przykładów. także umożliwia korzystanie z wbu-
Uproszczone zintegrowane środo- Na początek warto jednak spojrzeć - dowanej przeglądarki projektów.
wisko programistyczne (Avr S-imple podobnie jak w przypadku avr-gcc - W każdym subfolderze projektu
I-ntegrated D-evelopment E-nviron- na strukturę katalogów programu aby zapisujemy pliki zródłowe (*.c, *.s
ment) powstało właśnie w celu ła- nie stanowił on tajemniczej czarnej oraz *.h) oraz plik konfiguracji pro-
twego rozpoczęcia nauki programo- skrzynki . Drzewo katalogów (doty- jektu (nazwa_projektu.gcp) określający
wania mikrokontrolerów AVR Atmela czące instalacji AvrSide we własnym wszystkie opcje, ustawienia, ścieżki
z użyciem avr-gcc w systemie Win- niezależnym od WinAvr folderze) jest itp. użyte w projekcie. W tym sa-
dows. Zawiera edytor kodu zródło- przedstawione na rys. 3. mym subfolderze powstają wspo-
wego z kolorowaniem składni oraz W podkatalogu [bin] umieszczo- mniane wcześniej pliki wynikowe
systemem podpowiedzi i wyszukiwa- ny jest plik wykonawczy AvrSide.exe działania kompilatora. W głównym
nia. Pozwala na wygodne ustawianie oraz pliki konfiguracyjne: folderze [Projects] znajdziemy też
w oknie dialogowym podstawowych desktop.cfg - zapis ogólnej konfi- plik lastwork.cfg zapisujący dane pro-
opcji kompilacji. Uruchamia - po- guracji środowiska (np. położenie jektu używanego w chwili zamykania
dobnie jak make - kolejno potrzeb- i rozmiar okien), AvrSide (co pozwala na natychmia-
ne podprogramy avr-gcc i raportuje autocpl.cfg - plik tekstowy szablo- stowe przywrócenie środowiska pracy
ewentualne błędy wykonania z moż- nów autokompletacji kodu, podczas ponownego uruchomienia)
liwością ich lokalizacji w kodzie libfunc.cfg - plik tekstowy auto- oraz - tylko w przypadku używania
zródłowym. Jednocześnie zaś umoż- kompletacji funkcji avr-libc, AvrProgrammera - pliki eeprom.hex i
liwia dokładne zapoznanie się z wy- ftd2xx.dll - dodatkowo biblioteka flash.hex wykorzystywane przez ten
wołaniami avr-gcc i wynikiem pracy FTDI niezbędna do uruchomienia programator.
kompilatora, z czego będziemy na AvrSide jeśli nie mamy w sys- Foldery [Freaks] i [Notes] nie są
bieżąco korzystać. temie zainstalowanego sterownika bezpośrednio związane z AvrSide
Szczegóły obsługi AvrSide najle- direct dla układów Ft8uxx. ani avr-gcc - przechowuję tam róż-
piej chyba będzie objaśniać w trak- W podkatalogu [dev] przechowy- ne notatki, noty aplikacyjne, wypisy
wane są pliki *.pdf firmowej doku- z forum i listy avr-gcc itp. - w ten
mentacji mikrokontrolerów. Nazwane sposób nie rozbiega mi się to po
są zgodnie z typem mikrokontrolera całym dysku.
ustalonym w AvrSide, co pozwala
na ich otwieranie z poziomu menu Tworzymy pierwszy testowy projekt
pomocy programu. Po zainstalowaniu wszystkich
Dalej widzimy omówione wcze- wcześniej wymienionych składników
śniej foldery kompilatora avr-gcc w na dysku pora na wypróbowanie
różnych wersjach. Folder [isp] zawie- działania środowiska. Wszystkie przy-
ra pliki programatora AvrProgrammer taczane przykłady dotyczą AvrSide
Adama Dybkowskiego. Foldery [My- ulokowanego w folderze c:\AvrSide i
inc] oraz [MyLib] są przeznaczone na korzystającego z wersji avr-gcc z sub-
własne - bardziej uniwersalne i sto-
sowane w większej liczbie projektów
- pliki nagłówkowe oraz biblioteki.
Folder [Projects] grupuje podkata-
logi (a także drzewa podkatalogów)
poszczególnych projektów. Każdy
nowy projekt powinien być zakłada-
ny w oddzielnym podkatalogu (np.
\Projects\Nowy_projekt) lub drzewie
(np. \Projects\Kurs\Przyklad_01). Ta-
kie rozwiązanie umożliwia zacho-
wanie porządku i przejrzystości we Rys. 4. Opcje ustawień ekranowych
Rys. 3. Struktura folderów AvrSide własnych archiwach projektowych, a AvrSide
Elektronika Praktyczna 4/2005
89
K U R S
jakimkolwiek managerze plików); wrócić ustawienie domyślne w
przejdzmy do [Przyklad-01] na- dowolnym inaczej skonfiguro-
zwijmy plik main.c (rozszerzenie wanym projekcie);
jest dodawane domyślnie) i po- 2. Ścieżki - tu na razie ustawia-
twierdzmy; okno zapisu przełączy my tylko namiar na pliki wy-
się samoczynnie na zachowywa- konawcze narzędzi kompilatora,
nie projektu - nazwijmy go np. w naszym przykładzie będzie to
Test01 i zapiszmy; C:\AvrSide\gcc-3.4.2-2.15-1.0.4\bin
nasze nazwy zostały wprowadzone (jeśli zrobimy błąd i AvrSide nie
do projektu: plik na zakładce (tab) znajdzie kompilatora zgłosi to
Rys. 5. Opcje ustawień konfiguracji edytora, a projekt na belce tytu- przy próbie kompilacji);
plików wynikowych i typu mikrokon- łowej okna (w managerze plików 3. AvrSide - wyłączmy na ra-
trolera możemy też od razy sprawdzić zie opcję Samoczynnie zamykaj
poprawność zapisu - subfolder okno postępu kompilacji , będzie
folderu \AvrSide\gcc-3.4.2-2.15-1.0.4, \Projects\Kurs\Przyklad-01 powinien to pomocne w zapoznaniu się
bez użycia pakietu WinAvr. Należy zawierać dwa pliki: main.c oraz z przebiegiem kompilacji; pozo-
je więc każdorazowo dopasować do Test01.gcp); stałe opcje można zostawić jako
ustawionych u siebie lokalizacji. nazwy oczywiście możemy wy- domyślne (starsze PC mogą tak-
Podczas pierwszego uruchomienia brać dowolnie, jedynym ograni- że wymagać wyłączenia opcji
AvrSide otwiera w domyślnym poło- czeniem jest aby plik projektu Fast reading co umożliwi pracę
żeniu okno pustego projektu NONA- *.gcp nie nazywał się tak samo z małym RAM-em, ale kosztem
ME z pojedynczą zakładką pustego jak jakikolwiek plik zródłowy, szybkości działania);
pliku zródłowego NoName. Wywo- gdyż spowoduje to nadpisywanie 4. Wyjście (rys.5) - większość po-
łajmy skrótem Ctrl+J wykaz szablo- plików wynikowych listingu. zycji pozostawiamy na razie jako
nów kodu i wybierzmy mainmod Zanim ruszymy dalej z kompila- domyślne, sprawdzmy tylko czy
- szablon modułu głównego - zosta- cją zajmijmy się przez chwilę skonfi- są zaznaczone opcje: Zbiorczy
nie wpisany najprostszy, podstawowy gurowaniem środowiska oraz ustawie- listing projektu i Debug format
program z pustą pętlą: niem opcji projektu. Okno główne - dwarf-2 .
// główny moduł projektu umieszczamy na ekranie według po- Opcje kompilatora i linkera pozo-
#define _MAIN_MOD_ 1
trzeb - jego pozycja będzie odtąd na stawiamy bez zmian (będą oczywi-
// pliki dołączone (include):
// dane:
stałe zapamiętana we wspomnianym ście przedstawiane bardziej szczegó-
// funkcje:
/====================
wcześniej pliku ogólnej konfiguracji łowo w dalszych przykładach).
// funkcja main()
int main(void)
desktop.cfg. Następnie wybieramy z Po zamknięciu dialogu opcji mo-
{
// inicjalizacja
menu komendę Projekt>>Ustawie- żemy zapisać zmiany w projekcie
// pętla główna
while (1) nia i przełączamy widok kolejno na ( Projekt>>Zapisz projekt ) ale nie
{
potrzebne pozycje: jest to bezwzględnie konieczne gdyż
}
}
1. Ekran (rys. 4) - tutaj ustawimy zostaną samoczynnie zachowane przy
Teraz od razu wybierzmy lokali- sobie: przełączaniu projektu albo zamknię-
zację i nazwijmy plik oraz projekt: kolory i style dla podswietla- ciu AvrSide.
z menu Plik wybieramy komen- nych elementów składni kodu Po tych wszystkich wstępnych
dę Zapisz albo Zapisz jako zródłowego (wybieramy w czynnościach możemy wreszcie wy-
(w przypadku nowego pliku są prawym panelu posługując się próbować działanie kompilatora.
one równoważne); typowymi windowsowymi kon- Skrót klawiaturowy F9 spowodu-
w t y p o w y m w i n d o w s o w y m trolkami); je wykonanie niezbędnego szeregu
oknie dialogowym zapisywa- rodzaj i wielkość czcionki operacji (jest to odpowiednik pozy-
nia pliku otwartym na folde- oraz kolor tła dla głównych cji menu Projekt>>Make - jednak
rze [Projects] tworzymy nowy okienek AvrSide (edytor, ko- nazwa ta nie ma nic wspólnego z
podkatalog [Kurs] a w nim ko- munikaty błędów oraz podgląd klasycznym programem make), po-
lejny subfolder [Przyklad-01] asemblera); używamy do tego kazanych w oknie postępu (celowo
(używamy zwykłych narzędzi kontekstowego menu (prawy- wyłączyliśmy jego samoczynne za-
Windows czyli menu kontekstowe- -klik) trzech małych paneli po mykanie aby je sobie spokojnie obej-
go, możemy też jednak przygoto- lewej stronie; rzeć) - rys. 6.
wać sobie te foldery wcześniej w wygląd menu głównego (trady-
cyjny lub zgodny z XP);
rozmiar czcionki w generowa-
nym kodzie HTML;
ustawienia dotyczą naszego
pojedynczego projektu, jeśli
chcemy ich używać w każ-
dym nowym projekcie zapisz-
my je jako domyślne (w desk-
top.cfg) przy pomocy przycisku
Rys. 6. Wynik kompilacji przykłado- DEF>> (podobnie przyciskiem Rys. 7. Okno konfiguracyjne sesji
wego projektu DEF<< możemy pózniej przy- debuggera w AvrStudio
Elektronika Praktyczna 4/2005
90
K U R S
Jeśli teraz przełączymy się do ma- jestry 0x3e,0x3d - na etapie pliku la używającej adresów dwubajtowych
nagera plików znajdziemy w folderze relokowalnego nie są jednak jeszcze słów - dlatego adresy podawane w
naszego projektu szereg nowych pli- wstawiane konkretne wartości) i od notach i dokumentacjach należy dla
ków utworzonych w trakcie działania razu przechodzi do pustej nieskoń- potrzeb avr-gcc mnożyć przez dwa).
kompilatora (sięgnijmy do rys. 1): czonej pętli while (1). Dodatkowy kod spełnia kilka zadań
main.o: plik relokowalny modułu Jednak coś się tu nie zgadza: ten związanych z inicjalizacją pracy pro-
main.c, kod ma najwyżej kilka bajtów dłu- gramu (będziemy pózniej wracać do
Test01.hex: plik wynikowy kodu gości, a wynik kompilacji na pasku tego tematu bardziej szczegółowo):
programu (flash), statusu pokazał nam 102 bajty. Aby 1. Sekcja <__vectors> ustawia obszar
Test01.map: plik informacyjny znalezć różnicę zajrzyjmy do pliku wektorów przerwań odpowiedni
konsolidatora, Test01.lst, który zawiera ostateczny dla użytej kostki. Przerwanie pod
Test01.lst: plik assemblerowego li- kod po zakończeniu konsolidacji (do adresem 0x0 (czyli reset) zawiera
stingu całego projektu, tego posłuży nam skrót Ctrl+F7): skok na koniec obszaru wektorów.
Test01.elf: plik obiektowy projektu, Test01.elf: file format elf32-avr Pozostałe wektory domyślnie (o
Disassembly of section .text:
Test01.smb: wykaz symboli uży- 00000000 <__vectors>:
ile nie została zdefiniowana ob-
0: 12 c0 rjmp .+36 ; 0x26
tych w projekcie, sługa danego przerwania) wskazu-
2: 2b c0 rjmp .+86 ; 0x5a
4: 2a c0 rjmp .+84 ; 0x5a
Test01.txt: rejestracja komend wy- ją na błędne przerwanie.
6: 29 c0 rjmp .+82 ; 0x5a
8: 28 c0 rjmp .+80 ; 0x5a
konanych w trakcie kompilacji. 2. Sekcja <__ctors_end> kończy ob-
a: 27 c0 rjmp .+78 ; 0x5a
c: 26 c0 rjmp .+76 ; 0x5a
Zauważmy, że nie ma tu pliku szar wektorów - w tym miejscu
e: 25 c0 rjmp .+74 ; 0x5a
pośredniego main.s - dla przyśpiesze- 10: 24 c0 rjmp .+72 ; 0x5a ląduje skok z przerwania spo-
12: 23 c0 rjmp .+70 ; 0x5a
nia działania nie jest on zapisywany wodowanego resetem. Sekcja wy-
14: 22 c0 rjmp .+68 ; 0x5a
16: 21 c0 rjmp .+66 ; 0x5a
na dysku, a powstaje w chwilowym konuje kilka dodatkowych czyn-
18: 20 c0 rjmp .+64 ; 0x5a
1a: 1f c0 rjmp .+62 ; 0x5a
buforze pamięci operacyjnej. Pliki re- ności: zeruje rejestr r1 (co jest
1c: 1e c0 rjmp .+60 ; 0x5a
1e: 1d c0 rjmp .+58 ; 0x5a
lokowalne *.o zachowują nazwy od- wymagane przez standard wyko-
20: 1c c0 rjmp .+56 ; 0x5a
22: 1b c0 rjmp .+54 ; 0x5a
powiadających modułów zródłowych, rzystywania rejestrów w avr-gcc),
24: 1a c0 rjmp .+52 ; 0x5a
natomiast zbiorczym plikom wyniko- zeruje rejestr stanu i ustawia re-
00000026 <__ctors_end>:
wym AvrSide nadaje nazwę projektu jestry stosu (zauważmy, że stos
26: 11 24 eor r1, r1
28: 1f be out 0x3f, r1 ; 63
z odpowiednim rozszerzeniem. jest zatem ustawiany dwukrotnie
2a: cf e5 ldi r28, 0x5F ; 95
2c: d4 e0 ldi r29, 0x04 ; 4
W ostatnim z plików - Test01.txt - jest to jakaś zaszłość rozwo-
2e: de bf out 0x3e, r29 ; 62
30: cd bf out 0x3d, r28 ; 61
- znajdziemy zapis kolejnych ko- jowa kompilatora, która będzie
00000032 <__do_copy_data>:
mend kompilatora odpowiadających prawdopodobnie usunięta w dal-
32: 10 e0 ldi r17, 0x00 ; 0
pozycjom okienka postępu. Nie bę- 34: a0 e6 ldi r26, 0x60 ; 96 szych wersjach).
36: b0 e0 ldi r27, 0x00 ; 0
dziemy się w nie teraz na początku 3. Sekcje <__do_copy_data_xx> służą
38: e6 e6 ldi r30, 0x66 ; 102
3a: f0 e0 ldi r31, 0x00 ; 0
zagłębiać, ale wykorzystamy ten plik do załadowania wartościami zmien-
3c: 02 c0 rjmp .+4 ; 0x42
wielokrotnie podczas dalszego pozna- nych, które w programie zdefinio-
0000003e <.do_copy_data_loop>:
3e: 05 90 lpm r0, Z+
wania avr-gcc. waliśmy jako zainicjalizowane.
40: 0d 92 st X+, r0
Z punktu widzenia elektroni- 4. Sekcje <__do_clear_bss_xx> służą
00000042 <.do_copy_data_start>:
ka - konstruktora najważniejszy jest 42: a0 36 cpi r26, 0x60 ; 96 z kolei do wyzerowania wszystkich
44: b1 07 cpc r27, r17
oczywiście plik kodu *.hex, który za zmiennych nie zainicjalizowanych
46: d9 f7 brne .-10 ; 0x3e
pomocą dowolnego programatora ła- (które w standardzie C muszą
00000048 <__do_clear_bss>:
48: 10 e0 ldi r17, 0x00 ; 0
dujemy do mikrokontrolera. Odłóżmy mieć domyślnie wartość zero).
4a: a0 e6 ldi r26, 0x60 ; 96
4c: b0 e0 ldi r27, 0x00 ; 0
to jednak na nieco pózniej i naj- 5. Sekcja <__bad_interrupt> stanowi
4e: 01 c0 rjmp .+2 ; 0x52
pierw obejrzyjmy trochę dokładniej (jak wspomniano wyżej) domyśl-
00000050 <.do_clear_bss_loop>:
wygenerowany kod. Skorzystamy w 50: 1d 92 st X+, r1 ną obsługę błędnego przerwania,
tym celu z wbudowanych udogod- 00000052 <.do_clear_bss_start>:
jest to po prostu skok pod adres
52: a0 36 cpi r26, 0x60 ; 96
nień AvrSide. Skrót klawiaturowy F7 zero czyli na początek programu.
54: b1 07 cpc r27, r17
56: e1 f7 brne .-8 ; 0x50
otworzy nam okno podglądu kodu Cały ten blok kodu jest zawar-
58: 01 c0 rjmp .+2 ; 0x5c
asm odtworzonego ( zdeasemblowane- ty w relokowalnych plikach crtxx.o
0000005a <__bad_interrupt>:
5a: d2 cf rjmp .-92 ; 0x0
go ) z pliku relokowalnego bieżącego umieszczonych w podkatalogu (wróć-
modułu (u nas mamy tylko jeden - 0000005c
: my do rys. 2) \avr\lib\ kompilatora.
main.o). Widzimy następującą treść Komenda wywołania konsolidatora:
/====================
// funkcja main()
(sekcja .text określa obszar pamięci avr-gcc.exe -mmcu=atmega8 -Wl,-
int main(void)
{
programu Flash): -Map=Test01.map,--cref -o Test01.elf
5c: cf e5 ldi r28, 0x5F ; 95
5e: d4 e0 ldi r29, 0x04 ; 4
main.o: file format elf32-avr main.o
60: de bf out 0x3e, r29 ; 62
Disassembly of section .text:
62: cd bf out 0x3d, r28 ; 61
(znajdziemy ją we wspominanym
00000000 :
// inicjalizacja
/====================
już pliku Test01.txt) zawiera w sobie
// funkcja main()
// pętla główna
int main(void)
obowiązkowo opcję typu procesora. Na
while (1)
{
64: ff cf rjmp .-2 ; 0x64
0: c0 e0 ldi r28, 0x00 ; 0
tej podstawie konsolidator dołącza od-
2: d0 e0 ldi r29, 0x00 ; 0
4: de bf out 0x3e, r29 ; 62
Teraz zgadza się wszystko: ostat- powiedni plik crtxx.o oraz wybiera od-
6: cd bf out 0x3d, r28 ; 61
// inicjalizacja ni bajt kodu ma adres 0x65=101 powiedni skrypt (ze skryptu pochodzi
// pętla główna
- przy numeracji od zera długość m.in. docelowa wartość rejestru stosu:
while (1)
8: ff cf rjmp .-2 ; 0x8
wynosi 102 (przy okazji zauważmy, 0x45F, która - jak łatwo sprawdzić w
Funkcja main() ustawia na sa- że gcc stosuje adresowanie bajtowe dokumentacji Atmega 8 - odpowiada
mym początku wskaznik stosu (re- w przeciwieństwie do notacji Atme- końcowi obszaru pamięci SRAM).
Elektronika Praktyczna 4/2005
91
K U R S
Obecność bezparametrowej funk- na konieczność zachowania dodatkowej też sobie pasujący układ okien i sche-
cji main(void) wynika z zasad języ- ostrożności przy stosowaniu peceto- mat kolorowania składni.
ka C - każdy program musi ją mieć wych umiejętności programowania w Jeśli teraz zamkniemy AvrStudio
jako podstawową ramkę obejmują- C dla potrzeb mikrokontrolerów - cały parametry sesji zostaną zachowane w
cą wszystkie wewnętrzne działania. czas trzeba mieć świadomość, że prze- pliku Test01_elf.aps (ulokowanym w fol-
Jednak aplikacja działająca w małym nosimy się do środowiska o radykalnie derze naszego projektu), który posłuży
mikrokontrolerze będzie się dość innych możliwościach i wymaganiach. do jej samoczynnego wznawiania. Po-
istotnie różnić od zwykłego pro- Pojawi się niechybnie wątpliwość, nowne użycie F11 z poziomu AvrSide
gramu komputerowego. Taki program czy tak długi kod dla nic-nie-robiącego spowoduje uruchomienie AvrStudio od
jest uruchamiany przez system ope- programu nie jest marnowaniem cennej razu z naszym projektem (w zależności
racyjny, zakończenie funkcji main() pamięci Flash mikrokontrolera? No cóż od wydajności sprzętu może to chwilę
jest równoznaczne z zakończeniem - zawsze trzeba jakoś zapłacić za wygo- potrwać). Natomiast przy działającym
programu i powrotem do systemu. dę i standaryzację. Poza tym - pisząc w już Studiu efektem będzie po prostu
Wstawienie takiej jak u nas zamknię- C będziemy i tak sięgać raczej po kost- przywołanie jego okna. Warto poświę-
tej pętli jest kardynalnym błędem, ki o większych możliwościach aby nie cić chwilę czasu na przejrzenie możli-
gdyż uniemożliwia wyjście z main() przejmowac się ograniczonymi zasoba- wości, opcji i klawiszologii AvrStudio
co jest równoznaczne z zawiesze- mi. Dla przykładowej ATmega8 inicjali- - to znakomicie ułatwi pózniej analizę
niem się aplikacji. Zapis musi wy- zacja zajmuje ok. 1% dostępnej pamięci kolejnych przykładów.
glądać nieco inaczej (zazwyczaj wsta- programu, co jest wartością nieznaczną. Należy jednak cały czas mieć na
wimy jeszcze jakieś oczekiwanie na Dla Atmega128 z 16-krotnie większym uwadze, że najnowsze wersje AvrStudio
klawisz, żeby zamknięcie nie nastą- Flashem jest to już zupełnie pomijalne. wyposażone w możliwość bezpośrednie-
piło natychmiast): Natomiast w ATtiny13 z 1 kB programu go odczytu plików *.elf (z pominięciem
int main(void) oraz 64 B SRAM rzeczywiście C może dodatkowych konwersji elf >> coff, któ-
{ return 0; }
się zachowywać jak przysłowiowy słoń re zawsze były piętą achillesową współ-
Natomiast w atmedze oczywiście w składzie porcelany. W tym przypad- pracy z avr-gcc) są cały czas rozwijane
nie ma żadnego nadrzędnego sys- ku wybór narzędzia (C czy asm) będzie i dopracowywane - mogą się więc przy-
temu operacyjnego, któremu moż- podyktowany rzeczywistymi wymagania- trafiać rozmaite błędy. Dlatego warto na
na przekazać sterowanie. Wyjście z mi naszej konkretnej aplikacji. bieżąco sprawdzać czy nie pojawiły się
funkcji main() spowoduje po prostu jakieś aktualizacje (chodzi głównie o po-
opuszczenie obszaru kodu programu Uruchamiamy sesję debuggera prawione wersje bibliotek, często przeka-
i utratę kontroli nad mikrokontrole- Na koniec tego wstępnego rozdziału zywane poprzez forum avrfreaks).
rem - czyli znów kardynalny (cho- sprawdzmy jeszcze jak działa AvrStudio Jeśli wszystko poszło bez proble-
ciaż zupełnie innej natury) błąd. 4.10 w roli symulatora i debuggera. Z mów, to mamy po tej części artykułu:
Spróbujmy skompilować nasz test poziomu AvrSide po prostu wciskamy przygotowane środowisko do tworze-
w takiej wersji. W kodzie wyniko- F11 (albo używamy odpowiedniej ko- nia oraz symulacji i debugowania
wym czeka nas miła niespodzianka: mendy menu). Jednak za pierwszym projektów,
int main(void) razem zamiast startu AvrStudio zostaje wstępne rozeznanie jak są rozmiesz-
{
wyświetlone okienko informacyjne ze czone i jak współpracują jego po-
5c: cf e5 ldi r28, 0x5F ; 95
5e: d4 e0 ldi r29, 0x04 ; 4
wskazówkami dalszego postępowania. szczególne komponenty,
60: de bf out 0x3e, r29 ; 62
62: cd bf out 0x3d, r28 ; 61
Zgodnie z nimi uruchamiamy ręcznie orientację w typach plików używa-
// inicjalizacja
// pętla główna
AvrStudio z pustą sesją a następnie: nych w trakcie budowy projektu,
//while (1)
//{
otwieramy plik C:\AvrSide\Projects\ podstawowe informacje o zasadach
//}
return 0; Kurs\Przyklad-01\Test01.elf, działania kompilatora i uzyskiwanym
}
w wyświetlonym oknie konfiguracji wynikowym kodzie.
64: 80 e0 ldi r24, 0x00 ; 0
66: 90 e0 ldi r25, 0x00 ; 0
(rys. 7) wybieramy platformę debu- Jerzy Szczesiul, EP
68: 00 c0 rjmp .+0 ; 0x6a
gera - AVR Simulator, jerzy.szczesiul@ep.com.pl
0000006a <_exit>:
6a: ff cf rjmp .-2 ; 0x6a
oraz wybieramy typ układu - At-
Niektóre przydatne linki
Jak widać avr-gcc przewidział mega 8 (może się zdarzyć, że
http://winavr.sourceforge.net - strona
taką sytuację i samoczynnie (po wybór układu jest zablokowany -
domowa WinAvr
zwrocie w rejestrach r25,r24 dekla- świadczy to o braku w systemie
http://www.avrfreaks.net - największe forum
rowanej wartości zero) dodał sekcję odpowiedniej wersji parsera XML,
mikrokontrolerów AVR
<_exit>, która znów jest zamkniętą należy przeprowadzić update z
http://www.atmel.com - firmowa strona
pętlą. Oczywiście mikrokontroler za- witryny Microsoftu - znajdziemy producenta AVR
http://www.nongnu.org/avr-libc/ - strona
niemówi w oczekiwaniu na reset, o tym wzmiankę w opisie usterek
domowa projektu avr-libc
niemniej jego zachowanie pozostaje w pomocy AvrStudio).
http://gcc.gnu.org - strona główna
całkowicie przewidywalne. Po chwili projekt zostanie załado-
kompilatora gcc
Zwróćmy przy okazji uwagę, że w wany i w oknie edycji pojawi się nasz
http://sources.redhat.com/binutils/ - strona
wersji atmegowej kompilator uwzględ- kod ze wskaznikiem programu ustawio- narzędzi binutils
http://www.avrside.fr.pl - strona środowiska
nia fakt nie opuszczania main() i nie nym na funkcji main(). Nasz skrajnie
AvrSide
generuje ostrzeżenia o braku zwracanej uproszczony projekt nie daje żadnych
http://www.avrside.ep.com.pl - strona
wartości (control reaches end of non- praktycznych możliwości debugowania,
środowiska AvrSide
-void function) nawet jeśli pomijamy możemy jednak sprawdzić działanie: http://www.amwaw.edu.pl/~adybkows/elka/
ispprog.html - programator ISP LPT Adama
końcową instrukcję return. startu i wstrzymania wykonywania, re-
Dybkowskiego
Powyższy przykład wskazuje też setu oraz pracy krokowej. Wybierzmy
Elektronika Praktyczna 4/2005
92
Wyszukiwarka
Podobne podstrony:
04 2005 kosmos aurora
Mosty łukowe AUTOSTRADY [04 z 2005]
mat 04 2005 ii
kolokwia WPR k 04 2005 sydow
kolokwia WPR k 04 2005 sydow
mat 04 2005 iii
HTML & PHP Jak działają formularze , WAP Statystyki przez WAP, czyli jak połączyć PHP z językiem
Personalfragebogen 11 04 2005
mat 04 2005 i
więcej podobnych podstron