Kurs AVR-GCC cz.2.pdf

(253 KB) Pobierz
1 z 19
Artykuł pochodzi ze strony XYZ HOBBY ROBOT (xyz.isgreat.org)
Kurs AVR-GCC cz.2
30.11.2008 ABXYZ
W pierwszym odcinku kursu
zainstalowaliśmy pakiet programów
WinAVR, nauczyliśmy się kompilować kody
źródłowe programów oraz ładować
programy do pamięci flash
mikrokontrolera AVR. W tej części kursu
zaczniemy pisać proste programy w języku
C, poznamy w jaki sposób programować
równoległe porty wejścia/wyjścia układów
AVR. Zaczniemy od naprawdę prostych przykładów :), zupełnie od
zera. Jeśli i tak coś w tekście będzie niezrozumiałe, to nie naleŜy
szybko się zniechęcać, w trakcie dalszej lektury kursu powinno się
wyjaśnić.
Równoległe porty wejścia/wyjścia
Układ atmega8 w obudowie DIP28, na którym będziemy uruchamiać
przykładowe programy, posiada 28 wyprowadzeń, z których 23
mogą słuŜyć jako uniwersalne binarne wejścia/wyjścia. Linie we/wy
atmega8 podzielone są na trzy grupy, nazwane: PORTB, PORTC i
PORTD. Mikrokontrolery AVR w obudowach DIP40(atmega16,
atmega32) posiadają cztery porty: A,B,C,D; natomiast attiny2313
w obudowie DIP20, posiada: PORTA (tylko PA0..PA2), PORTB
i PORTD(PD0..PD6).
PORTB układu atemga8 posiada osiem linii we/wy (PB0..PB7), ale
jeśli zamierzamy podłączyć do mikrokontrolera rezonator, to linie
PB6 i PB7 odpadają. Z kolei wyprowadzenia: 17(PB3), 18(PB4)
i 19(PB4) wykorzystywanie są przy programowaniu szeregowym
ISP pamięci flash mikrokontrolera. PORTC uC atmaga8 posiada 7
linii we/wy (PC0..PC6), ale wyprowadzenie 1(PC6) normalnie pełni
rolę wejścia sygnału reset mikroprocesora. Aby wykorzystywać
wyprowadzenie 1(PC6) atmeg8 jako kolejną linię portu we/wy,
potrzeba zaprogramować fuse-bit RSTDISBL (na temat fuse-bitów
będę pisał), lecz w ten sposób pozbawimy się moŜliwości
programowania szeregowego ISP pamięci FLASH mikrokontrolera.
PORTD atmega8 posiada 8 linii we/wy (PD0..PD7).
Rozkład wyprowadzeń mikrokontrolera ATmega8
2 z 19
KaŜda z wymienionych linii we/wy układu atmega8 moŜe zostać
indywidualnie skonfigurowana jako binarne wejście lub wyjście.
Domyślnie wszystkie ustawione są wejściami z wyjątkiem
wyprowadzenia 1 (RESET|PC6), które jest normalnie w atmega8
wejściem sygnału RESET mikroprocesora.
Program kontroluje układy peryferyjne mikrokontrolera AVR
poprzez "rejestry I/O", 64 8-bitowe rejestry I/O znajdują się
w przestrzeni adresowej pamięci danych - program moŜe zapisywać
do "rejestrów I/O" lub odczytywać z nich jakby korzystał z pamięci
RAM. W zbiorze instrukcji języka maszynowego uC AVR istnieją teŜ
specjalne rozkazy słuŜące do odczytu(zapisu) zawartości rejestrów
I/O, takŜe rozkazy do manipulowani poszczególnymi bitami
rejestrów. W jaki sposób moŜna w AVR-GCC odczytywać i
zapisywać rejestry I/O pokaŜę za chwilę, przy objaśnianiu
przykładowych programów.
Z kaŜdym z równoległych portów we/wy: A,B,C,D powiązane są po
trzy rejestry I/O, o nazwach: DDRx, PORTx, PINx, gdzie x to
oczywiście litery A,B,C,D. Stan poszczególnych bitów rejestrów
DDRx (Port Data Direction Register) decyduje czy odpowiadające im
linie są wejściami, czy wyjściami (0-wejście, 1-wyjście).
Jeśli dana linia we/wy pracuje jako wyjście, wtedy ustawiając na
wartość 1 odpowiadający tej linii bit w rejestrze PORTx (Port Data
Register), wymuszamy na wyprowadzeniu stan wysoki napięcia,
a ustawiając wartość bitu na 0, oczywiście stan niski.
Jeśli linię we/wy skonfigurowano jako wejście, poziom napięcia na
wyprowadzeniu, niski czy wysoki, sprawdza się odczytując wartość
odpowiadającego tej linii bitu w rejestrze PINx (Port Input Pins
Address), oczywiście wartość 0 oznacza stan niski, 1 stan wysoki.
Dodatkowo, gdy linia jest wejściem i odpowiadający tej linii bit w
rejestrze PORTx ma wartość 1, wtedy wyprowadzenie jest
wewnętrznie podciągnięta do napięcia zasilania.
DDRx.n PORTx.n
0
0
1
0
1
0/1
Px.n
wejście
wejście z podciągnięciem do VCC
wyjście
Konfiguracja równoległych portów we/wy mikrokontrolerów AVR
A teraz przykład konfiguracji portu B, patrzymy na ilustrację
poniŜej.
3 z 19
Przykład konfiguracji portu B
WyŜej, na ilustracji widać, Ŝe cztery mniej znaczące bity rejestru
DDRB mają wartość "0", a pozostałe cztery wartość "1", więc linie
PB0..PB3 będą wejściami, a linie PB4..PB7 będą wyjściami. Bity
numer 0 i 1 w rejestrze PORTB ustawione zostały na wartość 1,
więc linie PB0 i PB1 pracują jako wejścia z wewnętrznym
podciągnięciem do napięcia zasilania. Stan wejść (PB0..PB3)
sprawdzamy odczytując bity 0..3 rejestru PINB, natomiast
zmieniając wartości bitów 4..7 rejestru PORTB moŜna wymusić
oczekiwany stan napięcia(wysoki lub niski) na wyprowadzeniach
PB4..PB7.
Schematy połączeń
Oprócz mikro_kontrolera AVR, dla uruchomienia przykładowych
programików, potrzebne będą: osiem diod LED, cztery miniaturowe
przyciski monostabilne oraz buzzer z generatorem. Diody LED
przyłączone będą do portu D, przyciski do linii PC0..PC3, a buzzer
do PB1. KaŜda z ośmiu diod LED, wraz z rezystorem ograniczającym
prąd, przyłączona jest między wyprowadzenie portu a masę, więc
będzie się świecić, kiedy do odpowiedniego bitu rejestru wpiszemy
wartość "1".
Przyciski przyłączone są do linii we/wy portu C w taki sposób, Ŝe
przy wciśnięciu zwierają dane wyprowadzenie układu z masą, więc
przy wciśniętym przycisku z rejestru PINC odczytamy wartość
odpowiedniego bitu "0", a przy zwolnionym przycisku, odczytamy
"1". Linie we/wy z przyłączonymi w ten sposób przyciskami naleŜy
skonfigurować jako wejścia z podciągnięciem do VCC.
Sposób przyłączenia przycisku do portu we/wy uC AVR
Dla przejrzystości schemat połączeń rozdzieliłem na dwa. Pierwszy
schemat przedstawia sposób przyłączenia do atmega8 zasilania,
resetu oraz programatora ISP, na drugim schemacie widać sposób
podłączenie do portów we/wy mikro_kontrolera diod LED,
przycisków i buzzera.
4 z 19
Schemat przedstawia sposób przyłączenia do atmega8 zasilania, resetu oraz programatora
ISP. Kliknij w obrazek, Ŝeby powiększyć.
Schemat przedstawia sposób przyłączenia diod LED, przycisków i buzzera do portów
we/wy uC Kliknij w obrazek, Ŝeby powiększyć.
Ja zestawiłem wszystkie części na małej płytce stykowej.
Gotowy układ zestawiony na płytce stykowej.Kliknij w obrazek, Ŝeby powiększyć.
Szkielet prostego programu dla avr-gcc
Wszystkie przykładowe programy z tej części kursy będą wyglądać
podobnie, poniŜej znajduje się szkielet prostego programu dla
AVR-GCC.
/* Szkielet prostego programu dla avr-gcc */
5 z 19
#define F_CPU 1000000L
#include <avr/io.h>
#include <util/delay.h>
int
main(
void)
(
)
{
/* Tutaj wpisujemy instrukcje naszego programu */
for(;;)
(;;)
{
/* Instrukcje moŜna umieścić w nieskończonej pętli */
}
}
Szkielet prostego programu dla avr-gcc
Pierwsza linia to komentarz.
/* Szkielet prostego programu dla avr-gcc */
Komentarze są pomijanie przez kompilator, zwykle objaśniają
mniej oczywiste fragmenty kodu. GCC pozwala wstawiać
komentarze na dwa sposoby. Pierwszy sposób to objęcie treści
komentarza parą ograniczników: '/*' , '*/'; w ten sposób utworzony
komentarz moŜe zawierać wiele linii tekstu.
/*
Komentarz blokowy,
moŜe zawierać wiele
linii tekstu
*/
Drugi sposób to umieszczenie przed treścią komentarza dwóch
znaków slash '//' , tak utworzony komentarz rozciąga tylko do
końca linii.
// Komentarz liniowy
A czy GCC pozwala zakomentowywać inne komentarze ? Proszę to
sprawdzić samemu :)
Kolejne trzy linijki to polecenia preprocesora.
#define F_CPU 1000000L
#include <avr/io.h>
#include <util/delay.h>
Polecenia preprocesora zaczynają się znakiem hash "#".
Preprocesor języka C przeprowadza rozmaite operacje na tekście
programu jeszcze przed rozpoczęciem "właściwej" kompilacji
programu. Na przykład pierwsze z tych trzech poleceń zmienia w
tekście programu wszystkie wystąpienia ciągu znaków "F_CPU" na
"1000000L", jak opcja "replace" w edytorze teksu. Liczba ta jest
częstotliwością taktowania mikrokontrolera podaną w Hz. Nowe
układy atmega skonfigurowane są do pracy z wewnętrznym
oscylatorem RC 1Mz, dla przykładowych programików z tej części
kursu nie ma potrzeby tego zmieniać. Inne częstotliwości
taktowania mikrokontrolera atmaga moŜna wybrać programując
odpowiednie fuse-bity, napiszę o tym w dalszej części kursu. Drugie
polecenie dołącza (wkleja) do tekstu programu, w miejscu jego
wystąpienia, zawartość pliku "include/avr/io.h"; podobnie trzecie
polecenie dołącza zawartość pliku "include/util/delay.h" A co
takiego zawierają te pliki? Są to pliki tekstowe, więc ich zawartość
Zgłoś jeśli naruszono regulamin