4


K U R S
O sposobie, w jaki przerwania są obsługiwane
część 4
w jÍzyku C, pisaÅ‚em juÅ‚ przy okazji omawiania podstaw
programowania. DziÅ› wykorzystamy programowanie przerwaÒ do budowy
prostego licznika. Wykorzystamy w nim przerwanie generowane przez
Timer 1 do obsługi wyświetlacza LED oraz przerwanie generowane przez
opadajÄ…ce zbocze sygnaÅ‚u na wejÅ›ciu INT0 do zliczania impulsÛw
zegarowych. W programie wykorzystamy teÅ‚ wskaüniki i ich arytmetykÍ -
bÍdzie okazja co nieco siÍ nauczyĘ.
Budujemy licznik, czyli język C i przerwania
Licznik prezentowany w artykule wiÍc efektu migotania cyfr w czasie
jako przykÅ‚ad zbudowaÅ‚em, korzysta- wpisywania danych do rejestrÛw. Po-
jąc z płytki AVR Starter Kit oraz ka- łączyłem szeregowo dwa układy
waÅ‚ka pÅ‚ytki uniwersalnej. OczywiÅ›- 74HCT595, tworzÄ…c w ten sposÛb re-
cie, jeśli uływasz innego zestawu jestr 16-bitowy. Jako pierwszy w sze-
eksperymentalnego - nie jest to Å‚ad- regu znajduje siÍ rejestr segmentÛw rowy, ktÛrego opadajÄ…ce zbocze po-
nÄ… przeszkodÄ…. Prawdopodobnie bÍ- cyfr, jako drugi rejestr zaÅ‚Ä…czajÄ…cy woduje przepisanie danych z we-
dziesz tylko musiaÅ‚ zbudowaĘ sobie poszczegÛlne cyfry. WejÅ›cie szerego- wnÍtrznego szeregowo-rÛwnolegÅ‚ego
wyświetlacz LED. we danych taktowane jest sygnałem rejestru do wyjściowego rejestru ty-
o czÍstotliwoÅ›ci 4,8 kHz, natomiast pu zatrzask.
PÅ‚ytka wyÅ›wietlacza LED cyfry przeÅ‚Ä…czane sÄ… z czÍstotliwoÅ›ciÄ… Program napisany zostaÅ‚ tak, Å‚e
Schemat poÅ‚Ä…czeÒ wyÅ›wietlacza okoÅ‚o 300 Hz. w danym momencie Å›wieci tylko jed-
LED pokazano na rys. 1. Niestety - UÅ‚yÅ‚em wyÅ›wietlaczy LED ze na cyfra. JeÅ›li przeÅ‚Ä…czanie cyfr bÍ-
jeÅ‚eli chcesz eksperymentowaĘ z tym wspÛlnÄ… anodÄ…. Zasilanie anod zaÅ‚Ä…- dzie wystarczajÄ…co szybkie, ludzkie
przykładem programowania, musisz czane jest przez tranzystory MOS oko tego nie zauwały. Jest to typ
sobie taki układ zbudowaĘ. Moim z kanałem typu P (BS250). Ich sto- wyświetlania zwany multipleksowa-
zdaniem przyda on ci siÍ nie tylko sowanie jest bardzo wygodne, ponie- nym (wyÅ›wietlanie dynamiczne).
do eksperymentÛw, ale rÛwnieÅ‚ moÅ‚- waÅ‚ nie wymagajÄ… Å‚adnych dodatko- Charakteryzuje siÍ on maÅ‚ym pobo-
na go uÅ‚yĘ w dowolnym innym wych elementÛw, takich jak na przy- rem prÄ…du - w danym momencie za-
ukÅ‚adzie wykorzystujÄ…cym wyÅ›wietla- kÅ‚ad rezystory. WartoÅ›ci rezystorÛw silana jest tylko jedna cyfra. Tyle na
cze LED. Trzeba jednak uwaÅ‚aĘ - podÅ‚Ä…czonych do poszczegÛlnych seg- temat zasady dziaÅ‚ania, zajmijmy siÍ
obsÅ‚uga wyÅ›wietlacza oparta jest mentÛw wyÅ›wietlacza musisz dobraĘ teraz programem.
o przerwanie generowane przez Ti- sobie do posiadanych cyfr. Numery
mer 1, dlatego teÅ‚ nie polecam ta- wyprowadzeÒ wyÅ›wietlacza LED po- Mikrokontroler jako licznik
kiego ukÅ‚adu na przykÅ‚ad do czÍs- traktuj jako orientacyjne. Istotne sÄ… Program pokazano na list. 1.
toÅ›ciomierza. Chyba Å‚e zgodzisz siÍ literowe oznaczenia segmentÛw. Na Licznik wykorzystuje dwa przerwa-
na wyÅ‚Ä…czenie wyÅ›wietlania w czasie wejÅ›ciach rejestrÛw szeregowych nia. Pierwsze, zewnÍtrzne, powodo-
pomiaru czÍstotliwoÅ›ci. Zaowocuje to znajdujÄ… siÍ rezystory pull-up, tak wane przez opadajÄ…ce zbocze napiÍ-
migotaniem przy pomiarze przebie- aby mołna było wyświetlacz podłą- cia na wejściu INT0, uływane jest
gÛw o niskiej czÍstotliwoÅ›ci. Jednak czyĘ do dowolnego z portÛw mikro- do zwiÍkszania wartoÅ›ci licznika.
tam, gdzie mikrokontroler nie jest kontrolera. Drugie - wewnÍtrzne, generowane
zbyt mocno obciąłony i gdzie nie Wyświetlacz do sterowania wyma- cyklicznie - pochodzące od Timera
ma ścisłych zalełności czasowych - ga trzech linii - jednej danych 1, przepisuje stan bufora display do
Å›miaÅ‚o moÅ‚esz tego ukÅ‚adu uÅ‚yĘ. i dwÛch zegarowych. Ja wykorzysta- rejestrÛw wyÅ›wietlacza.
Z powodzeniem na przykÅ‚ad stosujÍ Å‚em P1.1, P1.2 i P1.3 OczywiÅ›cie, Program rozpoczyna siÍ od dekla-
go w układzie termometru cyfrowego, zmieniając program, mołesz ułyĘ do- racji. Linia danych wyświetlacza za-
mimo rÛÅ‚nic poglÄ…dÛw na temat za- wolnych innych. RÛwnieÅ‚ wykonujÄ…c deklarowana zostaje jako P1^0, linia
wieszania transmisji z DS1820 na drobne modyfikacje w programie, zegara szeregowego jako P1^1, linia
czas obsÅ‚ugi przerwaÒ - nie mam moÅ‚na podÅ‚Ä…czyĘ do 8 wyÅ›wietlaczy zegara wyjÅ›ciowego rejestru latch ja-
z tym kÅ‚opotu w mojej aplikacji. LED o wspÛlnej anodzie. W skrÛcie ko P1^2. OprÛcz tego inicjujemy
Do konstrukcji wyświetlacza uły- funkcjonowanie wyświetlacza wyglą- zmienną typu unsigned int zawiera-
Å‚em rejestrÛw przesuwajÄ…cych da nastÍpujÄ…co: dane za pomocÄ… jÄ…cÄ… zliczane impulsy oraz staÅ‚Ä… ty-
74HCT595. ZrobiÅ‚em tak z dwÛch po- opadajÄ…cego zbocza sygnaÅ‚u zegaro- pu char z zawartoÅ›ciÄ… inicjujÄ…cÄ… re-
wodÛw. Po pierwsze, cena tych wego podawanego na wyprowadzenie jestr TH1 Timera 1. StaÅ‚a ta to po-
ukÅ‚adÛw jest bardzo niska, a obciÄ…- 11 (SRCLK) wpisywane sÄ… z wejÅ›cia Å›rednio czÍstotliwośĘ, z jakÄ… wywo-
łalnośĘ ich wyjśĘ w stanie niskim szeregowego na wyprowadzeniu 14 ływane jest przerwanie obsługujące
jest wystarczajÄ…ca do zasilania typo- (SER) do wewnÍtrznego rejestru. wyÅ›wietlacz LED. Dalej znajduje siÍ
wego wyświetlacza LED. Po drugie Mikrokontroler przesyła pełne słowo uporządkowana w kolejności rosnącej
zaś, układ nie wyprowadza informa- 16-bitowe tak, aby działały oba ukła- (od 0 do 9) tablica określająca wy-
cji na wyjÅ›cia do momentu pojawie- dy rejestrÛw. NastÍpnie, po wpisa- glÄ…d wyÅ›wietlanego znaku (patterns),
nia siÍ osobnego impulsu zegarowe- niu 16 bitÛw, na wyprowadzenie 12 tablica z kodami kolejnoÅ›ci zaÅ‚Ä…cza-
go, ktÛry jÄ… tam przepisze. Nie ma (RCLK) podawany jest impuls zega- nia cyfr (digits) oraz tablica - bufor
Elektronika Praktyczna 9/2002
93
K U R S
Rys. 1
wyÅ›wietlacza w RAM (display). Jak zrobione w celu unikniÍcia migotania wygaszeniu cyfry. Tak dzieje siÍ aÅ‚
Å‚atwo zauwaÅ‚yĘ, dwie pierwsze wyÅ›wietlacza. PÛüniej, wskaünikowi do momentu napotkania wzorca rÛÅ‚-
umieszczone sÄ… w obszarze pamiÍci TDisplay przypisywane jest wskaza- nego od wzorca ì0î. WÛwczas to in-
ROM mikrokontrolera (słowo kluczo- nie na ostatni element bufora wy- strukcja break (spotkaliśmy ją w kon-
we code) i mają przypisane wartości. świetlacza. Od niego to rozpocznie strukcjach warunku switch) przerywa
Trzecia znajduje siÍ w obszarze siÍ translacja na kody LED. Przebie- dziaÅ‚anie pÍtli for. Po zakoÒczeniu
RAM. Jest ona odwzorowaniem sta- ga ona wedÅ‚ug nastÍpujÄ…cego sche- pÍtli zaÅ‚Ä…czane jest wyÅ›wietlanie -
nu wyÅ›wietlacza, abstrahujÄ…c od nu- matu: do wartoÅ›ci wskaünika TPat- odpowiada mu zezwolenie na przyj-
meru wyÅ›wietlanej aktualnie cyfry. terns dodaj resztÍ z dzielenia argu- mowanie przerwaÒ Timera 1.
KaÅ‚da z tablic ma przypisany wÅ‚aÅ›- mentu przez 10, a nastÍpnie skopiuj Dalej napotkamy procedury ob-
ciwy jej wskaünik, czyli zmiennÄ…, wskazywanÄ… w wyniku dziaÅ‚ania sta- sÅ‚ugi przerwaÒ. WyrÛÅ‚nia je sÅ‚owo
ktÛra bÍdzie wskazywaĘ na element Å‚Ä… typu char z tablicy patterns pod kluczowe interrupt umieszczone
tablicy. W momencie zadeklarowania, adres wskazywany przez TDisplay. w nagÅ‚Ûwku funkcji. Funkcja Incre-
kaÅ‚dy wskaünik ustawiany jest na Podziel liczbÍ przez 10, przesuÒ mentCounter obsÅ‚uguje przerwanie
pierwszy element tablicy. WyraÅ‚enie wskazanie na nastÍpnÄ… pozycjÍ w bu- zewnÍtrzne INT0. W zasadzie nie ro-
Wskaünik = &Tablica powoduje przy- forze wyÅ›wietlacza i powtÛrz opera- bi nic za wyjÄ…tkiem zwiÍkszenia
pisanie zmiennej Wskaünik adresu, cjÍ dla nastÍpnej cyfry. I tak 6 razy stanu zmiennej counter i wywoÅ‚ania
pod ktÛrym umieszczona jest Tabli- - dla kaÅ‚dej z cyfr LED. funkcji Translate. Druga z nich to
ca. Wskaüniki to fantastyczne narzÍ- Jako swego rodzaju rozszerzenie procedura obsÅ‚ugi przerwania Time-
dzie jÍzyka C! funkcjonalnoÅ›ci, umieszczono wyga- ra 1 - DisplaySend, zajmujÄ…ca siÍ
Funkcja Translate zamienia argu- szanie zer nieznaczących na począt- konstrukcją i przesłaniem słowa do
ment x, ktÛrym jest dwubajtowa ku cyfry. PÍtla - rozpoczynajÄ…c od wyÅ›wietlacza LED. Przyjrzyjmy siÍ
liczba całkowita bez znaku, na od- początku bufora - sprawdza znak dokładniej stosowanym w niej meto-
powiadajÄ…cÄ… tej liczbie zawartośĘ bu- znajdujÄ…cy siÍ pod wskazanym przez dom.
fora display. Jednym sÅ‚owem, zamie- wskaünik bufora wyÅ›wietlacza adre- Timer 1 pracuje w trybie 16-bito-
nia liczbÍ na odpowiadajÄ…cy jej wy- sem (TDisplay) i porÛwnuje go ze wym. Przerwanie zgÅ‚aszane jest przez
gląd wyświetlacza LED. Metoda jest znakiem na początku tablicy digits, timer w momencie przepełnienia, to
bardzo prosta, chociaÅ‚ zapis poczÄ…t- to znaczy wzorcem ì0î. JeÅ›li sÄ… to znaczy zmiany stanu z 0xFFFF na
kowo moÅ‚e siÍ wydaĘ niezrozumia- te same znaki, kod ì0î w buforze 0x0000. WÛwczas to wywoÅ‚ywana
ły. Po wywołaniu funkcji wyłączane wyświetlacza zostaje zamieniony na jest procedura obsługi przerwania.
sÄ… przerwania Timera 1. ZostaÅ‚o to 0xFF, co odpowiada caÅ‚kowitemu Cykl odliczania rozpoczyna siÍ na
Elektronika Praktyczna 9/2002
94
K U R S
nowo od wartości 0 do 0xFFFF. Jeś-
List. 1.
li nie zdecydujemy inaczej, to od te-
//===============================================
go momentu do nastÍpnego przerwa-
// (C) Easy Soft 01/2002
nia upłynie czas 65536 cykli maszy-
// Raisonance RC-51, version 6.4.16
nowych (to jest 1/12 czÍstotliwoÅ›ci //===============================================
oscylatora). W przypadku mojego mo-
// rezonator 7,3728MHz
delu byłby to czas około 100 mili-
sekund - z całą pewnością byłby on
#include
powodem migotania cyfr, poniewał
jest zbyt długi. Mołna czas do wy- //definicje linii sterujących wyświetaniem
sbit dataline = P1^0;
woÅ‚ania przerwania skrÛciĘ, ustawia-
sbit shiftline = P1^1;
jąc na połądaną wartośĘ najpierw
sbit latchline = P1^2;
mÅ‚odszy a pÛüniej starszy bajt time-
ra. Poniewał nie zaleły mi na bar- //licznik impulsów
int counter = 0;
dzo dokładnym odmierzaniu czasu,
zdecydowaÅ‚em siÍ na ustawienie (od-
//wartość rejestru timera TH1, TL1 nie jest modyfikowane liczy zawsze od 0
świełenie) tylko starszego bajtu.
const char interval = 0xF8;
Dalej zwiÍkszane sÄ… wartoÅ›ci
wskaünikÛw TDisplay (wskazanie na
/* tutaj wzorce cyfr
cyfrÍ w buforze wyÅ›wietlacza) oraz
d5
TDigits, to znaczy wskaünik do tab-
======
licy z kodami załączenia cyfr. Oba te
d1 | | d6
wskaüniki zmieniane sÄ… synchronicz- | d0 |
======
nie co oznacza, Å‚e przesuniÍcie siÍ
d7 | | d4
na nastÍpnÄ… cyfrÍ musi powodowaĘ
| |
rÛwnieÅ‚ zmianÍ kodu zaÅ‚Ä…czenia wy-
======
świetlacza.
d2 */
Warunek if (TDisplay == 0) słu-
char code patterns[10] = { 0x09,0xAF,0x1A,0x8A,0xAC,0xC8,0x48,0x8F,0x08,0x88 };
Å‚y do zbadania, czy napotkano znak
//przecinek = d3, wyłączenie cyfry = 0xFF
koÒca bufora w RAM. JeÅ›li tak, to
char *TPatterns = &patterns;
wskaüniki sÄ… ustawiane ponownie na
poczÄ…tek wskazywanych tablic.
//tutaj kolejność załączania
Jako łe kod załączenia musimy
char code digits[6] = { 0xFE,0xFD,0xFB,0xF7,0xEF,0xDF };
wysłaĘ jako pierwszy, na początek
char *TDigits = &digits;
zmiennej x przypisywana jest war-
tośĘ kodu zaÅ‚Ä…czenia cyfry. PÛüniej
przesuwana jest ona w lewo o 8 po- //bufor wyświetlacza w RAM
char data display[7];
zycji, a nastÍpnie sumowany jest
char data *TDisplay = &display;
z nią wzorzec znaku do wyświetle-
nia z bufora display. To sÄ… wszyst-
kie operacje, ktÛre muszÄ… byĘ wyko- //zamiana zmiennej x na zawartość bufora do wyÅ›wietlenia
void Translate(unsigned int x)
nane w celu poprawnej budowy sło-
{
wa do sterowania wyświetlaczem.
char temp;
Teraz docieramy do pÍtli for, ktÛra
ET1 = 0; //wyłączenie na czas translacji wyświetlania
ma za zadanie wysłanie wszystkich
//(migotanie LED)
TDisplay = &display + 5; //zaczynamy translację od najmłodszej cyfry
16 bitÛw sÅ‚owa do wyÅ›wietlacza.
for (temp=0; temp<6; temp++)
ZnajdujÄ…ca siÍ wewnÄ…trz pÍtli
{
operacja przesuwania w lewo zmien-
*TDisplay = *(TPatterns + x % 10); //adres wzorca + (reszta z dzielenia
nej x ma na celu przeniesienie po-
//przez 10)
jedynczego bitu słowa do flagi C, TDisplay-;
x /= 10;
ktÛra to w nastÍpnym poleceniu (da-
}
taline = CY) wpływa na stan bitu
TDisplay += 1; //po poprzedniej pętli TDisplay jest o 1 za małe
portu - wyjścia danych. Impuls ze-
for (temp=0; temp<5; temp++) //wygaszenie zer nieznaczÄ…cych od pozycji 1..5
garowy, zmiana stanu shiftline z wy- {
if (*TDisplay == *TPatterns) *TDisplay = 0xFF; else break;
sokiego na niski, koÒczy proces wy-
//jeśli napotkamy znak różny od 0,to koniec
sÅ‚ania bitu. PÍtla for powtarza ope-
TDisplay++;
racjÍ 16 razy, dla wszystkich bitÛw
}
zmiennej. TransmisjÍ koÒczy przepi-
ET1 = 1; //załączenie wyświetlania
sanie danych z wewnÍtrznego rejest- }
ru do rejestru wyjściowego poprzez
zmianÍ stanu linii latchline. I to jest
//procedura obsługi przerwania INT0
koniec obsługi przerwania Timera 1.
//zwiększanie licznika impulsów
Program gÅ‚Ûwny main() zawiera
void IncrementCounter(void) interrupt 0
tylko proste ustawienia mikrokontro- {
counter++; //zwiększenie licznika impulsów
lera oraz, na samym poczÄ…tku, zapi-
Translate(counter); //zamiana counter na liczby do wyświetlenia
sanie znaku koÒca bufora wyÅ›wietla-
}
cza. Ustawiane sÄ…:
Elektronika Praktyczna 9/2002
95
K U R S
List. 1. (ciÄ…g dalszy)
//procedura obsługi przerwania od timer a 1
//wysłanie zmiennej 2-bajtowej do wyświetlacza - 1 znak z bufora display
void DisplaySend(void) interrupt 3
{
char temp;
unsigned int x;
TH1 = interval; //odświeżenie zawartości timera 1
TDisplay++; //następna pozycja do wyświetlenia
TDigits++;
if (*TDisplay == 0) //jeśli osiągnięto koniec bufora,
{ //to wróć do początku
TDisplay = &display;
TDigits = &digits;
}
x = *TDigits; //x przyjmuje wartość liczby do wysłania
x <<= 8; //składa się ona z bajtu wzorca cyfry
//i bajtu kolejności załączenia
x |= *TDisplay;
for (temp = 0; temp<16; temp++) //wysłanie cyfry poprzez przypisanie flagi C
//do wyjścia danych
{
x <<= 1;
dataline = CY;
shiftline = 1; //impuls na wyjściu zegara przesuwającego
shiftline = 0;
}
latchline = 1; //przepisanie danych do wyjść rejestrów
latchline = 0;
}
//program główny
void main(void)
{
*(TDisplay + 6) = 0x00; //tutaj kod końca danych
Translate(counter); //wyświetlenia 0.
TMOD = 0x11; //oba timery jako 16 bitowe, kontrolowane
//wewnętrznie
TH1 = interval; //przerwanie wywoływane z częstotliw.około 75Hz
ET1 = 1; //zezwolenie na przerwanie od timer a 1
TR1 = 1; //uruchomienie timer a 1
IT0 = 1; //opadajÄ…ce zbocze na INT0 wyzwala przerwanie
EX0 = 1; //załączenie przerwania INT0
EA = 1; //zezwolenie na przyjmowanie przerwań
while (1); //oczekiwanie na przerwania
}
- rejestr TMOD na wartośĘ 0x11, to wiÍkszego problemu. MoÅ‚na uÅ‚ywaĘ
znaczy oba Timery jako 16-bitowe, pewnych drÛg na skrÛty. I co na to
a impulsy pobierane sÄ… z wewnÍt- wszyscy twierdzÄ…cy, Å‚e programy na-
rznego zegara, pisane w jÍzykach wysokiego poziomu
- ustawiany jest starszy bajt licznika zajmujÄ… duÅ‚o pamiÍci? OczywiÅ›cie,
Timera 1, mołesz teł powiedzieĘ, łe jestem
- włączane są przerwania. kiepskim programistą...
Program gÅ‚Ûwny koÒczy pÍtla Na koniec mam jeszcze maÅ‚Ä… su-
while(1), w ktÛrej mikrokontroler gestiÍ. A moÅ‚e by tak doÅ‚oÅ‚yĘ prostÄ…
oczekuje na impulsy przychodzÄ…ce procedurÍ komunikacji, chociaÅ‚by przez
na INT0 oraz zajmuje siÍ obsÅ‚ugÄ… port RS232, i nawet bez translacji po-
wyÅ›wietlania. ziomÛw napiÍĘ zbudowaĘ alternatywÍ
Pewnym zaskoczeniem byÅ‚ dla dla ukÅ‚adÛw sterownikÛw wyÅ›wietlaczy
mnie drobny fakt napotkany podczas LED, ktÛrych cena detaliczna jest - le-
testowania programu. Jego pierwowzo- kko mÛwiÄ…c - przeraÅ‚ajÄ…ca? MoÅ‚na by
rem był identycznie funkcjonujący było wykorzystaĘ tani mikrokontroler,
program w jÍzyku asembler. Faktycz- na przykÅ‚ad AT89C2051. A moÅ‚e AVR?
nie nie przejmowaÅ‚em siÍ mocno je- WÛwczas nie potrzeba rezonatora
go optymalizacjÄ…, ale gdy napisaÅ‚em kwarcowego. MyÅ›lÍ, Å‚e wraz z cyfra-
program w C, mina mi zrzedÅ‚a. Pro- mi bÍdzie on taÒszy niÅ‚ jeden ukÅ‚ad
gramy - mniej wiÍcej rÛwnowaÅ‚ne sterownika LED.
w funkcjach - ten napisany w asemb- Jacek Bogusz, AVT
lerze zajmowaÅ‚ 169 bajtÛw, a ten na- jacek.bogusz@ep.com.pl
pisany w C - 119 bajtÛw. StaÅ‚o siÍ
tak chyba z jednego powodu. Po pier-
Dodatkowe informacje
wsze, w asemblerze dosyĘ trudno pi-
EwaluacyjnÄ… wersjÄ™ pakietu firmy Raisonance
sze siÍ programy operujÄ…ce na adre-
prezentowanego w artykule zamieSciliSmy na
sach. Takie programy sÄ… po prostu
CD-EP8/2002B.
mało czytelne. W C nie ma z tym
Elektronika Praktyczna 9/2002
96


Wyszukiwarka

Podobne podstrony:
5 try 4?stract
podrecznik 4
baza 4
car cross com4
Thom?80553904765 oeb?4 r1
WL?4 L11 diag wir
e4
inf stos) 4
Z4
file4518
zagadki 4

więcej podobnych podstron