 
 
 
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