Kurs AVR C.pdf

(4911 KB) Pobierz
Microsoft Word - Kurs AVR.doc
Kurs AVR-GCC cz.2
30.11.2008 ABXYZ
W pierwszym odcinku kursu zainstalowaliĻmy pakiet
programw WinAVR, nauczyliĻmy siħ kompilowaę kody Ņrdþowe
programw 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 sposb programowaę rwnolegþe porty wejĻcia/wyjĻcia ukþadw
AVR. Zaczniemy od naprawdħ prostych przykþadw :), 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ę.
Rwnolegþe porty wejĻcia/wyjĻcia
Ukþad atmega8 w obudowie DIP28, na ktrym bħdziemy uruchamiaę
przykþadowe programy, posiada 28 wyprowadzeı, z ktrych 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-bitw bħdħ pisaþ), lecz w ten sposb 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
708347120.168.png 708347120.179.png 708347120.190.png
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), ktre 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 "rejestrw 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 rejestrw I/O, takŇe rozkazy do manipulowani
poszczeglnymi bitami rejestrw. W jaki sposb moŇna w AVR-GCC
odczytywaę i zapisywaę rejestry I/O pokaŇħ za chwilħ, przy objaĻnianiu
przykþadowych programw.
Z kaŇdym z rwnolegþych portw 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 poszczeglnych bitw rejestrw 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
Px.n
0
0
wejĻcie
0
1 wejĻcie z podciĢgniħciem do VCC
1
X
wyjĻcie
Konfiguracja rwnolegþych portw we/wy mikrokontrolerw AVR
A teraz przykþad konfiguracji portu B, patrzymy na ilustracjħ poniŇej.
708347120.201.png
Przykþad konfiguracji portu B
Cztery pierwsze bity rejestru DDRB majĢ wartoĻę "0", zaĻ pozostaþe cztery
bity wartoĻę "1", wiħc linie PB3..PB0 sĢ skonfigurowane jako wejĻcia,
a linie PB7..PB4 jako wyjĻcia. Dodatkowo bity numer 1 i 0 w rejestrze
PORTB ustawione zostaþy na wartoĻę 1, zatem linie PB1 i PB0 bħdĢ
pracowaę jako wejĻcia z wewnħtrznym podciĢgniħciem do napiħcia
zasilania. ZmieniajĢc wartoĻci bitw 7..4 rejestru PORTB moŇna wymusię
oczekiwane stany napiħcia(wysoki lub niski) na wyprowadzeniach
PB7..PB4. Natomiast stan wejĻę (PB3..PB0) sprawdzamy odczytujĢc bity
3..0 rejestru PINB. W przykþadzie do wyprowadzeı PB3..PB0 podano
poziomy napiħę L H L H, wiħc w rejestrze PINB bity 3..0 majĢ wartoĻci
0101. Bity 7..4 rejestru PORTB ustawiono na wartoĻci 1001, zatem na
wyprowadzeniach PB7..PB4 pojawiþy siħ stany napiħę H L L H.
Schematy poþĢczeı
Oprcz mikro_kontrolera AVR, dla uruchomienia przykþadowych
programikw, 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 sposb, Ň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 sposb przyciskami naleŇy skonfigurowaę jako
wejĻcia z podciĢgniħciem do VCC.
Sposb przyþĢczenia przycisku do portu we/wy uC AVR
Dla przejrzystoĻci schemat poþĢczeı rozdzieliþem na dwa. Pierwszy
schemat przedstawia sposb przyþĢczenia do atmega8 zasilania, resetu
708347120.001.png 708347120.012.png 708347120.023.png
oraz programatora ISP, na drugim schemacie widaę sposb podþĢczenie do
portw we/wy mikro_kontrolera diod LED, przyciskw i buzzera.
Schemat przedstawia sposb przyþĢczenia do atmega8 zasilania, resetu oraz programatora ISP. Kliknij w obrazek, Ňeby
powiħkszyę.
Schemat przedstawia sposb przyþĢczenia diod LED, przyciskw i buzzera do portw 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ę.
708347120.034.png 708347120.045.png 708347120.056.png 708347120.067.png 708347120.078.png 708347120.089.png 708347120.100.png 708347120.111.png 708347120.122.png 708347120.130.png 708347120.131.png 708347120.132.png 708347120.133.png 708347120.134.png 708347120.135.png 708347120.136.png 708347120.137.png 708347120.138.png 708347120.139.png 708347120.140.png 708347120.141.png 708347120.142.png 708347120.143.png 708347120.144.png 708347120.145.png 708347120.146.png 708347120.147.png 708347120.148.png 708347120.149.png 708347120.150.png 708347120.151.png 708347120.152.png 708347120.153.png 708347120.154.png 708347120.155.png 708347120.156.png 708347120.157.png 708347120.158.png 708347120.159.png 708347120.160.png 708347120.161.png 708347120.162.png 708347120.163.png 708347120.164.png 708347120.165.png 708347120.166.png 708347120.167.png 708347120.169.png 708347120.170.png 708347120.171.png 708347120.172.png 708347120.173.png 708347120.174.png 708347120.175.png 708347120.176.png 708347120.177.png 708347120.178.png 708347120.180.png 708347120.181.png 708347120.182.png 708347120.183.png 708347120.184.png 708347120.185.png 708347120.186.png 708347120.187.png 708347120.188.png 708347120.189.png 708347120.191.png 708347120.192.png 708347120.193.png 708347120.194.png 708347120.195.png 708347120.196.png 708347120.197.png 708347120.198.png 708347120.199.png 708347120.200.png 708347120.202.png 708347120.203.png 708347120.204.png 708347120.205.png 708347120.206.png 708347120.207.png 708347120.208.png 708347120.209.png 708347120.210.png 708347120.211.png 708347120.002.png 708347120.003.png 708347120.004.png 708347120.005.png 708347120.006.png 708347120.007.png 708347120.008.png 708347120.009.png 708347120.010.png 708347120.011.png 708347120.013.png 708347120.014.png 708347120.015.png 708347120.016.png 708347120.017.png 708347120.018.png 708347120.019.png 708347120.020.png 708347120.021.png 708347120.022.png 708347120.024.png 708347120.025.png 708347120.026.png 708347120.027.png 708347120.028.png 708347120.029.png 708347120.030.png 708347120.031.png 708347120.032.png 708347120.033.png 708347120.035.png 708347120.036.png 708347120.037.png 708347120.038.png 708347120.039.png 708347120.040.png 708347120.041.png 708347120.042.png 708347120.043.png 708347120.044.png 708347120.046.png 708347120.047.png 708347120.048.png 708347120.049.png 708347120.050.png 708347120.051.png 708347120.052.png 708347120.053.png 708347120.054.png 708347120.055.png 708347120.057.png 708347120.058.png 708347120.059.png 708347120.060.png 708347120.061.png 708347120.062.png 708347120.063.png 708347120.064.png 708347120.065.png 708347120.066.png 708347120.068.png 708347120.069.png 708347120.070.png 708347120.071.png 708347120.072.png 708347120.073.png 708347120.074.png 708347120.075.png 708347120.076.png 708347120.077.png 708347120.079.png 708347120.080.png 708347120.081.png 708347120.082.png 708347120.083.png 708347120.084.png 708347120.085.png 708347120.086.png 708347120.087.png 708347120.088.png 708347120.090.png 708347120.091.png 708347120.092.png 708347120.093.png 708347120.094.png 708347120.095.png 708347120.096.png 708347120.097.png 708347120.098.png 708347120.099.png 708347120.101.png 708347120.102.png 708347120.103.png 708347120.104.png 708347120.105.png 708347120.106.png 708347120.107.png 708347120.108.png 708347120.109.png 708347120.110.png 708347120.112.png 708347120.113.png 708347120.114.png 708347120.115.png 708347120.116.png 708347120.117.png 708347120.118.png 708347120.119.png 708347120.120.png 708347120.121.png 708347120.123.png 708347120.124.png 708347120.125.png 708347120.126.png 708347120.127.png
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 */
#define F_CPU 1000000L
#include <avr/io.h>
#include <util/delay.h>
(;;)
{
/* 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 sposb to objħcie treĻci komentarza parĢ
ogranicznikw: '/*' , '*/'; w ten sposb utworzony komentarz moŇe
zawieraę wiele linii tekstu.
/*
Komentarz blokowy,
moƊe zawieraę wiele
linii tekstu
*/
Drugi sposb to umieszczenie przed treĻciĢ komentarza dwch znakw
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 znakw "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 programikw 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
int main( void )
{
/* Tutaj wpisujemy instrukcje naszego programu */
for (;;)
(;;)
708347120.128.png 708347120.129.png
Zgłoś jeśli naruszono regulamin