Listing 1S rozwinięty program obsługi wyświetlacza LED oraz klawiatury
Dziś, po wakacyjnej przerwie wracamy do poznawania naszego kompilatora C dla procesorów AVR. Do tej pory przeszliśmy przez zasady tworzenia prostych plików' makef.le oraz konfiguracji Programmers Notepada do wygodnej pracy. Do symulacji programów wykorzystaliśmy AVRStudio w wersji 4.11 (minimalnie 4.10). Przedstawiona została podstawowa składnia do wykorzystania dyrektywy /Altfinc, skrótowo omówiliśmy przeprowadzanie obliczeń, stosowanie zmiennych globalnych oraz pisanie do ponów, włącznie z dostępem do poszczególnych bitów Wreszcie w części ostatniej pojawił się opis najważniejszych plików nagłówkowych, przerwania, tworzenie funkcji, instrukcja If oraz sposób wykorzystania pamięci programu.
Po raz ostatni sięgniemy do prostego pro-giamu obsługi wyświetlacza multipleksowa-nego. Na tej podstawie chcę przedstawić Ci działanie dostępnych w C instrukcji pętli, wykorzystanie zmiennych lokalnych, propo-zycję obsługi przycisków oraz wykorzystanie przerwania wyświetlacza do dokładniejszego i jednocześnie mniej pamięciochłonnego generowania opóźnień niż wykorzystanie funkcji zawartych w pliku <avr\delay.h>.
Tym razem zmieniając nieco ideę, przedstawiani pełny kod źródłowy, a następnie wyjaśniam jego działanie. Na listingu 15 znajdziesz kod razem z dodatkowymi przypisami. Strategiczne miejsca oznaczyłem cyframi, do których będę się odwoływał w czasie opisu. Jak zwykle szare tło towarzyszy częściom programu, które nie zmieniły się od ostatniej wersji. Ze względu na oszczędność miejsca wy kropko walem jedynie dane inicjujące tablicę wzorów cyfr.
Zadaniem nowego programu jest zliczanie w górę lub w dól - w zależność od naciśniętego przycisku. Inaczej niż miało to miejsce do tej pory, wynik jest wyświetlany w postaci dziesiętnej. Odpowiada za to funkcja Wyświeil-DEC. Dodatkowo przytrzymanie danego przycisku rozpoczyna szybkie zliczanie. Zanim przystąpisz do czytania informacji na temat dokładnego działania poszczególnych części, proponuję zapoznanie się z ramkami ABC... C o pętlach, zmiennych lokalnych, słowach kluczowych static i volatile oraz o czytaniu z ponów. Dylem zmuszony umieścić
" ■ ““V - i 'v^rr
Mnclude <avr\sii łinęludc «ivr\lnt«rruft.h>
li ar lulu >' Rgncpic 4 . h>
// wefimcle wyprowadzeń
•d<-H ne irn_A n Idcńne ifDJi 1 ♦.Jf ■ ii*: ifD.C 2
*de’ine tto o 3
idR-ine LEQ_E 4 *dr ■ i a< lC0_f 5 #de‘ine t FO..G 6 ICD.DP 7
Usurtif t» dołączenie nagłówka
Idefłn# comI 4
•*!**' tnc C(JM4 J
i n* rnMKMT MMtm
adefine conooii ooro
Wcrine SWROrtT KiUTD •detine SwDOk DORO adctlne SWPIN pind Mcfine Swl 0
Udefine sw2 1 Q
Usunięta zmienna B_AktWy»wlattacx
volit11a ui.ntS t ^ »D. 1 »•/; //
Ulnta c Q 0«n«Ny«wr«clacłaCOł
pcog uint5_t o D«n*Coml,4] ■
uintl«_t g_Lictnik ■ 0}
// Funkcja wyświetlająca daną liczbę Cziesiętrie vo1d wyał.let.u*c(uintiD_t v»r)
ulnt8 t n;
1f</ar > 93 39)
for(n»0; n<4; n+O i
j_t*n«Wył«w1<»r I »n*A [n] m -(. ;
retirni
for(n»4; n>0; n-*)
JaneWysw;
?gtr r«ni . /- 10;
< , , © c_D4n«Mvjwi«tlaciafn-]l •
r«nd b>t«:Ag_WiorCyfr[YarXlC]):
»•« * "
// Start 1nt Mln(vo d)
nnumin/mmmin/fii
// -nicjacjł
ŁSD3DR - OxFf{
COMDDR - . «C011 \ l«COK2 | 1«C0#3 l«COM4J
// włączenie podciągania na wyprowadzeniach przycisków swport - lC<SWl | 1«SW2:
Tccao • :«csoi l :<cscoj timsk - 3«roiRo;
// Globalne zezwolenie na przerwania «•!();
// koni*( Uiclifjl
iinnuimniinnnmun
rj;:!
Wv*wiet.DEC(c Licznik):
if(l(sw?:N A T«ski))
usuwanie droaiS styków DDelay • 6; //Stos
/i
q bDelay . ..
wFOe(g ŁDelay 1-0) {}
i f (I CSKPIK & 1«SK1J) +ł-g_Licmifc;
<j bDelay • 120: //ls wfiile(!(SKPlN A 1«.1W1))
W^8wle:lCEC(o_Llczn:k):
Cg_b>elay—T))
q_bDalay ■ 6: //SOms ś% ++g Llczn.k; V/
if(l (SWPIN A 1«3M2))
// usuwanie drgań styków g bDalay ■ 6j //SOms wlil 1e(g_bD«l*y l« 0) {] ..... ’ ‘ «8M»
1f(l(SWPZ»< A 1«BW2]
-*g_Lic«nlk5 <j bDelay - 120 i //I# wFile(l(S4PIN i 1«SK2))
Wyautet1DCC(g Łtoanik); i f (q_bDel»y"wTi)
g_bDal*y - l»; //S0m‘, ^ --g_Llcanik;
\
// Obsługa przerwali
3IGNAŁ(SIQ_OVERPLCWO)
statlc Un-.8 t Akt4yflv»i*tJ.»cz - QjJ».
// wpisanie da licznika po / - -w
TCMTO - 121;
// wyjaszenie wyświetlaczy
CGMPÓ&T |- L«C0M1 I l«C0*2 | <CON3 | l«COH»J // wycłania odpcwiednlet dane)
LBDPOZT - 9 Can«Wyswletlacie[AktWy>wletl«ci]5 // włąc zen e Mpoweckiitno wyświetlacza
Crew»T Iw p-y"_ i«*d_byt• (A|_ !ua«C 3«£*ti t.Wy««i«t. l«o»J ) ; // Zwiększenie stanu zmiennej wskazujące] na obsługiwany wyświetlacz 4-tiktWyawUelnet;
1f(AkiNyaw:otlac< > ))
// Zmienna zatwihieeająra n epsereeknenu kopiowań , zmiennej o-boeiar (typ yjlatile!)
ulj,te_t cjolay;
AlctWylulatUrt ■ 0; fSf
// Obsługa opóźnień w
dolny - g_6Dolny; if(dolny > 0)
--dcłnyi
^ 0_bDolay - dolny:
wspomniane ramki na kolejnych stronach, mam nadzieję, że nie utrudni to czytania.
Omawianie programu rozpoczniemy od tytułowej funkcji. Ze wzgiędu na ilość obliczeń, a więc i zajętość pamięci, dobrym sposobem przetworzenia liczby zapisanej w kodzie dwójkowym na kolejne cyfry liczby dziesiętnej jest wydobywanie po kolei każdej ostatniej cyfry za pomocą reszty z dzielenia przez 10. Po wydobyciu każdej kolejnej cyfry liczba jest przesuwana o jedną pozycję w prawo. Uzyskujemy więc cyfry wf kolejności od
ostatniej do pierwszej. Poglądowo przedstawia to rysunek 24. Na listingu 15 właściwe przetwarzanie zostało umieszczóne w pętli oznaczonej numerkiem 0. Pętla została zbudowana w taki sposób, aby przerwanie następowało w chwili, gdy zmienna przyjmie wartość 0. Dlaczego została wybrana taka wartość, o tym dalej. Jednak sprawia to, że zmienna n przyjmuje wartości 4, 3, 2, 1. Natomiast dopuszczalne indeksy tablicy wyświetlacza mieszczą się w zakresie 0-3. Oczywiste jest, że możemy dokonać odpowiedniej zamiany przez odjęcie 1. Czy nie zwiększy to rozmiaru kodu? Co ciekawe:
38 Wrzesień2005 Elektronika dla Wszystkich