Dzisiejszy odcinek bêdzie doæ nietypowy.
Znacznie bardziej zwi¹zany ze sprzêtem ni¿
z samym C. Zobaczysz dzi, jak przenieæ
napisane do tej pory programy na now¹ plat-
formê sprzêtow¹. Poznamy tak¿e czêæ mo¿-
liwoci nowego procesora oraz zasadê jego
konfiguracji.
Fusy
Jeli do tej pory zajmowa³e siê jedynie, prze-
starza³ym ju¿, procesorem AT90S2313 nie
mia³e do czynienia z wieloma mo¿liwocia-
mi konfiguracji, jakie oferuj¹ nowsze modele
AVRów. Bardzo wa¿ne jest poznanie bitów
konfiguracyjnych dostêpnych w naszym uk³a-
dzie zwanych ¿artobliwie fusami (fuse
ang. bezpiecznik). Okazuje siê bowiem, ¿e
przy pozostawieniu ustawieñ fabrycznych
mo¿emy zostaæ nieprzyjemnie zaskoczeni
dzia³aniem naszego procesora.
Ustawianie dostêpnych bitów konfiguracji
omówiê na przyk³adzie programatora BAS-
COM (wersja 1.11.7.9). Program ten pozwala
na ustawienie konfiguracji w bardzo intuicyj-
ny sposób. Jednoczenie zdobyte w ten spo-
sób informacje pozostaj¹ aktualne niezale¿nie
od programu steruj¹cego programatorem.
Niestety autor rodowiska BASCOM nada³
bitom konfiguracyjnym w³asne nazwy,
w wiêkszoci niezgodne z nazwami propono-
wanymi przez ATMEL-a. Mo¿e wprowadziæ
to nieco zamieszania, tak wiêc dalej podam
oryginalne oznaczenia i przy opisie w³anie
ich bêdê siê trzyma³.
Uruchom rodowisko BASCOM. Pod³¹cz
p³ytkê do programatora i wybierz komendê
Program->Send to chip. Aby komenda by³a
aktywna, konieczne jest otwarcie dowolnego
pliku w edytorze. Nie przejmuj siê pojawiaj¹-
cymi siê ostrze¿eniami, chyba ¿e pojawi siê
informacja o niemo¿noci identyfikacji uk³a-
du wtedy konieczne mo¿e okazaæ siê spraw-
dzenie po³¹czeñ oraz skontrolowanie ustawie-
nia zworki LCDE. Po uruchomieniu progra-
matora przejd do ostatniej z dostêpnych
zak³adek: Lock and Fuse Bits. Okienko pro-
gramatora powinno wygl¹daæ podobnie do
tego z rysunku 35. Dla wygody, omawiane
bajty konfiguracyjne zosta³y oznaczone kolo-
rami wraz z przypisanymi im przyciskami
wysy³aj¹cymi nastawy do procesora. Dodat-
kowo na rysunku wprowadzi³em oznaczenia
stosowane przez firmê ATMEL.
Nie bêdziemy zajmowaæ siê teraz bitami
zabezpieczaj¹cymi program. Wymaga³oby to
omówienia mo¿liwoci procesora z zakresu
samoprogramowania, co wykracza poza ³amy
aktualnego odcinka. Tak wiêc sekcjê zielon¹
mo¿emy spokojnie od³o¿yæ do czasu zajêcia
siê pisaniem w³asnego bootloadera.
Sekcja oznaczona na niebiesko grupuje
bity dotycz¹ce wszystkiego co
zwi¹zane z taktowaniem uk³adu.
CKDIV8 zaprogramowanie tego
bitu powoduje podzia³ czêstotliwo-
ci taktuj¹cej procesor przez 8
w tym miejscu opis BASCOM-
owy jest nieprawid³owy. Co doæ
wa¿ne, nie jest to ustawienie
sztywne. Polega ono jedynie na
wpisaniu odpowiedniej wartoci do
rejestru CLKPR przy zerowaniu
uk³adu. Wartoæ tê mo¿na zmieniæ
programowo. Bit ma znaczenie jeli
procesor nie mo¿e dzia³aæ z pe³n¹
czêstotliwoci¹ zegara w warun-
kach, jakie zapewnia mu otoczenie
(na przyk³ad za niskie napiêcie zasi-
lania). Domylnie zaprogramowany.
CKOUT zaprogramowanie tego
bitu spowoduje wyprowadzenie na
PortB.0 zegara systemowego. Przydatne, jeli
w uk³adzie posiadamy zewnêtrzne peryferia,
które bêd¹ taktowane tym samym zegarem co
mikrokontroler. Domylnie niezaprogramo-
wany.
SUT1..0 ustala czas podnoszenia siê uk³a-
du po zerowniu oraz z trybów obni¿onego
poboru mocy. Opónienie jest konieczne ze
wzglêdu na koniecznoæ stabilizacji drgañ po
w³¹czeniu generatora. Dokumentacja przed-
stawia doæ z³o¿ony opis konfiguracji, co jest
zwi¹zane z tym, ¿e znaczenie tych bitów
zale¿ne jest od wybranego oscylatora.
W wiêkszoci wypadków bezpieczniki te nie
maj¹ dla nas znaczenia. Domylnie ustawione
na najbardziej bezpieczn¹ opcjê.
CKSEL4..0 wybór ród³a sygna³u zegaro-
wego. Domylnie praca z wewnêtrznym gene-
ratorem RC o czêstotliwoci 8MHz. Doku-
mentacja stwierdza doæ dobr¹ stabilnoæ jego
czêstotliwoci w dziedzinie napiêcia zasila-
nia. Gorzej sprawa ma siê w dziedzinie zmian
temperatury. W praktyce jednak uda³o mi siê
uzyskaæ stabiln¹ transmisjê z komputerem
poprzez port RS232 przy prêdkoci 38,4kbps,
przesy³aj¹c blok 32kB danych. Sprawd inne
dostêpne opcje w BASCOM-ie s¹ one opi-
sane doæ intuicyjnie.
Z dowiadczenia wiem, ¿e wiele osób
przesiadaj¹c siê z prostszych AVR-ów na
wiêkszych cz³onków rodziny zapomina,
¿e aby procesor pracowa³ z pod³¹czonym
z zewn¹trz oscylatorem, konieczne jest jego
w³¹czenie w tym w³anie miejscu.
OCD i JTAG w naszym przypadku intere-
sujemy siê tymi bitami na tyle, aby wy³¹czyæ,
domylnie w³¹czony, interfejs JTAG. Element
ten zajmuje górne linie adresowe magistrali
danych, uniemo¿liwiaj¹c nam prawid³ow¹
wspó³pracê z pamiêci¹ danych. Oba bity
zwi¹zane s¹ z debugowaniem aplikacji w sys-
temie za pomoc¹ interfejsu JTAG.
SPIEN bit ten umo¿liwia programowanie
w trybie, z którego najprawdopodobniej w³a-
nie korzystasz. Nie ma mo¿liwoci jego zmia-
ny z tego poziomu. Domylnie, oczywicie,
zaprogramowany.
WDTON w³¹czenie na sta³e zegara WDT.
Opcja przydatna tam, gdzie konieczna jest
du¿a niezawodnoæ dzia³ania systemu.
Domylnie niezaprogramowany.
EESAVE jego zaprogramowanie umo¿liwia
zachowanie danych pamiêci EEPROM pod-
czas czyszczenia pamiêci uk³adu przed pro-
gramowaniem. Domylnie dane s¹ tracone.
Uwaga: Bezpiecznik w stanie 0 to
bezpiecznik zaprogramowany. Bezpiecznik
ustawiony na 1 to bezpiecznik niezapro-
gramowany.
39
Programowanie
Elektronika dla Wszystkich
PP
PP
rr
rr
oo
oo
gg
gg
rr
rr
aa
aa
m
m
m
m
oo
oo
w
w
w
w
aa
aa
nn
nn
ii
ii
ee
ee
pp
pp
rr
rr
oo
oo
cc
cc
ee
ee
ss
ss
oo
oo
rr
rr
óó
óó
w
w
w
w
w
w
w
w
jj
jj
êê
êê
zz
zz
yy
yy
kk
kk
uu
uu
CC
CC
--
--
pp
pp
rr
rr
zz
zz
ee
ee
pp
pp
rr
rr
oo
oo
w
w
w
w
aa
aa
dd
dd
zz
zz
kk
kk
aa
aa
Rys. 35 Konfiguracja procesora
"$
Programowanie
Elektronika dla Wszystkich
BOOT... - dwie ostatnie pozycje, a trzy ostat-
nie bity, zwi¹zane s¹ z mo¿liwoci¹ samopro-
gramowania uk³adu. Zajmiemy siê nimi przy
okazji tworzenia w³asnego bootloadera.
M161C tryb kompatybilnoci z uk³adem
ATmega161, który zosta³ wycofany z pro-
dukcji. Tryb ten polega w praktyce na wy³¹-
czeniu niektórych z udogodnieñ nowszego
uk³adu. Zostawmy bit niezaprogramowany
(1).
BODLEVEL2..0 w³¹czenie uk³adu zerowa-
nia procesora przy zbyt niskim napiêciu zasi-
lania. Dostêpne s¹ cztery wartoci napiêcia,
przy którym uk³ad bêdzie zerowany: 1,8V;
2,3V; 2,7V; 4,3V. Domylnie uk³ad BOD jest
wy³¹czony. Polecam zmianê tego ustawienia.
W przypadku zegara do 8MHz zerowanie
powinno nastêpowaæ przy napiêciu zasilania
nie ni¿szym ni¿ 2,3V.
Fusy podsumowanie
Opis ten z koniecznoci by³ bardzo skrótowy.
Uzna³em jednak, ¿e chocia¿by pobie¿ne
zaznaczenie istnienia bitów konfiguruj¹cych
uk³ad oraz ich przeznaczenia pozwoli za-
oszczêdziæ pocz¹tkuj¹cym Czytelnikom do-
datkowych stresów w poszukiwaniu przyczy-
ny niedzia³ania uk³adu. Najczêstszym przy-
padkiem, z jakim siê spotka³em, by³a zwykle
niespodziewana czêstotliwoæ taktowania
zwi¹zana z pozostawieniem domylnego
ustawienia bitów CKSEL. Wydawaæ by siê
to mog³o zabawne, gdy to opisujê, jednak
jest to problem doæ trudny do wykrycia,
jeli nie wie siê, gdzie szukaæ procesor
przecie¿ dzia³a, do wszystkich rejestrów
wpisano trzykrotnie przeliczone wartoci,
pod³¹czony (fizycznie) kwarc ma dobr¹
wartoci... a w oknie terminala ci¹gle
zamiast ³adnego przywitania pojawiaj¹ siê
krzaki.
Dociekliwi Czytelnicy odnajd¹ dok³adne
informacje w dokumentacji procesora
ATmega162 i wierzê, ¿e powy¿szy opis u³at-
wi zadanie.
Przenoszenie programów
Zwracamy siê teraz prêdko ku tematom
znacznie bli¿szym C. Przeniesiemy dwa
ró¿ne, napisane do tej pory programy na nasz¹
now¹ p³ytkê. Pierwszym z nich bêdzie osta-
teczna wersja obs³ugi wywietlacza LED.
Drugim bêdzie napisana ostatnio obs³uga
przetwornika PCF8591. Specjalnie wybra³em
dwa skrajnie ró¿ne programy. Oto najwa¿niej-
sze ró¿nice, na które chcê zwróciæ uwagê:
1. Pierwszy z programów pos³uguje siê
wywietlaczem LED, drugi LCD.
2. W drugim programie wprowadzilimy
podzia³ na pliki pod wzglêdem zadañ
poszczególnych modu³ów.
3. Drugi program korzysta z elementu niedo-
stêpnego na nowej p³ytce. Poka¿emy, jak
w prosty sposób, ³¹cz¹c obie p³ytki, rozsze-
rzyæ mo¿liwoci naszego uk³adu.
Przenoszenie programu
LEDMulti
Program napisalimy w czêci 4 kursu. Jeli
przechowujesz na dysku poprzednie progra-
my, gor¹co polecam Ci wykonanie opisanych
zmian samodzielnie.
Po pierwsze, przyjrzyjmy siê ró¿nicy po³¹-
czeñ na obu p³ytkach. Przedstawia je tabela 4.
Domylasz siê ju¿, co na tej podstawie powin-
nimy zrobiæ? Jeli nie pamiêtasz ju¿, w jaki
sposób pisalimy program we wrzeniu, zer-
knij do kodu. Zwykle blisko pocz¹tku pliku
umieszczone by³y przypisania sta³ych symbo-
licznych odpowiednim wyprowadzeniom.
Jest to pierwszy punkt naszych zmian. Zmie-
niony fragment kodu przedstawia listing 47.
Jeli chodzi o zegar, mamy dwie mo¿liwo-
ci. Albo w³o¿ymy w p³ytkê taki sam rezonator
i uk³ad skonfigurujemy do pracy na zewnêtrz-
nym kwarcu, albo wykorzystamy wewnêtrzny
generator RC i program jako dostosujemy do
nowej, wiêkszej czêstotliwoci pracy (trzeci¹
mo¿liwoci¹ jest zupe³nie niezajmowanie siê
spraw¹ i pozwolenie, aby ca³y program dzia-
³a³ 2x szybciej ;). Ze wzglêdu na wiêksz¹
atrakcyjnoæ, z edukacyjnego punktu widze-
nia, zajmiemy siê drug¹ mo¿liwoci¹. Zrobi-
my to najprociej, jak siê da. Wewnêtrzny
generator pracuje z czêstotliwoci¹ 8MHz.
Jednak uk³ad ATmega162 zosta³ wyposa¿ony
w programowalny dzielnik czêstotliwoci
wybranego ród³a zegara. W³¹czmy go zaraz
na starcie programu. Pokazuje to listing 48.
Aby zabezpieczyæ rejestr CLKPR przed
przypadkow¹ zmian¹ wartoci, zapis do niego
wymaga specjalnej sekwencji dzia³añ. Naj-
pierw wpisujemy wartoæ, w której ustawiony
jest jedynie bit CLKPCE. Od tej chwili rejestr
mo¿na bêdzie zapisywaæ przez cztery nastê-
puj¹ce po sobie cykle maszynowe.
Nasz programik wykorzystuje timer0 do
obs³ugi przemiatania wywietlacza. Czy
mo¿emy zegar, o tym samym oznaczeniu,
wystêpuj¹cy w nowym procesorze, wykorzys-
taæ w podobny sposób? Zajrzyjmy do doku-
mentacji. Oba zegary s¹ omiobitowe. Okazu-
je siê, ¿e s¹ do siebie bardzo podobne. Naj-
lepszy obraz wystêpuj¹cych ró¿nic i podo-
bieñstw pokazuje rysunek 36. Widzimy na
nim rejestry steruj¹ce naszym licznikiem
w obu procesorach. Zauwa¿amy, ¿e rejestry
wystêpuj¹ce w procesorze ATmega162 s¹ nie-
jako rozwiniêciem tych z AT90S2313. Nazwy
Niezale¿nie od przenoszonego progra-
mu, w ka¿dym przypadku rozpoczynamy
od modyfikacji pliku makefile poprzez
przypisanie jak na obrazku, informuj¹c
kompilator o wybraniu innego procesora.
Fot. 2 Wykorzystanie uk³adu PCF8591 zawartego
na p³ytce AVT3500
Tabela 4 Przyporz¹dkowanie po³¹czeñ
na obu p³ytkach dla programu
LEDMulti
Listing 47 Zmienione definicje
wyprowadzeñ programu LEDMulti.
// Definicje wyprowadzeñ
#define LED_A 4
#define LED_B 3
#define LED_C 5
#define LED_D 2
#define LED_E 6
#define LED_F 0
#define LED_G 7
#define LED_DP 1
#define LEDPORT PORTB
#define LEDDDR DDRB
#define COM1 5
#define COM2 4
#define COM3 3
#define COM4 2
#define COMPORT PORTD
#define COMDDR DDRD
#define SWPORT PORTE
#define SWDDR DDRE
#define SWPIN PINE
#define SW1 0
#define SW2 2
Listing 48 W³¹czenie wewnêtrznego dzielnika czêstotli-
woci zegara procesora.
// Start
iinntt
main((
vvooiidd))
{{
// Dzielenie zegara
CLKPR ==
1
<<<<CLKPCE;;
CLKPR ==
1
<<<<CLKPS0;;
/////////////////////////////
// inicjacja
LEDDDR ==
0xff
;;
...
"%
Programowanie
Elektronika dla Wszystkich
interesuj¹cych bitów a nawet ich rozmiesz-
czenie s¹ identyczne. Znaczenie bitów
CS02..CS00 jest w obu uk³adach takie samo.
Okazje siê, ¿e pozostawiaj¹c niewystêpuj¹ce
w poprzednim uk³adzie bity wyzerowane,
uzyskamy licznik dzia³aj¹cy w praktycznie
identyczny sposób jak do tej pory. Bardzo nas
to cieszy, poniewa¿ oszczêdza nam dalszej
pracy. Program powinien daæ siê teraz skom-
pilowaæ i uruchomiæ. Pojawi siê jednak kilka
ostrze¿eñ. Nie jest to nic gronego i zaraz siê
nimi zajmiemy. Niezale¿nie od wystêpuj¹-
cych ostrze¿eñ program ju¿ dzia³a.
Trochê o sta³ych,
ich typach i obcinaniu
Nie bêdê dok³adnie opisywa³ wszystkich
mo¿liwoci typów sta³ych w programach C.
Teraz skupimy siê tylko na tym, dlaczego
nasz zmieniony program zacz¹³ nagle genero-
waæ ostrze¿enia.
Kompilator domylnie nadaje wszystkim
sta³ym typ ze znakiem o wielkoci najmniej-
szej, która jest w stanie pomieciæ podan¹
liczbê. Zauwa¿my, ¿e w p³ytce AVT3500 bit
7 portu B po³¹czony by³ z kropk¹ dziesiêtn¹,
co sprawi³o, ¿e nie by³ przez nas wykorzysty-
wany. Teraz sytuacja jest inna, co daje nam
mo¿liwoæ zwrócenia uwagi na pominiêty
poprzednio szczegó³. Ile wynosi liczba 1<<7?
Jest to 128. W zmiennej omiobitowej ze zna-
kiem mo¿emy zapisaæ wartoci z przedzia³u
-128..127. Tak wiêc jeli ustawiamy najstar-
szy bit (w³¹czamy segment G wywietlacza),
kompilator domylnie przypisuje danej sta³ej
typ szesnastobitowy. Sta³a ta ma wyzerowany
starszy bajt. Jednak ju¿ po chwili wszystkie
wyzerowane bity zmieniamy w jedynki za
pomoc¹ operatora negacji bitowej. Ostatecz-
nie, kompilator zauwa¿a, ¿e wpisujemy
sta³¹ szesnastobitow¹ do omiobitowej
zmiennej lub tablicy. Operacja taka zostanie
prawid³owo wykonana starsze bajty zostan¹
obciête. Jednak kompilator ostrze¿e nas lojal-
nie, ¿e tracimy czêæ informacji.
Ponownie, tak jak zrobilimy to w czêci 5,
aby nie pogubiæ siê w g¹szczu ostrze¿eñ, ozna-
czymy, ¿e wiemy, co robimy za pomoc¹ rzuto-
wania. Zapis przypominam na listingu 49,
jednoczenie wskazuj¹c miejsca modyfikacji.
Przenoszenie
programu PCF8591
Przy przenoszeniu ostatnio napisanego
programu na now¹ p³ytkê napotkamy
podstawowy problem: Nowy uk³ad nie
ma na pok³adzie przetwornika, dla które-
go program zosta³ napisany. Jednak
posiadacze AVT3500 mog¹ wykorzystaæ
zawarty na niej element. Wystarczy pod-
³¹czyæ now¹ p³ytkê do z³¹cza wyprowa-
dzaj¹cego interfejs I
2
C. Konieczne jest
tak¿e wyjêcie z podstawki procesora
AT90S2313 tak aby jego dzia³anie nie
zajmowa³o interfejsu. Po³¹czenie pokaza-
³em na fotografii 2. Nie zapomnij o odpo-
wiednim ustawieniu zworki LCDE na p³ytce
wykonawczej AVT3505. Po wykonaniu po³¹-
czenia zgodnie z fotografi¹ spójrzmy na
tabelkê 5. Przedstawia ona aktualne porów-
nanie przypisania koñcówek.
Skopiuj poprzedni¹ wersjê programu.
I rozpocznijmy jej modyfikacjê. Pamiêtaj
o zaznaczeniu zmiany procesora w pliku
m a k e f i l e .
N a s t ê p n i e
otwieramy
p l i k
h a r d d e f . h
i zaznacza-
my w nim
z m i a n y ,
jakie zasz³y,
z g o d n i e
z tabel¹ 5.
Zmodyfiko-
wany frag-
ment pliku pokazuje listing 50. Zauwa¿,
¿e dodana zosta³a definicja LCD_RW.
Dalej, tak jak poprzednio, podzielimy czês-
totliwoæ zegara przez 2. Dodatkowo jednak,
w funkcji main, konieczna jest modyfikacja
inicjacji portów. Jest to wa¿ne z dwóch powo-
dów. Po pierwsze, z wyprowadzeniami proce-
sora mamy teraz po³¹czone wyprowadzenie
RW wywietlacza, na którym musi znaleæ siê
stan niski, aby wywietlacz by³ widziany od
strony programowej, tak jak ten zainstalowa-
ny na poprzedniej p³ytce. Po drugie, musimy
pamiêtaæ, ¿e porty konfigurowalimy, operu-
j¹c bezporednio na ich nazwach. Wszystkie
zmiany funkcji main pokazuje listing 51.
W tym momencie program jest gotowy do
kompilacji oraz powinien dzia³aæ prawid³owo
na nowej p³ytce. Zmodyfikowane kody ród-
³owe oraz skompilowane programy, jak zwyk-
le, dostêpne s¹ na Elportalu.
Podsumowanie
W dzisiejszym, nietypowym odcinku, urucho-
milimy stare programy na nowym uk³adzie,
jednoczenie oswajaj¹c p³ytkê. Okaza³o siê,
¿e z pewnym uproszczeniem, procesor ATme-
ga162 mo¿na traktowaæ jako rozwiniêcie
AT90S2313, co oznacza w praktyce, ¿e mo¿e-
my uzyskaæ bardzo podobne dzia³anie jego
peryferii, po prostu nie ruszaj¹c dodatkowych,
pojawiaj¹cych siê bitów. Pokaza³em ogólnie,
jak dokonaæ modyfikacji programu, by dzia³a³
prawid³owo przy innej konfiguracji sprzêtu.
Bardzo wczenie zaczêlimy pisaæ programy
tak, aby ich prosta modyfikacja by³a mo¿liwa,
co dzisiaj przynios³o wymierne korzyci.
W najbli¿szym odcinku zajmiemy siê
funkcjami, które nie mog³y siê pomieciæ
w AT90S2313.
Rados³aw Koppel
radoslaw.koppel@elportal.pl
Rys. 36 Porównanie rejestrów steruj¹-
cych licznikiem T0 w obu proce-
sorach
Listing 49 Zabieg usuwaj¹cy ostrze¿enia
pojawiaj¹ce siê podczas kompilacji.
prog_uint8_t g_WzorCyfr[[
16
]] ==
{
~~((...)),,
// 0
~~((...)),,
// 1
((...))
vvooiidd
WyswietlDEC((uint16_t var))
{{
uint8_t n;;
iiff
((var >>
9999
))
{
ffoorr
((n==
0
;; n<<
4
;; n++++))
{
g_DaneWyswietlacza[[n]] ==
~~((
1
<<<<LED_G));;
}
rreettuurrnn
;;
}
((...))
((uint8_t))
((uint8_t))
((uint8_t))
Listing 50
Modyfikacja pliku harddef.h.
// Interfejs I2C
#define I2C_SDAPORT B
#define I2C_SDA 0
#define I2C_SCLPORT B
#define I2C_SCL 1
#define I2C_SPEED 100000
// Wywietlacz
#define LCD_RS 2
#define LCD_RSPORT D
#define LCD_E 4
#define LCD_EPORT D
#define LCD_RW 3
#define LCD_RWPORT D
Listing 51 Modyfikacja pliku harddef.h
iinntt
main((
vvooiidd
))
{{
// Dzielenie zegara przez 2
CLKPR ==
1
<<<<CLKPCE;;
CLKPR ==
1
<<<<CLKPS0;;
// Inicjacja
PORTB ==
1
<<<<I2C_SDA ||
1
<<<<I2C_SCL;;
PORTD == ~~((
1
<<<<LCD_E ||
1
<<<<LCD_RW));;
DDRD ==
1
<<<<LCD_E ||
1
<<<<LCD_RS ||
1
<<<<LCD_RW;;
DDRB ==
0x0F
<<<<LCD_D4 ||
1
<<<<I2C_SCL;;
lcd_init(());;
// Koniec inicjacji
((......))
Niech nie wprowadzi Ciê w b³¹d moje
okrelenie ju¿ po chwili. Pisz¹c to, mam
na myli kolejnoæ wykonywania operacji.
Procesor nic nie bêdzie oblicza³. W kodzie
pojawi siê tylko wynik ca³ego dzia³ania,
jako ¿e z³o¿one jest ono jedynie ze sta³ych.
Tabela 5 Przyporz¹dkowanie po³¹czeñ
na obu p³ytkach dla programu PCF8591