background image

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¿-

liwoœci  nowego  procesora  oraz  zasadê  jego

konfiguracji.

Fusy

Jeœli do tej pory zajmowa³eœ siê jedynie, prze-

starza³ym ju¿, procesorem AT90S2313 – nie

mia³eœ do czynienia z wieloma mo¿liwoœcia-

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. Jednoczeœnie 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êkszoœci 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³aœnie

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¿noœci 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¿liwoœci  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 wartoœci do

rejestru  CLKPR przy  zerowaniu

uk³adu.  Wartoœæ  tê  mo¿na  zmieniæ

programowo. Bit ma znaczenie jeœli

procesor  nie  mo¿e  dzia³aæ  z  pe³n¹

czêstotliwoœci¹  zegara  w  warun-

kach, jakie zapewnia mu otoczenie

(na przyk³ad za niskie napiêcie zasi-

lania). Domyœlnie zaprogramowany.

CKOUT  – zaprogramowanie  tego

bitu spowoduje wyprowadzenie na

PortB.0 zegara systemowego. Przydatne, jeœli

w  uk³adzie  posiadamy  zewnêtrzne  peryferia,

które bêd¹ taktowane tym samym zegarem co

mikrokontroler.  Domyœlnie  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êkszoœci wypadków bezpieczniki te nie

maj¹ dla nas znaczenia. Domyœlnie ustawione

na najbardziej bezpieczn¹ opcjê.

CKSEL4..0 – wybór Ÿród³a sygna³u zegaro-

wego. Domyœlnie praca z wewnêtrznym gene-

ratorem  RC  o  czêstotliwoœci  8MHz.  Doku-

mentacja stwierdza doœæ dobr¹ stabilnoœæ jego

czêstotliwoœci  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êdkoœci 38,4kbps,

przesy³aj¹c blok 32kB danych. SprawdŸ inne

dostêpne opcje – w BASCOM-ie s¹ one opi-

sane doœæ intuicyjnie. 

Z  doœwiadczenia  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³aœnie miejscu.

OCD i JTAG – w naszym przypadku intere-

sujemy siê tymi bitami na tyle, aby wy³¹czyæ,

domyœlnie 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¿liwoœci jego zmia-

ny  z  tego  poziomu.  Domyœlnie,  oczywiœcie,

zaprogramowany.

WDTON – w³¹czenie na sta³e zegara WDT.

Opcja  przydatna  tam,  gdzie  konieczna  jest

du¿a  niezawodnoœæ  dzia³ania  systemu.

Domyœlnie niezaprogramowany.

EESAVE – jego zaprogramowanie umo¿liwia

zachowanie  danych  pamiêci  EEPROM  pod-

czas  czyszczenia  pamiêci  uk³adu  przed  pro-

gramowaniem. Domyœlnie 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

background image

"$

Programowanie

Elektronika dla Wszystkich

BOOT... - dwie ostatnie pozycje, a trzy ostat-

nie bity, zwi¹zane s¹ z mo¿liwoœci¹ samopro-

gramowania uk³adu. Zajmiemy siê nimi przy

okazji tworzenia w³asnego bootloadera.

M161C  – tryb  kompatybilnoœci  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  wartoœci  napiêcia,

przy  którym  uk³ad  bêdzie  zerowany:  1,8V;

2,3V; 2,7V; 4,3V. Domyœlnie 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 koniecznoœci 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  domyœlnego

ustawienia bitów CKSEL. Wydawaæ by siê

to  mog³o  zabawne,  gdy  to  opisujê,  jednak

jest  to  problem  doœæ  trudny  do  wykrycia,

jeœli  nie  wie  siê,  gdzie  szukaæ  –  procesor

przecie¿  dzia³a,  do  wszystkich  rejestrów

wpisano  trzykrotnie  przeliczone  wartoœci,

pod³¹czony  (fizycznie)  kwarc  ma  dobr¹

wartoœci...  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  wyœwietlacza  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ê

wyœwietlaczem LED, drugi LCD.

2. W  drugim  programie  wprowadziliœmy

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¿liwoœci naszego uk³adu.

Przenoszenie programu 

LEDMulti

Program napisaliœmy w czêœci 4 kursu. Jeœli

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.

Domyœlasz siê ju¿, co na tej podstawie powin-

niœmy zrobiæ? Jeœli nie pamiêtasz ju¿, w jaki

sposób pisaliœmy program we wrzeœniu, 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.

Jeœli 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êstotliwoœci pracy (trzeci¹

mo¿liwoœci¹ 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¿liwoœci¹. Zrobi-

my  to  najproœciej,  jak  siê  da.  Wewnêtrzny

generator  pracuje  z  czêstotliwoœci¹  8MHz.

Jednak uk³ad ATmega162 zosta³ wyposa¿ony

w  programowalny  dzielnik  czêstotliwoœci

wybranego Ÿród³a zegara. W³¹czmy go zaraz

na  starcie  programu.  Pokazuje  to  listing  48.

Aby  zabezpieczyæ  rejestr  CLKPR  przed 

przypadkow¹ zmian¹ wartoœci, 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  wyœwietlacza.  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¹ oœmiobitowe. 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-

woœci zegara procesora.

// Start

iinntt

main((

vvooiidd))

{{

// Dzielenie zegara

CLKPR ==

1

<<<<CLKPCE;;

CLKPR ==

1

<<<<CLKPS0;;

/////////////////////////////

// inicjacja

LEDDDR ==

0xff

;;

...

background image

"%

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 groŸnego 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¿liwoœci  typów  sta³ych  w  programach  C.

Teraz  skupimy  siê  tylko  na  tym,  dlaczego

nasz zmieniony program zacz¹³ nagle genero-

waæ ostrze¿enia.

Kompilator  domyœlnie  nadaje  wszystkim

sta³ym typ ze znakiem o wielkoœci najmniej-

szej,  która  jest  w  stanie  pomieœciæ  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 oœmiobitowej ze zna-

kiem  mo¿emy  zapisaæ  wartoœci  z  przedzia³u 

-128..127.  Tak  wiêc  jeœli  ustawiamy  najstar-

szy bit (w³¹czamy segment G wyœwietlacza),

kompilator domyœlnie 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  oœmiobitowej

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 zrobiliœmy 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,

jednoczeœnie 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 wyœwietlacza, na którym musi znaleŸæ siê

stan niski, aby wyœwietlacz by³ widziany od

strony programowej, tak jak ten zainstalowa-

ny na poprzedniej p³ytce. Po drugie, musimy

pamiêtaæ, ¿e porty konfigurowaliœmy, operu-

j¹c bezpoœrednio 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-

miliœmy  stare  programy  na  nowym  uk³adzie,

jednoczeœnie  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  wczeœnie  zaczêliœmy  pisaæ  programy

tak, aby ich prosta modyfikacja by³a mo¿liwa,

co dzisiaj przynios³o wymierne korzyœci.

W  najbli¿szym  odcinku  zajmiemy  siê

funkcjami,  które  nie  mog³y  siê  pomieœciæ 

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

// Wyœwietlacz

#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

okreœlenie „ju¿ po chwili”. Pisz¹c to, mam

na myœli 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