Kurs AVR4, Elektronika i programowanie

[ Pobierz całość w formacie PDF ]

Kurs AVR-GCC cz.4(v2)

 

 

 



Ostatnio omawiane były: zmienne, operatory, pętle i instrukcje sterujące jak: if, switch. W tej części kursu przerobimy tablice, struktury i funkcje, czyli dalszy ciąg podstaw języka C. Jak poprzednio, wpierw omówię wymienione tematy, a następnie zestawimy układ z AVRem i uruchomimy kilka przykładowych programów. W tej części kursu będziemy wykorzystywać: diody LED i siedmiosegmentowe wyświetlacze LED, klawiaturę wykonaną z dwunastu przycisków oraz piezo-buzzer (bez generatora, sam przetwornik piezo).

 

Tablice

 

Gdy w programie mamy większą ilość danych jednego typu, to zamiast tworzyć wiele pojedynczych zmiennych, lepiej będzie utworzyć tablicę. W tablicy można przechowywać jednocześnie wiele zmiennych jednakowego typu. Wszystkie elementy tablicy są ponumerowane, dostęp do dowolnej zmiennej w tablicy uzyskuje się podając nazwę tablicy i numer elementu.

 

W języku C tablicę przed pierwszym użyciem należy wcześniej zdefiniować. Tablicę definiuje się pisząc kolejno: typ danych, nazwę tablicy i objętą parą nawiasów kwadratowych [] liczbę elementów tablicy. Definicję należy zakończyć średnikiem.

 

int main(void)

{

/* Definicja tablicy 'pomiar' o 64 elementach typu char */

char pomiar[64];

/* Definicja tablicy 'wysokosc' o 32 elementach typu int */

int wysokosc[32];

/* Definicja tablicy 'temperatura' o 16 elementach typu double */

double temperatura[16];

}

 

Elementami tablic mogą być wartości typów: char, int, float, double oraz: struktury, unie, pola bitowe i  wskaźniki o których będzie mowa w następnej części kursu. Elementami tablicy mogą być też same tablice; w taki sposób tworzy się w języku C tablice wielowymiarowe.

 

/* 2 elementowa tablica 40 elementach tablic typu char */

char bufor[2][40];

/* Tablica trójwymiarowa */

char jakas_tablica[4][8][3];

 

Definiując tablicę można jednocześnie tablicę inicjalizować wartościami początkowymi. W tym celu dopisuje się na końcu definicji: operator = , a po nim, objęte parą nawiasów klamrowych {}, wartości początkowe kolejnych elementów tablicy rozdzielone przecinkami.

/* Definicja tablicy z jednoczesną inicjalizacją wartościami początkowymi dwóch pierwszych elementów tablicy */

char tablica[4] = {0x01,0x02};

/* Definicja tablicy z jednoczesną inicjalizacją wartościami początkowymi wszystkich czterech elementów. W takim przypadku można nie wpisywać w definicji ilości elementów tablicy, kompilator sam to wyliczy. */

char tablica[] = {0x01,0x02,0x04,0x08};

/* Definicja z inicjalizacją tablicy dwuwymiarowej */

char inna_tablica[][2] = { 0x31,0x02, 0xf1,0x02, 0x41,0xf2, 0xf1,0xc2, 0x11,0xa2 };

 

W programie elementami tablicy posługujemy się w identyczny sposób jak pojedynczymi zmiennymi. Każdy element tablicy ma nazwę składającą się z nazwy tablicy oraz objętego parą nawiasów kwadratowych indeksu(numeru elementu). Elementy tablicy numerowane są zaczynając od zera, a nie od jedynki, należy to koniecznie zapamiętać.

 

/* Przypisanie pierwszemu elementowi tablicy wartości 23.5 */

temperatura[0] = 23.5;

/* Przypisanie drugiemu elementowi tablicy wartości 22.0 */

temperatura[1] = 22.0; /

* Przypisanie ósmemu elementowi tablicy wartości 17.5 */

temperatura[7] = 17.5;

/* Przypisanie jakiejs_zmiennej wartości czwartego elementu tablicy */

jakas_zmienna = temperatura[3];

 

 

Trzeba też pamiętać, że jeżeli zdefiniujemy tablicę n elementową i spróbujemy zapisać coś pod indeksem równym lub większym n to kompilator nie zgłosi błędu, ale skutkować to może nieprawidłowym działaniem programu.

Przy operacjach na tablicach szczególnie użyteczna może być instrukcja pętli for, gdzie licznik pętli będzie indeksem tablicy.

 

unsigned char i,j;

int tablica_1[16];

int tablica_2[16];

int tablica_3[10][10];

/* Kolejnym elementom tablicy przypisane zostaną wartości: 0,10,20,30..150 */

for(i = 0; i < 16; i++) tablica_1[i] = i * 10;

/* Kopiowanie zawartości tablica_1 do tablica_2 */

for(i = 0; i < 16; i++) tablica_2[i] = tablica_1[i];

/* Wypełnienie tablicy dwuwymiarowej */

for(i = 0; i < 9; i++) for(j = 0; j < 9; j++) tablica_3[i][j] = i * j;

 

 

Na tym etapie nauki, te informacje na temat tablic mam wystarczą.

 

 

Struktury

 

Strukturą w języku C nazywa się grupę zmiennych oznaczoną jedną nazwą. Na przykład, aby opisać okrąg (figurę geometryczną), którą program będzie rysował na ekranie wyświetlacza graficznego, potrzebujemy co najmniej trzech wartości: dwóch współrzędnych położenia środka okręgu oraz długość promienia. Dla jednego egzemplarza okręgu można by utworzyć w pamięci trzy zmienne o nazwach: x, y, r. Jednak, gdy przyjdzie potrzeba zapisać w pamięci większą liczbę okręgów, lepiej w tym celu będzie zdeklarować odpowiednią strukturę.

