background image

 
 

KATEDRA INFORMATYKI 

Wydział EAIiE AGH 

 
 
 
 
 
 

 

 
 

 

Laboratorium Techniki Mikroprocesorowej 

 
 
 
 
 
 
 
 
 
 
 

Ćwiczenie 5 

Podstawy programowania 

mikrokontrolerów AVR8 w 

środowisku AVR Studio 4 

background image

 

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

 . 

 

 

background image

 

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) 

background image

 

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 

background image

 

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 

 

background image

 

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  

background image

 

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 

background image

 

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 

background image

 

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 

background image

 

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. 

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

background image

 

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. 
 

background image

 

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 

background image

 

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) 

background image

 

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[])

.  

background image

 

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. 

background image

 

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 

background image

 

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 

background image

 

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

 

 

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

 

background image

 

19 

 

Rys. 18. Moduł układów współpracujących z szyną I

2

background image

 

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