kursC czesc006a przeprowadzka

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


Wyszukiwarka

Podobne podstrony:
kursC czesc007
kursC czesc006
kursC czesc001
kursC czesc003
kursC czesc000 programowanie
kursC czesc018
kursC czesc008
kursC czesc002
kursC czesc013
kursC czesc011
kursC czesc010
kursC czesc007
kursC czesc018

więcej podobnych podstron