Deklaracja struktury informuje kompilator z jakich zmiennych będzie składać się nowy typ struktury. Deklaracja struktury rozpoczyna się od słowa struct i nazwy nowego typu struktury. Po nazwie, pomiędzy parą nawiasów klamrowych {}, deklaruje się zmienne składowe struktury. Cała instrukcja deklaracji kończy się średnikiem.

 

/* Deklaracja struktury typu 'Okrag' */

struct Okrag { int x; int y; unsigned int r; };

 

Sama deklaracja struktury nie tworzy jeszcze zmiennych w pamięci, tworzy jedynie nowy typ. Aby utworzyć pamięci egzemplarz struktury danego typu należy ją zdefiniować, w podobny sposób jak definiuje się zmienne. Definicja zaczyna się od słówka struct, dalej podaje się nazwę typu zdeklarowanego wcześniej struktury i nazwę nowego egzemplarza struktury lub nazwy kilku egzemplarzy oddzielone przecinkami; na końcu deklaracji stawia się średnik.

 

/* Definicja trzech struktur typu 'Okrag' o nazwach: okrag_1, okrag_2, okrag_3 */

struct Okrag okrag_1, okrag_2, okrag_3;

 

Należy zapamiętać różnice między deklaracją a definicją: Deklaracja nie rezerwuje miejsca w pamięci, a jedynie tworzy nowy typ struktury. Dopiero definicja tworzy w pamięci konkretne egzemplarze danego typu struktury. Deklarując nowy typ struktury można jednocześnie utworzyć(zdefiniować) jeden lub kilka jej egzemplarzy; w tym celu, na końcu deklaracji, między nawiasem zamykającym } a średnikiem, dopisuje się nazwę tworzonego egzemplarza struktury lub nazwy kilku egzemplarzy rozdzielone przecinkami,

 

przykład:

 

/* Deklaracja struktury typu 'prostokąt' z jednoczesnym tworzeniem jej trzech egzemplarzy */

struct prostokat { int x; int y; unsigned int width; unsigned int height; } prostokat1, prostokat2, prostokat3;

 

Dostęp do zmiennych składowych struktury uzyskuje się podając kolejno: nazwę egzemplarza struktury, operator kropka i nazwę składowej użytej w deklaracji struktury,

 

przykłady:

 

/* Deklaruje strukturę bez podania nazwy typu (tak też można) i jednocześnie tworzy dwa egzemplarze struktury tego typu. */

struct { int x; int y; } punkt1, punkt2;

/* Dostęp do zmiennych składowych struktury uzyskuje się używając operatora kropki. */ punkt1.x = 17; punkt1.y = 20; punkt2.x = 10; punkt2.x = 18;

/* Składowymi struktury posługujemy się podobnie jak zmiennymi prostego typu */ jakas_ zmienna = punkt1.x + punkt2.x; inna_zmienna = punkt1.y + punkt2.y;

 

 

Struktury mogą wchodzić w skład innych struktur, w przykładzie poniżej struktura typu Punkt jest  zagnieżdżona w strukturze typu Okrag.

 

/* Deklaracja struktury typu 'Punkt' */

struct Punkt { int x; int y; };

/* Deklaracja struktury typu 'Okrag' z jednoczesnym utworzeniem trzech egzemplarzy tego typu struktury */

struct Okrag { struct Punkt o; unsigned int r; }okragA, okragB, okragC;

/* Dostęp do zmiennych składowych struktury uzyskuje się używając operatora kropki. */ okragC.o.x = okragA.o.x + okragB.o.x;

 

Definiując strukturę można jednocześnie inicjalizować jej składowe wartościami początkowym. W tym celu, w definicji, po nazwie nowo tworzonego egzemplarza struktury, wstawia się operator '=', i dalej, między nawiasami klamrowymi {}, wartości początkowe kolejnych składowych struktury rozdzielone przecinkami.

 

/* Definiując struktury można je jednocześnie inicjalizować wartościami początkowymi. */ struct punkt p1={12,33}, p2={20,30};

 

Także można inicjalizować definiowaną strukturę zawartością składowych innego egzemplarza struktury tego typu,

 

przykład:

 

/* Definicja struktury z jednoczesną inicjalizacją składowych */

struct punkt p3 = p1;

 

Używając operatora = można strukturę skopiować, tzn. przypisać składowym jednego egzemplarza struktury wartości odpowiednich składowych innego egzemplarza.

 

/* Kopiowanie struktury */ p2 = p1;

 

Funkcje

 

Program składa się z ciągu instrukcji zapisanych w pamięci i wykonywanych jedna po drugiej. Obok instrukcji, które realizują konkretne zadania, na przykład włączają i wyłączają diodę LED, istnieją też specjalne instrukcje sterujące przebiegiem programu jak np.: if-else, switch, for, while; które były tematem poprzedniej części kursu.

Obok wspomnianych instrukcji sterujących istnieje możliwość tworzenia podprogramów. Zwykle dłuższe programy dzielone są na odrębne fragmenty, nazywane podprogramami lub procedurami. Spośród podprogramów wyróżnić można podprogram pierwszy (główny), od którego pierwszej instrukcji rozpoczyna się działanie całego programu. Umieszczając w programie specjalną instrukcję - instrukcję wywołania podprogramu - można wykonać wybrany podprogram.

 

Przebieg przykładowego programu składającego się z podprogramu głównego i dwóch podprogramów.

 

Cały program zaczyna się od pierwszej instrukcji podp...

[ Pobierz całość w formacie PDF ]
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • psp5.opx.pl