Podstawy programowania mikrokontrolerów AVR8 w środowisku AVR Studio 4


KATEDRA INFORMATYKI
Wydział EAIiE AGH
Laboratorium Techniki Mikroprocesorowej
Ćwiczenie 5
Podstawy programowania
mikrokontrolerów AVR8 w
środowisku AVR Studio 4
1 Cel ćwiczenia
Celem ćwiczenia jest poznanie możliwości 8-bitowych mikrokontrolerów o
architekturze RISC oraz technikach programowania tych mikrokontrolerów w językach
wysokiego poziomu na przykładzie języka C.
Wymagane wiadomości
" Budowa, sposób programowania mikrokomputerów jednoukładowych rodziny AVR8.
" Magistrala I2C - budowa , zasada działania, implementacja programowa i obsługa z
poziomu języka C
" Budowa i zasada działania silników krokowych.
Wykorzystywany sprzęt
" Komputer klasy PC z zainstalowanym oprogramowaniem AVR Studio 4.0+, pakietem
WinAVR do przygotowania tekstu zródłowego, kodu wynikowego i programowania
procesora AT90S8515.
" Zestaw laboratoryjny AVR z interfejsem RS232C, wyświetlaczem LCD i zegarem czasu
rzeczywistego PCF8583 i silnikiem krokowym.
" Programator ISP /JTAG np. ATMEL JTAG/ICE mkII.
Literatura
1. ATMEL Corp. : AT90S8515 8-bit AVR® Microcontroller with 8K Bytes In-System
Programmable Flash . Rev .A 04.11.2001. Dostępny w internecine:
http://www.atmel.com/dyn/resources/prod_documents/doc0841.pdf
2. T.Augustyn, G.Niemiec, A.Szlachta : Zestaw uruchomieniowy AVR. Opracowanie
wewnętrzne KI AGH 2001.
3. AVR-LIBC Users manual : http://savannah.nongnu.org/download/avr-libc/avr-libc-
user-manual-1.7.1.pdf.bz2
4. Mielczarek W.: Szeregowe interfejsy cyfrowe. Wyd. Helion 1994
5. Philips Semiconductors : PCF8583 Data Sheet , 1997
6. http://www.mcselec.com  Informacje na temat pakietu BASCOM AVR.
7. Potocki L.: Silniki krokowe od podstaw cz. 1-6. Elektronika dla Wszystkich 7/2002
s.22-26 ,8/2002 s.26-29, 9/2002 s. 24-26, 10/2002 s. 21-22, 11/2002 s. 24-26,
12/2002 s.22-24. Dostępna online. http://edw.com.pl/pdf/k01/79_22.pdf,
http://edw.com.pl/pdf/k01/80_26.pdf, http://edw.com.pl/pdf/k01/81_24.pdf,
http://edw.com.pl/pdf/k01/82_21.pdf, http://edw.com.pl/pdf/k01/83_24.pdf,
http://edw.com.pl/pdf/k01/84_22.pdf .
2
2 Wykonanie ćwiczenia
Wykonanie ćwiczenia zostało podzielone na kilka zadań
2.1 Zadanie A  zapoznanie się ze środowiskiem AVR Studio 4.x
Środowisko AVR Studio jest komercyjnym bezpłatnym pakietem IDE służącym do
programowania mikrokontrolerów produkowanych przez firmę ATMEL. Pozwala
programować mikrokontrolery tej firmy na poziomie języka asemblerowego i
wspomagać proces tworzenia aplikacji dostarczając wygodne mechanizmy
uruchamiania przygotowywanego oprogramowania. W połączeniu z pakietem WinAVR
(zawierającym kompilator języka C oraz odpowiednie biblioteki) uzyskać można bardzo
wygodne środowisko, pozwalające programować mikrokontrolery AVR
z wykorzystaniem języka C.
Pierwszym krokiem jest uruchomienie środowiska AVR Studio. Tworzenie
projektu w AVR Studio najłatwiej rozpocząć, wykorzystując odpowiedni kreator
uruchamiany poleceniem Project->Project Wizard ( Rys. 1)
Rys. 1 Uruchamianie kreatora nowego projektu
Uruchamia to kreatora, którego wygląd przedstawia Rys. 2 . Kreator pozwala na
wczytanie jednego z wcześniej utworzonych projektów lub utworzenie nowego
projektu. Ponieważ jest to pierwszy projekt w AVR Studio, należy utworzyć nowy
projekt korzystajÄ…c z przycisku New Project.
Rys. 2 Kreator projektu AVR Studio (1)
3
W kolejnym oknie kreatora (rys) należy w pierwszej kolejności wybrać typ
projektu. Jeśli powstający projekt ma zostać przygotowany z użyciem języka C należy
zaznaczyć pozycje AVR GCC (jeśli w systemie nie zainstalowano pakietu WinAVR do
wyboru będzie tylko projekt w asemblerze AVR)
Rys. 3 Kreator projektu AVR Studio (2)
Następnie w aktywnym już polu Project Name wpisujemy nazwę projektu (n.p.: test). Dla
porządku, należy zaznaczyć również opcje Create initial file oraz Create folder.
Spowoduje to, że użyta nazwa projektu staje się automatyczne nazwą głównego pliku
zródłowego powstającej aplikacji, a wszystkie pliki aplikacji zostaną umieszczone we
wspólnym folderze o takiej nazwie jak nazwa projektu.
Można oczywiście wskazać inną niż domyślna, lokalizację w której będą
przechowywane pliki projektu. Po ustaleniu wszystkich dostępnych w tym oknie
kreatora parametrów aplikacji, należy przyciskiem Next przejść do kolejnego okna
kreatora Rys. 4.
Rys. 4 Kreator projektu AVR Studio (3)
Dokonuje się tu wyboru platformy sprzętowej wykorzystywanej do debugowania
aplikacji oraz modelu mikrokontrolera dla którego przygotowywana jest aplikacja. Z
listy po lewej stronie należy wybrać AVR Simulator a na liście po prawej stronie
4
odszukać model AT90S8515. Następnie można zakończyć pracę kreatora naciskając
przycisk Finish.
Rys. 5 Okno aplikacji AVR Studio 4
W oknie po lewej stronie znajduje się drzewo plików projektu, w środkowej części
powinien być otwarty edytor pliku lub plików zawierającego kod zródłowy
przygotowywanej aplikacji. W prawej części okna widoczny jest stan układów
peryferyjnych mikrokontrolera. Okno to wykorzystywane jest w trybie symulacji
działania programu lub w trybie śledzenia wykonania programu we wnętrzu
mikrokontrolera z wykorzystaniem interfejsu JTAG. Obecnie jego funkcja nie będzie
omawiana.
Przed przystąpieniem do przygotowania kodu zródłowego dobrze jest
zweryfikować/uzupełnić ustawienia środowiska AVR Studio do pracy z odpowiednim
modelem mikrokontrolera. Dokonuje siÄ™ tego w opcjach projektu
Project->Configuration Options (Rys. 6).
Rys. 6 Wywołanie okna właściwości projektu
5
Wywołanie opcji projektu powoduje wyświetlenie okna jak na rys. Należy sprawdzić czy
zakładce General w w polu Device wybrany jest mikrokontroler at90s8515 oraz czy
w polu Frequency wpisana jest właściwa częstotliwość podłączonego rezonatora
kwarcowego (8000000Hz).
Rys. 7 Okno opcji projektu
Po zakończeniu konfigurowania opcji projektu należy jeszcze sprawić właściwą
konfigurację połączeń na płytce uruchomieniowej  linie portu A0-A7 powinny być
połączone przewodami z diodami LED nad wyświetlaczem. Następnie korzystając
z wbudowanego edytora umieścić następujący kod:
#ifndef F_CPU
#define F_CPU 8000000 // określenie częstotliwości pracy mikrokontrolera
#endif
#include
#include
int main(void)
{
char i;
DDRA = 0xFF; // konfiguracja portu A jako wyjść
// nieskonczona petla
do{
PORTA = 0b10101010; // wpisanie 0xAA do portu A
for(i= 0; i < 25; i++) // odczekanie 250 ms
_delay_ms(10); //
PORTA = 0b01010101; // wpisanie 0x55 do portu A
for(i= 0; i < 25; i++) // odczekanie 250 ms
_delay_ms(10); //
}while(1);
return 0;
}
KompilacjÄ™ projektu przeprowadza siÄ™ poleceniem Build->Build lub klawiszem F7.
Po bezbłędnej kompilacji można przejść do zaprogramowania mikrokontrolera.
Jeśli jest to pierwsza próba programowania, należy wcześniej przeprowadzić
konfiguracjÄ™ programatora/debugera. Dokonuje siÄ™ tego przy pomocy polecenia
6
ToolsProgram AVRConnect& lub przyciskiem umieszczonym na pasku
przycisków (Rys. 8).
Rys. 8 Przycisk wywołania obsługi programatora
Wybranie tego polecenia powoduje pojawienie siÄ™ okna wyboru przedstawionego na
Rys. 9.
Rys. 9 Okno konfiguracji programatora
Z listy programatorów znajdujących się w oknie po lewej stronie należy wybrać
JTAGICE mkII. Port komunikacyjny pozostawiamy na Auto, lub jeśli było wybrane inne
ustawienie wybieramy Auto. Następnie wciskamy przycisk Connect& .
Jeśli połączenia między komputerem, programatorem oraz zestawem
uruchomieniowym funkcjonują poprawnie i konfiguracja przebiegła prawidłowo na
ekranie pojawi się następujące okno (Rys. 10):
Rys. 10 Okno programatora w trybie JTAG
7
Interfejs JTAGICE mkII daje możliwość programowania mikrokontrolerów AVR bez
demontowania ich z aplikacji w której mają pracować (funkcja In-System Programming)
Zadanie to może być realizowane w trybie JTAG lub w trybie ISP. Interfejs JTAG może
być dodatkowo wykorzystywany do śledzenia i krokowania wykonania programu we
wnętrzu mikrokontrolera. Wykorzystywany mikrokontroler AT90S8515 może być
programowany z użyciem interfejsu JTAGICE mkII wyłącznie w trybie ISP. Domyślnym
trybem pracy programatora JTAGICE mkII jest tryb JTAG. Koniecznie może się zatem
okazać odpowiednie jego skonfigurowania, aby pracował w trybie ISP. Należy w tym
celu przejść do zakładki Main (Rys. 11) i sprawdzić lub w miarę potrzeby ustawić
prawidłową konfigurację widoczną na tym rysunku.
Rys. 11 Konfiguracja programatora JTAG/ICE mkII do pracy w trybie ISP
W celu sprawdzenia poprawności działania interfejsu ISP można dokonać odczytu
sygnatury układu. Wciskamy w tym celu przycisk Read Signature (Rys. 12). Po
poprawnym odczytaniu sygnatury będzie ona widoczna w polu zawierającym wcześniej
napis Signature not read. Poprawna wartość sygnatury dla mikrokontrolera AT90S8515
wynosi 0x1E 0x93 0x01.
Rys. 12 Odczyt sygnatury mikrokontolera przez ISP
8
Najważniejsze opcje i polecenia związane z programowaniem wewnętrznej pamięci
mikrokontrolera znajdują się na zakładce Program (Rys. 13). Przycisk Erase Device
powoduje wykasowanie wewnętrznej pamięci FLASH mikrokontrolera (co jest
równoznaczne z usunięciem zapisanego w niej programu).
Rys. 13 Programowanie pamięci flash mikrokontrolera
Do zaprogramowania tej pamięci wykorzystywać będziemy sekcję Flash. Powinna w
niej być zaznaczona opcja Input HEX File (jak na Rys. 13). W polu obok należy wskazać
plik, którym ma zostać zaprogramowana pamięć FLASH. Zwykle taki plik wynikowy
posiada nazwÄ™ takÄ…, jak nazwa projektu oraz rozszerzenie *.hex . Kompilator tworzy ten
plik w podkatalogu ./default znajdujÄ…cym siÄ™ w katalogu z plikami projektu. Po
wciśnięciu przycisku Program, pamięć FLASH mikrokontrolera jest zapisywana
zawartością pliku .hex. Po zakończeniu zapisu następuje automatyczne uruchomienie
wczytanego programu, co w przypadku projektu wykonanego w tej części zadania
powinno być widoczne w postaci zapalających się i gasnących diod świecących D0-D7.
Po prawidłowym wykonaniu wszystkich etapów związanych z uruchomieniem
przykładowego projektu o nazwie LED, dokonać modyfikacji w programie tak, aby
uzyskać efekt wędrującego światła (zapalamy diodę D0, w kolejnym kroku zapalamy
diodÄ™ D1 i gasimy D0, w kolejnym zapalamy D2 i gasimy D1 itd. gdy zapalimy diodÄ™ D7 w
kolejnym kroku zapalamy D6 i gasimy D7 itd. aż dojdziemy do diody D0.
2.2 Zadanie B  Unipolarny silnik krokowy
Unipolarny silnik krokowy posiada wyprowadzone na zewnątrz 5 zacisków. Jeden z
nich jest zaciskiem wspólnym dla wszystkich uzwojeń, podłączanym zwyczajowo do
dodatniego bieguna zasilania. Pozostałe 4 zaciski to wyprowadzenia odpowiednich
uzwojeń. Silnik krokowy jest podłączony do 4 najstarszych bitów portu C
mikrokontrolera przez wzmacniacze prądowe układu ULN2803. Uzwojenie A jest
9
podłączone do portu PC4, Uzwojenie B do portu PC5, uzwojenie C do portu PC6 i
uzwojenie D do portu PC7. Przepływ prądu przez wybrane uzwojenie silnika uzyskuje
się podając wartość  0 na wyprowadzenie mikrokontrolera, do którego jest ono
podłączone.
Uwaga !  Ze względu na własności mechaniczne, zbyt szybkie załączanie
i wyłączanie przepływu prądu przez uzwojenie silnika nie będzie powodować
ruchu wirnika. W początkowej fazie uruchamiania programu należy
zagwarantować przepływ prądu przez uzwojenie przez czas około 200ms.
Na początku programu należy wyłączyć przepływ prądu przez uzwojenia silnika
poprzez ustawienie odpowiednich wyjść w stan  1 .
2.2.1 Sterowanie liniami we/wy mikrokontrolera
Mikrokontroler AT90S8515 posiada 4 ośmiobitowe porty wejścia-wyjścia oznaczone
odpowiednio A,B,C,D. Kontrolowania stanu portów we/wy mikrokontrolera służą 3
rejestry specjalne związane odpowiednio z każdym z portów: DDRx, PORTx i PINx (za x
należy podstawić właściwą nazwę portu). Szersze informacje na ten temat można
znalezć w [1].
Rejestr DDRx służy do określenia kierunku linii portu x . Wpisanie wartości 1 na n-tej
pozycji bitowej konfiguruje n-tą linię portu x jako wyjście, natomiast wpisanie zera
konfiguruje tą linie jako wejście (np.: zapisanie wartości 0b00001111 do rejestru DDRC
ustawia 4 najstarsze bity portu jako wejścia i 4 najmłodsze jako wyjścia) . Po sygnale
zerowania wszystkie linie mikrokontrolera są ustawiane jako wejścia.
Rejestr PORTx pełni dwie funkcje:
- jeśli linia portu x jest skonfigurowana jako wyjście  zapisaną na tej pozycji
wartością jest sterowane odpowiednie wyprowadzenie mikrokontrolera
- jeśli dana linia portu x jest skonfigurowana jako wejście, wpisanie jedynki
załącza wewnętrzny rezystor podciągający.
Rejestr PINx służy wyłącznie do odczytu stanu linii portu x mikrokontrolera.
Silnik krokowy może być sterowany na kilka różnych sposobów. Szczegółowe
informacje można znalezć w [7].
2.2.2 Sterowanie jednofazowe
NajprostszÄ… metodÄ… sterowania silnika krokowego jest sterowanie jednofazowe. Przy
takim sterowaniu w danej chwili czasu prąd przepływa tylko przez jedno uzwojenie
silnika. Przebieg napięć sterujących dla sterowania jednofazowego przedstawia rysunek
poniżej.
A
B
C
D
A, B, C, D oznaczajÄ… kolejne uzwojenia silnika.
10
Za pomocą takiego sterowania można uzyskać obroty w prawą i lewą stronę. (w trakcie
zajęć należy sporządzić odpowiednie programy).
Wyznaczyć ilość kroków, którą należ wykonać, aby silnik wykonał obrót wirnika o
360°.
Do wyznaczania ilości kroków przydatne może się okazać wykorzystanie wyświetlacza
LCD. Zostało to objaśnione w rozdziale 2.3.
Zauważyć warto także wpływ zależności szybkości zmian napięcia na uzwojeniach
silnika od prędkości obrotowej silnika i istnienie maksymalnej szybkości zmian, powyżej
której silnik przestaje działać poprawnie.
Należy zaobserwować to zjawisko oraz wyznaczyć krytyczne wartości opóznień, dla
których praca silnik zaczyna być niestabilna. Wartości winny zostać wyznaczone dla
obrotów silnika w lewą i w prawą stronę ze względu na możliwe różne wartości tego
parametru.
2.2.3 Sterowanie dwufazowe
DrugÄ… metodÄ… sterowania silnika krokowego jest sterowania dwufazowe. Metoda ta jest
bardzo podobna do sterowania jednofazowego. W celu wysterowania silnika w
przedstawiony sposób należy zapewnić jednoczesny przepływ prądu przez dwa
sąsiadujące ze sobą uzwojenia, co może zostać zilustrowane następującą zależnością:
AB->BC->CD->DA.
Podobnie jak w przypadku sterowania jednofazowego należy przygotować odpowiedni
program sterujący pracą silnika w opisany sposób. Sprawdzić czy uległy zmianie osiągi
silnika zaobserwowane dla sterowania jednofazowego (kÄ…t obrotu na 1 krok, krytyczne
wartości opóznień).
Można spróbować ocenić wpływ zmiany sposobu sterowania na siłę, z jaką obraca się
wirnik silnika.
2.2.4 Sterowanie półkrokowe
Trzecią metodą sterowania jest sterowania półkrokowe.
Stanowi ono nałożenie na siebie sterowania jedno- i dwufazowego
W takim sterowaniu prąd płynie chwilami przez 2 uzwojenia silnika zgodnie z
zależnością:
A->AB->B->BC->C->CD->D->DA->A.
Przygotować program, który będzie sterował silnikiem w prezentowany sposób i
umożliwiał wykonywanie obrotów w lewo i w prawo. Podobnie jak w poprzednich
sposobach sterowania określić parametry pracy silnika: kąt obrotu wirnika na jeden
krok, krytyczne czasy opóznień, dla których silnik poprawnie pracuje.
11
2.3 Zadanie C - Znakowy wyświetlacz LCD oparty o kontroler zgodny z
HD4478
Znakowe wyświetlacze LCD oparte o kontroler zgodny z HD44780 są bardzo
popularnym urządzeniem wyjściowym stosowanym w systemach opartych o
mikrokontrolery jednoukładowe Dostępny jest bardzo szeroki asortyment wyświetlaczy
poczynając od organizacji 1x8 znaków a kończąc na organizacji 2x40 znaków. Spotyka
się również wyświetlacze o organizacji 4x40 znaków, ale są one zbudowane w oparciu o
dwa kontrolery i z punktu widzenia mikrokontrolera zachowujÄ… siÄ™ jak dwa
wyświetlaczy o organizacji 2x40 znaków.
Komunikacja z wyświetlaczem odbywa się zwykle za pośrednictwem 4-bitowej
dwukierunkowej magistrali danych (możliwa jest praca z magistralą ośmiobitową) oraz
trzech linii sterujących: RS, RW i E. Ponadto jeśli z rezygnujemy z funkcjonalności
odczytywania danych z wyświetlacza, wystarczy podłączyć linie RW na stałe do masy, co
ogranicza interfejs do 6 linii mikrokontrolera.
Wykorzystany w ćwiczeniu wyświetlacz posiada organizację 2x20 znaków i pracuje
w tej ostatniej konfiguracji.
Ze względu na dużą popularność tego typu wyświetlaczy, dostępnych jest wiele
bibliotek programistycznych, przeznaczonych na różne platformy sprzętowe, ,
pozwalających w prosty sposób wykorzystać wyświetlacz tego typu bez zgłębiania się w
szczegóły techniczne protokołu komunikacyjnego. Biblioteka obsługująca wyświetlacz
wraz z przykładem jej wykorzystania znajduje się w materiałach pomocniczych do
ćwiczenia. Biblioteka dostępna jest w postaci pliku zródłowego HD44780.c oraz pliku
nagłówkowego HD44780.h. Obsługa wyświetlacza będzie realizowana za pośrednictwem
funkcji dostarczanych przez tÄ… bibliotekÄ™.
Wyświetlacz został podłączony do mikrokontrolera w następujący sposób:
- linie danych wyświetlacza DB4-DB7 do linii PD4-PD7,
- linia E do portu PB2 mikrokontrolera
- linia RS do portu PB0 mikrokontrolera
Aby można było korzystać z dostarczonej biblioteki należy w pliku nagłówkowym
HD44780.H umieścić informacje o sposobie jego połączenia z mikrokontrolerem oraz
dołączyć do własnego projektu odpowiedni plik nagłówkowy. Na potrzeby ćwiczenia
odpowiednie informacje zostały tam już umieszczone.
Przed rozpoczęciem wyświetlania znaków, wyświetlacz powinien zostać
zainicjalizowany. Do tego celu służy funkcja LCD_Initialize ().
Po zainicjalizowani można od razu przystąpić do wyświetlania znaków. Służy do tego
funkcja LCD_WriteText . Poza podstawowymi funkcjami wyświetlania tekstu, możliwe
jest wyświetlanie znaków definiowanych przez użytkownika. Więcej informacji na ten
temat można znalezć w dodatku.
2.4 Zadanie D - Zegar czasu rzeczywistego oparty o PCF8583
W trakcie realizacji zadania należy napisać i uruchomić program realizujący funkcje
zegara czasu rzeczywistego. Odmierzania czasu będzie realizowane przez
specjalizowany układ PCF8583 [5], połączony z mikrokontrolerem za pomocą magistrali
12
I2C. Przed rozpoczęciem realizacji tej części ćwiczenia, wskazane jest zapoznać się z
dokumentacją techniczną układu PCF8583 [5].
Obsługa magistrali I2C będzie realizowana na drodze czysto programowej gdyż układ
AT90S8515 nie posiada sprzętowego interfejsu I2C. W materiałach do ćwiczenia
dostępna jest odpowiednia biblioteka przeznaczona do obsługi komunikacji przez tą
magistralę. W materiałach pomocniczych zamieszczono również przykładowy kod
korzystajÄ…cy z tej biblioteki.
Linie magistrali I2C zostały podłączone następująco:
SCL do portu PC0 ,
SDA do portu PC1.
Zadaniem mikrokontrolera będzie zapis do zegara odpowiednich ustawień
początkowych, a następnie wyświetlanie na wyświetlaczu LCD lub LED aktualnego czasu
odczytanego z zegara. Dodatkowo można wbudować w program funkcje alarmu
sygnalizowanego np. za pomocą głośnika lub mrugającej diody LED.
Układ PCF8583 jest widoczny pod adresem 80D (50H) magistrali I2C. Ponieważ
najmłodszy bit adresu I2C określa typ operacji (odczyt/zapis) wiec układ PCF8583 jest
 widoczny pod adresem 160D dla operacji zapisu i 161D dla operacji odczytu.
Do obsługi magistrali I2C wykorzystać można gotową bibliotekę programowej obsługi
magistrali I2C dostępną w materiałach do ćwiczenia.
Układ PCF8583 posiada możliwość generowania przerwania (niski poziom na
wyprowadzeniu nr 7 układu PCF8583), jednak w zestawie nie ma możliwości
wykonania połączenia tego wyprowadzenia do mikrokontrolera lub innego elementu
zestawu. Obsługa alarmu musi być realizowana na drodze programowego sprawdzania
stanu alarmu w odpowiednim rejestrze zegara. Sygnalizowanie stanu alarmu może być
wykonane za pomocÄ…:
- komunikatu pojawiającego się na wyświetlaczu
- sygnalizowania zapaleniem lub miganiem diody świecącej
- sygnałem akustycznym brzęczyka (nie zalecane)
13
Dodatek A - Definiowanie własnych znaków w wyświetlaczu lcd z
kontrolerem zgodnym z HD44780.
Wyświetlacz LCD (a właściwie kontroler HD44780) dysponuje możliwością
wyświetlania do ośmiu znaków zdefiniowanych przez użytkownika. Znaki te posiadają
kody o wartościach od 00H do 07H.
Dane opisujące kształty znaków są przechowywane w pamięci wyświetlacza, która
nazywa się CGRAM. Przed użyciem wzorce znaków muszą być wysłane do wyświetlacza.
Zwykle wykonywane jest to zaraz po jego inicjalizacji (wzorce znaków są tracone
bezpowrotnie po wyłączeniu zasilania lub inicjalizacji wyświetlacza).
Każdy zdefiniowany znak wymaga 8 bajtów danych. Ósmym bajtem jest zazwyczaj $00,
ponieważ jest to miejsce przeznaczone dla linii kursora. Standardowa czcionka
wyświetlacza ma 5 pikseli szerokości i 7 pikseli wysokości. Jeden rząd pikseli na samym
dole jest zarezerwowany na podkreślający znak kursora.
Kształt znaku jest taki, jaki jest układ zer i jedynek w bajcie danych. Jedynka zaświeca
piksel, zero pozostawia piksel zgaszonym. Oto przykład znaku zdefiniowanego przez
użytkownika:
Poniżej zamieszczono przykładowy program prezentujący w jaki sposób definiuje się
i wykorzystuje własne znaki.
#ifndef F_CPU
#define F_CPU 8000000
#endif
#include
#include
#include "HD44780.h"
uint8_t znak[] = {0, 10, 10, 0, 17, 14, 6, 0}; //wlasny znak - buzka
int main(void)
{
char temp, i;
LCD_Initialize();
LCD_ProgrammChar(0, znak); // przeslanie ksztaltu znaku
// o kodzie 0 do wyswietlacza
LCD_GoTo(0,0);
LCD_WriteText("- Wlasne znaki -");
// wyswietlenie zdefiniowanego znaku
LCD_GoTo(0,1);
LCD_WriteData(0);
while(1){}
return 0;
}
W przykładzie powyżej kształt znaku jest definiowany za pomocą tablicy ośmiobitowych
liczb (typu uint8_t) o nazwie znak. Za przesłanie kształtu znaku do pamięci CGRAM
wyświetlacza odpowiada funkcja LCD_ProgrammChar (unsigned char nr_znaku , unsigned
char znak[]).
14
Dodatek B - Zestaw uruchomieniowy AVR
Wszystkie opisywane tu moduły (oprócz zaprojektowanego modułu emulatora
sprzętowego AT89) znajdują się na jednej dużej płycie.
wyświetlacze
siedmiosegmentowe
transmisja wzmacniacz
wyświetlacz diody
szeregowa kodu RC5
LCD
przetwornik
piezoelektryczny
szyna I2C
programator
mikroprocesor mikroprocesor moduł zasilanie mikrozłącza
20-nóżkowy 40-nóżkowy resetu
Rys. 14. Rysunek poglÄ…dowy zestawu z zaznaczonymi elementami
2.5 Moduł programatora ISP dla AVR.
Programowanie mikroprocesorów AVR odbywać się może wykorzystując magistralę SPI
(3 linie). W takim trybie programowania dane są przesyłane do procesora szeregowo.
Procesory można programować zarówno w podstawkach wyposażonych w niezbędny
rezonator kwarcowy, jak i w systemie, za pomocą specjalnego złącza ISP, który to
sposób został wykorzystany w naszym zestawie. Programator jest umieszczony na
jednej płycie z resztą układu i jest podłączany z komputerem przez złącze Centronics.
Posiada diodę do wskazywania transmisji sygnałów. Przy programatorze znajdują się
zworki do obsługi złącza ISP. Zworki znajdujące się bliżej programatora służą do
całkowitego odłączenia złącza ISP lub podłączenia zewnętrznego (np. innego typu)
programatora ISP. Drugi rząd zworek służy do przełączenia podłączenia złącza ISP
między mikroprocesorem 20- i 40-nóżkowym.
Istnieje też drugi tryb programowania, Parallel Mode, w którym dane przesyłane
są równolegle przy wykorzystaniu większej ilości przewodów  wyklucza to jednak
używanie ISP, gdyż układ trzeba fizycznie przenieść do programatora. Główną zaletą
programowania ISP jest prostota wykonania programatora. Jest jednak i druga strona
medalu  czym prostszy układ programujący tym większa możliwość wystąpienia
przekłamań podczas programowania.
15
2.6 Moduł procesorowy
Należy zauważyć, że procesory AVR mogą działać przy częstotliwości 0-8 MHz, a
AT89xxx z wartościami 0-24 MHz. W celu dowolnej zmiany tych wartości na płytce
znajdują się po trzy kwarce dla mikroprocesora 20- i 40-nóżkowego, wybierane
zworkami: 4, 8 i 11.059 MHz. Należy zauważyć, że niektóre aspekty programowania
mikroprocesora są dedykowane do ściśle określonego kwarcu i nie można go zmienić
np. tam, gdzie mają znaczenie wartości zliczane przez wewnętrzny licznik / czasomierz
mikroprocesora  ma to miejsce przy transmisji szeregowej1, obsłudze szyny 1WIRE,
częstotliwościomierzach itp. Zmiana kwarcu raczej nie wpływa na wyświetlacz LCD,
szynę I2C (synchronizacja zegara z układem mastera  mikroprocesorem) i obsługę
innych urządzeń poza zmianą szybkości działania mikroprocesora.
Uwaga: Należy pamiętać, aby do mikroprocesora AVR nie podłączać kwarcu
11.059 MHz, którego on nie obsługuje i może skończyć się przegrzaniem, a nawet
spaleniem układu.
W przypadku wykorzystywania określonego typu mikroprocesorów (AT89 lub AVR)
należy odpowiednio ustawić zworkę poziomu sygnału RESET. Należy zauważyć, że
działa tylko wybrany RESET (albo AVR albo  51). Zastosowany układ RESETU dla AVR
automatycznie resetuje mikroprocesory po włączeniu zasilania. Zauważono także
resetowanie procesora AVR po zakończeniu działania zapisanego w nim programu
(program wykonuje się w kółko).
Należy zauważyć, że dzięki temu, że mikroprocesory 20- i 40-nóżkowy mają
odrębne wyprowadzenia portów, istnieje możliwość działania dwóch procesorów. Aby
umożliwić pracę mikroprocesora należy podłączyć mu zasilanie (Vcc). Nie zostało to
wykonane na stałe, gdyż umożliwia to wybór uruchamianego układu. Dzięki
zastosowanemu układowi resetu, jednocześnie mogą pracować mikroprocesory AT89 i
AT90, ale wybór poziomu resetu musi być odłączony.
1
niektórych szybkości transmisji nie da się otrzymać przy każdym kwarcu
16
2.7 Moduł urządzeń
Płyta prototypowa została wyposażona w następujące urządzenia peryferyjne:
" wyświetlacz LCD (o organizacji 2x20 znaków)
" 4 wyświetlacze siedmiosegmentowe LED, wspólna anoda (Rys. 15)
" złącze szeregowe RS232 (Rys. 16)
" wzmacniacz sygnału w kodzie RC5  obsługa standardowego pilota (Rys. 17)
" 8 mikroprzełączników membranowych (Rys. 17)
" 8 diód świecących (Rys. 15)
" przetwornik piezoelektryczny
Rys. 15. Diody i wyświetlacze siedmiosegmentowe
Rys. 16. Podłączenie układu MAX232  transmisja szeregowa
17
Rys. 17. Podłączenie wzmacniacza kodu RC5 i mikroprzełączników
2.8 Moduł układów współpracujących z szyną I2C
Układy pracujące w magistrali I2C :
" pamięć szeregowa
" zegar z kalendarzem + dodatkowy kwarc (zegarkowy) + bateria podtrzymujÄ…ca
" 2 dwukierunkowe konwertery I2C na 8-bitowÄ… szynÄ™ danych
" 2 wzmacniacze prÄ…dowe 5V i 12V (wykorzystywane poprzez expandery z
poprzedniego podpunktu lub bezpośrednio)  np.. sterowanie silnikami krokowymi,
przekaznikami
" przetwornik AD/DA
18
Rys. 18. Moduł układów współpracujących z szyną I2C
19
2.9 Moduł zasilania
Układ zasilania zestawu uruchomieniowego (Rys. 19) składa się z mostka
prostowniczego i scalonego stabilizatora napięcia 7805, wraz z niezbędnymi do jego
pracy kondensatorami wygładzającymi impulsy. Doprowadzone zasilanie powinno być o
3V wyższe od nominalnego, niekoniecznie stabilizowane. Pobór prądu jest poniżej 1A (w
zależności od ilości podłączonych urządzeń), więc nie dochodzi do przegrzania
stabilizatora.
Istnieje możliwość obejścia zastosowanego zasilacza (poprzez przestawienie zworki
JP2 w pozycję zasilania zewnętrznego). Możliwe jest wówczas podłączenie napięcia
stałego 5V.
Rys. 19. Moduł zasilania
20


Wyszukiwarka