Kurs AVR-GCC cz.3.pdf

(523 KB) Pobierz
XYZ Hobby Robot-Kurs AVR-GC...
1 Z 36
Artykuł pochodzi ze strony XYZ HOBBY ROBOT ( xyz.isgreat.org )
Kurs AVRGCC cz.3
17.03.2009 ABXYZ
W poprzedniej części kursu objaśniałem
jak programować równoległe porty
we/wy układów AVR, bo porty
równoległe to najprostszy i podstawowy
sposób komunikacji mikrokontrolera
z otoczeniem. W tej i dwóch kolejnych
częściach kursu postaram się
przedstawić podstawy języka C,
oczywiście w duŜym skrócie, gdyŜ
trudno byłoby opisać szczegółowo
całość języka C w trzech krótkich artykułach. Ale nie ma się czego
obawiać, na szczęście język C nie jest zbyt obszerny, szybko moŜna
opanować jego postawy, które pozwolą samodzielnie pisać
programy.
Tematem tej części kursu będą: zmienne i stałe liczbowe, operatory
oraz instrukcje sterujące. Wpierw omówię kolejno wymienione
tematy, a dalej, jako ćwiczenie, uruchomimy kilka przykładowych
programów.
Zmienne i typy danych
Zakładam, Ŝe nie ma potrzeby objaśniać czym są zmienne w
programie, wiadomo, zmienne przechowują dane. KaŜda zmienna
posiada własną nazwę (identyfikator) oraz przypisany jeden
z dostępnych w języku C typów. Typ zmiennej określa rodzaj
przechowywanej danej, np. znak, liczba całkowita, liczba
rzeczywista oraz wielkość obszaru pamięci zajmowanego przez
zmienną, np. 8, 16, 32 bity.
Podstawowe typy danych w języku C to:
char jeden znak (8bitowa liczba całkowita);
int liczba całkowita;
short int liczba całkowita krótka;
long int liczba całkowita długa;
long long int liczba całkowita bardzo długa;
float liczba rzeczywista (typ zmiennopozycyjny);
double typ zmiennopozycyjny podwójnej precyzji;
long double typ zmiennopozycyjny rozszerzonej precyzji.
W języku C naleŜy kaŜdą zmienną przed uŜyciem zdefiniować,
definicję zmiennej moŜna rozumieć jako tworzenie zmiennej.
Zmienne definiuje się wpisując w linii typ zmiennej, a po nim
nazwę zmiennej lub nazwy kilku zmiennych rozdzielone
przecinkami; definicję kończymy średnikiem. Definiując zmienną
moŜna jednocześnie ją zainicjować umieszczając zaraz po nazwie
zmiennej znak "=", a po nim wartość początkową dla zmiennej.
Znaczenie ma miejsce definicji zmiennych, dokładnie objaśnię to
przy temacie funkcji. W programach z tej części kursu będziemy
definiować zmienne na początku funkcji main. Przykłady:
int main( void )
{
/* Definicja zmiennej 'temperatura' typu char */
char temperatura;
214668304.007.png 214668304.008.png 214668304.009.png 214668304.010.png 214668304.001.png
2 Z 36
/* Definicja zmiennej 'wysokość' typu unsigned int */
unsigned int wysokosc;
/* Definicja z inicjacją zmiennej 'napięcie' typu float */
float napiecie =
= 3.36 ;
/* Definicja z inicjacją zmiennej 'prędkość' typu int */
int predkosc =
= 0 ;
/* Definicja trzech zmiennych typu unsigned char */
unsigned char bieg, poziom =
= 1 , stan;
Nazwy zmiennych mogą składać się z liter, z cyfr i znaku "_", ale
nie mogą zaczynać się od cyfry; wielkość liter ma znaczenie,
np. "temp" i "Temp" to dwie róŜne zmienne. Nie moŜna uŜywać
w nazwach zmiennych polskich liter: ąćęłńóśźŜ ĄĆĘŁŃÓŚŹś.
W nazwach typów: short int, long int, long long int moŜna pominąć
słówko int, np. typ long oznacza typ long int. Dodając przed nazwę
typu całkowitego słówko signed(unsigned) informujemy kompilator,
Ŝe powinien traktować wartości w zmiennej jako liczby ze
znakiem(bez znaku). Liczby ze znakiem (signed) zapisywane są na
bitach w kodzie uzupełnień do dwóch U2(two's complement).
ZaleŜnie od uŜywanego kompilatora języka C, rozmiary
poszczególnych typów zmiennych mogą się róŜnić. Przykładowo na
procesorach 16bitowych typ całkowity int zwykle ma rozmiar 16
bitów, na procesorach 32bitowych 32 bity. W przypadku
mikroprocesorów 8bitowych typ int ma zwykle rozmiar 16 bitów,
tak teŜ jest w AVRGCC; zgodnie ze standardem języka C typ int
nie moŜe mieć mniej niŜ 16 bitów. W AVRGCC zmienne wszystkich
typów zmiennopozycyjnych: float, double, long double kodowane są
na 32 bitach, czyli faktycznie jest dostępny jedynie typ
zmiennopozycyjny pojedynczej precyzji (zgodny ze standardem
IEEE754). Zapewne wynika to z faktu, Ŝe operacje na liczbach
zmiennopozycyjnych większej precyzji byłyby zbyt duŜym
obciąŜeniem dla 8bitowych mikroprocesorów. W tabeli poniŜej
wypisałem rozmiary podstawowych typów zmiennych
w kompilatorze AVRGCC.
Typ
Rozmiar
(bitów)
Wartość
minimalna
Wartość
maksymalna
char
8
signed char
8
128
127
unsigned char
8
0
255
short int
16
32768
32767
unsigned short
int
16
0
65535
int
16
32768
32767
unsigned int
16
0
65535
long int
32
2 31
2 31 1
unsigned long
int
32
0
2 32 1
long long int
64
2 63
2 63 1
unsigned long
long int
64
0
2 64 1
float
32
±1.1810 38
±3.410 38
=
=
=
214668304.002.png
3 Z 36
Wartość
maksymalna
double 32 ±1.1810 38 ±3.410 38
long double 32 ±1.1810 38 ±3.410 38
Podstawowe typy zmiennych w C, rozmiary typów w kompilatorze AVRGCC
Rozmiar
(bitów)
Wartość
minimalna
W języku C nie istnieje specjalny typ zmiennych dla wartości
logicznych, zwyczajnie jeśli wartość jakiejś zmiennej równa się
zeru, to zmienna posiada wartość logiczną FAŁSZ, w przeciwnym
przypadku zmienna posiada wartość logiczną PRAWDA. Przykład:
if
( jakas_zmienna
)
{
/* Instrukcje wykonywane jeśli zawartość zmiennej
"jakas_zmienna" będzie róŜna od zera */
}
Ogólna zasada. W języku C jeśli wartość liczbowa stałej, zmiennej
lub dowolnego wyraŜenia jest róŜna od zera, wtedy stała, zmienna,
wyraŜenie ma wartość logiczną PRAWDA, w przeciwnym przypadku
ma wartość logiczną FAŁSZ.
Chwilowo tyle informacji o zmiennych wystarczy.
Stałe liczbowe
W programie moŜna uŜywać stałych liczbowych całkowitych
w postaci dziesiętnej, szesnastkowej i ósemkowej; moŜna teŜ
uŜywać stałych typu zmiennopozycyjnego. Postać szesnastkową
tworzymy wstawiając przed liczbą parę znaków 0x lub 0X
(np. 0xFF); stałe ósemkowe rozpoczynają się od cyfry 0 (np. 077);
a stałe całkowite w systemie dziesiątkowym piszemy zwyczajnie
(np. 123). Stałe zmiennopozycyjne zawierają dziesiętną kropkę
(np. 3.14), mogą teŜ zawierać wykładnik (np. 123.45E3= 123450)
Domyślnie stałe całkowite są typu int, jeśli wartość stałej nie mieści
się w typie int, wtedy stała otrzymuje typ long int lub long long int.
MoŜna nadawać stałym typ long int dopisując na ich końcu literę
L lub l; a dopisując litery LL lub ll, typ long long int. Podobnie
dopisując na końcu stałych całkowitych literę U lub u moŜna nadać
stałym typ bez znaku. Stałe zmiennopozycyjne są domyślnie typu
double. Dopisując na końcu stałych zmiennopozycyjnych literkę
F lub f moŜna nadać im typ float; a dopisując literkę L lub l moŜna
nadać typ long double. Przykłady:
/* stała 0xff jest typu int */
DDRD
= 0xff
;
/* stała 255 jest typu int */
PORTD
= 255
;
/* stała 12345U jest typu unsigned int */
uz
= 12345U
;
/* stała 12.0 jest typu double */
liczba
= 12.0
;
/* stała 123456L jest typu long int */
123456L * zy
;
/* stała 1UL jest typu unsigned long int */
zz
= 1UL
;
Typ
214668304.003.png
4 Z 36
/* stała 3.17f jest typu float */
3.17f * yz;
Rejestry I/O
A czym są nazwy rejestrów I/O, jak np.: PORTB, PINB, DDRB ?
PrzecieŜ język C nic nie wie o rejestrach mikrokontrolerów AVR. W
poprzedniej części napisałem kilka słów na temat preprocesora
języka C, który moŜe wykonywać róŜne operacje na tekście
źródłowym programu jeszcze przed właściwą kompilacją. To właśnie
preprocesor, przed kompilacją, zmienia w tekście programu nazwy
rejestrów I/O na właściwy kod w języku C; na przykład instrukcja:
PORTB = 0x02 ;
zostanie zmieniona przez preprocesor na kod:
(*( volatile uint8_t *)((
(( 0x18 ) + 0x20 ))
)) =
= 0x02 ;
Ale tylko, jeśli dołączy się do kodu programu pliki z definicjami
rejestrów I/O, wstawiając gdzieś na początku programu linię:
#include <avr/io.h>
A co oznacza ten fragment kodu ? Rejestry I/O układów AVR
ulokowane są w przestrzeni adresowej pamięci danych, zaczynając
od adresu 0x20, rejestr PORTB mieści się pod numerem 0x18
względem adresu 0x20 (patrz datasheet AVRa) W AVRGCC dostęp
do rejestrów I/O jest za pośrednictwem wskaźnika do zmiennej
typu uint8_t (unsigned char). Jeśli ostatnie dwa zdania są
niezrozumiałe, to absolutnie proszę się tym nie przejmować i czytać
dalej. Z tego trzeba zapamiętać, Ŝe rejestry IO, jak na przykład:
PORTB, PINB, DDRB, posiadają typ "unsigned char".
Kodowanie U2.
Liczby całkowite ze znakiem (signed) zapisywane są w pamięci
w kodzie uzupełnień do dwóch U2 (two's complement), liczby bez
znaku (unsigned) w naturalnym kodzie binarnym NKB.
Proszę spojrzeć na wzory i tablice.
((
))
=
214668304.004.png
5 Z 36
bity wartości w kodzie NKB wartości w kodzie U2
0000
0
0
0001
1
1
0010
2
2
0011
3
3
0100
4
4
0101
5
5
0110
6
6
0111
7
7
1000
8
8
1001
9
7
1010
10
6
1011
11
5
1100
12
4
1101
13
3
1110
14
2
1111
15
1
Kodowanie liczb na 4 bitach
214668304.005.png 214668304.006.png
Zgłoś jeśli naruszono regulamin