KATEDRA INFORMATYKI
Wydział EAIiE AGH
Laboratorium Techniki Mikroprocesorowej
Ćwiczenie 5
Podstawy programowania
mikrokontrolerów AVR8 w
środowisku AVR Studio 4
2
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 I
2
C - 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 źró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
.
3
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)
4
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
źró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
5
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 źró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 źró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
6
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 <avr/io.h>
#include <util/delay.h>
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
7
Tools→Program AVR→Connect…
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
8
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
9
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
10
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
znaleźć 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 znaleźć 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 oznaczają kolejne uzwojenia silnika.
A
B
C
D
11
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óźnień, 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óźnień).
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óźnień, dla których silnik poprawnie pracuje.
12
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 źró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 znaleźć 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
13
I
2
C. Przed rozpoczęciem realizacji tej części ćwiczenia, wskazane jest zapoznać się z
dokumentacją techniczną układu PCF8583 [5].
Obsługa magistrali I
2
C będzie realizowana na drodze czysto programowej gdyż układ
AT90S8515 nie posiada sprzętowego interfejsu I
2
C. 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 I
2
C 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 I
2
C. Ponieważ
najmłodszy bit adresu I
2
C 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 I
2
C 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)
14
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 <avr/io.h>
#include <util/delay.h>
#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[])
.
15
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.
mikroprocesor
40-nóżkowy
mikroprocesor
20-nóżkowy
transmisja
szeregowa
wzmacniacz
kodu RC5
wyświetlacze
siedmiosegmentowe
programator
przetwornik
piezoelektryczny
wyświetlacz
LCD
diody
zasilanie
mikrozłącza
szyna I
2
C
moduł
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.
16
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 szeregowej
1
, obsłudze szyny 1WIRE,
częstotliwościomierzach itp. Zmiana kwarcu raczej nie wpływa na wyświetlacz LCD,
szynę I
2
C (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
17
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
18
Rys. 17. Podłączenie wzmacniacza kodu RC5 i mikroprzełączników
2.8
Moduł układów współpracujących z szyną I
2
C
Układy pracujące w magistrali I
2
C :
• pamięć szeregowa
• zegar z kalendarzem + dodatkowy kwarc (zegarkowy) + bateria podtrzymująca
• 2 dwukierunkowe konwertery I
2
C 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,
przekaźnikami
•
przetwornik AD/DA
19
Rys. 18. Moduł układów współpracujących z szyną I
2
C
20
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