You are on page 1of 40

Dìjiny pøenosu

Z dìjin vìdyzpráv
ana dálku
techniky
ROÈNÍK XI/2006. ÈÍSLO 5
Vìda a mìøení teploty
René Antoine Ferchault dnešních historikù má jeho mnoha-
svazkové dílo Popis umìní a øemesel.
de Réaumur Réaumur u svého teplomìru pro
ROÈNÍK LV/2006. ÈÍSLO 5 nulu zvolil teplotu tajícího ledu a druhým
Byl to Francouz jen o tøi roky starší
pevným bodem byla teplota vaøící vody.
než Fahrenheit, který se narodil v La
Stupnici mezi tìmito dvìma body roz-
Rochelle 28 února 1683. Studoval na
dìlil na 80 dílkù. Tento teplomìr se
V TOMTO SEŠITÌ jezuitské koleji v Poitiers a v roce 1699
v Evropì - hlavnì v Nìmecku a ve
pøešel do Bourges, kde studoval nepøí-
Francii (ale i u nás) znaènì rozšíøil pro
liš související obory: civilní právo a ma-
bìžné používání v domácnostech. Ješ-
Z dìjin vìdy a techniky ...................... 1 tematiku. Následnì se pak v Paøíži vì- tì pøed 2. svìtovou válkou se u nás
noval studiu matematiky a fyziky a již bìžnì prodávaly teplomìry se dvìma
PROGRAMOVÁNÍ A APLIKACE jako 24letý se stal èlenem francouzské stupnicemi - celsiovou po jedné stranì
Akademie vìd. a „reomírovou“, jak se jí øíkalo, po druhé
MIKROØADIÈE ATtiny2313
Nepìstoval vìdu pro vìdu, spíše stranì rtuového èi lihového sloupce.
Úvod ................................................. 3 se vìnoval využití vìdeckých poznatkù Souèasné bìžnì užívané teplomìry
1. Základní HW a SW vybavení ......... 3 v praxi. Doporuèil napø. zmìny výrobní- u nás užívají stupnici, kterou navrhl
ho postupu pøi výrobì zrcadel a zdoko- švédský astronom Anders Celsius, kte-
2. První pokusy s LED ....................... 7 nalil postup výroby oceli, za což získal rý vzal jako výchozí body teplotu vaøící
3. Tlaèítka a jejich obsluha .............. 14 velmi solidní rentu, kterou však celou vody, tu oznaèil nulou, druhým pevným
4. Pøerušení a režimy snížené vìnoval Akademii na další práce pro bodem byla teplota tajícího ledu, a inter-
spotøeby ...................................... 17 aplikace vìdy pro prùmysl. Kolem roku val mezi nimi rozdìlil na 100 stejných
1730 se vìnoval hlavnì meteorologii a dílù. Navrhl to v dopise Švédské akade-
5. 8bitový èítaè/èasovaè 0 ............... 21
roku 1731 navrhl svùj teplomìr. V roce mii vìd v roce 1742. Že se již jednalo
6. 16bitový èítaè/èasovaè 1 ............. 24 1735 se dal do služeb armády jako o velmi precizní rozvahu, lze konstato-
7. Použití piezomìnièe .................... 30 velitel a proviantní zásobovaè posádky vat také z toho, že již definoval tyto
8. LCD displej a jeho použití ............ 34 v Saint Louis. Bydlel v okolí a pøi jedné pevné body pøi „normálním“ atmosféric-
ze svých projíždìk na koni utrpìl pøi kém tlaku (s mìnícím se tlakem se
Literatura ........................................ 40 pádu úraz, na jehož následky nakonec také mìní bod varu).
Závìr .............................................. 40 zemøel 17. øíjna 1757.
V posledních letech intenzivnì pub-
likoval a Akademii odkázal bohatou Anders Celsius
KONSTRUKÈNÍ ELEKTRONIKA A RADIO sbírku svých poznámek. Závažné dílo Narodil se 27. 11. 1701 v Uppsale.
je l’histoire des Insectes vìnované Již jeho prarodièe pøednášeli na univer-
Vydavatel: AMARO spol. s r. o.
Redakce: Zborovská 27, 150 00 Praha 5, hmyzu, zkoumal také korály a zdù- zitì v Uppsale a jeho otec Nils Celsius
tel.: 2 57 31 73 11, tel./fax: 2 57 31 73 10. vodnil, že se jedná o živoèichy a nikoliv byl rovnìž profesorem astronomie.
Šéfredaktor ing. Josef Kellner, sekretáøka re- o rostliny, jak se tehdy všeobecnì sou- Sám v letech 1730 až 1744 pøednášel
dakce Eva Marková, tel. 2 57 31 73 14. dilo. Velký význam také z hlediska
Roènì vychází 6 èísel. Cena výtisku 36 Kè.
astronomii, i když byl velmi talentova-
Rozšiøuje PNS a. s., Transpress spol. s r. o., ným matematikem. Od roku 1725 byl
Mediaprint & Kapa a soukromí distributoøi. sekretáøem nejstarší švédské vìdecké
Pøedplatné v ÈR zajišuje Amaro spol. s r. o. spoleènosti s názvem Královská spo-
- Michaela Hrdlièková, Hana Merglová (Zborovská leènost vìd a v této funkci setrval až do
27, 150 00 Praha 5, tel./fax: 2 57 31 73 13, 2 57
31 73 12. Distribuci pro pøedplatitele také pro- své smrti. Nìjaký èas vìdecky pracoval
vádí v zastoupení vydavatele spoleènost Media- i na observatoøích v Nìmecku, v Itálii a
servis s. r. o., Abocentrum, Moravské námìstí ve Francii. V roce 1736 se zúèastnil ex-
12D, P. O. BOX 351, 659 51 Brno; tel: 5 4123
3232; fax: 5 4161 6160; abocentrum@mediaser- pedice na severní výbìžek Švédska,
vis.cz; reklamace - tel.: 800 800 890. která mìøením potvrdila, že má zemì
Objednávky a predplatné v Slovenskej repub- tvar elipsoidu, a úèastnil se též mìøení
like vybavuje MAGNET-PRESS Slovakia s. r. o.,
Šustekova 8, 851 04 Bratislava, pro zmapování švédského území. Se
tel.: 00421 2 / 6720 1931 - 33 svým asistentem odvodili, že aurorální
email: predplatne@press.sk ; www.press.sk efekty souvisejí se zmìnami magnetic-
Podávání novinových zásilek povoleno Èeskou kého pole. Vìnoval se i publikacím pro
poštou - øeditelstvím OZ Praha (è.j. nov 6005/96
ze dne 9. 1. 1996). mládež a vehementnì propagoval za-
Inzerci v ÈR pøijímá redakce, Zborovská 27, vedení Gregoriánského kalendáøe ve
150 00 Praha 5, tel.: 2 57 31 73 11, tel./fax: Švédsku, což se podaøilo až po jeho
2 57 31 73 10.
Inzerci v SR vyøizuje MAGNET-PRESS Slovakia smrti v roce 1753.
s. r. o., Šustekova 8, 851 04 Bratislava, Zemøel 25. 4. 1744 v Uppsale na tu-
tel.: 00421 2 / 6720 1931 - 33 ; www.press.sk berkulózu. Dnes mimo celsiovy stupni-
Za pùvodnost a správnost pøíspìvkù odpovídá autor ce na teplomìrech je po nìm pojmeno-
(platí i pro inzerci). Nevyžádané rukopisy nevracíme. ván jeden kráter na mìsíci.
http://www.aradio.cz; E-mail: pe@aradio.cz Celsiova „obrácenᓠstupnice (viz
ISSN 1211-3557, MK ÈR E 7443
Titulní list Réaumurovy knihy pøedchozí kapitola o Réaumurovi) však
© AMARO spol. s r. o. „Popis umìní a øemesel“ z roku 1761 nebyla pøíliš praktická, a proto ji do

Konstrukèní elektronika A Radio - 5/2006 1


mìøí ve Fahrenheitech. V Anglii je ofici- Pak objevil metodu zkapalòování
ální jednotkou stupeò Celsia, jen starší plynù pomocí speciálního pístového ex-
lidé stále používají teplomìry se stupni- pandéru, støídavým stlaèováním, ochla-
cí Fahrenheita a teplota pøi zprávách zováním a expanzí, touto metodou bylo
o poèasí se udává v obou stupnicích. možné zkapalòovat plyny s vysokou
Pøevodní vzorce pro výpoèet teploty ϑ úèinností a bylo jí využito hlavnì v dobì
mezi stupni Fahrenheita a Celsia jsou: války pøi zkapalòování kyslíku v rus-
kém metalurgickém prùmyslu. Za vál-
ϑ [°C] = (5/9)· ϑ [°F] - 32 ky pak pracoval na výzkumu dùleži-
ϑ [°F] = (9/5)· ϑ [°C] + 32 tém pro ruský váleèný prùmysl a proto
byl v roce 1945 vyznamenán nejvyšším
obèanským vyznamenáním - Hrdina
Pjotr Leonidoviè Kapica socialistické práce.
(Pierre Kapitza) V listopadu 1945 však upadl do ne-
milosti, když odmítl spolupracovat na
Tento významný ruský vìdec se vývoji ruské atomové bomby. Kupodivu
narodil 8. èervence 1894 v Kronštadtu, jej za to neèekala poprava, jako nìkte-
kde jeho otec pracoval jako vojenský in- ré další kolegy, ani vyhoštìní na Sibiø,
ženýr. Vystudoval petrohradský Poly- ale dokonce pomáhal dalším vìdcùm
technický institut a v letech 1918 až (Landau, Fock), aby se dostali z vìzení,
1921 tam pracoval jako asistent na ka- kde by je èekala témìø jistá smrt. Po-
Titulní list Celsiovy knihy o pozorování tedøe elektromechaniky. Hned po do- stihlo jej pouze odvolání ze všech funk-
polární záøe (1716 až 1732), studování se také oženil a zplodil dva cí a domácí vìzení - nesmìl opustit mís-
vydané v roce 1733 v Norimberku syny, oba však i s jeho ženou zemøeli to, kde mìl své letní sídlo. Vìnoval se
pøi velké chøipkové epidemii. tam alespoò problematice vzniku kulo-
dnešní podoby po jeho smrti navrhl Kapica po jejich smrti v roce 1921 vých bleskù, výzkumu plazmatu a elek-
zmìnit další švédský vìdec, botanik odejel do Anglie, zaèal pracovat ve trických množství s vysokou energií.
Carl Linné (1707 až 1778). Ten si ze známé Cavendishovì laboratoøi (viz Teprve po smrti Stalina a uvìznìní
svých cest pøivezl do Švédska fahren- KE2/2003) pod vedením Ernsta Ruthe- Beriji se mohl v roce 1955 vrátit na své
heitùv teplomìr, ovšem jeho dìlení ne- forda a v roce 1924 se stal øeditelem pùvodní místo øeditele Institutu fyzikál-
považoval za praktické, a body, které výzkumu v oblasti silných magnetic- ních problémù, které musel násilnì
vzal za základ Celsius, uznal daleko kých polí. V dobì svého anglického pù- opustit. Po návratu se již nevìnoval
vhodnìjšími. Ovšem to, aby stoupající sobení se podepisoval jako Pierre Ka- rozpracovaným problémùm svého pù-
teplota byla oznaèována stále nižšími pitza. Roku 1924 také navrhl speciální vodního výzkumu, nýbrž pokraèoval ve
èísly, také nepovažoval za praktické. pøístroj, který dokázal vytvoøit magnetic- výzkumu plazmatu, pracoval v rùzných
Myšlenku „obrácené“ Celsiovy stupnice ké pole o síle pùl milionu Gaussù, což ekologických spoleènostech (zasloužil
navrhli pozdìji i další vìdci, takže se se podaøilo pøekonat teprve za více než se napø. o to, že jezero Bajkal pøestalo
málem zapomnìlo, že je to pùvodnì 30 let, v roce 1956! Zkoumal pak, jak se být intenzivnì zneèišováno) a v míro-
Linného myšlenka. Obrácenou stupnici v silném magnetickém poli chovají rùzné vých hnutích.
zaèali používat v první øadì meteorolo- kovy, a v roce 1928 objevil tzv. Kapicùv Zaèal se také zajímat o speciální
gové a oznaèovali ji zprvu jako „Celsius zákon, který popisuje zmìny jejich od- mikrovlnné generátory a na téma øíze-
Novum“. Teprve potom se zaèaly teplo- poru v mìnícím se magnetickém poli. né termonukleární fúze publikoval v 70.
mìry s jeho dìlením více uplatòovat. V roce 1925 se stal èlenem Trinity letech øadu prací. V roce 1978 se stal
Samotné dìlení teplotní stupnice na College v Cambridge a roku 1927 se spolu s dalšími dvìma vìdci nositelem
100 dílù vyvolalo dodateènì problémy, znovu oženil s Ruskou, se kterou mìl Nobelovy ceny za fyziku za práce sou-
když se obecnì zaèala pøedpona centi pozdìji další dva syny. Roku 1929 byl visející s fyzikou nízkých teplot.
užívat pro setiny fyzikálních jednotek. zvolen do anglické Královské spoleè- Až do své smrti v Moskvì 8. 4. 1984
Celsiova stupnice ovšem v prvopoèát- nosti (Royal Society). Ta pro nìj zøídi- stál v èele Institutu.
ku skuteènì mìla jeden krok (schod) la Mondovu laboratoø a Kapica se stal QX
- grad, a jednotlivé dílky se nazývaly v roce 1933 jejím øeditelem. Tam zkou-
centigrady. Teprve pozdìji se centigrad mal vlastnosti tekutého helia a vrhl se
nahradil kratším grad ve významu stu- do zkoumání fyziky nízkých teplot všeo-
peò a teprve od roku 1948 se jednotka becnì, na tomto poli pak publikoval
„degree Centigrade“ zaèala obecnì na- øadu nových poznatkù.
zývat stupnìm Celsia (u nás to bylo již Kapica se však po celou dobu své-
dávno pøed tím). ho pobytu v Anglii nevzdal ruského ob-
Definice Celsiovy stupnice byla èanství a do Ruska také èasto zajíždìl.
v dobì nedávné ještì zmìnìna. Od Pøi jedné ze svých cest v roce 1934,
roku 1954 je vzata jako etalon stupnice pøestože mu bylo pøedem pøislíbeno,
Kelvina a 0 °C je stanoveno na 273,15 K. že se mùže do Anglie svobodnì vrátit,
Komplikace ale pøetrvávaly. V metric- mu byl na Stalinùv pøíkaz odebrán
kém systému platí, že setina se ozna- cestovní pas, a tak byl pøinucen zùstat
èuje pøedponou centi. U teploty si v Rusku. Byl jmenován øeditelem mos-
ovšem „centiKelviny“ nikdo netroufl po- kevského Institutu fyzikálních problémù
užívat. Nakonec se vìdci dohodli, že pøi Akademii vìd a tam pokraèoval v prá-
základním intervalem teplotní stupnice ci, kterou zapoèal v Anglii. Stal se také
bude kelvin - psáno s malým k, a jako profesorem na moskevské univerzitì. Titulní list Kapicovy knihy „Elektronika
symbol se bude používat K bez ozna- Od roku 1937 se intenzivnì vìnoval bolšich mošènostìj“ z roku 1962
èení stupòù. Teplotní interval celsio- zkoumání helia II, což je zvláštní sku-
vy stupnice jsou nadále stupnì Cel- penství tohoto zkapalnìného plynu pøi Literatura
sia a teplota mrznoucí vody pøi tlaku teplotách -271 °C a nižších. Pøi jednom [1] Kapica, P. L.: Experiment, teorija, prak-
1 atmosféry je v metrickém systému z pokusù zpozoroval, že když otevøe tika. Nauka, Moskva 1987.
273,15 kelvinù. nádobu s tekutým heliem, to zaène „vy- [2] Kapica, P. L.: Elektronika bolšich mošè-
V souèasné dobì se teplota mìøí na tékat“ po stìnì vzhùru - molekuly helia nostìj. Izdatìlstvo AN SSSR, Moskva 1962.
stupnì Celsia po celém svìtì, vyjma ztrácejí vlastnost tøení a helium nabývá [3] Kedrov, F.: Kapica: Žizò i otkryja. Mos-
Spojených státù a Jamaiky, kde se stále novou vlastnost - supratekutost. kovskij raboèij, Moskva 1984.

2 Konstrukèní elektronika A Radio - 5/2006


PROGRAMOVÁNÍ
A APLIKACE
MIKROØADIÈE ATtiny2313
Ing. David Matoušek

Tento èlánek je urèen všem, kteøí chtìjí rychle proniknout do „tajù“ programování mikroøadièù
ATMEL AVR. Pro praktické testy je použit typ ATtiny2313.
Text je sestaven bez složitých teoretických úvodù. Proto v nìm najdete pøedevším podrobnì komen-
tované pøíklady. Postup jejich realizace je vyložen do co nejmenších detailù tak, aby je velmi dobøe po-
chopil i zaèáteèník a nemusel pøitom hledat vysvìtlení v další literatuøe.
Vzhledem k rozsahu je v tomto èísle èasopisu uvedena pouze první èást. Druhá èást bude uveøej-
nìna v KE 1/2007.

Úvod Osmá kapitola je vìnována použití


dvouøádkového LCD displeje (pøípravek
Druhý díl pøinese informace o ana-
logovém komparátoru, jednotkách US-
ATLCDTX2). Kromì základního pøíkladu ART, USI a o zbývajících vlastnostech
První kapitola uvádí základní vlast- (vypsání textu na displeji) je ukázána mikroøadièe ATtiny2313. Dále bude pøi-
nosti mikroøadièe ATtiny2313 a popisu- realizace èasovaného vypínání výkono- pojen komentovaný výklad instrukcí a
je konstrukci levného vývojového kitu
vých spotøebièù (èas do vypnutí lze pøe- popis pøevodníku USB<=>COM a USB
SDK2313, který se ovládá sériovým
hlednì sledovat na LCD displeji). programátoru ATtiny2313.
portem poèítaèe PC.
Ve druhé kapitole jsou uvedeny zá-
kladní vlastnosti portù B a D na pøíkla-
dech ovládání skupiny osmi LED (jedná
se o pøípravek AT8LED). Kromì toho
1. Základní hardwarové a
je ètenáø seznámen s obsluhou vývojo-
vého prostøedí AVR Studio a použitím softwarové vybavení
programu SDK2313.EXE, kterým se
øídí vývojový kit SDK2313. V první kapitole budou ètenáøi 20 miliónù instrukcí za sekundu; tedy vy-
Tøetí kapitola ukazuje obsluhu tla-
seznámeni se samotným mikroøa- konání jedné instrukce trvá 50 ns),
èítek (pøípravek ATSW). Jedná se jak
dièem ATtiny2313 a vývojovým ki- • instrukèní soubor obsahuje 120 in-
o tlaèítka, která mají ošetøeny zákmity
tem SDK2313, které jsou používány strukcí (k dispozici jsou aritmetické a
hardwarovì, tak i o tlaèítka bez ošetøení
v tomto èlánku. logické instrukce, instrukce pro pøesu-
zákmitù (odstranìní zákmitù musí být
provedeno programovì). ny dat a další),
Ètvrtá kapitola vysvìtluje pojem 1.1. ATtiny2313 • pamì programu a dat je oddìlena
pøerušení a jsou v ní také popsány re- (tzv. Harvardská architektura), toto øeše-
žimy snížené spotøeby. Uvedený pøí- se pøedstavuje ní zjednodušuje konstrukci mikroøadièe
klad ukazuje, jak pomocí vstupu vnìjší- a dovoluje tak zvýšit i jeho rychlost,
ho pøerušení realizovat zapnutí/vypnutí Nejdøíve je tøeba uvést a hlavnì vy-
mikroøadièe jediným tlaèítkem. svìtlit základní vlastnosti mikroøadièe • programová pamì Flash má kapa-
Pátá kapitola popisuje vlastnosti ATtiny2313. citu 2048 bajtù (spíše se však udává
jednoduchého 8bitového èítaèe/èaso- kapacita ve slovech - dvojbajtech, pro
vaèe 0. Na prvním pøíkladu je ukázáno Základní vlastnosti tento pøípad je kapacita 1024 slov; vìt-
použití režimu èítaèe pro poèítání im- šina instrukcí zabírá právì jedno slovo
pulsù generovaných tlaèítkem (lze • nízká cena okolo 50 Kè, a tak lze øíci, že program mùže obsa-
použít i pro poèítání impulsù jiného sig- • malý pøíkon, hovat až 1024 instrukcí),
nálu). Druhý pøíklad ukazuje požití 8bi- • 8bitová aritmetika (pøímo je scho- • datová pamì RAM má kapacitu
tového PWM. pen pracovat s èísly v rozsahu 8 bitù: 128 bajtù (umožòuje tedy uložit až
Šestá kapitola popisuje vlastnosti tedy 0 až 255; pomocí speciálních pod- 128 promìnných o šíøce jednoho bajtu),
dokonalejšího 16bitového èítaèe/èa- programù lze šíøku zpracovávaných èí-
sovaèe 1. Na pøíkladech je ukázáno • k dispozici je i datová E2PROM o ka-
sel zvýšit), pacitì 128 bajtù (jedná se o pamì,
použití režimu èasovaèe, jednotky Out-
put Compare a PWM generátoru. • výkonná architektura AVR RISC která po vypnutí napájení udrží zapsané
Sedmá kapitola ukazuje, jak použí- (redukovaný instrukèní soubor vede informace; informace z datové pamìti
vat piezomìniè. Pøíklady pøedvádí ge- na jednodušší dekodér instrukcí, tím lze RAM po odpojení napájení „vyprchají“),
nerování jednoduchého tónu, pøerušo- zvýšit pracovní kmitoèet), • sériový download dovoluje nahrávat
vaného tónu nebo sirény. Pro realizaci • velká rychlost až 20 MIPS pøi použití program nebo mìnit obsah datové
je použit èítaè/èasovaè 0, který pracuje hodinového kmitoètu 20 MHz (20 MIPS E2PROM pøímo v aplikaèní desce (od-
v režimu èasovaèe. znaèí, že mikroøadiè je schopen vykonat padá nutnost naprogramovat mikroøa-

Konstrukèní elektronika A Radio - 5/2006 3


diè v programátoru a provést test pro- Pøipomeòme ještì, že pro aplikace
gramu v jiné desce), s malým pøíkonem jsou výhodné typy
• k dispozici je 32 obecnì použitel- s menším rozsahem napájecího napìtí
ných registrù o šíøce 8 bitù (tedy jed- (ztrátový výkon je pøibližnì úmìrný dru-
noho bajtu) - tzv. registrové pole, hé mocninì napìtí a pøímoúmìrný pra-
žádný z tìchto registrù nemá proti covnímu kmitoètu).
ostatním výsadní postavení (i když pro
nìkteré pøípady je použití registrù o- Vývody a struèný popis jejich
mezeno), oznaèení tìchto registrù je funkce
R0 až R31,
• v rámci jedné instrukce lze pracovat Vývody mikroøadièe ATtiny2313
se dvìma registry registrového pole jsou pøehlednì vyobrazeny na jeho
(napø. je možno provést souèet dvou pouzdøe (viz obr. 1.1). Popišme si
registrù na jeden hodinový takt), struènì jejich funkci: Obr. 1.1. Oznaèení vývodù mikroøadièe
• kromì registrového pole je mikroøadiè • UCC a GND - vývody pro pøipojení ATtiny2313 na pouzdrech DIP a SOIC
vybaven tzv. vstupnì/výstupními re- napájecího napìtí,
gistry, které slouží pro ovládání vesta- • /RESET - nulovací vstup, který je ak- • DO, DI, USCK - vývody jednotky USI
vìných periferií (viz níže), tivní v úrovni „log. 0“. Pomocí tohoto pro pøipojení SPI periferií,
• kvalitní vestavìné periferie (v mik- vstupu lze mikroøadiè kdykoli vynulo-
• PCINT0 až PCINT7 - vstupy vnìjšího
roøadièi je pøítomno mnoho podpùrných vat (pøinutit k rozbìhu programu od
pøerušení.
obvodù): zaèátku),
- analogový komparátor (lze použít • XTAL1 a XTAL2 - vývody pro pøipoje-
napø. pro mìøení napìtí nebo dalších ní krystalu,
1.2. AVR Studio
velièin), • PD0 až PD6 - 7 vývodù tvoøících - vývojové prostøedí
- jednoduchý 8 bitový èítaè/èasovaè port D (port je oznaèení pro vìtší sku-
a pokroèilý 16 bitový èítaè/èasovaè Výrobce mikroøadièù AVR (firma
pinu vývodù, kterou lze ovládat najed- ATMEL) dodává ke svým produktùm
(èítaèe lze použít pro mìøení kmitoètu; nou),
èasovaèe dovolují odmìøovat èasové volnì šiøitelný vývojový prostøedek
• PB0 až PB7 - 8 vývodù tvoøících nazvaný AVR Studio. Je k dispozici
intervaly). Celkem jsou k dispozici 4
port B, v [4].
PWM kanály,
• PA0 až PA2 - 3 vývody tvoøící port A Obrovskou výhodou prostøedí AVR
- hlídaè bìhu programu WDT (Watch Studio je skuteènost, že v sobì sluèuje:
Dog Timer - zabraòuje „zamrznutí“ ne- (na úkor ostatních signálù).
vhodnì navrženého programu), • editor (pomocí nìj zapíšeme zdrojo-
Nìkteré vývody mají tzv. alternativní vý text programu),
- komunikaèní obvod USART (Uni- funkce (na obr. 1.1 jsou jejich zkratky
versal Synchronous and Asynchronous • pøekladaè (pøeloží zdrojový text do
uvedeny v závorce):
Receiver and Transmitter - zajišuje formy použitelné programátorem),
• RxD a TxD - vstup a výstup jednotky • simulátor (umožní simulovat funkci
snadné pøipojení mikroøadièe k sériové- USART (sériového kanálu),
mu portu poèítaèe), programu, tedy napøíklad sledovat stav
• INT0 a INT1 - vstupy vnìjšího pøeru- registrù simulovaného programu).
- komunikaèní obvod USI (Universal
šení (pomocí vnìjšího pøerušení mùže
Serial Interface), který mùže pracovat Na tomto místì je ještì pøíliš brzo
mikroøadiè reagovat napøíklad na hava-
jako SPI nebo I2C sbìrnice. na výklad ovládání vývojového pro-
rijní situace),
støedí AVR Studio. Vysvìtlíme si jej
Typy, pouzdra a znaèení • T0 a T1 - vstupy obou èítaèù/èasova- v kapitole 2.3, výklad probìhne na
èù (na tyto vstupy lze pøivést mìøený prvním pøíkladu.
Mikroøadiè ATtiny2313 je dodáván kmitoèet), viz kapitoly 5 a 6,
ve dvou pouzdrech.
• DIP 20 - 20vývodové pouzdro DIP,
• ICP - vstup jednotky Input Capture 1.3. SDK2313
(záchyt údaje 16bitového èítaèe/èaso-
• SOIC 20 - 20vývodové pouzdro pro vaèe lze provést aktivací tohoto vstu- - vývojový kit
povrchovou montហ(SMD). pu), viz kapitolu 6,
Pro praktické testy programù byl již
Mutace se dále liší napájecím napì- • OC0A, OC0B, OC1A, OC1B - výstu- v [3] navržen speciální pøípravek nazva-
tím, pracovním kmitoètem a provozní py jednotek Output Compare, ný SDK2313. Jedná se o komplexní vý-
teplotou (viz tab 1.1). • AIN0 a AIN1 - vstupy analogového vojový kit (tedy spojení programátoru a
Nejèastìji je používán typ ATti- komparátoru, testovací desky) pro mikroøadiè ATti-
ny2313-20PU. Je to mikroøadiè schop- ny2313 (v pouzdru DIL).
ný pracovat s hodinovým kmitoètem • SCK, MISO, MOSI - vývody pro pod- Pøi návrhu tohoto kitu byla zohled-
až 20 MHz pøi napájecím napìtí 2,7 poru sériového downloadu (tedy mož- nìna pøedevším cena a univerzálnost.
až 5,5 V (nominálnì 5 V). Teplotní roz- nosti nahrávat program pøímo do testo- Celkové náklady na amatérskou stavbu
sah je -40 až +85° C. Pøípony PI/SI vané aplikace), vývojového kitu SDK2313 nepøesáh-
znaèí prùmyslový standard, PU/SU je • SDA, SCL - vývody jednotky USI pro nou 150 Kè.
bezolovnaté pouzdro. pøipojení I2C periferií,
Zapojení a konstrukce
Tab. 1.1. Jednotlivé mutace ATtiny2313 Schéma zapojení vývojového kitu
SDK2313 je na obr. 1.2.
Pro napájení je potøebný vnìjší zdroj
o napìtí asi 9 V. Pøepólování brání dio-
da D6. Filtrace a stabilizace je zajištì-
na kondenzátorem C4 a stabilizátorem
IO2 (7805).
Pøípravek je ovládán sériovým por-
tem poèítaèe. Jsou použity linky TxD
(odpovídá signálu SCK), DTR (odpoví-
dá signálu MOSI), RTS (odpovídá sig-

4 Konstrukèní elektronika A Radio - 5/2006


C3 47 µF/16 V, radiální
C4, C5 470 µF/16 V, radiální
C6 až C8 100 nF/63 V, keramický
X krystal 10,000 MHz
D1 BZX83V004.7
(Zener. dioda na 4,7 V)
D2 až D4,
D7 1N4148
D5 LED, 5 mm, 200 mcd
D6 1N4001
T1, T2 BC548
IO1 TL061
IO2 7805
IO3 ATtiny2313-20PU
PB, PD vidlice PSL10
CON CAN 9 Z 90
chladiè DO1A pro IO2 (1 ks)
precizní objímka DIL20 pro IO3 (1 ks)
deska s plošnými spoji SDK2313
Pozn.: V seznamu souèástek je uve-
den krystal 10 MHz, mùže však použít
i jiné krystaly až do kmitoètu 20 MHz.

Konektory PB a PD
Osazení konektorù PB a PD je èás-
teènì zøejmé již ze schématu zapojení
(viz obr. 1.2). Pro lepší pøehled je dopl-
nìn obr. 1.6.
Vývod 1 konektoru je oznaèen zøe-
telným trojúhelníèkem a je na nìj vyve-
deno napìtí 5 V. Na vývodu 10 je GND.
Jednotlivé vývody portù PB a PD
jsou rozloženy tak, že nejvyšší bit (D7)
je na vývodu 2. Další bity jsou na vývo-
dech s následujícími èísly. Nejménì vý-
znamný bit (D0) je pak na vývodu 9.
Všimnìte si, že port PD nemá
k dispozici vývod PD7. Posledním vý-
vodem portu je D6. Ze schématu podle
obr. 1.2 je zøejmé, že vývody 2 a 3
Obr. 1.2. Vývojový kit SDK2313
jsou na pøípravku spojeny (to aby nezù-
stal nezapojený vývod úplnì „ve vzdu-
nálu /RESET a CTS (odpovídá signálu Seznam souèástek pro SDK2313 chu“). Èili vývody D6 a D7 portu D jsou
MISO). (cena bez mikroøadièe asi 80 Kè) zkratovány.
Signály SCK a MOSI jsou ovládány
pomocí tranzistorových invertorù, pøí- R1 2,2 kΩ/1 %/0,6 W
R3, R5 10 kΩ/1 %/0,6 W
Propojovací kabely PSLKAB
mé spojení (podobnì jako u signálu
/RESET) se jevilo jako problematické R2, R4 1,5 kΩ/1 %/0,6 W Pro pøipojení dále popsaných pøí-
(mohly by se poškodit dále pøipojené R6 680 Ω/1 %/0,6 W pravkù jsou zapotøebí propojovací ka-
pøípravky). Tranzistory T1 a T2 záro- C1, C2 33 pF/500 V, keramický bely oznaèené jako PSLKAB.
veò zajišují pøevod z úrovní RS-232 C
(jsou na sériovém portu) na úrovnì
TTL (s nimi pracují èíslicové obvody).
Pro signál /RESET je použita prostá
Zenerova dioda, která napìtí omezu-
je na 4,7 V.
Signál MISO musí být z pùvod-
ních úrovní TTL pøeveden na úrovnì
RS-232 C. Pro tento úèel je použit OZ
IO1 s malým pøíkonem (TL061), který
je napájen pøímo ze sériového portu. Je
to levnìjší øešení, než použít klasický
konvertor typu MAX232.
Hodinový kmitoèet je odvozen od
krystalu X pøipojeného na vývody XTAL1
a XTAL2.
Oba porty jsou vyvedeny na konek-
tory PB a PD. Obr. 1.3.
Souèástky pøípravku SDK2313 jsou Obrazec
pøipájeny na desce s jednostrannými plošných
plošnými spoji. Obrazec spojù je na spojù
obr. 1.3. Rozmístìní souèástek na des- pøípravku
ce je na obr. 1.4, drátová propojka na SDK2313
stranì spojù je na obr. 1.5. (mìø.: 1 : 1)

Konstrukèní elektronika A Radio - 5/2006 5


Obr. 1.4. Rozmístìní souèástek na desce Obr. 1.5. Drátová propojka na stranì spojù na desce
pøípravku SDK2313 pøípravku SDK2313

na pozici 1 a konektor zmáèkneme ve • Pomocí tlaèítka Port vyberte sériový


svìráku. Postup opakujeme i pro druhý kanál, na který je pøipojen pøípravek.
konektor. Nakonec spoje zajistíme za- • Nyní je možné pomocí políèek TxD,
jišovacími sponami (klipsy). DTR a RTS ovládat odpovídající vývody
Obr. 1.6. sériového portu (obr. 1.8):
Osazení Oživení vývojového kitu - Pokud je pole TxD zaškrtnuto, sepne
konektorù Pøestože je konstrukce vývojového tranzistor T1 a na vývodu 19 objímky,
PB a PD kitu pomìrnì jednoduchá, je vhodné který odpovídá signálu SCK, bude úro-
zaøadit detailní popis oživení. Už proto, veò „log. 0“. Pokud je pole TxD volné,
že tento èlánek je urèen pøedevším za- tranzistor T1 je vypnut a signál SCK je
èínajícím. pomocí rezistoru R3 zdvižen do úrov-
Pøednì doporuèujeme osadit mikro- nì „log. 1“.
øadiè do patice (nejlépe precizní). - Pokud je pole DTR zaškrtnuto, sepne
Po zapájení všech souèástek (dejte tranzistor T2 a na vývodu 17 objímky,
pozor pøedevším na správnou polaritu který odpovídá signálu MOSI, bude
diod a elektrolytických kondenzáto- úroveò „log. 0“. Pokud je pole DTR vol-
rù) zkontrolujte, zda máte zespodu né, tranzistor T2 je vypnut a signál
Obr. 1.7. Konstrukce kabelu PSLKAB správnì zapájenu drátovou propojku MOSI je pomocí rezistoru R5 zdvižen
(obr. 1.5). do úrovnì „log. 1“.
Tyto kabely lze bez obtíží vyrobit ze Nyní již mùžeme uvést postup - Pokud je pole RTS zaškrtnuto, je na
dvou konektorù PFL10 a kousku (po- oživení: vývodu 1 objímky, který odpovídá sig-
staèí asi 15 cm) plochého 10žilového • Pøípravek zatím nepøipojujte k poèítaèi nálu /RESET, úroveò „log. 1“ (napìtí
kabelu (typ AWG28-10) - viz obr. 1.7. PC ani na konektory PB a PD nepøipo- musí být alespoò 4,5 V, maximálnì
Plochý kabel vložíme oznaèenou ži- jujte žádné pøípravky. Mikroøadiè vyjmì- však 5,7 V). Pokud je pole volné, namì-
lou na pozici 1 prvního z konektorù te z patice. øíme napìtí odpovídající úrovni „log. 0“
PFL10 a konektor zmáèkneme ve svì- (nejménì však -0,7 V).
ráku. Naprosto stejnì postupujeme • Pøipojte napájecí napìtí o velikosti
- Funkci linky MISO (resp. vývodu 18
i u druhého konektoru. Pozornì si pro- zhruba 9 V (minimální velikost napá-
objímky) lze otestovat tak, že odpovída-
hlédnìte obr. 1.7, abyste kabel neotoèi- jecího napìtí pro správnou funkci je jící vývod pøipojíme buï napìtí 5 V (po-
li. Potom již lze do konektoru zasunout asi 8 V; maximální velikost napájecího líèko CTS zùstane volné) nebo 0 V (po-
zajišovací spony (klipsy). napìtí by nemìla pøesáhnout 12 V, ji- líèko CTS bude zaškrtnuto).
nak hrozí, že se pøehøeje stabilizátor
7805, protože chladiè stabilizátoru má - Pokud jsou problémy s linkou MISO,
Propojovací kabel COMKAB zkontrolujte pøítomnost napájecího na-
jen minimální rozmìry).
Rovnìž pro pøipojení vývojového pìtí operaèního zesilovaèe IO1. Pro pøí-
kitu k sériovému portu poèítaèe PC je • Zkontrolujte voltmetrem, zda je na pad volného políèka RTS musí být na
zapotøebí vyrobit speciální kabel. kondenzátoru C4 napìtí alespoò 8 V. vývodu 4 IO1 napìtí alespoò -6 V proti
Budeme potøebovat konektory • LED D5 musí svítit. Pokud nesvítí, zemi a na vývodu 7 IO1 napìtí alespoò
CAN 9 V S a CAN 9 Z S a zhruba jeden zkontrolujte, zda je správnì zapájena. +8 V proti zemi.
metr plochého 10žilového kabelu ty-
• Zkontrolujte také napájecí napìtí mik- • Pokud jsou pøedchozí testy úspìšné,
pu AWG28-10 (9žilový se totiž nepro- zavøete program RSDEBUG a odpojte
roøadièe na objímce mezi vývody
dává). Také lze použít hotový kabel napájecí zdroj. Vložte do patice mikro-
10 a 20 (toto napìtí musí být asi 5 V).
CAB261MO (GM electronic) øadiè. Zapnìte zdroj a zkontrolujte osci-
Nejdøíve odtrhneme neoznaèenou • Pøipojte vývojový kit kabelem COM- lace krystalu (postaèí pøipojit mezi vý-
krajní žílu plochého kabelu, èímž vytvo- KAB k sériovému portu poèítaèe. Spus- vody XTAL1 a XTAL2 - tedy vývody
øíme 9žilový kabel. Oznaèenou žílu te program RSDEBUG. Najdete jej 4 a 5 IO3 - digitální voltmetr, mìl by
pak vsuneme do jednoho z konektorù v [4] v adresáøi SDK2313\RSDEBUG. ukázat napìtí zhruba 2,5 V).

6 Konstrukèní elektronika A Radio - 5/2006


Obr. 1.8. • Je-li DDRBn = 0 a PORTBn = 1, je
Program vývod PBn konfigurován jako vstup
RSDEBUG s pull-upem.
po volbì • Je-li DDRBn = 1 a PORTBn = 0, je
sériového vývod PBn výstupní a má logickou hod-
kanálu notu 0.
COM1
• Je-li DDRBn = 1 a PORTBn = 1, je
vývod PBn výstupní a má logickou hod-
notu 1.
• Nyní by mìlo všechno fungovat. První Popis použití tohoto programu je Výstupy jsou typu totem, to zna-
pøíklad, který nám mùže poskytnout uveden v kapitole 2.3 na konkrétním mená, že pøi vybuzení do stavu „log. 0“
ovìøení funkce vývojového kitu, je uve- pøíkladu. nebo „log. 1“ je možné odebírat pomìr-
den v kapitole 2.3. nì znaèný proud. Výrobce udává, že
maximální proud výstupu je 40 mA.
Ovládací program 1.4. Na øadì jsou aplikace Pro celý port však nesmí proudový od-
bìr pøesáhnout 100 mA (tedy prùmìrnì
Pro ovládání (pøedevším programo- Pøedchozí text byl nezbytný pøede- 12,5 mA na každý vývod) a odbìr celé-
vání programové pamìti Flash a datové vším pro seznámení jak s použitým ho obvodu nesmí pøesáhnout 200 mA.
pamìti E2PROM) byl již v [3] vytvoøen typem mikroøadièe, tak i s vývojovým
speciální program nazvaný SDK2313. kitem. V dalších kapitolách si již ukáže-
Najdete jej v [4] v adresáøi SDK2313. me konkrétní pøíklady.
Bity vstupnì/výstupních regist-
rù pro práci s porty PB a PD
Na obr. 2.2 a 2.3 jsou znázornìny
jednotlivé bity popisovaných vstupnì/
2. První pokusy s LED /výstupních registrù pro ovládání portù
PB a PD.
Po nezbytném úvodu již mùžeme gurovány jako vstupní (protože se vy- Symbol R oznaèuje, že daný bit lze
pøistoupit k prvním pøíkladùm. Na nulují registry DDRB a DDRD). Dále èíst. Symbol W oznaèuje, že do dané-
programech pro ovládání skupiny jsou vynulovány registry PORTB a ho bitu lze zapisovat. Symbol R/W
LED si dále ukážeme použití vývo- PORTD, takže tyto vstupy mají odpo- oznaèuje bit, ze kterého lze èíst i do nìj
jového prostøedí AVR Studio a pro- jené pull-up rezistory (pull-up rezistor je zapisovat. Výchozí hodnota urèuje ob-
gramu SDK2313, který øídí vývojový v obr. 2.1 tvoøen tranzistorem T). sah registru po resetu mikroøadièe
kit SDK2313. Také se seznámíme se Vstupy jsou proti rušení chránìny (tedy 0 nebo 1). Oznaèení ? øíká, že vý-
základními instrukcemi mikroøadièe Schmittovými klopnými obvody. chozí hodnotu nelze pøedem stanovit.
ATiny2313. Pøipomeòme, že port D nemá
Vliv bitù DDRBn a PORTBn k dipozici vývod PD7. Proto jsou také
nejvyšší bity registrù DDRD, PORTD a
2.1. Struènì o portech na chování vývodu PBn (tab. 2.1) PIND neobsazeny.
PB a PD • Je-li DDRBn = 0 a PORTBn = 0, je
vývod PBn konfigurován jako vstup bez
Pozn.: Zpìtným ètením obsahu regist-
rù PORTB nebo PORTD zjistíme døí-
Oba porty PB a PD jsou øízeny troji- pull-upu (tento stav odpovídá situaci po ve uložené hodnoty. Pro ètení stavu vý-
cí vstupnì/výstupních registrù (viz také resetu mikroøadièe). vodù použijte registry PINB nebo PIND.
tab. 2.1):
• První registr ovládá smìr jednotli-
vých vývodù portu. Registry jsou
oznaèeny DDRB (pro port B) a DDRD
(pro port D). Každý vývod portu mùže
být nezávisle na ostatních konfigurován
jako vstup nebo výstup.
• Druhý registr umožòuje nastavovat
logickou úroveò vývodù, které jsou
konfigurovány jako výstupní.
Pokud jsou dané vývody konfiguro-
vány jako vstupy, lze pøipojovat èi od-
pojovat vestavìný pull-up rezistor
(pomocí bitu PUD v registru SFIOR
lze rezistory pull-up odpojit od vývo-
dù všech portù). Tento rezistor zdvih-
ne úroveò vstupního vývod smìrem
k „log. 1“ v pøípadì, že není pøipojen
vnìjší signál. Tímto zpùsobem se tedy Obr. 2.1.
zajišuje, že je na vývodu definována Zapojení
úroveò „log. 1“ i pro pøípad, že vývod vývodu n
není pøipojen na vnìjší obvod. portu X
Registry jsou oznaèeny PORTB
(pro port B) a PORTD (pro port D).
• Tøetí registr slouží pro ètení stavu vý-
vodù, které jsou konfigurovány jako Tab. 2.1.
vstupní. Registry jsou oznaèeny PINB Vliv bitù
(pro port B) a PIND (pro port D). DDRXn a
PORTXn
Z obr. 2.1 je zøejmé, že po rese- na chování
tu jsou všechny vývody portù konfi- vývodu PXn

Konstrukèní elektronika A Radio - 5/2006 7


Obr. 2.2.
Vstupnì/výstupní
registry
pro øízení
portu B

Obr. 2.3.
Vstupnì/výstupní
registry
pro øízení
portu D

Ovládání portù PB2 log. 0. Instrukce SBI PORTB,2


zase pošle na vývod PB2 log. 1.
2.2. Pøípravek AT8LED
Uvedené vstupnì/výstupní registry
DDRB (resp. DDRD), PORTB (resp. b) Pokud požadujeme konfiguraci - osmice LED
PORTD) a PINB (resp. PIND) lze po- všech vývodù portu D najednou, bude
rozumné použít instrukci OUT. Pøipo- První pøíklady budou pøedstavovat
hodlnì ovládat pomocí nìkolika instruk- programy pro ovládání jedné LED nebo
cí. Symbol P oznaèuje vstupnì/vý- meòme ještì, že hodnota pro zápis
musí být nejdøíve zapsána do regist- celé skupiny LED, které budou pøipoje-
stupní registr, symbol b oznaèuje bit ny na port B.
vstupnì/výstupního registru a sym- ru a teprve poté pøenesena na urèe-
ný port (dále je použit registr R16). Napø. Z pøedchozího textu již víme, že
boly Rd a Rr znaèí registr registrového
sled instrukcí LDI R16,0b00001111 a každý z vývodù portù je schopen dodá-
pole, který je použit jako cílový nebo
OUT DDRD,R16 pøepne vývody PD0 vat proud až 12,5 mA (pøi rovnomìr-
zdrojový operand:
až PD3 do výstupního režimu a vývody ném zatížení všech vývodù). Proto by
• IN Rd,P - uloží obsah vstupnì/výstup- PD4 až PD6 do vstupního režimu. bylo možné pøipojit LED pøímo k mikro-
ního registru P do registru Rd, takto lze øadièi. Rozumnìjší však bude napojit
tedy najednou sejmout stav všech bitù Pozn.: Pøestože mikroøadiè ATti-
LED pøes oddìlovací obvod, protože
vstupnì/výstupního registru P, ny2313 disponuje 32 registry, platí, že
tím zmenšíme ztrátový výkon mikroøa-
v nìkterých pøípadech nelze použít li-
• OUT P,Rr - zapíše obsah registru Rr bovolný registr. Napø. pro instrukci LDI dièe.
do vstupnì/výstupního registru P, takto (nahrání pøímé hodnoty do registru) lze Takovým oddìlovacím obvodem
lze tedy najednou nastavit stav všech používat pouze registry z horní polo- mùže být napø. budiè sbìrnice typu
bitù vstupnì/výstupního registru P, viny registrového pole. Tedy registry 74245 (èasto jej najdete i na základních
R16 až R31. deskách PC, avšak na nich je obvykle
• CBI P,b - vynuluje bit b vstupnì/vý- v provedení SMD).
stupního registru P (tedy P,b je po ope- Zápis 0b00001111 pøedstavuje
dvojkové èíslo 00001111 (pøedpona 0b Zapojení pøípravku s osmi LED je
raci 0), na obr. 2.4. LED jsou pøipojeny na jed-
znaèí, že se jedná o dvojkové - binární
• SBI P,b - nastaví bit b vstupnì/vý- èíslo). Toto èíslo má spodní 4 bity na- notlivé vývody portu. Rezistory R1 až
stupního registru P (tedy P,b je po ope- staveny a horní 4 bity vynulovány. R8 omezují proud každé LED na maxi-
raci 1), Pokud danou hodnotu zapíšeme do málnì 10 mA (zmìnou odporu tìchto
• SBIC P,b - pøeskoèí následující in- vstupnì/výstupního registru DDRD, rezistorù lze tedy upravit jejich jas). IO1
strukci v pøípadì, že je bit b vstupnì/vý- konfigurují se dolní 4 bity portu D (tedy je již zmiòovaný budiè sbìrnice 74245.
stupního registru P vynulován, vývody PD0 až PD3) jako výstupy a Rezistory R9 a R10 není nutno osazo-
ostatní bity (tedy vývody PD4 až PD6) vat. Tyto rezistory mají význam pouze
• SBIS P,b – pøeskoèí následující in- jako vstupy. ve spojení s mikroøadièem AT89C2051,
strukci v pøípadì, že je bit b vstupnì/vý-
stupního registru P nastaven.

Pøíklady
a) Chceme konfigurovat vývod PB2
jako výstup. Dále chceme na tento vý-
vod vystavit úrovnì „log. 0“ a „log. 1“.
b) Chceme konfigurovat spodní 4 bity
portu D jako výstupy a ostatní bity to-
hoto portu jako vstupy.

a) Pokud budeme konfigurovat a ovlá-


dat jediný vývod portu B, bude rozumné
používat instrukce typu CBI a SBI.
Napø. instrukce SBI DDRB,2 pøepne
vývod PB2 do výstupního režimu. In-
strukce CBI PORTB,2 pošle na vývod Obr. 2.4. Schéma pøípravku AT8LED

8 Konstrukèní elektronika A Radio - 5/2006


který byl popsán v [1]. V zájmu zpìtné
kompatibility byly tyto rezistory pone-
2.3. Pøíklad 1 Po instalaci je vytvoøena skupina
ATMEL AVR TOOLS, která obsahuje
chány, nebo pøípravek AT8LED byl - rozsvícení LED zástupce pro spouštìní vývojového pro-
poprvé publikován právì v [1]. støedí. Pomocí zástupce tedy spuste
Po nezbytném popisu mikroøadièe
Pozn.: Kterákoliv LED svítí teh- vývojové prostøedí.
dy, když na odpovídajícím vývodu ATtiny2313, obou jeho portù a vývo-
Nejdøíve aktivujte položku nabídky
konektoru P je úroveò „log. 0“. jového kitu SDK2313 lze již realizovat
Project|New Project. Zobrazí se dia-
Napø. pokud je pøípravek pøipojen na první pøíklad.
log podle obr. 2.7. Zde je tøeba v poli
port B a vývody PB0 až PB6 tohoto Zadání: Pøipojte k vývojovému kitu Project Name uvést jméno projektu
portu jsou v úrovni „log. 1“ a pouze vý- SDK2313 na port B pøípravek AT8LED. (PROG_01). V poli Location pak zvolí-
vod PB7 je v úrovni „log. 0“, bude svítit Konfigurujte všechny vývodu portu B me adresáø, do kterého se má projekt
LED D1. jako výstupy. Rozsvite LED na vývodu umístit (mùže se jednat o adresáø, kte-
Chcete-li aby LED svítily pøi úrov- PB2. Ostatní LED zùstanou zhasnuty. rý neexistuje - vytvoøí se). Nakonec vy-
ních „log. 1“ na vývodech portù, musíte berte typ projektu v seznamu Project
použít tzv. invertující budiè sbìrnice. Zadání pøíkladu je zámìrnì velmi
type (AVR Assembler). Doporuèujeme
Bez jakýchkoliv úprav zapojení pak jednoduché. To proto, aby zápis pro-
zaškrtnout volby Create initial File (vy-
místo neinvertujícího budièe 74245 po- gramu byl snadno pochopitelný, pro-
tvoøí zdrojový soubor) a Create Folder
užijeme invertující budiè 74640. tože jej spojíme s výkladem ovládání
(soubory se budou ukládat do složky
Pøípravek AT8LED je zkonstruován vývojového prostøedí AVR Studio a po-
urèené jménem projektu). Vše potvrïte
na desce s jednostrannými plošnými pisem nahrávání programu do vývojo- tlaèítkem Next.
spoji. Obrazec spojù je na obr. 2.5, vého kitu SDK2313 pomocí programu Ze seznamu Debug Platform vy-
rozmístìní souèástek na desce je na SDK2313. bereme vývojový nástroj (AVR Simula-
obr. 2.6. tor zajišuje programovou simulaci mi-
Založení projektu ve vývojovém kroøadièe), ze seznamu Device pak
Seznam souèástek pro AT8LED prostøedí AVR Studio mikroøadiè ATtiny2313 - viz obr. 2.8.
(cena asi 40 Kè) Pøed prvním spuštìním vývojového Po stisku tlaèítka Finish se již vygene-
R1 až R8 330 Ω/1 %/0,6 W prostøedí AVR Studio musíme toto pro- rují potøebné soubory a prostøedí je pøi-
R9, R10 4,7 kΩ/1 %/0,6 W støedí nainstalovat. praveno.
D1 až D8 LED, 5 mm, 200 mcd Instalace je k dispozici v [4] v adre- Na obr. 2.9 je základní okno projektu.
IO1 74HCT245 (74HC245, sáøi AVRStudio.
74LS245) Poklepáním na pøíslušný soubor Vlastní zdrojový text
P PSL10 (MLW10G) ASTUDIO4B401.EXE lze spustit insta- Pøed první instrukcí, kterou zapíše-
deska s plošnými spoji AT8LED laci. Potom poklepáme na druhém sou- me do programu, musíme vybrat typ
boru ze stejného adresáøe a tak se na- mikroøadièe. Nejsnazší je vložit definici
instaluje „záplata“ (patch). registrù (a další informace) daného
Na všechny dotazy odpovídáme kla- typu mikroøadièe, které jsou obsaženy
sickým zpùsobem jako pøi instalaci ji- v souborech s pøíponou INC. Tyto sou-
ných programù (zvolte si správnì adre- bory najdete v adresáøi APPNOTES
sáø, kam má být instalace provedena). vaší instalace vývojového prostøedí

Obr. 2.7.
Dialog
Obr. 2.5. Obrazec plošných spojù pro
pøípravku AT8LED (mìø.: 1 : 1) založení
nového
projektu

Obr. 2.8.
Volba
ladicího
prostøedku
a typu
Obr. 2.6. Rozmístìní souèástek mikro-
na desce pøípravku AT8LED øadièe

Konstrukèní elektronika A Radio - 5/2006 9


Obr. 2.9. Vývojové prostøedí AVR Studio 4
AVR Studio. V našem pøípadì se jed- sobilo rozsvícení všech LED na pøí- èovat dále. Jaký je však obsah pro-
ná o soubor TN2313DEF.INC, který pravku AT8LED). Staèí tedy hodnotu gramové pamìti nemusí být pøedem
odpovídá mikroøadièi ATtiny2313. Vlo- obsaženou v registru REG (obsahuje známo. Proto je tøeba øadu programù
žení souboru provedeme direktivou .IN- ještì hodnotu 11111111) zapsat do zapsat tak, aby se po svém vykonání
CLUDE, jméno souboru se zapisuje do vstupnì/výstupního registru PORTB: prostì zastavily. Jedinou možností, jak
uvozovek: .INCLUDE “tn2313def.inc“. OUT PORTB,REG. program zastavit, je zacyklit jej. Nejvý-
Dále je vhodné zavést si symbolic- Takže všechny LED pøípravku hodnìjší je zapsat instrukci skoku tak,
ké oznaèení pro každý z použitých re- AT8LED jsou zhasnuté. Nyní je tøeba že se bude vracet na adresu, kde je
gistrù. Jistì si snáze zapamatujeme vynulovat bit 2 portu B. Tím dosáhne- tento skok zapsán. Skok je realizován
námi zavedený symbol než èíslo regis- me rozsvícení LED pøipojené na vývod instrukcí RJMP addr (addr urèuje ad-
tru, který používáme. Pro definici zá- PB2 (LED svítí pøi úrovni „log. 0“ na vý- resu, na kterou chceme pøevést øízení
stupného symbolu použijeme direktivu vodu portu). Pro zmìnu jednoho bitu programu - kam chceme „skoèit“). Mís-
.DEF. Vzhledem k tomu, že do použí- vstupnì/výstupního registru je nejvý- to, kam je tøeba skoèit, si oznaèíme
vaného registru budeme potøebovat na- hodnìjší použít instrukci SBI (nastavení návìštím (symbol uvedený na za-
hrát pøímou hodnotu, musíme volit nì- bitu) nebo CBI (vynulování bitu - to je èátku øádku a zakonèený dvojteèkou):
který z registrù v rozsahu R16 až R31. nᚠpøípad): CBI PORTB,2. SKOK: RJMP SKOK.
Dále je tedy zaveden symbol REG pro Uvìdomte si, že po vykonání po- Z pøedchozích úvah tedy vyplyne
registr, který budeme obvykle používat slední instrukce bude program pokra- zdrojový text programu, který je na-
(jedná se o registr R16): .DEF REG=R16.
Po tìchto pøípravných pracích je
tøeba konfigurovat celý port B jako vý-
stupní, tzn. zapsat do vstupnì/výstup-
ního registru DDRB samé 1 (dvojkovì).
Vzhledem k tomu, že do vstupnì/vý-
stupních registrù nelze zapisovat pøí-
mo, musíme použít námi zavedený
registr REG a nastavit jej tak, aby obsa-
hoval dvojkovou hodnotu 11111111.
Pøímá hodnota (konstanta) se nahrává
instrukcí LDI: LDI REG,0b11111111.
Nyní je tedy možno obsah registru
REG pøenést do vstupnì/výstupního Obr. 2.10.
registru DDRB pomocí instrukce OUT. Dialog
Tak se tedy všechny vývody portu B kon- pro volbu
figurují jako výstupy: OUT DDRB,REG. vlastností
Dále je tøeba vystavit na všechny mikro-
vývody portu B jednièky, protože vý- øadièe
chozí stav vstupnì/výstupního portu pro
PORTB jsou samé nuly (a to by zpù- simulaci

10 Konstrukèní elektronika A Radio - 5/2006


Obr. 2.11. Zobrazení zdrojového textu a registrù
zván PROG_01.ASM. Jeho výpis je gram se pøeloží (pokud nebudou chy- Nyní v [4] vyhledejte adresáø
v tab. 2.3. Pøíklad najdete v [4] v ad- by) a pøejde automaticky do ladicího re- SDK2313 a soubory SDK2313.INI
resáøi PROGRAMY\PROG_01: žimu. Pøechod do ladicího režimu bude a SDK2313.EXE pøekopírujte na
ponìkud pomalejší, protože vývojové pevný disk vašeho poèítaèe PC (pøí-
Pozn.: Skoky jsou instrukce, které pøe-
nesou vykonávání programu na urèené prostøedí AVR Studio se snaží navázat padnì odstraòte atribut R/O, který
návìští. Kromì nepodmínìného skoku komunikaci s rùznými emulátory a vý- mùže být nastaven pøi kopírování
RJMP existují také skoky podmínìné. vojovými kity, které podporuje (takže z CD-ROM). Pøed spuštìním progra-
Ty se provedou, pokud je splnìna nejdøíve musí zjistit, že žádný z vývojo- mu SDK2313.EXE musíte ještì otevøít
urèitá podmínka. Pøíkladem mùže být vých kitù není k dispozici). soubor SDK2313.INI (v textovém edito-
instrukce BRNE, která bude použita Pøed vlastní simulací je vhodné na- ru) a zkontrolovat klíè Port. V souboru
v kapitole 2.4. stavit parametry simulace pomocí dia- z CD-ROM je nastavena hodnota 1 což
logu podle obr. 2.10. Zobrazí se po znaèí, že vývojový kit musí být pøipojen
Ladìní aktivaci položky nabídky Debug|AVR na sériový port COM1. Pokud však
Pøed testem programu pøímo v mik- Simulator Options. V dialogu je tøeba chcete použít jiný port, musíte hodnotu
roøadièi se obvykle vyplatí alespoò krát- zvolit použitý mikroøadiè a jeho taktova- upravit (napøíklad pro COM2 musí být
ce jej odladit. Ladìní znamená, že cí kmitoèet. Port = 2). Po uložení zmìn v souboru
spustíme simulátor a sledujeme ob- Pøed odsimulováním první instrukce SDK2313.INI lze spustit program
sahy registrù a chování programu. Je je vhodné zobrazit si obsahy registrù SDK2313.EXE.
pravda, že simulace bude výraznì po- registrového pole (aktivací položky me- Vývojový kit lze provozovat i na po-
malejší než bìh programu v reálném nu View|Registers) a vstupnì/výstup- èítaèi bez sériového portu, pokud si
procesoru, ale poskytne nám mnohem ních registrù (aktivací položky menu opatøíte pøevodník USB<=>COM (cena
více informací než vnìjší projevy nefun- View|New IO View). Jedno z možných asi 400 Kè). Vývojový kit pak pøipojíte
gujícího programu. uspoøádání pracovní plochy vývojového pøes USB.
Nyní již mùžete aktivovat položku prostøedí AVR Studio je uvedeno na Døíve pøeložený program (tedy sou-
nabídky Project|Build and run. Pro- obr. 2.11. bor PROG_01.HEX otevøete tlaèítkem
Poklepáním (doubleclickem) na hod- Otevøení souboru (obr. 2.14). Zápis
Tab. 2.3. Program PROG_01.ASM notì sledovaného registru (viz obr. programu do vývojového kitu provedete
2.12) se zobrazí dialog podle obr. 2.13. tlaèítkem Zápis programu.
PROG_01.ASM V tomto dialogu mùžeme zadat hodno-
;vloží definice registru ATtiny2313: Je-li vývojový kit v poøádku, rozsvítí
.INCLUDE “tn2313def.inc“
tu registru v šestnáctkové, desítkové, se na pøípravku AT8LED (musí být pøi-
.DEF REG=R16 ;zaved REG jako R16 osmièkové nebo dvojkové soustavì. pojen na port B) LED odpovídající vývo-
Program lze krokovat klávesou F11.
LDI REG,0b11111111 ;REG samé 1 du PB2.
OUT DDRB,REG ;všechny bity portu B Tovární nastavení procesoru je ta-
Nahrání programu
;jsou výstupní kové, že jako zdroj hodin se používá
OUT PORTB,REG ;všechny bity portu B do vývojového kitu SDK2313 vestavìný RC oscilátor 8 MHz a pøed-
;mají log. 1 Protože simulace probìhla úspìš- dìlièka osmi. Proto bude pracovní
CBI PORTB,2 ;PB2 je v log.0
nì, zbývá nám již pouze vyzkoušet kmitoèet pouze 1 MHz. Pro použití
SKOK: RJMP SKOK ;zablokuj program program v reálném procesoru. pøipojeného krystalu musíme tlaèít-

Konstrukèní elektronika A Radio - 5/2006 11


Obr. 2.14.
Program
SDK2313

Obr. 2.15.
Nastavení
propojek
pro výbìr
vnìjšího
krystalu
jako zdroje
hodin

Obr. 2.12. Pøechod do editaèního


režimu
Jak vlastnì fungují podprogra- ní podprogramù. Pokud zavoláme pod-
my? Podprogram je nìkolik instrukcí program, uloží se do zásobníku ná-
spojených do logického celku. Podpro- vratová adresa. V rámci vykonávání
gram vyvoláme instrukcí RCALL. In- podprogramu je èasto tøeba uložit do
strukce RCALL addr nejdøíve uloží zásobníku další hodnoty (napøíklad zá-
Obr. 2.13. do zásobníku adresu následující in- lohovat obsahy registrù nebo chce-
Editace strukce a poté skoèí na adresu addr. me zavolat z daného podprogramu jiný
registru Každý podprogram musí být zakonèen podprogram), tyto hodnoty se pak ze
PORTB instrukcí RET. Tato instrukce ze zá- zásobníku pøeètou zpìt pøed návrato-
sobníku vyzvedne adresu døíve ulože- vou adresou. Pokud neudìláme nìja-
kem Propojky vyvolat dialog Nastave- nou instrukcí RCALL a na tuto adresu kou chybu (nezapomeneme vybrat zpìt
ní propojek. V tomto dialogu upravíte pøejde. To zpùsobí, že podprogram vy- stejný poèet údajù, jako jsme uložili),
nastavení propojek podle obr. 2.15. Pak volaný instrukcí RCALL se vykonáním vrátí se podprogram úspìšnì na místo,
bude jako zdroj hodin použit vnìjší instrukce RET vrátí zpìt na místo, od- odkud byl zavolán.
krystal. kud byl vyvolán. Je tedy jasné, že pøed použitím
Zbývá vysvìtlit, co je to zásobník. podprogramù musí být korektnì nasta-
Pozn.: Nezapomeòte projekt v progra- Jedná se o speciální typ pamìti s ar- ven ukazatel vrcholu zásobníku (SPL).
mu AVR Studio uložit položkou menu chitekturou LIFO (Last In, First Out) Umístìní musí být takové, aby nehrozi-
Project|Save Project. Zavøít projekt mù- - naposledy zapsaný údaj je vyzvednut lo pøepsání registrù nebo jiných pamì-
žete položkou Project|Close Project. jako první. Pro lepší pøehled je ukázáno ových buòek. Vzhledem k tomu (jak
uložení dvou èísel 10 a 20 do zásobní- jsme si již ukázali), že u procesorù
2.4. Pøíklad 2 ku. Uvažujme, že vstupnì/výstupní re- AVR se zásobník rozrùstá smìrem
k nižším adresám, je nejvýhodnìjší na-
gistr SPL (ukazatel vrcholu zásobní-
- blikání LED ku, pøedstavuje adresu pro uložení stavit registr SPL na hodnotu odpovída-
údaje do zásobníku) je nastaven na ad- jící poslední adrese datové pamìti
Druhý pøíklad nám pøedevším uká- resu 100. Viz obr. 2.16. RAM. V souboru TN2313DEF.INC
že, jak zajistit èekání v programu. Také Údaj se vždy zapisuje na adresu je pro tento úèel zaveden symbol
si ukážeme jak používat podprogramy. danou obsahem SPL. Proto se hodno- RAMEND (konec RAM). Vzhledem
Zadání: Pøipojte k vývojovému kitu ta 10 se uloží na adresu 100. Po ulože- k tomu, že registr SPL patøí do skupiny
SDK2313 na port B pøípravek AT8LED. ní prvního údaje se obsah SPL sníží
Konfigurujte všechny vývodu portu B o 1, tedy na hodnotu 99. Takže druhý
jako výstupy. Blikejte LED na vývodu údaj je uložen na adresu 99 a poté se
PB2 v intervalu zhruba 0,5 s (LED tedy SPL ještì jednou sníží. Koneèný stav
bude 0,5 s svítit a potom na dobu 0,5 s SPL je tedy 98. Dùležité je si uvìdomit,
zhasne; vše se neustále opakuje). že data není pøi ukládání nutno pøesou-
Ostatní LED zùstanou zhasnuty. vat. Místo toho se posouvá pozice SPL!
Pøi ètení dat ze zásobníku se nejdøí-
Hlavním úkolem tohoto zadání je re- ve obsah vstupnì/výstupního registru
alizace zpoždìní. Kratší zpoždìní se SPL zvýší o 1. Takže se pøeète údaj
obvykle realizuje instrukcí NOP. Její z adresy 99, zde je uložena hodnota
vykonání však trvá pouze 100 ns (pro 20. Následující ètení nejdøíve pøesune
uvažovaný hodinový kmitoèet 10 MHz), SPL na 100 a z této adresy pak pøeète
v zadání je však požadován podstatnì hodnotu 10.
delší interval. Vidíte tedy, že pøestože byla ulože-
Pro delší èekání bude tøeba provést na èísla v poøadí 10 a poté 20, pøi ètení
vìtší poèet instrukcí. Protože èekání se jsme hodnoty dostali v opaèném poøadí
používá èasto, je vhodné vytvoøit si pro (20 a potom 10).
tento úèel speciální podprogram (ruti- Možná se vám tento zpùsob správy
nu). Tak nemusíme kód èekací opera- zásobníku mùže zdát nelogický, je Obr. 2.16. Manipulace se zásobníkem
ce zapisovat pøi každém použití znovu. však velmi dùležitý pro opakované volá- a vstupnì/výstupním registrem SPL

12 Konstrukèní elektronika A Radio - 5/2006


Obr. 2.17. Zadání: Pøipojte k vývojovému kitu
Funkce XOR SDK2313 na port B pøípravek AT8LED.
a použití Realizujte bìžící svìtlo. Nejdøíve budou
této funkce LED zhasnuty. Poté se rozsvítí LED
pro negaci na vývodu PB7. V dalším kroku tato
stavu LED zhasne a rozsvítí se LED na vývo-
vývodu PB2 du PB6. Tak to pokraèuje a nakonec
svítí LED na vývodu PB0. Potom všech-
vstupnì/výstupních registrù, musíme s hodnotou 0b00000100 dostaneme ny LED zhasnou a celá sekvence za-
jeho nastavení provést pomocí instruk- 0b11111111 (všude jsou jednièky). Prv- ène zase od zaèátku. Každý dílèí krok
ce OUT. Proto tedy nejdøíve nahrajeme ní výsledek odpovídá stavu, kdy LED na trvá zhruba 0,5 s.
hodnotu RAMEND do registru REG vývodu PB2 svítí. Druhý výsledek od- Realizaci èekací rutiny jsme si uká-
(LDI REG,RAMEND) a poté ji instrukcí povídá stavu, kdy jsou všechny LED zali již v kapitole 2.4. Zrovna tak bylo
OUT pøeneseme do vstupnì/výstupní- zhasnuty. V našem programu je zave- v této kapitole vysvìtleno používání
ho registru SPL (OUT SPL,REG). den registr REG obsahující výchozí zásobníku i výchozí nastavení vstup-
Dále je tøeba konfigurovat port B jako hodnotu 0b11111111 a registr MASKA, nì/výstupního registru SPL.
výstupní (zápisem hodnoty 0b111111111 který obsahuje hodnotu 0b00000100. Takže již jen zbývá vyøešit postup-
do vstupnì/výstupního registru DDRB). Každý výluèný logický souèet provede- nou zmìnu bitu s úrovní „log. 0“ na por-
To jsem si již ukázali v kapitole 2.3: ný nad tìmito registry tedy neguje bit 2 tu B. K tomuto úèelu je nejvhodnìjší
LDI REG,0b11111111 a OUT DDRB,REG. výsledku: EOR REG,MASKA. použít instrukci rotace ROR. Bity regis-
Jak provedeme negování logic- Uvedená instrukce provede výluèný tru se pak spojí s pøíznakovým bitem C
kého stavu vývodu PB2? V instrukè- logický souèet mezi registry REG a a vytvoøí 9bitový registr. Po každém vy-
ním souboru procesorù AVR žádnou MASKA a výsledek je uložen do regist- konání instrukce ROR Rd (Rd je obec-
podobnou instrukci nenajdeme. Nejjed- ru REG (vždy platí, že výsledek opera- né oznaèení registru) je hodnota obsa-
nodušší bude negaci vypoèítat pomocí ce se ukládá do levého operandu). žená v pøíznakovém bitu C vložena
operace výluèného logického souètu A nyní se koneènì dostáváme k re- na místo nejvyššího bitu registru, dále
(zkratka XOR nebo EX-OR, symbol ⊕). alizaci èekací rutiny CEKEJ. Opakova- se bity posunou o jednu pozici dopra-
Pøipomeòme si tabulku této logické funk- né provádìní instrukcí (vykonáním vel- va (smìrem k nižším bitùm). Hodno-
ce a vysvìtleme si na ní, že se dá použít kého poètu instrukcí realizujeme dlouhý ta, která „vypadne“ z nejnižšího bitu, je
pro negaci. Všimnìte si (viz obr. 2.17): èasový interval) se nejèastìji øeší tak, pak uložena do pøíznakového bitu C.
• pokud je A = 0, pøechází stav B pøímo že použijeme nìkterý z registrù jako Žádný z bitù se tedy neztratí, informace
na výstup (první dva øádky tabulky), tzv. poèítadlo. Jeho obsah snížíme o 1 vlastnì jen koluje v takto vytvoøeném
• pokud je A = 1, pøechází stav B na vý- pomocí instrukce DEC. Pokud je obsah 9bitovém registru (viz obr. 2.18).
stup negovanì (poslední dva øádky ta- rùzný od nuly, pokraèujeme. Test nuly Pro lepší pøehled je požadovaná
bulky). zajišuje instrukce BRNE (skoè, když sekvence zachycena v jiné formì na
není nula). Pokud tedy registr CITAC3 obr. 2.19. Pokud chceme, aby byly LED
A nyní se zamìøme na pravou èást nastavíme napøíklad na hodnotu 100, nejdøíve zhasnuty, musí být výchozí ob-
obr. 2.17. Instrukce EOR vypoèítá vý- zajistí nám konstrukce uvedená od ná- sah registru roven 0b11111111. Dále
luèný logický souèet všech osmi bitù vìští CEKEJA 100násobné projití cyklu. výchozí stav bitu C musí být 0, jinak by
dvou registrù. Pokud první registr obsa- Výpoètem (a nahlédnutím do tabul- se nikdy nerozsvítila žádná z LED.
huje hodnotu 0b11111111 a druhý re- ky instrukcí) lze stanovit, že jeden Po první rotaci je nulová hodnota
gistr hodnotu 0b00000100 je výsle- prùchod cyklem zabere pøi krystalu uložena do nejvyššího bitu registru,
dek 0b11111011 (takže nula je pouze 10 MHz èas 300 ns. Pokud je obsah proto se po zápisu této hodnoty do
na místì bitu 2). Pokud tento výsle- registru CITAC3 pøed provedením vstupnì/výstupního registru DDRB roz-
dek (0b11111011) opìt “xorujeme” cyklu roven 100, odmìøí se interval
30 µs. Pro výchozí obsah CITAC3 = 0
Tab. 2.4. Program PROG_02.ASM bude interval nejdelší. Proè? První
PROG_02.ASM použití instrukce DEC CITAC3 totiž
.INCLUDE “tn2313def.inc“ zpùsobí podteèení obsahu registru Obr. 2.18. Instrukce ROR
;definice registrú (z 0 se pøejde na hodnotu 255) a tak se
cyklus vykoná vlastnì 256x.
.DEF REG=R16 ;obecný registr Pro delší èasy jsme museli vytvoøit
.DEF MASKA=R17 ;maska pro PB2
.DEF CITAC1=R18 ;registry 3 vnoøené cykly, tedy použít 3 zvláštní
.DEF CITAC2=R19 ;pro casovací registry. Podrobnìjším výpoètem do-
.DEF CITAC3=R20 ;rutinu CEKEJ jdeme k výsledku, že intervalu 0,5 s od-
povídá výchozí nastavení CITAC1 = 25.
LDIREG,RAMEND ;nastav SPL Další dva registry CITAC2 a CITAC3
OUTSPL,REG ;na konec RAM
LDIREG,0b11111111 ;nastav port B
se nulují instrukcí CLR.
OUTDDRB,REG ;jako výstupní Celý tento program, který je nazván
LDIMASKA,0b00000100 PROG_02.ASM, je vypsán v tab. 2.4.
;maska pro PB2 Postup založení projektu a pøelože-
SMYCKA: OUT PORTB,REG ;vystav výstupy ní pro pøípad ladìní a nahrání do vý-
RCALL CEKEJ ;pockej
EOR REG,MASKA ;negace PB2 vojového kitu byl již podrobnì popsán
RJMP SMYCKA ;a znovu v kapitole 2.3. Pøíklad najdete v [4]
v adresáøi PROGRAMY\PROG_02.
;cekací rutina (ceká asi 0,5 s):
CEKEJ: LDI CITAC1,25 ;CITAC1=25
CLR CITAC2
CLR CITAC3
;CITAC2=0
;CITAC3=0
2.5. Pøíklad 3
CEKEJA: DEC CITAC3
BRNE CEKEJA ;smycka 3
- bìžící svìtlo
DEC CITAC2 Tøetí pøíklad nám pøedevším ukazu-
BRNE CEKEJA ;smycka 2
DEC CITAC1 je použití instrukce rotace pro realizaci
BRNE CEKEJA ;smycka 1 bìžícího svìtla. Dále se seznámíme se Obr. 2.19. Rozkrokování celé
RET ;návrat vstupnì/výstupním registrem SREG. sekvence

Konstrukèní elektronika A Radio - 5/2006 13


Obr. 2.20.
Bity registru
SREG

Tab. 2.5. Program PROG_03.ASM na 0b), desítkové soustavì (pøedpona • Registr SPL - pøedstavuje ukazatel
PROG_03.ASM není vyžadována) nebo šestnáctkové na vrchol zásobníku. Nastavení tohoto
.INCLUDE “tn2313def.inc“ ;definice registrú soustavì (pøedpona $). registru je nezbytné pøed prvním použi-
• Instrukce OUT P,Rr - tato instrukce tím podprogramù. Obvyklé nastavení je
.DEF REG=R16 ;pracovní registr na konec pamìti RAM (symbol RAMEND).
.DEF CITAC1=R17 ;registry zapíše obsah registru na vstupnì/vý-
.DEF CITAC2=R18 ;pro casovací stupní registr. Takto lze napø. ovládat • Registr SREG - pøedstavuje stavový
.DEF CITAC3=R19 ;rutinu CEKEJ registry DDRB, PORTB, SPL. registr. Tedy registr indikující stav mik-
.EQU DDR=DDRB ;rízení smeru roøadièe po vykonání poslední instruk-
.EQU PORT=PORTB ;port • Instrukce CBI P,b a SBI P,b - tyto in-
ce. Význam jednotlivých bitù registru
strukce umožòují snadné vynulování
SREG (obr. 2.20).
LDI REG,RAMEND ;nastav SP nebo nastavení urèeného bitu vstup-
OUT SPL,REG ;na konec SRAM nì/výstupního registru. Tyto instrukce C - pøíznak pøeteèení. Indikuje pøete-
LDI REG,0b11111111 pak lze napø. použít pro ovládání vývo- èení pøi aritmetické nebo logické operaci.
OUT DDR,REG ;aktivuj výstupy dù portu B.
CLC ;0 do C
Z - pøíznak nulového výsledku. Indi-
SMYCKA: OUT PORT,REG ;pošli • Instrukce RJMP addr - instrukce sko- kuje nulový výsledek po aritmetické nebo
RCALL CEKEJ ;pockej 0,5 s ku. Program pøejde na místo, které je logické operaci.
ROR REG ;posun uvedeno návìštím zapsaným jako ope- N - pøíznak negativního výsledku. In-
RJMP SMYCKA ;a znovu
rand této instrukce. dikuje záporný výsledek po aritmetické
;cekací rutina (ceká asi 0,5 s) • Instrukce RCALL addr - vyvolá pod- nebo logické operaci.
CEKEJ: LDI CITAC1,25 ;CITAC1=25 program na urèeném návìští. V - pøíznak pøeplnìní èísla v druhém
CLR CITAC2 ;CITAC2=0 doplòku. Podporuje aritmetiku druhého
CLR CITAC3 ;CITAC3=0 • Instrukce RET - ukonèí podprogram a
CEKEJA: DEC CITAC3
doplòku.
vrátí se na místo, ze kterého byl pod-
BRNE CEKEJA ;smycka 3 program vyvolán. S - znaménkový bit. Indikuje znaménko
DEC CITAC2 èísla v druhém doplòku (S = N xor V).
BRNE CEKEJA ;smycka 2 • Instrukce EOR Rd,Rr - provede vý-
DEC CITAC1 luèný logický souèet dvou registrù. Tuto H - pomocný pøíznak pøeteèení. Indi-
BRNE CEKEJA ;smycka 1 instrukci lze napøíklad použít pro negaci kuje pøenos mezi dolní a horní polovi-
RET ;návrat stanoveného bitu (èi skupiny bitù). nou výsledku (dùležité zejména pøi prá-
ci s BCD èísly).
• Instrukce DEC Rd - sníží obsah re-
svítí LED na vývodu PB7. Nula se po- gistru. Po vynulování je nastaven pøí- T - kopírovací bit. Instrukce BLD a
stupnì posouvá smìrem k nižším bi- znakový bit Z (Zero, indikace nulového BST používají bit T jako zdrojový nebo
tùm, takže se mìní LED, která svítí. výsledku). cílový bit. Bit z registru mùže být kopí-
V programu jsou kromì zástupných rován do bitu T instrukcí BST a zase
symbolù pro registry zavedeny i symbo- • Instrukce BRNE addr - provede skok, uložen do bitu (tøeba i jiného) registru
ly DDR a PORT, která zastupují vstup- pokud je Z = 0 (BRanch Not Equal). instrukcí BST.
nì/výstupní registry DDRB a PORTB. Tj. tehdy, když pøedchozí operace ne-
mìla nulový výsledek (napø. když se I - globální povolení pøerušení. Pro
Zavedení takových symbolù je šikovné, po-
nevynuloval registr Rd pøi pøedchozím pøíjem pøerušení musí být tento bit na-
kud chceme program snadno upravit pro
použití instrukce DEC Rd). staven (I = 1). Individuální pøerušení lze
jiný port (pøedefinováním symbolu DDR
øídit dalšími registry. Je-li I = 0, je pøíjem
na DDRD a PORT na PORTD zajistíme • Instrukce ROR Rd - spojí pøíznakový
použití pøípravku AT8LED na portu D). pøerušení zakázán. Po vstupu do ob-
bit C s urèeným registrem a vše odro- sluhy pøerušení pøejde I = 0, tím je pøíjem
Celý tento program, který je nazván tuje o jeden bit vpravo.
PROG_03.ASM, je vypsán v tab. 2.5. dalších pøerušení zablokován. Vyvolá-
Pøíklad najdete v [4] v adresáøi PRO- • Instrukce NOP - nemá žádný vedlejší ním instrukce RETI z rutiny obsluhy
GRAMY\PROG_03. efekt (NO Operation), provedení trvá je- pøerušení se zajistí zpìtné nastavení
den hodinový cyklus (nejèastìji se pou- I = 1. Více informací o pøerušení najde-
Pozn.: Zkuste instrukci CLC pøesunout žívá pro realizaci krátkého zpoždìní). te v kapitolách 4, 5 a 6.
na místo návìstí SMYCKA. Místo bì-
žícího svìtla vznikne program, který
postupnì rozsvítí všechny LED. Nyní
obsah registru REG nekoluje, ale po-
stupnì se vynulují všechny jeho bity.
3. Tlaèítka a jejich obsluha
V této kapitole se seznámíme ku, používají se pull-up rezistory vesta-
2.6. Shrnutí s problematikou použití tlaèítek pro vìné na vývodech portù. Pokud je tla-
Nakonec si shrneme nejdùležitìj- ovládání programu, který je zapsán èítko rozpojeno, je z daného vstupu
ší poznatky z pøedchozho textu: v mikroøadièi. pøeètena úroveò „log. 1“. Po sepnutí tla-
èítka se pøeète úroveò „log. 0“. Pozor,
• Ovládání portu - pro ovládání portu
se používá trojice registrù. Jeden urèu- 3.1. ATSW - deska tlaèítek tlaèítka S0 až S3 nejsou nijak chránìna
proti zákmitùm, takže filtraci zákmitù
je smìr vývodù, druhý ovládá výstupy a musí provádìt ovládací program.
Dále uvedené pøíklady jsou testová-
tøetí slouží pro ètení vstupù. Jména Poslední tlaèítko oznaèené jako S4
ny pomocí pøípravku ATSW, který ob-
tìchto registrù pro port B jsou: DDRB,
sahuje 5 tlaèítek. Schéma pøípravku je je ošetøeno proti zákmitùm. Pokud je
PORTB a PINB.
na obr. 3.1. tlaèítko rozpojeno, je díky pull-up rezis-
• AT8LED - pøípravek AT8LED pøed- První ètyøi tlaèítka oznaèená jako S0 toru R1 na vstupu prvního invertoru (na
stavuje osmici LED. Aby daná LED sví- až S3 jsou pøipojena pøímo na datové vývod 3 IO1B) napìtí odpovídající úrov-
tila, musí být na jejím vývodu pøipojena linky D0 až D3. Pro správnou funkci ni „log. 1“. Po sepnutí tlaèítka se na
úroveò „log. 0“. musí být na vstupy D0 až D3 pøipojeny vstupu invertoru objeví úroveò „log. 0“.
• Instrukce LDI Rd,data8 - tato instruk- pull-up rezistory (jsou to rezistory, které První invertor vlastnì pracuje jako im-
ce slouží pro nahrání pøímé hodnoty jsou pøipojeny mezi datovou linku a pedanèní pøevodník, který napájí inte-
do registru (použitelné pouze pro regis- kladný pól napájení, které zdvíhají linku graèní èlánek R2, C2. Tento èlánek
try R16 až R31). Hodnotu lze zadávat do úrovnì „log. 1“). Vzhledem k tomu, potlaèuje zákmity tlaèítka. Signál na
napø. ve dvojkové soustavì (pøedpo- že takové rezistory nejsou na pøíprav- výstupu druhého invertoru (na vývodu 2

14 Konstrukèní elektronika A Radio - 5/2006


Tab. 3.2. Program PROG_04.ASM
PROG_04.ASM
.INCLUDE “tn2313def.INC“
;definice registrú

.DEF REG=R16 ;pracovní registr

SER REG ;REG=0b11111111


OUT DDRB,REG ;port B je výstupní
CLR REG ;REG=0b00000000
OUT DDRD,REG ;port D je vstupní
LDI REG,0b00001111 ;vývody PD0 až PD3
OUT PORTD,REG ;mají pull-upy

SMYCKA: IN REG,PIND ;cti stav spínacù


Obr. 3.3. Obrazec plošných spojù ORI REG,0b11100000 ;nahod bity D5 až D7
pøípravku ATSW (mìø.: 1 : 1) OUT PORTB,REG ;prenes na LED
Obr. 3.1. Schéma pøípravku ATSW RJMP SMYCKA ;zpet do smycky

3.3. Pøíklad 5
- tlaèítkem zapni/vypni
Tento pøíklad ukazuje filtraci zákmi-
tù pro jedno tlaèítko.
Zadání: Pøipojte k vývojovému kitu
SDK2313 na port B pøípravek AT8LED.
Na port D pøipojte pøípravek ATSW.
Pomocí spínaèe S0 (na vývodu PD0)
ovládejte LED pøipojenou na vývod
Obr. 3.4. Rozmístìní souèástek PB0. První stisk tlaèítka rozsvítí LED,
Obr. 3.2. Reálné prùbìhy signálu na desce pøípravku ATSW druhý stisk tlaèítka LED zhasne atd.
na tlaèítku S4 a na vývodu D4 sejmuté Ošetøete programovì zákmity tlaèítka.
digitálním osciloskopem. Zákmity jsou ATSW dal použít. Zatím nebude øešeno
odstranìny integraèním èlánkem odstranìní zákmitù. Pøednì je tøeba správnì konfiguro-
vat oba porty. Port B musí být konfigu-
IO1A) je pak prostý zákmitù. Invertory Zadání: Pøipojte k vývojovému kitu rován jako výstupní, LED jsou zhasnu-
jsou zapojeny dva, takže pro rozpojené SDK2313 na port B pøípravek AT8LED. ty. Vývod PD0 bude konfigurován jako
tlaèítko je na vstupu D4 úroveò „log. 1“ Na port D pøipojte pøípravek ATSW. vstup s pull-upem.
a pro sepnuté úroveò „log. 0“. Použité Pøenášejte stav tlaèítek na LED. Pokud A nyní již k realizaci ètení tlaèítka S0
invertory jsou vybaveny Schmittovými je tlaèítko sepnuto, bude svítit odpoví- tak, aby se potlaèily zákmity.
klopnými obvody, což je nutné, proto- dající LED. Pokud je tlaèítko uvolnìno, Stisk tlaèítka nastane, když z vývo-
že integraèní èlánek zmenšuje strmost LED nesvítí. du PD0 pøeèteme úroveò „log. 0“. Po-
hran èíslicového signálu. kud je PIND,0 roven 1, tlaèítko není
Na obr. 3.2 je digitálním oscilosko- Konstrukce programu není pøíliš stlaèeno. Zákmity potlaèíme tak, že
pem zachycena situace pøi rozpojení složitá. Pro použití pøípravku je tøeba stav vývodu PD0 vzorkujeme dvakrát.
tlaèítka S4. Nejdøíve je tlaèítko sepnuto pomocí registru DDRD zvolit vstupní Mezi jednotlivými vzorky musí být do-
(na S4 je úroveò „log. 0“), pak se roze- režim pro vývody PD0 až PD4 (nebo stateèný odstup. Postaèí asi 10 ms.
pne (pøejde do úrovnì „log. 1“). pro celý port). Dále musíme nechat pøi- Jsou-li tedy oba vzorky nulové, znaèí
Horní prùbìh je napìtí na tlaèítku se pojit pull-up rezistory na vývody PD0 to, že tlaèítko bylo skuteènì stisknuto.
zøetelnými zákmity. až PD3 (pomocí registru PORTD). Vý- Prakticky jediný zpùsob, jak otesto-
Dolní prùbìh je na vývodu D4 za in- vod PD4 pull-up rezistor nepotøebuje, vat stav vstupnì/výstupního registru, je
tegraèním èlánkem a invertorem IO1A. protože je napájen z invertoru. Port B použít instrukce pøeskoku SBIC nebo
Zákmity jsou odstranìny. nakonfigurujeme jako výstupní (pomocí SBIS (viz kapitolu 2.1 nebo souhrn uve-
Pøípravek ATSW je zkonstruován na registru DDRB). dený v kapitole 3.5). Tyto instrukce pøe-
desce s jednostrannými plošnými spo- Pøipomeòme, že stisknuté tlaèítko skoèí následující instrukci v pøípadì, že
ji. Obrazec spojù je na obr. 3.3, rozmís- odpovídá úrovni „log. 0“ pøeètené z da- je urèitý bit uvedeného vstupnì/výstupní-
tìní souèástek na desce je na obr. 3.4. ného vstupu. Podobnì LED svítí pøi ho registru vynulován nebo nastaven.
úrovni „log. 0“. Staèí tedy sejmou stav Nejdøíve èekáme, až se bit PIND,0
Seznam souèástek pro ATSW vývodù portu D (ètením registru PIND) stane nulovým (instrukcí SBIC PIND,0).
a pøenést jej na port B (zápisem do re- Pokud je PIND,0 roven 1, nepøeskoèí
(cena asi 30 Kè)
gistru PORTB). Horní 3 bity musí být se instrukce RJMP SMYC0 a cyklus
R1, R2 10 kΩ/1 %/0,6 W tedy stále vyèkává na vynulování bitu
C1, C2 100 nF/63 V, keramický pøed zápisem na port B nastaveny do
stavu „log. 1“ (v horních tøech bitech re- PIND,0. V opaèném pøípadì, když je
D1 až D8 LED, 5 mm, 200 mcd PIND,0 roven 0, se pokraèuje dále.
IO1 74HCT14 gistru PIND nejsou žádné užiteèné sig-
Nyní je tøeba provést ustálení.
S0 až S4 tlaèítko P-B1720B nály, proto musí horní 3 LED zùstat
Po ubìhnutí dostateènì dlouhého inter-
P1 PSL10 (MLW10G) zhasnuté). K tomuto úèelu se použije
valu totiž zákmity pominou a je možné
deska s plošnými spoji ATSW instrukce ORI, maska je 0b11100000.
provést druhé vzorkování. Ustálení rea-
Program je nazván PROG_04.ASM a lizujeme podprogramem USTAL, který
je vypsán v tab. 3.2. Pøíklad najdete v [4]
3.2. Pøíklad 4 v adresáøi PROGRAMY\PROG_04.
vyvoláme instrukcí RCALL USTAL.
Nakonec testujeme druhý vzorek té-
- sledování stavu tlaèítek Test programu
mìø stejným zpùsobem, jako ten první.
Nyní je tøeba aktualizovat stav LED
V prvním pøíkladu si pøedvedeme, Pøipojte pøípravky na urèené porty (bylo by totiž nešikovné, aby se stav
jak je tøeba konfigurovat vstupnì/vý- a sledujte stav LED podle stisknu- LED mìnil až po uvolnìní tlaèítka).
stupní registry portu, aby se pøípravek tých tlaèítek. Ètením obsahu registru PORTB lze

Konstrukèní elektronika A Radio - 5/2006 15


zjistit stav LED (IN LED,PORTB),
potom tento údaj “xorujeme” s mas-
3.4. Pøíklad 6 Tab. 3.4. Program PROG_06.ASM

kou 0b00000001 (maska zneguje - ovládání tøemi tlaèítky PROG_06.ASM


.INCLUDE “tn2313def.inc“ ;definice registrú
pouze bit 0; LDI REG,0b00000001 a .DEF REG=R16 ;pracovní registr
EOR LED,REG) a zapíšeme zpìt Tento pøíklad ukazuje, jak realizovat .DEF LED=R17 ;pro ctení LED
(OUT PORTB,LED). Tím dosáhneme vìtvení programu podle stisknutého tla- .DEF CNT1=R0 ;pocítadla
zmìny stavu LED na opaèný (svítí/ne- èítka. .DEF CNT2=R1 ;pro USTAL
svítí), po každém stisku tlaèítka. Zadání: Pøipojte k vývojovému kitu SER REG ;REG=0b11111111
Nakonec je tøeba poèkat na uvolnìní OUT DDRB,REG ;port B je výstupní
SDK2313 na port B pøípravek AT8LED.
OUT PORTB,REG ;LED zhasnuty
tlaèítka (pøechod bitu PIND,0 do sta- Na port D pøipojte pøípravek ATSW. CLR REG ;REG=0b00000000
vu „log. 1“). Pokud by tento test chybìl, Spínaèi S0 až S2 mìòte stav LED. OUT DDRD,REG ;port D je vstupní
mìnil by se pøi delším stisku tlaèítka S0 Tlaèítko S0 nuluje všechny LED. LDI REG,0b00000111
stav LED automaticky až do jeho uvol- Tlaèítko S1 zvýší èíslo zobrazené po- OUT PORTD,REG ;pull-upy pro S0.. S2
nìní. Test uvolnìní tlaèítka je realizován mocí LED o 1. Tlaèítko S2 sníží èíslo LDI REG,RAMEND ;nastav SPL
cyklem od návìští SMYC1 (realizace je zobrazené pomocí LED o 1. Ošetøete OUT SPL,REG ;na konec RAM
podobná jako u SMYC0). zákmity. Zabraòte chybné funkci pøi CLR LED ;nuluj LED
Program je nazván PROG_05.ASM a souèasném stisku více tlaèítek.
CYKL: ;hlavní smycka:
je vypsán v tab. 3.3. Pøíklad najdete v [4] ;cekej na stisk:
v adresáøi PROGRAMY\PROG_05. Pøednì je tøeba správnì konfiguro-
vat porty. Port B je konfigurován jako SMYC0: IN REG,PIND ;cti stav portu D
COM REG ;neguj stavy
Test programu výstupní, port D je vstupní (spodní tøi ANDI REG,0b00000111;zamaskuj další bity
bity musí mít aktivované pull-up rezisto- BREQ SMYC0 ;pro REG=0 se vrat
Pøipojte pøípravky na urèené porty, ry). Obsah registru LED se vynuluje, RCALL USTAL ;ustal
sledujte stav LED na vývodu PB0 v zá- tento registr udržuje stav všech LED IN REG,PIND ;cti stav portu D
vislosti na stisku tlaèítka S0. Každý (výchozí stav po resetu bude 0). COM REG ;neguj stavy
v poøadí lichý stisk LED rozsvítí, sudý Cykly SMYC0 a SMYC1, které od- ANDI REG,0b00000111;zamaskuj další bity
stisk LED zhasne. straòují zákmity tlaèítek, jsou zapsány BREQ SMYC0 ;pro REG=0 se vrat
Pozn.: Nevýhodou uvedené realizace podobnì jako v pøíkladu 5 (viz kapito-
;test spínacù:
je fakt, že program je blokován prová- lu 3.3). Rozdíl spoèívá v tom, že testu- CPI REG,0b00000001 ;test S0
dìním testovacích operací. Nemùže jeme stavy více tlaèítek najednou. Nej- BREQ NULUJ
tak vykonávat nic jiného než reakci døíve se sejme hodnota celého portu D CPI REG,0b00000010 ;test S1
na tlaèítko. Vhodnìjší realizace spoèívá (IN REG,PIND) a zneguje se instrukcí BREQ PRIDEJ
COM REG (po negaci odpovídá stlaèe- CPI REG,0b00000100 ;test S2
v použití pøerušení (program neèeká,
né tlaèítko bitu s hodnotou 1, to pro BREQ UBER
stiskem tlaèítka dojde k pøerušení stá- RJMP CYKL ;jiná varianta
vajícího programu). Použití pøerušení snažší testování). Dále je nutno sta-
se budeme vìnovat v kapitole 4. vy ostatních vývodù portu D zamas- ;reakce pro S0:
kovat logickým souèinem s maskou NULUJ: CLR LED ;nuluj stav
0b00000111 (vynuluje všechny bity kro- RJMP NASTAV
Tab. 3.3. Program PROG_05.ASM
mì bitù 0 až 2, použijeme instrukci AN-
PROG_05.ASM DI REG,0b00000111). Nyní se musí ;reakce pro S1:
.INCLUDE “tn2313def.inc“ ;definice registrù zjistit, zda bylo stlaèeno alespoò jedno PRIDEJ: MOV REG,LED ;zvyš obsah LED
.DEF REG=R16 ;pracovní registr INC REG ;pres REG
.DEF LED=R17 ;pro ctení LED
tlaèítko (to pak v registru REG musí být
BREQ CYKL ;pro REG=0 skocí
.DEF CNT1=R0 ;pocítadla alespoò jeden bit nenulový; tedy obsah MOV LED,REG ;jinak ulož do LED
.DEF CNT2=R1 ;pro USTAL registru se nesmí rovnat nule) pomocí RJMP NASTAV
instrukce BREQ SMYC0 (vrátí se
SER REG ;port B na návìští SMYC0 v pøípadì, že je ob- ;reakce pro S2:
OUT DDRB,REG ;je výstupní
OUT PORTB,REG ;LED jsou zhasnuty sah registru REG nulový - nebylo stisk- UBER: MOV REG,LED ;sniž obsah LED
CBI DDRD,0 ;PD0 je vstup nuto žádné tlaèítko). DEC REG ;pres REG
SBI PORTD,0 ;PD0 má pull-up Pak se poèká (pomocí rutiny USTAL) CPI REG,255 ;test podtecení
LDI REG,RAMEND ;nastav SPL BREQ CYKL ;pri podtecení skoc
a vzorkování se ještì jednou opakuje.
OUT SPL,REG ;na konec RAM MOV LED,REG ;jinak ulož do LED
Pokud tedy skuteènì bylo stlaèeno RJMP NASTAV
CYKL: ;hlavní smycka jedno z tlaèítek, musí se zjistit které.
;ceká na stisk tlacítka: Pro tento úèel lze použít instrukci CPI, ;zapíše stav reg. LED:
SMYC0: SBIC PIND,0 ;cekej na PD0=0 která porovnává obsah registru REG NASTAV: COM LED ;neguj pro zobrazení
RJMP SMYC0 ;jinak se vrat s hodnotami odpovídajícími bitovým OUT PORTB,LED ;zapiš
RCALL USTAL ;ustal hodnotám stisknutých tlaèítek (pro S0 COM LED ;neguj zpet
SBIC PIND,0 ;cekej na PD0=0
RJMP SMYC0 ;jinak se vrat
0b00000001, pro S1 0b00000010 a
;cekej na uvolnení:
;aktualizace stavu LED: pro S2 0b00000100). Pokud je jedna SMYC1: IN REG,PIND ;cti stav portu D
IN LED,PORTB ;cti stav LED z hodnot rovna obsahu registru, pøejde COM REG ;neguj stavy
LDI REG,0b00000001 ;maska pro negaci se na jedno z návìští NULUJ, PRIDEJ ANDI REG,0b00000111;zamaskuj další bity
EOR LED,REG ;zneguj bit 0 nebo UBER. V opaèném pøípadì (což BRNE SMYC1 ;pro REG<>0 se vrat
OUT PORTB,LED ;zapiš stav LED znaèí, že bylo stisknuto více tlaèítek RCALL USTAL ;ustal
;ceká na uvolnení tlacítka: IN REG,PIND ;cti stav portu D
SMYC1: SBIS PIND,0 ;cekej na PD0=1 souèasnì) je ètení opakováno tak, že
se program vrátí na návìští CYKL. COM REG ;neguj stavy
RJMP SMYC1 ;jinak se vrat ANDI REG,0b00000111;zamaskuj další bity
RCALL USTAL ;ustal Volba NULUJ znaèí vynulování re- BRNE SMYC1 ;pro REG<>0 se vrat
SBIS PIND,0 ;cekej na PD0=1 gistru LED a pøechod na návìští NA- RCALL USTAL ;ustal
RJMP SMYC1 ;jinak se vrat STAV (zobrazí nulu na LED). RJMP CYKL ;návrat do smycky
RJMP CYKL ;návrat do smycky
Volba PRIDEJ se pokusí zvýšit ob-
;rutina pro ustálení: sah registru LED. Je jisté, že musíme ;rutina pro ustálení:
USTAL: CLR CNT1 ;CNT1=0 zabránit pøeteèení obsahu tohoto regis- USTAL: CLR CNT1 ;CNT1=0
CLR CNT2 ;CNT2=0 tru (po maximální hodnotì 255 nebo CLR CNT2 ;CNT2=0
USTALS: DEC CNT2 ;sniž CNT2 USTALS: DEC CNT2 ;sniž CNT2
chcete-li 0b11111111 následuje 0). BRNE USTALS ;test konec
BRNE USTALS ;test konec
DEC CNT1 ;sniž CNT1 Proto se zvýší kopie registru LED na- DEC CNT1 ;sniž CNT1
BRNE USTALS ;test konec hraná do registru REG. V pøípadì, že je BRNE USTALS ;test konec
RET ;návrat výsledek nenulový (po pøiètení 1 nedo- RET ;návrat

16 Konstrukèní elektronika A Radio - 5/2006


šlo k pøeteèení), je nová hodnota sku- • Instrukce INC Rd - zvýší obsah dané- • Instrukce BREQ addr (BRanch if
teènì pøenesena do registru LED. ho registru o 1. Pokud je hodnota re- Equal) - provede skok, pokud je výsle-
Volba UBER je realizována podob- gistru pøed provedením této instrukce dek pøedchozí operace roven nule (tedy
nì. Nyní se však musí testovat podte- rovna 255, dojde k pøeteèení (nová pro pøípad Z = 1). Tato instrukce se obvyk-
èení (pøi odeèítání 1 od 0 je výsledek hodnota bude 0). Pøíznak pøeteèení le používá po instrukci porovnání (CPI
255). Testování hodnoty 255 je prove- (tedy bit C registru SREG) však nebu- nebo CP). Pokud jsou porovnávaná èís-
deno instrukcí CPI. de nastaven (takže je vhodnìjší testo- la stejná, nastaví se pøíznakový bit Z.
Pokud je tedy vše v poøádku, mùže vat pøíznak Z, který indikuje nulový vý- • Instrukce CPI Rd,data8 - porovná ob-
se nová hodnota pøenést na LED (ná- sledek pøedchozí operace). sah registru Rd s urèenou pøímou hod-
vìští NASTAV). Pøipomeòme, že kaž- • Instrukce DEC Rd - sníží obsah re- notou data8. Pokud je Rd = data8
dá LED svítí pøi úrovni „log. 0“. Proto gistru o 1. Pokud je hodnota registru je stav pøíznakových bitù po prove-
musíme obsah registru LED pøed zápi- pøed provedením této instrukce rov- dení této instrukce: Z = 1, C = 0. Je-li
sem na port B znegovat. Pro další po- na 0, dojde k podteèení (nová hodnota Rd > data8 je stav pøíznakù po prove-
užití registr LED znegujeme ještì jed- bude 255). Opìt se nenastaví pøíznako- dení instrukce: Z = 0, C = 0. Je-li
nou (po zápisu na pøípravek AT8LED). vý bit C. Rd < data8 je stav pøíznakù po prove-
Program je nazván PROG_06.ASM a dení instrukce: Z = 0, C = 1.
• Instrukce BRNE addr (BRanch if Not
je vypsán v tab. 3.4. Pøíklad najdete v [4] Equal) - provede skok, pokud je výsle- • Instrukce SBIC P,b - pøeskoèí násle-
v adresáøi PROGRAMY\PROG_06. dek pøedchozí operace rùzný od nuly dující instrukci, pokud je bit vstupnì/vý-
(tedy pro pøípad Z = 0). Tato instrukce stupního registru P,b vynulován.
Test programu se obvykle zapisuje po instrukci DEC, • Instrukce SBIS P,b - pøeskoèí násle-
Pøipojte pøípravky na urèené porty. která snižuje obsah nìkterého registru. dující instrukci, pokud je bit vstupnì/vý-
Stiskem tlaèítka S0 se nuluje stav LED. Tak lze realizovat cyklus. stupního registru P,b nastaven.
Stiskem tlaèítka S1 se zvýší zobrazené
èíslo. Stiskem tlaèítka S2 se sníží zob-
razené èíslo.
Èíslo zobrazované LED vlastnì od-
4. Pøerušení a režimy snížené spotøeby
povídá poètu stiskù tlaèítka S1, èíslo je
vyjádøeno ve dvojkové soustavì. Pro- V této kapitole si jednak vysvìtlí- pøerušení blokován. Kromì toho lze
gram pracuje jako èítaè impulsù. me pojem pøerušení. Dále se bude- všechna pøerušení blokovat centrálnì
me vìnovat výkladu režimù snížené pomocí pøíznakového bitu I (z regist-
spotøeby, které mají velký význam ru SREG, viz kapitolu 2.6).
3.5. Shrnutí pøi napájení zaøízení z baterií. Uve-
dený pøíklad je skloubením pøeruše- Význaèné adresy
Nakonec si shrneme instrukce ní a použití režimu power-down.
použité v pøedchozích pøíkladech: U mikroøadièù AVR jsou adresy ru-
tin obsluhy pøerušení stanoveny pevnì.
• Instrukce SER Rd - nastaví všech-
ny bity urèeného registru (stav bude 4.1. Pøerušení Proto je poèátek programové pamìti
vyhrazen tzv. význaèným adresám.
0b11111111). Pøerušení je neodmyslitelnì spoje- Z tab. 4.1 je zøejmé, že první adresa
• Instrukce CLR Rd - vynuluje všech- no s používáním vestavìných periferií v programu je vyhrazena resetu. Tedy
ny bity urèeného registru (stav bude (èítaè/èasovaè, sériový kanál, analogo- po resetu pøejde procesor na adre-
0b00000000). vý komparátor). Mikroøadiè ATtiny2313 su $0000. Proto musí být první instruk-
• Instrukce COM Rd - zneguje bity ur- disponuje i deseti vstupy vnìjšího pøe- ce programu uložena právì na této ad-
èeného registru. Instrukce byla použita rušení, takže dokáže reagovat i na pod- rese (pokud není stanoveno jinak,
pro negování hodnot zapisovaných nìty z vnìjšího okolí. zajistí to pøekladaè automaticky - proto
na pøípravek AT8LED nebo pro negaci jsme tento problém u døíve uvedených
hodnot pøeètených z pøípravku ATSW Obecnì o pøerušení pøíkladù zatím neøešili). Pokud nepo-
(u obou pøípravkù je totiž aktivní úrovní Pøerušení je prostøedek, kterým mù- užíváme pøerušení, lze od této adresy
„log. 0“). že procesor reagovat na stavy periferií. umístit první instrukci. Pokud však pøe-
• Instrukce IN Rr,P - ète stav vstupnì/ Pøirovnejme pøerušení k lidské èin- rušení používáme, musíme na adre-
/výstupního registru P do registru Rr. nosti: Víme, že nám má dnes nìkdo su $0000 umístit skok na návìští, kam
Nejèastìji se používá pro ètení stavu zatelefonovat. Pokud stále bedlivì èe- zapíšeme první instrukci inicializaèní
vývodù portu (napø. pro port D se jedná káme na zavolání a kromì toho se ne- rutiny. Podobnì na adresu $0001 zapí-
o formu IN Rr,PIND). vìnujeme již nièemu jinému, ztratíme šeme skok na první instrukci obsluhy
• Instrukce ORI Rd,data8 - provede bi- spoustu èasu. Na zavolání však mùže- pøerušení INT0, atd.
tový souèet registru s udanou maskou. me èekat efektivnìji, napøíklad èteme
Tato instrukce byla použita pro nasta- knihu. V okamžiku, kdy zazvoní telefon, Jak je pøerušení obslouženo
vení bitù odpovídajících LED, které mají zvedneme sluchátko a vìnujeme se te- Program používající pøerušení
zùstat zhasnuty. lefonování. Potom se vrátíme k pùvodní musí definovat minimálnì dvì význaè-
• Instrukce ANDI Rd,data8 - provede èinnosti a pokraèujeme ve ètení na né adresy: inicializaci (úèelem je povolit
bitový souèin registru s udanou mas- místì, kdy jsme pøestali. pøerušení a spustit hlavní program) a
kou. Tato instrukce se používá k za- Èemu to odpovídá v øeèi programá- obsluhu pøerušení.
maskování bitù. Bit, který je v masce torù: Procesor vykonává tzv. hlavní V inicializaèní rutinì zajistíme po-
nulový, se ve výsledném souèinu vynu- program. Pokud dojde k pøerušení volení pøerušení (nastavením odpovída-
luje. Instrukce byla použita k vynulování (napøíklad aktivaci vnìjšího pøerušova- jící masky) a dále vykonáním instrukce
bitù, které nemìly smysl pro následné cího vstupu), pøejde program do tzv. SEI (nastaví I = 1) povolíme pøeruše-
testy tlaèítek. rutiny obsluhy pøerušení. Po jejím ní globálnì. Poté spustíme hlavní pro-
• Instrukce EOR Rd,Rr - provede vý- dokonèení se program vrací do hlavní- gram.
luèný bitový souèet dvou registrù (for- ho programu na místo, kde bylo pøeru- Pokud se aktivuje pøerušení, bude
ma pro registr a masku udanou v podo- šení aktivováno. pøednì uložena adresa aktuálnì vyko-
bì pøímé hodnoty není v instrukèním Co když ale pøerušení nechceme návané instrukce do zásobníku. Podle
souboru procesorù AVR k dispozici; nebo nemùžeme obsloužit? Každé typu pøerušení se pøejde na pøíslušnou
proto se maska musí nahrát do dalšího pøerušení má tzv. masku. Je-li maska význaènou adresu (adresy $0001 až
registru). Vhodné pro negaci jednoho nastavena, je pøerušení povoleno. Po- $0012). Zde musí být instrukce RJMP,
nebo více bitù. kud je maska vynulována, je pøíjem která skoèí na obsluhu pøerušení. Pøed

Konstrukèní elektronika A Radio - 5/2006 17


Tab. 4.1. Význaèné adresy u ATtiny2313 vý, požadavek aktivace pøerušení se
nezapamatuje (zapamatování platí pou-
ze pro vstup citlivý na hranu).
Pomocí bitù registru MCUCR (obr.
4.3) lze konfigurovat podmínku, která
aktivuje pøerušení vnìjším vstupem.
Z hlediska pøerušení mají v registru
MCUCR význam pouze bity ISC00,
ISC01, ISC10 a ISC11. Význam dal-
ších bitù je spojen s režimy snížené
spotøeby (viz kapitolu 4.2).
Z tab. 4.2 a tab. 4.3 je zøejmý úèel
bitù ISC00, ISC01 (ovládají vstup INT0)
a ISC10, ISC11 (ovládají vstup INT1).
Pøerušovací vstupy mohou být tedy cit-
livé na úroveò („log. 0“) nebo na hranu
(vzestupnou èi sestupnou).
Pro vstup citlivý na úroveò platí, že
pro aktivaci pøerušení musí být úroveò
„log. 0“ pøiložena do dokonèení aktuál-
nì provádìné instrukce (v nejhorším
pøípadì tedy po dobu ètyø strojních cyk-
lù - nejdelší instrukce se totiž provádí
4 strojní cykly). Vstup citlivý na úroveò
tím však ještì procesor zakáže pøíjem programu), proto je nutné nastavit bude generovat pøerušení tak dlouho,
dalších pøerušení (to znamená, že ob- správnì registr SPL. dokud na nìm bude úroveò „log. 0“.
sluha pøerušení nemùže být pøerušena Pro vstup citlivý na hranu platí, že
aktivací jiného pøerušení). Vnìjší pøerušení INT0, INT1 pro aktivaci musí být pøivedený impuls
Pøestože je pøerušení povoleno (jak delší než jeden strojový cyklus (tedy
Dosud jsme ještì nevyložili èinnost
maskou, tak i pøíznakovým bitem I), ne- delší než 100 ns pro hodinový kmito-
žádné z vestavìných periferií, které
musí být okamžitì obslouženo. Do hry èet 10 MHz). U kratších impulsù není
mohou používat pøerušení. Proto bude
ještì vstupuje tzv. priorita pøerušení. dále uvedený pøíklad založen na použití vygenerování pøerušení zajištìno.
Pøednost mají pøerušení s nižšími adre- vnìjších vstupù pøerušení. Dále jsou Pøíklad použití najdete v kapitole 4.3.
sami vektorù (nejvyšší prioritu tedy má tedy popsány registry související se
RESET, dále vstupy INT0, potom INT1 vstupy vnìjšího pøerušení. Vnìjší pøerušení PCINT0 až PCINT7
atd. Nejnižší prioritu má pøerušení Vnìjší pøerušení jsou spouštìna Kromì vnìjších pøerušení spouštì-
od jednotky WDT). vstupy INT0 a INT1. Jedná se o vývody ných ze vstupù INT0 a INT1 je k dispo-
Pøi obsluze pøerušení je nezbytnì PD2 a PD3 (viz obr. 1.1). Vnìjší vstupy zici dalších až 8 vstupù pøerušení
nutné uchovat obsahy registrù pøed tím, lze spouštìt nábìžnou nebo sestupnou PCINT0 až PCINT7 (odpovídají vývo-
než se jejich hodnoty zmìní. Pøed hranou nebo úrovní „log. 0“ (viz dále dùm PB0 až PB7).
ukonèením obsluhy pøerušení totiž uvedený popis registru MCUCR). Pøerušení se v tomto pøípadì aktivu-
musí být obsahy registrù obnoveny (ji- Pomocí maskovacích bitù registru je, když se zmìní stav vývodu. Sché-
nak se do hlavního programu vrátí GIMSK (obr. 4.1) lze povolovat (1) ma detekèní logiky je na obr. 4.4.
zmìnìné registry a program se prav- nebo zakazovat (0) aktivaci pøerušení
dìpodobnì zaène chovat neoèekáva- Signál z vývodu PCINTx (x je 0 až
z vnìjších vstupù INT0, INT1. 7) je zachycen v obvodu latch a porov-
ným zpùsobem). Do této skupiny patøí Bit INT0 povoluje (1)/zakazuje (0)
i registr SREG, který obsahuje pøízna- nán s pøedchozí hodnotou uloženou
aktivaci pøerušení ze vstupu INT0. Bit
kové bity (mohou se mìnit v dùsledku v registru. Hradlo EX-OR detekuje roz-
INT1 povoluje (1)/zakazuje (0) aktivaci
vykonávání instrukcí). Pro uchování/ob- pøerušení ze vstupu INT1. díl mezi souèasnì zachycenou hodno-
novení obsahu registrù se obvykle pou- Pomocí pøíznakových bitù registru tou a døíve uloženým stavem.
žívá zásobník (ve høe jsou tedy instruk- EIFR (obr. 4.2) se udržují požadavky Pokud se obì hodnoty liší, je na vý-
ce PUSH a POP). aktivace vnìjších pøerušovacích vstupù stupu hradla EX-OR stav „log. 1“. Sig-
Obsluha pøerušení je zakonèena in- v okamžiku, kdy je pøerušení zakázáno nál dále postupuje do hradla AND, kde
strukcí RETI. Tato instrukce (podobnì buï odstavením masky (GIMSK) nebo je maskován bitem PCINTx (každý
jako instrukce RET) vyjme ze zásobní- globálním zákazem pøerušení (I = 0). ze vstupù pøerušení má maskovací bit
ku návratovou adresu a dále povolí pøe- Takže po povolení pøerušení mohou být uložený v registru PCMSK). Pokud je
rušení (pozor, instrukce RET pøerušení obsloužena ta pøerušení, která požada- bit PCINTx z registru PCMSK nasta-
nepovoluje), takže po obsluze daného vek aktivace uložila do registru EIFR. vený (1), projde stav „log. 1“ až na vý-
pøerušení lze obsloužit další. Poté se Bit INTF0 zapamatovává požada- stup hradla AND.
již øízení programu vrátí do místa, kde vek aktivace pøerušení ze vstupu INT0. Nakonec se výstupy všech detek-
byl program pøerušen. Bit INTF1 zapamatovává požadavek torù, které jsou pøipojené na vývody
Pøerušení využívá zásobník (pro aktivace pøerušení ze vstupu INT1. Je-li PCINT0 až PCINT7, sèítají v hradle
uložení návratové adresy do hlavního vstup konfigurován jako úrovòovì citli- OR. Bylo-li pøerušení detekováno ales-

Obr. 4.1.
Registr GIMSK

Obr. 4.2.
Registr EIFR

Obr. 4.3.
Registr MCUCR

18 Konstrukèní elektronika A Radio - 5/2006


Tab. 4.2. Citlivost vstupu INT0 Tab. 4.3 Citlivost vstupu INT1

poò na jednom z vývodù, postupuje Je-li aktivován reset, procesor se Tab. 4.4. Volba režimu snížené spotøe-
signál na výstup tohoto hradla. „probudí“ a pøedá programové øízení by pomocí bitù SM0, SM1
Dále jsou zaøazeny tøi registry, které na adresu $0000. Reset zpùsobí na-
vlastnì plní úèel zpožïovací linky. Tak- stavení vstupnì/výstupních registrù
že požadavek pøerušení je držen 4 ho- na výchozí hodnoty.
dinové takty procesoru. Výstup posled-
ního registru pøedstavuje pøíznak PCIF, Idle mode (režim neèinnosti)
který indikuje pøerušení od jednoho Jsou-li bity SM0, SM1 vynulovány,
ze vstupù PCINT0 až PCINT7. pøejde mikroøadiè po vykonání instrukce Vstupy vnìjšího pøerušení INT0,
Jak bylo již uvedeno, s pøerušením SLEEP do režimu neèinnosti: INT1 musí být v režimu Power-down
od vstupù PCINT0 až PCINT7 souvisí konfigurovány jako úrovòovì citlivé, po-
• Jádro procesoru je zastaveno (nejsou
bity PCIE, PCIF a registr PCMSK. Vy- kud se mají použít k procitnutí mikroøa-
vykonávány instrukce),
svìtleme si jejich funkci: dièe. Dùvod je prostý. Hranová citlivost
• èítaèe/èasovaèe, USART, analogový
• PCIE - pokud je bit PCIE = 1 (z regis- je zajišována vzorkováním vstupù
komparátor, Watchdog, jednotka USI a
tru GIMSK, viz obr. 4.1) a I = 1, je po- INT0, INT1 synchronnì s kmitoètem
pøerušovací systém zùstávají aktivní.
voleno pøerušení pøi zmìnì stavu libo- krystalového oscilátoru. V režimu Po-
volného z vývodù PCINT0 až PCINT7. Bìžící periferie dovolují procesoru wer-down však krystalový oscilátor ne-
Jednotlivé vstupy lze blokovat pomocí procitnout z režimu neèinnosti aktivací bìží. Takže vzorkování není možné!
bitù z registru PCMSK. jejich pøerušení nebo pomocí resetu.
• PCMSK - tento registr obsahuje bity Pokud není požadováno procitnutí Standby mode
PCINT0 až PCINT7 (obr. 4.5). Tyto bity po aktivaci pøerušení od analogového (pohotovostní režim)
vybírají, které ze vstupù pøerušení budou komparátoru, mìl by být komparátor
odstaven nastavením bitu ACD z regis- Je-li SM0 = 0 a SM1 = 1, pøejde pro-
sledovány. Pokud má být sledování bitu cesor po vykonání instrukce SLEEP do
povoleno, musí být odpovídající bit na- tru ACSR. Toto opatøení sníží odbìr
v režimu neèinnosti. pohotovostního režimu. Tento režim je
staven. Pokud má být sledování zakázá- podobný režimu Power-down, navíc
no, musí být odpovídající bit vynulován. Po procitnutí z režimu neèinnosti se
mikroøadiè pøepne do normálního režimu. zùstává bìžet oscilátor. Procesor
• PCIF - pøíznak (z registru EIFR, viz se z režimu Stadby probudí automatic-
obr. 4.2) aktivace libovolného ze vstupù Power-down mode (režim ky po uplynutí šesti hodinových cyklù.
PCINT0 až PCINT7. Pøíznak se vynu- sníženého napájecího napìtí)
luje vstupem do odpovídající obslužné
rutiny nebo zápisem 1 do bitu PCIF. Je-li bit SM0 nastaven (stav bitu SM1 4.3. Pøíklad 7
není rozhodující, viz tab. 4.4), pøejde pro-
cesor po vykonání instrukce SLEEP do - použití pøerušení a
4.2. Režimy snížené režimu sníženého napájecího napìtí: režimu Power-down
spotøeby • Vnìjší krystalový oscilátor je odsta-
ven, Pøíklad ukazuje použití vnìjšího pøe-
Režimy snížené spotøeby umožòují vý- • jádro procesoru je zastaveno (nejsou rušení INT0 k pøechodu mikroøadièe
raznì snížit spotøebu mikroøadièe v do- vykonávány instrukce), do režimu Power-down a procitnutí z nìj.
bì, kdy není požadován jeho plný výkon. • èítaèe/èasovaèe, USART a analogový Zadání: Pøipojte k vývojovému kitu
Pro pøechod do režimu snížené spo- komparátor jsou odstaveny, SDK2313 na port B pøípravek AT8LED.
tøeby musí být nastaven bit SE z registru Na port D pøipojte pøípravek ATSW.
MCUCR a následnì provedena instruk- • jednotka USI, Watchdog a pøerušova-
cí systém zùstávají aktivní. Na pøípravku AT8LED bude prová-
ce SLEEP. Režim snížené spotøeby se dìn program „bìžící svìtlo“ (kap. 2.5).
volí bity SM0, SM1 registru MCUCR K procitnutí mùže dojít buï vnìjším Pomocí spínaèe S2 a odpovídající-
(viz obr. 4.3 a tab. 4.4). resetem, Watchdog resetem (je-li WDT ho vstupu vnìjšího pøerušení INT0 za-
Je-li povoleno pøerušení, po jeho ak- aktivován) a úrovòovì citlivými vstupy jistìte pøechod do režimu Power-down.
tivaci „procitne“ procesor z režimu sní- INT0, INT1 nebo vstupy PCINT0 až První stisk tlaèítka uvede mikroøadiè
žené spotøeby, obslouží pøerušení a PCINT7. do režimu snížené spotøeby, druhý
pokraèuje v programu instrukcí násle- Po procitnutí z režimu Power-down se stisk zajistí procitnutí a pøechod do pù-
dující za instrukcí SLEEP (která jej døí- mikroøadiè pøepne do normálního režimu. vodního režimu.
ve do režimu snížené spotøeby uved- Hlavní výhodou režimu Power-down
la). Obsah registrového pole, RAM a je skuteènost, že po jeho aktivaci lze Pøi realizaci programu jsme vyšli
vstupnì/výstupních registrù zùstane výraznì snížit napájecí napìtí (napø. z 5 z pøíkladu 3 (viz kapitolu 2.5). Zmìny
nezmìnìn. na 2 V). Tím výraznì poklesne odbìr. se týkají použití pøerušení.

Obr. 4.4.
Detekèní logika
pøerušení PCINTx

Obr. 4.5.
Registr PCMSK

Konstrukèní elektronika A Radio - 5/2006 19


Nejdøíve je tøeba zavést dvì obslu- nulováním pøíznakového bitu I. Proto je lze aktivovat úrovní (úrovní „log. 0“)
hy. První bude pro inicializaci (skoèí nezbytnì nutné povolit pøerušení (vyko- nebo hranou (lze volit mezi vzestupnou
na návìští RESET) a druhý bude pro nat instrukci SEI ještì pøed instrukcí a sestupnou hranou).
pøerušení INT0 (návìští VYPZAP). Ulo- SLEEP). Jinak nebude možné nechat • Režimy snížené spotøeby poskytují
žení èásti programu na pøesné místo mikroøadiè procitnout stiskem tlaèítka možnost snížit spotøebu mikroøadièe
v pamìti je zajištìno direktivou .ORG S2 (aktivací pøerušení INT0). odstavením nìkterých zabudovaných
následovanou požadovanou adresou. Návìští VYPSD odpovídá stavu, kdy periferií nebo samotného jádra proce-
Symbol INT0addr (je zaveden v definiè- procesor procitne z režimu Power-down.
ním souboru TN2313DEF.INC) pøedsta- V tomto pøípadì se vynuluje bit SE re- Tab. 4.5. Program PROG_07.ASM
vuje adresu $0001 (je výhodnìjší použí- gistru MCUCR (abychom mohli bit SE PROG_07.ASM:
vat tento symbol než pracnì zjišovat døíve otestovat) a pøejde se na návìští .INCLUDE “tn2313def.INC“
podle tab 4.1, kam vektor umístit): VYPSK - obnovení registrù. ;definice registrú
Poslední èástí obsluhy je obnova re- .DEF REG=R16 ;pracovní registr
.ORG $0000 ;vektor RESETu gistrù. Zde dùraznì pøipomeòme (viz .DEF CITAC1=R17 ;registry
RJMP RESET .DEF CITAC2=R18 ;pro casovací
.ORG INT0addr ;vektor INT0
kapitolu 2.4), že zásobník je pamì typu
LIFO. Proto musíme registry ze zásob- .DEF CITAC3=R19 ;rutinu CEKEJ
RJMP VYPZAP .EQU DDR=DDRB ;rízení smeru
níku obnovovat (instrukcí POP) v opaè- .EQU PORT=PORTB ;port
V inicializaèní èásti je nutné správnì ném poøadí, než jak byly uloženy:
konfigurovat pøerušovací systém. Po .ORG $0000 ;vektor RESETu
aktivaci pull-up rezistoru pro tlaèítko S2 Poøadí uložení Poøadí obnovení: RJMP RESET
nastavíme vnìjší vstup INT0 jako REG SREG .ORG INT0addr ;vektor INT0
úrovòovì citlivý (budeme požadovat CITAC1 CITAC3 RJMP VYPZAP
procitnutí z režimu power-down pøes CITAC2 CITAC2
;inicializace:
pøerušení INT0). Dále musí být povole- CITAC3 CITAC1 RESET: LDI REG,RAMEND ;nastav SP
no pøerušení INT0. Obojí je øešeno zá- SREG REG OUT SPL,REG ;na konec RAM
pisy do registrù MCUCR a GIMSK. SER REG
Poslední instrukcí obsluhy je RETI, OUT DDR,REG ;aktivuj výstupy
Dále musíme uvolnit globální pøíznak která kromì návratu na místo, kde byl SBI PORTD,2 ;S2 má pull-up
pøerušení, tedy nastavit bit I (pomocí in- pøerušen hlavní program, nastaví globál- LDI REG,0b00000000 ;INT0 úrovnove
strukce SEI). Nakonec se tedy rozbìh- ní pøíznak pøerušení (pøíznakový bit I). OUT MCUCR,REG ;citlivý
ne program „bìžící svìtlo“. Program je nazván PROG_07.ASM a LDI REG,0b01000000
Obsluha pøerušení (rutina VYPZAP) je vypsán v tab. 4.5. Pøíklad najdete v [4] OUT GIMSK,REG ;povol INT0
musí nejdøíve uložit obsahy registrù SEI ;povol prerušení
v adresáøi PROGRAMY\PROG_07. CLC ;0 do C
(pouze tìch, které zmìní) do zásobní-
SER REG ;nastav REG
ku instrukcí PUSH. Registr SREG se Test programu SMYCKA: OUT PORT,REG ;pošli data
ukládá komplikovanìji (instrukce PUSH RCALL CEKEJ ;pockej 0,5 s
totiž pracuje nad registry R0 až R31, Pøipojte pøípravky na urèené porty. ROR REG ;posun
nikoli nad vstupnì/výstupními registry; Po naprogramování se spustí program RJMP SMYCKA ;a znovu
proto se obsah SREG musí naèíst „bìžící svìtlo“.
První stisk tlaèítka S2 zhasne LED ;cekací rutina (ceká asi 0,5 s)
do registru REG a poté uložit instrukcí CEKEJ: LDI CITAC1,25 ;CITAC1=25
PUSH REG). a uvede mikroøadiè do režimu Power- CLR CITAC2 ;CITAC2=0
Dále musíme zajistit deaktivaci tla- down (zkuste i snížit napájecí napìtí na CLR CITAC3 ;CITAC3=0
èítka. Pro úrovòovì citlivé vstupy vnìj- velikost 2 V). CEKEJA: DEC CITAC3
šího pøerušení totiž platí, že jsou aktivní Druhý stisk tlaèítka S2 zpùsobí roz- BRNE CEKEJA ;smycka 1
tak dlouho, dokud je na nich pøiložena bìh hlavního programu (pøed stiskem DEC CITAC2
BRNE CEKEJA ;smycka 2
hodnota „log. 0“. Proto se musí vyèkat musí být napájecí napìtí na nominální DEC CITAC1
na pøechod vývodu PD2 (INT0) do úrovnì hodnotì). BRNE CEKEJA ;smycka 3
„log. 1“ (tedy až obsluha tlaèítko uvolní). RET ;návrat
Protože rutina VYPZAP zohledòuje Pozn.: Program PROG_05 odpovídá
jak pøechod do režimu Power-down, èásteènì èinnosti „blikaèky na jízdní ;obsluha INT0:
kolo“. Taková „blikaèka“ umí napø. VYPZAP: PUSH REG ;ulož
tak i procitnutí z nìj, musíme rozlišit, PUSH CITAC1 ;registry
o který pøípad se jedná. Proto se testu- blikat sérií LED nebo provozovat bì- PUSH CITAC2 ;do zásobníku
je bit SE z registru MCUCR. Bohužel žící svìtlo zleva doprava nebo zpra- PUSH CITAC3
registry EIFR, GIMSK a MCUCR ne- va doleva. Režim èinnosti se volí je- IN REG,SREG ;ulož také
jsou dostupné pøes instrukce SBI, CBI, diným tlaèítkem. Posledním režimem PUSH REG ;SREG
SBIS a SBIC (to platí jen pro spodní bývá vypnutí. Je jasné, že pokud ;pockej na prechod S2 do log.1:
rozlišíme další režimy, lze podobné VYPZAS: RCALL CEKEJ ;0,5 s cekej
polovinu vstupnì/výstupních registrù). SBIS PIND,2 ;preskoc pro S2=1
Takže obsah registru MCUCR musíme zaøízení vytvoøit i na základì mikro- RJMP VYPZAS ;jinak se vrat
testovat tak, že jej nejdøíve nahrajeme øadièe ATtiny2313. ;testuj režim:
do registru REG a poté testujeme bit 5 IN REG,MCUCR ;cti MCUCR
(maska pro bit 5 je 0b00100000). Po- ANDI REG,0b00100000;testuj bit SE
kud je hodnota nula, je po instrukci AN- 4.4. Shrnutí BREQ VYPSE
DI REG,0b00100000 registr REG ;pro SE=1 (návrat ze SLEEP):
Nakonec si shrneme poznatky, kte- VYPSD: LDI REG,0b00000000 ;zakaž SLEEP
vynulován (tedy Z = 1) a instrukce OUT MCUCR,REG
ré byly podány v pøedchozím textu:
BREQ VYPSE pøevede øízení progra- RJMP VYPSK ;a konec
mu na návìští VYPSE. • Pøerušení je reakce procesoru na ;pro SE=0 (jdi do SLEEP):
Návìští VYPSE odpovídá stavu, kdy asynchronní událost (událost vyvola- VYPSE: LDI REG,0b00110000 ;povol SLEEP
je tøeba pøejít do režimu power-down. nou nezávisle na aktuálnì vykonáva- OUT MCUCR,REG ;vyber Power-down
Nejdøíve tedy musíme konfigurovat re- ném programu a adrese právì zpraco- SER REG
vávané instrukce). Pomocí pøerušení je OUT PORT,REG ;zhasni LED
gistr MCUCR (nastavit bity SE a SM). SEI ;povol prerušení
Dobré je také zhasnout LED (zápisem možné získat pøednostní obsluhu nìja- SLEEP ;vstup do SLEEP
hodnoty 0b11111111 na port B), tím se ké kritické situace a není nutné výraznì ;obnova registrù:
sníží odbìr pøedstavovaný periferií. upravovat výchozí program (srovnejte VYPSK: POP REG ;obnov
Nakonec se musí vykonat instrukce inicializaèní èásti pøíkladù PROG_03 a OUT SREG,REG ;SREG
SLEEP (po ní již program pøejde do re- PROG_05). POP CITAC3 ;a další
POP CITAC2 ;registry
žimu Power-down). Nacházíme se • Vnìjší pøerušení je reakcí na aktiva- POP CITAC1
však v rutinì obsluhy pøerušení, kde je ci vnìjších vývodù INT0 a INT1 (pøí- POP REG
pøíjem dalších pøerušení zablokován vy- padnì PCINT0 až PCINT7) Pøerušení RETI ;návrat z prerušení

20 Konstrukèní elektronika A Radio - 5/2006


soru. Mikroøadiè ATtiny2313 rozlišuje • Instrukce SLEEP uvede procesor do Øídicí registry èítaèe/èasovaèe 0
tøi režimy snížené spotøeby: Idle mode režimu snížené spotøeby. Pomocí bitu - TCCR0A, TCCR0B
(režim neèinnosti) a Power-down mode SE lze vykonání této instrukce blokovat,
(režim sníženého napájecího napìtí) a bit SM volí jeden ze dvou režimù sníže- Registry TCCR0A a TCCR0B slou-
Standby mode (pohotovostní režim). né spotøeby. Oba tyto bity patøí do re- ží pro výbìr hodinového zdroje èítaèe/
• Instrukce SEI nastaví pøíznakový bit I gistru MCUCR. èasovaèe 0, nastavení režimu práce a
a tím povolí pøíjem pøerušení. Podobnì konfiguraci jednotek Output Compare
• Instrukce RETI je poslední instrukce
instrukce CLI pøerušení zakáže. (viz obr. 5.2).
obsluhy pøerušení. Kromì návratu na
místo programu, ve kterém nastalo pøe- V tab. 5.1 je ukázáno, jak bity CS02,
• Instrukce PUSH Rr uloží obsah urèe-
rušení, zároveò povolí pøerušení (I = 1). CS01 a CS00 øídí výbìr hodinového
ného registru R0 až R31 do zásobníku.
signálu èítaèe/èasovaèe 0. Výchozí
Obsahy vstupnì/výstupních registrù • Pro registry EIFR, GIMSK a MCUCR
(napø. SREG) je nutno pøed použitím té- hodnota (000) odpovídá odstavenému
není možno používat instrukce SBI, èítaèi/èasovaèi.
to instrukce pøenést do nìkterého z re- CBI, SBIS a SBIC. Tyto instrukce jsou
gistrù registrového pole. Bity WGM02, WGM01 a WGM00
dostupné pouze u dolní poloviny vstup- volí režim práce èítaèe/èasovaèe 0.
• Instrukce POP Rd obnoví obsah ur- nì/výstupních registrù. Takže nastavo-
Tab. 5.2 obsahuje seznam všech mož-
èeného registru R0 až R31 ze zásobní- vání nebo ètení obsahù tìchto registrù
ných režimù. První sloupec (WGM) je de-
ku. Zásobník je pamì typu LIFO, proto je možné pouze za pomoci jednoho
sítkovì vyjádøené tøíbitové èíslo dané ob-
se musí registry obnovovat v opaèném z registrù R0 až R31 instrukcemi IN
poøadí, než ve kterém byly ukládány. a OUT. sahem bitù WGM02, WGM01 a WGM00
(napø. desítková hodnota 4 odpovídá:
WGM02 = 1, WGM01 = 0 a WGM00 = 0).
Dvì dvojice bitù COM0A0, COM0A1
5. 8bitový èítaè/èasovaè 0 a COM0B0, COM0B1 konfigurují èin-
nost jednotek Output Compare, které
jsou vázány na komparaèní registry
V této kapitole se seznámíme vá jeho synchronizace s hodinovým OCR0A a OCR0B. Vysvìtlení jejich
s jednoduchým 8bitovým èítaèem/èa- signálem mikroøadièe (CLK). Protože
funkce je uvedeno spolu s popisem
sovaèem a ukážeme si jeho použití je vnìjší hodinový signál vzorkován ná-
jednotlivých režimù.
pro èítání impulsù generovaných bìžnou hranou CLK, musí být minimál- Nastavení bitù FOC0A, FOC0B
tlaèítkem (v praxi lze místo impulsù ní interval mezi dvìma zmìnami vnìj-
od tlaèítka èítat napø. impulsy z foto- umožòuje používat výstupy OC0A,
šího hodinového signálu vìtší než
buòky a tak poèítat osoby, které ve- OC0B mimo PWM režimy.
perioda CLK. Takže maximální kmito-
šly do místnosti). èet pøivádìný na vstup T0 mùže být Obsah èítaèe/èasovaèe 0
polovinou hodinového kmitoètu mikro-
- registr TCNT0
5.1. Základní pojmy øadièe.
Èítaè/èasovaè 0 má k dispozici dva Registr TCNT0 (obr. 5.3) poskytuje
Èítaè je obvod, který poèítá impulsy komparaèní registry oznaèené jako pøístup k obsahu èítaèe/èasovaèe 0.
vnìjšího signálu (a mùže mìøit jejich OCR0A a OCR0B. Tyto registry lze Je tøeba poznamenat, že èítaè/èaso-
kmitoèet). používat pro generování intervalù zada- vaè 0 èítá nahoru (ve všech režimech
Èasovaè èítá impulsy odvozené né délky, jako generátor kmitoètu nebo vyjma fázovì korigovaného PWM).
od hodinového (taktovacího) signálu PWM jednotku. Tzn., že po každém hodinovém impul-
mikroøadièe. Napoèítáním urèitého po- su pøivedeném na jeho vstup se obsah
zvýší o 1 (napø. pro první impuls je to
ètu impulsù se zajistí odmìøení èaso-
vého intervalu.
5.3. Registry zmìna z 0 na 1).
Jednotka Output Compare pøed- èítaèe/èasovaèe 0 Pokud registr TCNT0 obsahuje
hodnotu 0xFF = 255 (0b11111111) a
stavuje tzv. komparaèní registr, jehož
obsah je neustále porovnáván s obsa- V této kapitole jsou uvedeny øídicí pøijde-li další hodinový impuls, obsah
hem èítaèe. Pokud nastane shoda (èí- registry èítaèe/èasovaèe 0. èítaèe pøeteèe (0b00000000) a poèítá
taè obsahuje stejnou hodnotu jako se od zaèátku. Pøi pøeteèení se nastaví
komparaèní registr), mùže být vyvoláno pøíznak pøeteèení a mùže se generovat
pøerušení nebo mùže nastat urèená pøerušení (viz dále).
událost na výstupním vývodu (vývod se
napøíklad uvede do úrovnì „log. 0“ nebo
„log. 1“, popø. se jeho stav zneguje).

5.2. Struèný popis


èítaèe/èasovaèe 0
Blokové schéma èítaèe/èasovaèe 0
je na obr. 5.1.
Jako zdroj hodin lze použít buï ho-
dinový signál mikroøadièe CLK (lze ak-
tivovat pøeddìlièku, hodnoty tedy jsou
f0, f0/8, f0/64, f0/256 a f0/1024), nebo
vnìjší signál pøivedený na vývod T0
(lze volit polaritu hodin - èítání na ná-
bìžnou nebo na sestupnou hranu).
Také lze hodiny odpojit, tedy zablokovat
èítání (viz tab. 5.1).
Pøeddìlièka pøedøazená hodinové-
mu signálu mikroøadièe dovoluje reali-
zovat èasování v rozsahu zhruba od de-
sítek ms po jednotky µs (viz tab. 5.2).
Pokud je použit vnìjší zdroj hodin
(signál pøivedený na vývod T0), nastá- Obr. 5.1. Blokové schéma èítaèe/èasovaèe 0

Konstrukèní elektronika A Radio - 5/2006 21


Tab. 5.1 Výbìr hodinového signálu pro èítaè/èasovaè 0 Tab. 5.2 Jednotlivé režimy
registrem TCCR0B èítaèe/èasovaèe 0

Komparaèní registry - OCR0A, OCR0B Pøíznak pøeteèení TOV0 se nastaví taè èítá ode dna do maxima a po pøete-
ve stejném hodinovém cyklu èítaèe, ve èení se vrací opìt ke dnu.
Registry OCR0A, OCR0B (obr. 5.3) kterém obsah TCNT0 dosáhl nuly. Hodnota vrcholu je pro WGM = 3
jsou komparaèními registry èítaèe/èa- pevná (0xFF) a pro WGM = 7 nastavi-
sovaèe 0. Jejich obsah se nestále po- CTC režim (WGM = 2; tab. 5.3) telná obsahem registru OCR0A.
rovnává s aktuálním obsahem èítaèe Pro neinvertující režim (COM0X1 =
(TCNT0). Pøi shodì mùže být vyvolána V CTC režimu se èítaè vynuluje,
když TCNT0 dosáhne hodnoty OCR0A. = 1,COM0X0 = 0) je vývod OC0X na-
operace na vývodech OC0A, OC0B. staven do úrovnì „log. 1“ vždy po pøe-
Hodnota OCR0A vlastnì definuje hod-
notu vrcholu, tedy rozlišení èítaèe. Ten- teèení obsahu èítaèe. Po dosažení
Podpora èítaèe/èasovaèe 0 shody TCNT0 = OCR0X pøejde tento
to režim poskytuje vìtší možnost øízení
v pøerušovacím systému kmitoètu. vývod do úrovnì „log. 0“. Takže hod-
Èítaè/èasovaè 0 mùže generovat Pøerušení se mùže generovat, když nota obsažená v registru OCR0X
celkem tøi pøerušení. TCNT0 dosáhne vrcholu, který je dán vlastnì pøímoúmìrnì urèuje dobu tr-
Registr TIMSK (obr. 5.4) obsahuje obsahem OCR0A. V tomto pøípadì se vání úrovnì „log. 1“ na vývodu OC0X.
masky tìchto pøerušení: TOIE0 (povo- nastaví pøíznak OCF0. Je-li pøerušení V invertujícím režimu (COM0X1 = 1,
lení pøerušení pøi pøeteèení obsahu èí- povoleno, vyvolá se. COM0X0 = 1) je vše naopak.
taè/èasovaèe 0), OCIE0A (povolení Pro generování výstupního prùbìhu Pro výstupní kmitoèet PWM signálu
pøerušení pøi shodì TCNT0 = OCR0A) na vývodu OC0X (X je A nebo B) lze na vývodu OC0X platí:
a OCIE0B (povolení pøerušení pøi sho- zvolit režim toggle (COM0X1 = 0,
COM0X0 = 1). Pak každá shoda TCNT0 fOC0X PWM = fclk_IO/N·256,
dì TCNT0 = OCR0B).
s OCR0X vede k negaci vývodu OC0X,
Registr TIFR (obr. 5.5) obsahuje kde N pøedstavuje dìlicí pomìr (1, 8,
takže se generuje signál støídy 1 : 1.
pøíznaky tìchto pøerušení: TOV0 (indiku- 64, 256 nebo 1024).
Nejvyšší generovaný kmitoèet dostane-
je pøeteèení èítaèe/èasovaèe 0), OCF0A me pro pøípad, že je OCR0X = $00. Mezní hodnoty OCR0X registru pøed-
(indikuje shodu TCNT0 = OCR0A) a OCF0B Pro maximální kmitoèet platí fOC0MAX = stavují zvláštní pøípady generování PWM
(indikuje shodu TCNT0 = OCR0B). = fclk_IO/2. Pro ostatní pøípady je: prùbìhu. Pokud je OCR0X = $00, vy-
tváøí se krátký zákmit v okamžiku pøete-
5.4. Popis fOC0X = f clk_IO/2·N·(1 + OCR0X), èení èítaèe. Pokud je OCR0X = $FF,
bude výstup stabilnì v úrovni „log. 1“
jednotlivých režimù kde N pøedstavuje dìlicí pomìr (1, 8,
64, 256 nebo 1024).
(neinvertující režim) nebo „log. 0“ (in-
vertující režim).
Nyní si vysvìtlíme jednotlivé pracov- Podobnì jako v normálním režimu
ní režimy èítaèe/èasovaèe 0. je pøíznak TOV0 nastaven ve stejném Fázovì korigovaný PWM režim
hodinovém cyklu èítaèe, ve kterém na- (WGM = 1 nebo 5; tab. 5.5)
Normální režim (WGM = 0) stane pøeteèení z $FF na $00.
Fázovì korigovaný PWM režim po-
Nejjednodušším režimem je tzv. skytuje PWM prùbìh s velkým rozliše-
Rychlý PWM režim
normální režim. V tomto režimu se vždy ním, používá dvojfázovou realizaci. Èí-
èítá nahoru (inkrementace obsahu) a (WGM = 3 nebo 7; tab. 5.4) taè èítá opakovanì z $00 do vrcholu a
nedochází k žádnému nulování. Èítaè Rychlý PWM režim generuje PWM potom z vrcholu do $00.
jednoduše pøeteèe, když dosáhne své- prùbìh s velkou rychlostí. Rychlý PWM Hodnota vrcholu je pro WGM = 1
ho 8bitového maxima (vrchol = $FF) a režim se odlišuje od ostatních PWM re- pevná (0xFF) a pro WGM = 5 nastavi-
restartuje se ze dna ($00). žimù svou jednofázovou realizací. Èí- telná obsahem registru OCR0A.

Obr. 5.2.
Registry
TCCR0A a
TCCR0B

Obr. 5.3.
Registry
TCNT0,
OCR0A,
OCR0B

22 Konstrukèní elektronika A Radio - 5/2006


Obr. 5.4.
Registr TIMSK

Obr. 5.5.
Registr TIFR

V neinvertujícím režimu je vývod Zadání: Pøipojte k vývojovému kitu Tab. 5.6. Program PROG_08.ASM
OC0X vynulován pøi shodì TCNT0 = SDK2313 na port B pøípravek AT8LED. PROG_08.ASM:
= OCR0X pøi èítání nahoru. K nasta- Na port D pøipojte pøípravek ATSW. .INCLUDE “tn2313def.INC“
vení dojde pøi shodì TCNT0 = OCR0X Poèítejte pomocí èítaèe/èasovaèe 0 ;definice registrú
pøi èítání dolù. Pro invertující režim je impulsy z tlaèítka S4. Poèet stiskù tla-
èinnost opaèná. èítka je indikován jako dvojkové èíslo .DEF REG=R16 ;prac. registr
Dvojfázové provedení má sice nižší zobrazované na pøípravku AT8LED.
RESET: SER REG ;REG=0b11111111
pracovní kmitoèet než provedení jedno- OUT DDRB,REG ;port B je výstupní
fázové (rychlý PWM režim), ale pro nì- Pøipomeòme, že programové èítání LDI REG,0b00000110 ;konfiguruj c/c 0
které aplikace se mu dává pøednost. impulsù bylo již øešeno v pøíkladu 6 OUT TCCR0B,REG ;jako cítac
Rozlišení je totiž pevnì stanoveno jako v kapitole 3.4. Nyní si ukážeme hard- ;(sestupná hrana)
8 bitù. Dvoufázová èinnost spoèívá warové øešení založené na použití èí- SMYCKA: IN REG,TCNT0 ;cti obsah cítace
v tom, že èítaè se nejprve inkrementuje taè/èasovaèe 0. COM REG ;zneguj
Pro tento pøípad je tøeba pøivést sle- OUT PORTB,REG ;zobraz na LED
až do okamžiku dosažení maxima. Pak RJMP SMYCKA ;zpet do smycky
se pøepne a èítá dolù. dované impulsy na vývod T0 (vstup èí-
Pøíznak TOV0 je nastaven pokaždé, taèe/èasovaèe 0) tedy na PD4. Na pøí-
když èítaè dosáhne dna ($00). Nasta- pravku ATSW odpovídá tomuto vývodu ci (pøipomeòme, že LED svítí pøi úrovni
vení COM0X1 = 1, COM0X0 = 0 posky- tlaèítko S4, které má navíc ošetøené „log. 0“):
tuje na vývodu OC0X neinvertující PWM zákmity. Vlastní realizace programu je Program je nazván PROG_08.ASM a
signál, pro COM0X1 = 1, COM0X0 = 1 jednoduchá a velmi krátká.
je vypsán v tab. 5.6. Pøíklad najdete v [4]
dostáváme invertující PWM signál. Program musí nakonfigurovat port
v adresáøi PROGRAMY\PROG_08:
Pro výstupní kmitoèet PWM signálu B jako výstupní (port D je po resetu auto-
na vývodu OC0X platí: maticky konfigurován jako vstup, pull-up
rezistor pro vývod PD4 není tøeba, na Test programu
fOC0X PWM = fclk_IO/N·510, tento vývod je pøipojen výstup klasické- Pøipojte pøípravky na urèené porty.
kde N pøedstavuje dìlicí pomìr (1, 8, ho hradla). Každý stisk tlaèítka S4 zvýší hodno-
64, 256 nebo 1024). Dále je nutné správnì konfigurovat tu zobrazenou na pøípravku AT8LED
Mezní hodnoty OCR0X pøedstavují èítaè/èasovaè 0 (budeme nastavovat o 1. Po údaji 255 (dvojkovì 11111111)
zvláštní pøípady generace PWM signá- pouze registr TCCR0B, protože je po- obsah pøeteèe (00000000) a vše zaène
lu. Pro neinvertující režim platí: Je-li užit normální režim, který je po resetu od zaèátku.
OCR0X = $00, je výstup OC0X stabil- vždy nastaven). V úvahu pøipadají tyto
hodnoty TCCR0B: 0b00000110 nebo
nì v úrovni „log. 0“. Pøi OCR0X = $FF
je výstup OC0X stabilnì v „log. 1“. Pro 0b00000111. V obou pøípadech se jed- 5.7. Pøípravek ATDIPSW2
invertující režim platí vše opaènì. ná o èítání impulsù na vstupu T0 (tedy
ne o režim èasovaèe, kdy se èítá kmi- Pøípravek ATDIPSW2 (obr. 5.6) pøed-
toèet odvozený z hodin mikroøadièe). stavuje jednoduchou osmici spínaèù DSW
5.5. Závìreèné poznámky Byl vybrán režim èítání aktivovaný se- umístìných v pouzdøe DIP (DIP8X).
stupnou hranou (impuls se pak vezme Spínaèe jsou doplnìny zdvíhacími (pull-
Pro správnou funkci vývodu OC0A up) rezistory, které pøi vypnutých spína-
je nutné nastavit bit DDRB2 (konfiguro- do úvahy okamžitì po stisku tlaèítka
S4; v opaèném pøípadì, pøi èítání na èích drží jednotlivé vývody v úrovních
vat vývod OC0A jako výstupní), podob- „log. 1“. Zdvíhací rezistory jsou sdruže-
nábìžnou hranu, by se stav èítaèe mì-
nì pro vývod OC0B je nutné nastavit ny v rezistorové síti R1. Když nìkterý
nil až po uvolnìní tlaèítka). Takže vstup-
bit DDRD5. nì/výstupní registr TCCR0B je nasta- ze spínaèù sepneme, je na pøíslušném
ven na hodnotu 0b00000110. vývodu úroveò „log. 0“.
5.6. Pøíklad 8 Vlastní zjištìní poètu naèítaných im- Pokud použijeme tento pøípravek
- hardwarové èítání impulsù pulzù spoèívá ve ètení obsahu èítaèe/èa-
sovaèe 0, tedy registru TCNT0. Pøed
k jinému mikroøadièi, mùžeme popø. re-
zistorovou sí vynechat - napø. mikroøa-
Pøíklad ukazuje použití èítaèe/èaso- zobrazením pøeètené hodnoty na pøí- dièe typu 8051 mají vývody již opatøe-
vaèe 0 v režimu èítaèe vnìjších událostí. pravku AT8LED je nutno provést nega- ny zdvihacími rezistory.
Pøípravek ATDIPSW2 je zkonstruo-
Tab. 5.3. ván na desce s jednostrannými ploš-
Význam bitù nými spoji (obr. 5.7 a obr. 5.8).
COM0X1 a COM0X0
v režimech bez PWM

Tab. 5.4.
Význam bitù
COM0X1 a COM0X0
v rychlém
PWM režimu
Tab. 5.5.
Význam bitù
COM0X1 a COM0X0
ve fázovì korigova-
ném PWM režimu

Obr. 5.6. Schéma pøípravku ATDIPSW2

Konstrukèní elektronika A Radio - 5/2006 23


Obr. 5.7.
Obrazec
noduchost WGM = 1), režim manipula-
ce s vývodem OC0B (volíme invertující
5.9. Shrnutí
plošných režim, nebo LED svítí pøi log. 0) a ho- • Èítaè/èasovaè 0 lze používat jako èí-
spojù dinový kmitoèet èítaèe (volíme f0/64, taè impulsù pøivedených na vstup T0
pøípravku takže výstupní kmitoèet PWM signálu (lze volit nábìžnou èi sestupnou hranu)
ATDIPSW2 bude zhruba 300 Hz). Takže do registru nebo jako èasovaè (èítají se impulsy
(mìø.: 1 : 1) TCCR0A uložíme hodnotu 0b00110001 o pevném kmitoètu odvozené od hodi-
a do registru TCCR0B pak hodnotu nového signálu mikroøadièe).
0b00000011.
Hlavní smyèka pouze zajišuje se- • Registry TCCR0A, TCCR0B konfigu-
Obr. 5.8. jmutí stavu spínaèù (naètení registru rují èítaè/èasovaè 0. Volí režim èítaèe a
Rozmístìní PINB) a pøenos této hodnoty do regist- ovládají pøeddìlièku a èinnost vývodù
souèástek ru OCR0B. OC0A, OC0B.
na desce Program je nazván PROG_09.ASM a • Registr TCNT0 udržuje aktuální stav
pøípravku je vypsán v tab. 5.7. Pøíklad najdete v [4] èítaèe/èasovaèe 0. V normálním režimu
ATDIPSW2 v adresáøi PROGRAMY\PROG_09: èítaè èítá nahoru, takže po každém im-
pulsu se stav tohoto registru zvýší o 1.
Test programu • Instrukce COM Rd - pøipomeòme, že
Seznam souèástek pro ATDIPSW2 Pøipojte pøípravky na urèené porty. tato instrukce slouží pro negování bitù
Pomocí spínaèù pøípravku ATDI- urèeného registru. V daném programu
R1 odporová sí 8x 10 kΩ PSW2 nastavujte jas LED na vývodu je použita pro negaci hodnoty pøeètené
(RR8X 10K) DDRD5 od zcela zhasnuté (všechny z registru TCNT0 pøed jejím zápisem
DSW spínaè dip osminásobný spínaèe sepnuty) až po maximální jas do registru PORTB (pøípravek AT8LED
(DIP8X1) (všechny spínaèe vypnuty). zobrazuje stavy bitù negovanì).
P MLW10G (nebo PSL10)

5.8. Pøíklad 9 6. 16bitový èítaè/èasovaè 1


- použití PWM režimu
V této kapitole se seznámíme 16 bitù a je vybaven obvody Input Cap-
Tento pøíklad ukazuje použití èítaèe/ s pokroèilým 16bitovým èítaèem/ ture a Output Compare. Jeho blokové
/èasovaèe 0 v PWM režimu. /èasovaèem. Na pøíkladech bude schéma je na obr. 6.1.
Zadání: Pøipojte k vývojovému kitu ukázáno použití režimu èasovaèe, Jako zdroj hodin lze použít buï ho-
SDK2313 na port B pøípravek ATDIPSW2. jednotky Output Compare a PWM dinový signál mikrokontroléru CLK (lze
Na port D pøipojte pøípravek AT8LED. generátoru. aktivovat pøeddìlièku, hodnoty tedy
Použijte 8bitovou hodnotu nastave- jsou f 0, f 0/8, f 0/64, f 0 /256, f 0 /1024),
nou spínaèi pøípravku ATDIPSW2 k na- 6.1. Struèný popis nebo vnìjší signál pøivedený na vý-
stavení jasu LED, která je pøipojena vod T1 (lze volit polaritu hodin - èítání na
na vývod OC0B (DDRD5). Jas bude øí- èítaèe/èasovaèe 1 vzestupnou nebo na sestupnou hra-
zen pomocí støídy generované na vývo- Èítaè/èasovaè 1 je pomìrnì doko- nu). Také lze hodiny odpojit, tedy za-
du OC0B fázovì korigovaným PWM nalý èítaè/èasovaè, který má rozlišení blokovat èítání.
generátorem.
Program musí zapsat hodnotu pøe- Obr. 6.1. Blokové schéma
ètenou z portu PB do registru OCR0B. èítaèe/èasovaèe 1
Proto je jeho realizace velmi krátká.
Ostatní instrukce musí pouze zajistit
inicializaci portù a èítaèe/èasovaèe 0.
Nejdøíve se konfigurují porty. Port PD
musí být konfigurován jako výstupní,
LED by mìly po resetu zhasnout. Pro
port PB je vhodné nastavit pull-upy (po
resetu je jako vstupní konfigurován au-
tomaticky).
Dále musíme konfigurovat èítaè/èa-
sovaè 0. Pøednì je tøeba vybrat fázovì
korigovaný PWM režim (volíme pro jed-

Tab. 5.7. Program PROG_09.ASM


PROG_09.ASM:
.INCLUDE “tn2313def.INC“
;definice registrú
.DEF REG=R16 ;pracovní registr
;inicializace:
RESET: SER REG ;REG=0b11111111
OUT DDRD,REG ;port D je výstupní
OUT PORTD,REG ;LED zhasnuty
OUT PORTB,REG ;port B s pull-upy
LDI REG,0b00110001 ;inv. PWM
OUT TCCR0A,REG ;na OC0B
LDI REG,0b00000011 ;preddelicka
OUT TCCR0B,REG ;na f0/64
;smycka hlav. programu:
SMYCKA: IN REG,PINB ;nacte hodnotu
OUT OCR0B,REG ;uloží
RJMP SMYCKA ;nekonecný cyklus

24 Konstrukèní elektronika A Radio - 5/2006


Obr. 6.2
Registry
TCCR1A,
TCCR1B a
TCCR1C

Pøeddìlièka pøedøazená hodinové- Tab. 6.1. →


mu signálu mikrokontroléru dovoluje re- Výbìr
alizovat èasování v širokém rozsahu hodinového signálu
zhruba od jednotek s po jednotky µs. pro èítaè/èasovaè 1
Pokud je použit vnìjší zdroj hodin registrem TCCR1B
(signál pøivedený na vývod T1), nastá-
vá jeho synchronizace s hodinovým
signálem mikrokontroléru (CLK). Pro-
tože je vnìjší hodinový signál vzorko-
Tab. 6.2.→
Jednotlivé režimy
ván nábìžnou hranou CLK, musí být
èítaèe/èasovaèe 1
minimální interval mezi dvìma zmìna-
mi vnìjšího hodinového signálu vìtší
než perioda CLK. Takže maximální
kmitoèet pøivádìný na vstup T1 mùže
být polovinou hodinového kmitoètu
mikrokontroléru.
Režim èinnosti a výbìr hodin zajiš-
ují registry TCCR1A, TCCR1B. Pøí-
znaky jsou uloženy v registru TIFR,
pøerušení se povolují v registru TIMSK.
Èítaè/èasovaè 1 podporuje funkci
Output Compare pomocí komparaè-
ních registrù OCR1A, OCR1B a vývo-
dù OC1A, OCR1B.
Novinkou je obvod Input Capture
(záchytný registr), který umožòuje za-
chytit stav èasovaèe ve zvláštním re-
gistru ICR1. Zachycení probíhá aktivací
vstupu ICP (k záchytu lze také použít
vestavìný analogový komparátor).

Práce s 16bitovými registry


• Pøi ètení musí být nejdøíve èten nálu ICP (viz ICES1). Je-li ICNC1 = 1,
Èítaè/èasovaè 1 disponuje nìkolika dolní bajt (TCNT1L), tento údaj se je omezovaè šumu zapnut. Spouštìcí
registry, které jsou 16bitové. Vnitønì se uloží do registru TCNT1L a horní bajt signál z vývodu ICP se vzorkuje ve èty-
však jedná o 8bitový mikrokontrolér, se souèasnì uloží do registru TEMP. øech po sobì jdoucích okamžicích
takže k takovým registrù pøistupuje Ètení horního bajtu (TCNT1H) pøedsta- (kmitoèet vzorkování odpovídá hodino-
po 8bitových polovinách. vuje kopii TEMP do registru TCNT1H. vému kmitoètu mikrokontroléru). Jed-
Pro zajištìní souèasného ètení/zá- notlivé vzorky musí mít úrovnì odpoví-
pisu obou bajtù používá mikrokontrolér
doèasný registr TEMP. Tento doèasný
6.2. Registry dající spouštìcí události (viz ICES1).
• ICES1 vybírá hranu ICP. Pro ICES1 = 0
registr je sdílen pøi pøístupu k registrùm: èítaèe/èasovaèe 1 je obsah èítaèe/èasovaèe 1 pøenesen
• TCNT1H, TCNT1L, do záchytného registru ICR1H, ICR1L
V této kapitole jsou uvedeny jednotli- sestupnou hranou ICP. Pro ICES1 = 1
• OCR1AH, OCR1AL, OCR1BH, vé registry èítaèe/èasovaèe 1.
OCR1BL, je obsah èítaèe/èasovaèe 1 pøenesen
do záchytného registru ICR1H, ICR1L
• ICR1H, ICR1L. Øídicí registry nábìžnou hranou ICP.
èítaèe/èasovaèe 1 • WGM13, WGM12, WGM11, WGM10
Pokud hlavní program a obsluha
pøerušení pøistupují k tìmto registrùm, - TCCR1A, TCCR1B, TCCR1C volí režim práce èítaèe/èasovaèe 1. Viz
musí být zakázáno pøerušení (jinak se tab. 6.2.
Registry TCCR1A, TCCR1B a TCCR1C
pøeètou/zapíší nekorektní hodnoty). (obr. 6.2) slouží pro konfiguraci jedno- • COM1A0, COM1A1 a COM1B0, COM1B1
Dále je uveden algoritmus pøístupu tek Output Compare a Input Capture, a konfigurují èinnost jednotek Output
k obsahu èítaèe/èasovaèe 1 (pro pøí- pro volbu režimu a hodinového zdroje Compare, které jsou vázány na kompa-
klad uvedeme práci s registry TCNT1H, èítaèe/èasovaèe 1. raèní registry OCR1A a OCR1B. Vy-
TCNT1L): Význam jednotlivých bitù (je také svìtlení jejich funkce je uvedeno spolu
• Pøi zápisu musí být nejdøíve zapsán uveden v tab. 6.1 a tab. 6.2): s popisem jednotlivých režimù.
horní bajt (TCNT1H), tento údaj se • ICNC1 ovládá omezovaè šumu pro • CS12, CS11, CS10 vybírají hodiny èí-
uloží do registru TEMP. Zápis dolního jednotku Input Capture. Je-li ICNC1 = 0, taèe/èasovaèe 1. Viz tab. 6.1.
bajtu (TCNT1L) je zkombinován s TEMP je omezovaè šumu vypnut. Zápis • FOC1A, FOC1B - nastavení tìchto
a je tedy najednou zapsáno všech 16 do záchytného registru ICR1H, ICR1L bitù umožòuje používat výstupy OC1A,
bitù obsahu èítaèe/èasovaèe 1. je pak spuštìn první aktivní hranou sig- OC1B mimo PWM režimy.

Konstrukèní elektronika A Radio - 5/2006 25


Obr. 6.4.
Registry
TCNT1H,
TCNT1L

Obsah èítaèe/èasovaèe 1 Ètením této hodnoty lze zjistit èas (re- Normální režim (WGM = 0)
- registry TCNT1H, TCNT1L lativnì od okamžiku vynulování èítaèe/
/èasovaèe 1), kdy na vývodu ICP na- V tomto režimu se vždy èítá naho-
stala vstupní událost. Pøipomeòme, že ru (inkrementace obsahu) a nenastá-
Dva 8bitové registry TCNT1H a
první se musí èíst ICR1L. vá žádné nulování. Èítaè jednoduše
TCNT1L (obr. 6.4) umožòují pøístup
pøeteèe, když dosáhne svého 16bitové-
k obsahu 16bitového èítaèe/èasovaèe 1
Podpora èítaèe/èasovaèe 1 ho maxima (vrchol = $FFFF) a restar-
(pøipomeòme, že pøi zápisu se musí
zapsat nejdøíve do TCNT1H, pøi ètení tuje se ze dna ($0000).
v pøerušovacím systému Pøíznak pøeteèení TOV1 se nastaví
se jako první musí èíst TCNT1L).
Je tøeba poznamenat, že èítaè/èa- Èítaè/èasovaè 1 mùže generovat ve stejném hodinovém cyklu èítaèe, ve
sovaè 1 èítá nahoru (ve vìtšinì reži- celkem ètyøi pøerušení: kterém obsah TCNT1 dosáhl nuly.
mù). To znamená, že po každém hodi- Jednotka Input Capture se v nor-
• pøerušení pøi pøeteèení èítaèe/èasova- málním režimu používá snadno. Ovšem
novém impulsu pøivedeném na jeho èe 1,
vstup se obsah zvýší o 1 (napø. z $0000 èasové rozmezí dvou po sobì jdoucích
• pøerušení pøi shodì obsahu komparaè- událostí nesmí pøekroèit rozlišení èíta-
na $0001). ního registru OCR1A s obsahem èítaèe,
Pokud registr TCNT1H, TCNT1L èe. Rozlišení mùžeme zvýšit buï ob-
obsahuje hodnotu $FFFF a pøijde další • pøerušení pøi shodì obsahu komparaè- sluhou pøerušení TOV1 (poèítáme,
hodinový impuls, obsah èítaèe pøeteèe ního registru OCR1B s obsahem èítaèe, kolikrát èítaè pøetekl) nebo použitím
($0000) a poèítá se od zaèátku. Pøi • pøerušení pøi zachycení obsahu èíta- pøeddìlièky.
pøeteèení se nastaví pøíznak pøeteèení èe v záchytném registru. Jednotka Output Compare mùže
a mùže se generovat pøerušení. být použita pro generování pøerušení,
Registr TIMSK (obr. 6.7) obsahuje ale použití OC1A/OC1B výstupu se
Komparaèní registry masky: TOIE1 (povolení pøerušení pøi v tomto režimu nedoporuèuje (pohltí pøí-
pøeteèení), OCIE1A (povolení pøeruše- liš mnoho strojového èasu procesoru).
èítaèe/èasovaèe 1 ní pøi dosažení shody obsahu TCNT1 Význam bitù COM1X1, COM1X0
- OCR1AH, OCR1AL a s OCR1A), OCIE1B (povolení pøeruše- z registru TCCR1A v tomto a dalších re-
OCR1BH, OCR1BL ní pøi dosažení shody obsahu TCNT1 žimech bez PWM je uveden v tab. 6.3.
s OCR1B) a TICIE1 (povolení pøeruše-
Komparaèní registry obsahují hod- ní po zachycení obsahu èítaèe v regist- CTC režim (WGM = 4 nebo 12)
notu, která se ustaviènì porovnává ru ICR1).
s obsahem èítaèe/èasovaèe 1. V pøípa- Registr TIFR (obr. 6.8) obsahuje Tento režim zvolíme nastavením
dì shody se na vývodu OC1X provede pøíznaky: TOV1 (indikuje pøeteèení), WGM = 4 nebo 12. V tomto režimu je
výstupní událost definovaná nastave- OCF1A (indikuje dosažení shody v jed- registr OCR1A/ICR1 použit pro mani-
ním bitù COM1X1, COM1X0. notce Output Compare A), OCF1B (indi- pulaci s rozlišením èítaèe.
Pøipomeòme, že pøi zápisu se musí kuje dosažení shody v jednotce Output V CTC režimu se totiž èítaè vynu-
zapsat nejdøíve do OCR1XH. Pøi ètení Compare B) a ICF1 (indikuje zachycení luje, když TCNT1 dosáhne hodnoty
se jako první musí èíst OCR1XL. stavu jednotkou Input Capture). OCR1A. (pro WGM = 4) nebo ICR1
(pro WGM = 12). Takže OCR1A/ICR1
vlastnì definuje hodnotu vrcholu, tedy
Záchytný registr èítaèe/èasovaèe 1 6.3. Popis rozlišení èítaèe. Tento režim poskytuje
- ICR1H, ICR1L (obr. 6.6)
V okamžiku aktivace vývodu ICP (viz
jednotlivých režimù vìtší možnost øízení kmitoètu.
Pøerušení se mùže generovat, když
obr. 6.1) je aktivní stav èítaèe/èasovaèe 1 Nyní si vysvìtlíme jednotlivé pracov- TCNT1 dosáhne vrcholu, který je dán
pøenesen do registru ICR1H, ICR1L. ní režimy èítaèe/èasovaèe 1. obsahem OCR1A/ICR1. V tomto pøípa-

Obr. 6.5.
Registry
OCR1AH,
OCR1AL
a OCR1BH,
OCR1BL

Obr. 6.6.
Registr
ICR1H,
ICR1L

26 Konstrukèní elektronika A Radio - 5/2006


Obr. 6.7.
Registr
TIMSK

Obr. 6.8.
Registr
TIFR

Tab 6.3. teèení èítaèe. Pokud je OCR1X = vrchol,


Význam bitù bude výstup stabilnì v úrovni „log. 1“
COM1X1, (neinvertující režim) nebo „log. 0“ (in-
COM1X0 vertující režim).
v režimech Význam bitù COM1X1, COM1X0
bez PWM z registru TCCR1A v rychlém PWM re-
žimu je uveden v tab. 6.4.
dì se nastaví pøíznak OCF1. Je-li pøe- Pro výpoèet rozlišení platí vzorec: Fázovì korigovaný PWM režim
rušení povoleno, vyvolá se.
Tento režim nepoužívá dvojité „buffe- rozlišenírychlý PWM = log2(vrchol + 1). (WGM = 1, 2, 3, 10 nebo 11)
rování“ hodnoty maxima. Je-li tedy do Tento režim zvolíme nastavením:
Pro neinvertující režim (COM1X1 =
registru OCR1A/ICR1 zapsána hodno- WGM = 1, 2, 3, 10 nebo 11.
= 1, COM1X0 = 0) je vývod OC1X na-
ta menší, než je aktuální obsah TCNT1, staven do úrovnì „log. 1“ vždy po pøe- Fázovì korigovaný PWM režim po-
vynechá se porovnávací událost a èítaè teèení obsahu èítaèe. Po dosažení skytuje PWM prùbìh s velkým rozliše-
pak bude èítat do svého maxima. Teprve shody TCNT1 = OCR1X se tento vývod ním, používá dvoufázovou realizaci. Èí-
po pøeteèení nastane žádaná událost. taè èítá opakovanì z $0000 do vrcholu
vynuluje (pøejde do úrovnì „log. 0“).
Pokud je tento efekt nevítaný, použijte al- a potom z vrcholu do $0000.
Doba trvání úrovnì „log. 1“ na vývodu
ternativnì rychlý PWM režim (WGM = V neinvertujícím režimu je vývod
OCR1X je tak vlastnì pøímo úmìrná
= 15), ve kterém je registr OCR1A dvo- hodnotì obsažené v registru OCR1X. OC1X vynulován pøi shodì TCNT1 =
jitì bufferovaný. V invertujícím režimu (COM1X1 = 1, = OCR1X pøi èítání nahoru. Vývod se
Pro generování výstupního prùbìhu COM1X0 = 1) je vše naopak. nastaví pøi shodì TCNT1 = OCR1X pøi
na vývodu OC1A lze zvolit režim tog- èítání dolù. V invertujícím režimu je
Pøíznak TOV1 je nastaven pokaždé,
gle (COM1A1 = 0, COM1A0 = 1). Pak èinnost opaèná.
když èítaè dosáhne hodnoty vrcholu.
každá shoda TCNT1 s OCR1A vede Dvoufázové provedení má sice nižší
V závislosti na volbì nastavitelného vr-
k negaci vývodu OC1A, takže se gene- cholu (OCR1A/ICR1) se navíc ve stej- pracovní kmitoèet, než provedení jedno-
ruje signál se støídou 1 : 1. ném hodinovém cyklu, když byl nasta- fázové (rychlý PWM režim), ale pro
Nejvyšší generovaný kmitoèet do- ven TOV1, nastaví pøíznak OC1A/ICF1. nìkteré aplikace se mu dává pøednost.
staneme pro pøípad, že je OCR1A =
Aktualizace ICR1 se liší od aktuali- Rozlišení pro fázovì korigovaný
= $0000. Pro tento maximální kmitoèet
zace OCR1A. Registr ICR1 totiž není PWM režimu mùže být buï stanoveno
platí: dvojitì bufferovaný jako OCR1A. Je pevnì jako 8, 9 nebo 10 bitù, nebo mùže
fOC1AMAX = fclk_IO/2. tedy velmi riskantní nastavit obsah být definováno registry ICR1, OCR1A.
Pro ostatní pøípady platí: ICR1 na hodnotu menší, než je obsah Minimální rozlišení jsou 2 bity (ICR1/
èítaèe v pøípadì, že je použit nízký stu- /OCR1A = $0003), maximální rozlišení
fOC1A = fclk_IO/2·N·(1 + OCR1A), peò pøeddìlièky. Okamžik shody je pak je 16 bitù (ICR1/OCR1A = $FFFF).
minut a èítaè doèítá do hodnoty $FFFF. Pro výpoèet rozlišení platí vzorec:
kde N pøedstavuje dìlicí pomìr (1, 8, Teprve po pøeteèení a novém bìhu na-
64, 256 nebo 1024). stane událost shody. rozlišenífáz. korig. PWM = log2(vrchol + 1).
Podobnì, jako v normálním režimu, U registru OCR1A tento problém
nevzniká, je dvojitì bufferovaný. Takže Pro fázovì korigovaný PWM režim
je pøíznak TOV1 nastaven ve stejném platí, že èítaè je inkrementován, dokud
hodinovém cyklu èítaèe, ve kterém na- zapsat novou hodnotu do tohoto regist-
ru mùžeme kdykoli. Obsah 16bitového obsah èítaèe nedosáhne hodnoty:
stane pøeteèení z $FFFF na $0000. $00FF (WGM = 1), $01FF (WGM = 2),
bufferu se do 16bitového registru pøe-
nese automaticky v okamžiku pøeteèení $03FF (WGM = 3), ICR1 (WGM = 10)
Rychlý PWM režim nebo OCR1A (WGM = 11). Po dosaže-
obsahu èítaèe.
(WGM = 5, 6, 7, 14 nebo 15) ní takto stanoveného vrcholu se zmìní
Pro výstupní kmitoèet PWM signálu
na vývodu OC1X platí: smìr èítání (obsah èítaèe je roven vr-
Tento režim zvolíme nastavením:
cholu po jeden hodinový takt).
WGM = 5, 6, 7, 14 nebo 15. Rychlý
fOC1XPWM = fclk_IO/N·(vrchol + 1), Pøíznak TOV1 je nastaven pokaždé,
PWM režim generuje PWM s velkou
když èítaè dosáhne dna ($0000). Když
ryclostí. Rychlý PWM režim se odlišuje
kde N pøedstavuje dìlicí pomìr (1, 8, je pro definici vrcholu použit registr
od ostatních PWM režimù svou jedno-
fázovou realizací. Èítaè èítá ode dna 64, 256 nebo 1024). ICR1/OCR1A, je pøíznak ICF1/OCF1A
do maxima (vrcholu) a po pøeteèení se Mezní hodnoty OCR1X registru pøed- nastaven ve stejném hodinovém cyklu
vrací opìt ke dnu. stavují zvláštní pøípady generování prù- èítaèe, ve kterém se aktualizují registry
V rychlém PWM režimu je obsah èí- bìhu PWM. Pokud je OCR1X = $0000, OCR1X (tyto registry jsou dvojitì buffe-
taèe inkrementován, dokud nedosáhne vytváøí se krátký zákmit v okamžiku pøe- rované). Takže pøíznaky pøerušení lze
vrcholu, tj. jedné z pevných hodnot:
$00FF (WGM = 5), $01FF (WGM = 6), Tab 6.4.
$03FF (WGM = 7) nebo hodnoty ICR1 Význam
(WGM = 14) nebo OCR1A (WGM = 15). bitù
Èítaè se pak vynuluje následujícím ho- COM1X1,
dinovým cyklem. COM1X0
Z pøedchozího odstavce vyplývá, že v rychlém
rozlišení v rychlém PWM režimu je buï PWM
pevnì stanoveno jako 8, 9 nebo 10 bitù, režimu
nebo je definováno obsahem registru
ICR1/OCR1A. Minimální rozlišení jsou 2
bity (ICR1/OCR1A = $0003), maximální
rozlišení je 16 bitù (ICR1/OCR1A = $FFFF).

Konstrukèní elektronika A Radio - 5/2006 27


použít pro generování pøerušení pøi do- OC1X vynulován pøi shodì TCNT1 = PWM signál. Pro správnou funkci vý-
sažení dna nebo vrcholu. = OCR1X pøi èítání nahoru a je nasta- vodu OC1A/OC1B je nutné nastavit bit
Pøi zmìnì hodnoty vrcholu musí pro- ven pøi shodì TCNT1 = OCR1X pøi èí- DDRD5/DDRD4 (konfigurovat vývod
gram zajistit, aby nová hodnota vrcholu tání dolù. V invertujícím režimu je vše jako výstupní).
byla stejná nebo vyšší než hodnota obou naopak. Pro výstupní kmitoèet PWM signálu
registrù OCR1A, OCR1B. Je-li hodnota Hlavní rozdíl mezi fázovì a kmito- na vývodu OC1X platí:
vrcholu menší než obsah libovolného re- ètovì korigovaným režimem a døíve po-
gistru OCR1A, OCR1B, nemùže nastat psaným (”pouze”) fázovì korigovaným f OC1XPWM = fclk_IO/2·N·vrchol,
událost shody TCNT1 = OCR1X. Pokud režimem je v okamžiku, kdy je registr
však používáme pevné hodnoty ($00FF, OCR1X aktualizován ze svého bufferu. kde N pøedstavuje dìlicí pomìr (1, 8,
$01FF, $03FF), nejsou nepoužité bity Rozlišení je nyní definováno obsa- 64, 256 nebo 1024).
OCR1X registrù uvažovány! hem registru ICR1/OCR1A. Minimální Mezní hodnoty OCR1X pøedstavují
Pokud mìníme hodnotu vrchulu rozlišení jsou 2 bity (ICR1/OCR1A = zvláštní pøípady generování PWM sig-
za bìhu èítaèe, je doporuèeno používat = $0003), maximální rozlišení je 16 bitù nálu. Pro neinvertující režim platí: Je-li
místo fázovì korigovaného PWM reži- (ICR1/OCR1A = $FFFF). OCR1X = $0000, je výstup OC1X sta-
mu režim oznaèovaný jako fázovì a Pro výpoèet rozlišení platí: bilnì v úrovni „log. 0“. Pøi OCR1X = vr-
kmitoètovì korigovaný PWM. Pro sta- chol je výstup OC1X stabilnì v úrov-
bilní hodnotu vrcholu není mezi tìmito rozlišenífázovì a kmitoètovì korig. PWM =
ni „log. 1“. Pro invertující režim platí vše
režimy prakticky žádný rozdíl. = log2(vrchol + 1). opaènì.
Nastavení COM1X1 = 1, COM1X0 = 0
poskytuje na vývodu OC1X neinvertu- Ve fázovì a kmitoètovì korigova-
jící PWM signál, pro COM1X1 = 1, ném PWM režimu je èítaè inkremento-
ván, dokud jeho hodnota nedosáhne
6.4. Závìreèné poznámky
COM1X0 = 1 dostáváme invertující
PWM signál. Pro správnou funkci vý- údaje v registru ICR1 (WGM = 8) nebo Pro správnou funkci vývodu OC1A
vodu OC1A/OC1B je nutné nastavit bit OCR1A (WGM = 9). Po dosažení vr- je nutné bit nastavit DDRB3 (konfiguro-
DDRB3/DDRB4 (konfigurovat vývod cholu se zmìní smìr èítání (hodnota vat vývod OC1A jako výstupní), podob-
jako výstupní). vrcholu je v èítaèi držena jeden hodino- nì pro vývod OC1B je nutné nastavit
Pro výstupní kmitoèet PWM signálu vý takt èítaèe. bit DDRB4.
na vývodu OC1X platí: Pøíznak TOV1 pøeteèení èítaèe je na-
staven ve stejném hodinovém cyklu èí-
fOC1XPWM = fclk_IO/2·N·vrchol, taèe, ve kterém je aktualizován obsah 6.5. Pøíklad 10 - použití
dvojitì bufferovaného registru OCR1X
kde N pøedstavuje dìlicí pomìr (1, 8, (tedy pøi dosažení dna – $0000). Podle režimu Output Compare
64, 256 nebo 1024).
Mezní hodnoty OCR1X pøedstavují
toho, zda byl pro definování vrcholu po-
užit registr ICR1 nebo OCR1A, je pøi
pro blikání LED
zvláštní pøípady generování PWM sig- dosažení vrcholu nastaven pøíznak Tento pøíklad ukazuje, že použití re-
nálu. Pro neinvertující režim platí: Je-li ICF1 nebo OCF1A. Takže pøerušení žimu Output Compare výraznì zjedno-
OCR1X = $0000, je výstup OC1X sta- mùžeme generovat buï pøi dosažení duší realizaci programu, který zajišuje
bilnì v úrovni „log. 0“. Pøi OCR1X = vr- dna, nebo pøi dosažení vrcholu. blikání LED na pozadí bìhu hlavního
chol je výstup OC1X stabilnì v úrovni Pøi zmìnì hodnoty vrcholu musí programu.
„log. 1“. Pro invertující režim platí vše program zajistit, aby nová hodnota vr-
opaènì. cholu byla stejná nebo vyšší než hod- Zadání: Pøipojte k vývojovému kitu
Pokud použijeme režim WGM = 11, nota obou registrù OCR1A, OCR1B. SDK2313 na port B pøípravek AT8LED.
ve kterém je pro definování vrcholu Je-li hodnota vrcholu menší než obsah Nech bliká LED na vývodu PB2
zvolen registr OCR1A, a zároveò na- libovolného registru OCR1A, OCR1B, v intervalu 0,5 s pomocí èítaèe/èasova-
stavíme COM1A1 = 0, COM1A0 = 1, nemùže nastat událost shody TCNT1 = èe 1. Použijte režim Output Compare.
bude výstup OC1A pracovat v režimu = OCR1X.
toggle a produkovat signál se støídou Na rozdíl od fázovì korigovaného Pro realizaci musíme na adresu
1 : 1. PWM režimu je nyní výstupní signál sy- oznaèenou symbolem OC1Aaddr umís-
Význam bitù COM1X1, COM1X0 metrický. Jelikož se hodnota OCR1X tit obsluhu pøerušení.
z registru TCCR1A ve fázovì korigova- aktualizuje pøi dosažení dna, jsou délky Dùležité je správnì konfigurovat
ném PWM režimu je uveden v tab. 6.5. nábìžné a sestupné fáze stejné. èítaè/èasovaè 1, musíme nastavit bit
Použití registru ICR1 je zvláštì CTC1 z registru TCCR1B.
Fázovì a kmitoètovì korigovaný vhodné pro pevné hodnoty vrcholu. Èasovací údaj nyní pøeneseme v pøí-
PWM režim (WGM = 8 nebo 9) Navíc je pak registr OCR1A volnì mé hodnotì (symbol KONST pøed-
k dispozici pro generování PWM výstu-
Fázovì a kmitoètovì korigovaný stavuje èíslo 4883) do páru registrù
pu na vývodu OC1A. Pokud ale potøe-
PWM režim je velmi podobný výše po- OCR1AH:OCR1AL (je vhodné vynulo-
buje PWM kmitoèet mìnit, musíme
psanému fázovì korigovanému PWM použít registr OCR1A, který je dvojitì vat pár TCNT1H:TCNT1L, i když je
režimu. bufferovaný. tato operace nadbyteèná - po resetu
Opìt je použita dvoufázová realiza- Nastavení COM1X1 = 1, COM1X0 = 0 jsou totiž tyto registry vynulovány auto-
ce. Èítaè tedy èítá ode dna ($0000) do poskytuje na vývodu OC1X neinvertu- maticky).
vrcholu a potom zpìtnì z vrcholu do jící PWM signál, pro COM1X1 = 1, Poslední zmìna pøi inicializaci je
dna. V neinvertujícím režimu je výstup COM1X0 = 1 dostáváme invertující na místì volby povoleného pøerušení.
Obslužná rutina pøerušení je nyní
trochu jednodušší než v pøíkladu 9, re-
Tab 6.5. žim Output Compare totiž hodnotu obsa-
Význam ženou v páru registrù OCR1AH:OCR1AL
bitù nemìní. Místo toho zvyšuje obsah páru
COM1X1, TCNT1H:TCNT1L. Po dosažení shody
COM1X0 TCNT1H:TCNT1L = OCR1AH:OCR1AL
ve fázovì se pár TCNT1H:TCNT1L automaticky
(a kmito- vynuluje (což zajišuje bit CTC1 nasta-
ètovì) vený v registru TCCR1B).
korigova- Program je nazván PROG_10.ASM a
ném PWM je vypsán v tab. 6.6. Pøíklad najdete v [4]
režimu v adresáøi PROGRAMY\PROG_10.

28 Konstrukèní elektronika A Radio - 5/2006


Tab. 6.6. Program PROG_10.ASM Tab. 6.7. Program PROG_11.ASM povídá invertovanému PWM generátoru
PROG_10.ASM: (inverzi potøebujeme proto, že LED
PROG_11.ASM: na pøípravku AT8LED svítí pøi úrovni
.INCLUDE “tn2313def.INC“
.INCLUDE “tn2313def.INC“
;definice registrú
;definice registrú
„log. 0“), dolní dva bity pak podle tab.
.DEF REG=R16 ;pracovní registr 6.2 volí 8bitovou šíøi. Byl zvolen nejvyš-
.DEF BIT2=R15 ;maska bitu 2 ší pracovní kmitoèet. Nastavení registru
.EQU KONST=4883 ;konstanta OC .DEF REG=R16 ;pracovní registr
.ORG $0000 ;RESET .EQU KONST=4883 ;konstanta OC TCCR1B na hodnotu 0b00000001 od-
RJMP RESET ;inicializace povídá pøímo hodinovému signálu mik-
.ORG OC1Aaddr ;OC c/c 1A ;inicializace: rokontroléru (10 MHz). Výstupní kmito-
RJMP BLIKNI ;obsluha LED RESET: SER REG ;REG=0b11111111 èet PWM generátoru je však podle
OUT DDRB,REG ;port B je výstupní tab. 6.4 dìlen èíslem 511, vychází tedy
;inicializace: OUT PORTB,REG ;LED zhasnuty pøibližnì 20 kHz.
RESET: SER REG ;REG=0b11111111 LDI REG,RAMEND ;nastav SPL
OUT DDRB,REG ;port B je výstupní Nakonec se jako výchozí hodnota
OUT SPL,REG ;na konec RAM
OUT PORTB,REG ;LED zhasnuty LDI REG,0b01000000 ;zvol režim
PWM generátoru nastaví èíslo 255 (což
LDI REG,0b00000100 ;nahraj masku OUT TCCR1A,REG ;OC toggle je pro 8bitový rozsah maximum), které
MOV BIT2,REG ;pro bit 2 LDI REG,0b00001101 ;povol CTC1 je uloženo v registru PWM. Horní polovi-
LDI REG,RAMEND ;nastav SPL OUT TCCR1B,REG ;preddelicka f0/1024 na páru OCR1AH:OCR1AL je vynulová-
OUT SPL,REG ;na konec RAM na (pøipomeòme, že nejdøíve se musí na-
CLR REG ;nuluj
LDI REG,0b00000000 ;zvol normální
OUT TCCR1A,REG ;režim OUT TCNT1H,REG ;TCNT1H stavit OCR1AH a potom až OCR1AL):
LDI REG,0b00001101 ;povol CTC1 OUT TCNT1L,REG ;TCNT1L Realizace ošetøení zákmitù tlaèítek
OUT TCCR1B,REG ;preddelicka f0/1024 LDI REG,HIGH(KONST);nahraj horní je podobná jako v pøíkladu, pouze se
CLR REG ;nuluj OUT OCR1AH,REG ;bajt KONST do OCR1AH mìní maska na hodnotu 0b00001111,
OUT TCNT1H,REG ;TCNT1H LDI REG,LOW(KONST) ;nahraj dolní protože používáme 4 tlaèítka.
OUT TCNT1L,REG ;TCNT1L OUT OCR1AL,REG ;bajt KONST do OCR1AL
Porovnáním konstant 0b00000001,
LDI REG,HIGH(KONST);nahraj horní
OUT OCR1AH,REG ;bajt KONST do OCCR1AH ;smycka hlavního programu: 0b00000010, 0b00000100 a 0b00001000
LDI REG,LOW(KONST) ;nahraj dolní SMYCKA: NOP ;žádná akce se znegovaným stavem pøeèteným
OUT OCR1AL,REG ;bajt KONST do OCCR1AL RJMP SMYCKA ;nekonecný cyklus z registru PIND (negace je nutná proto,
LDI REG,0b01000000 ;povol prerušení že sepnuté tlaèítko uvede odpovídající
OUT TIMSK,REG ;pri OC c/c 1A vstup do úrovnì „log. 0“) se realizuje
SEI ;povol prerušení gle (po každém dosažení shody párù zmìna obsahu registru PWM na hod-
TCNT1H:TCNT1L = OCR1AH:OCR1AL) noty: 64, 128, 192 a 255. Tyto hodnoty
;smycka hlavního programu: se výstup PB3 (OC1A) zneguje. Pro
SMYCKA: NOP ;žádná akce odpovídají pracovnímu impulsu délky
RJMP SMYCKA ;nekonecný cyklus správnou funkci musí být opìt nasta- 25%, 50%, 75% a 100% (poslední hod-
ven bit CTC1 v registru TCCR1B. nota je ve skuteènosti 99,61%), viz obr.
;obsluha OC c/c 1: Program je nazván PROG_11.ASM a 6.10. Pøenesení aktualizované hodnoty
BLIKNI: ;ulož registry: je vypsán v tab. 6.7. Pøíklad najdete v [4] registru PWM do PWM generátoru pro-
PUSH REG ;ulož REG v adresáøi PROGRAMY\PROG_11.
IN REG,SREG ;ulož SREG
bìhne od návìští NASTAV.
PUSH REG ;do zásobníku Nakonec je tøeba vyèkat na to, až
;blikni: Pozn.: Pøestože je tato realizace velmi obsluha uvolní tlaèítko (od návìští SM1).
IN REG,PORTB ;cti stav LED jednoduchá (a navíc i zcela èasovì pøes- Rutina USTAL se používá pro reali-
EOR REG,BIT2 ;negace bitu 2 ná) má jednu nevýhodu. Nelze ji použít zaci krátkého zpoždìní pøed opakova-
OUT PORTB,REG ;ulož nový stav libovolnì, ale pouze pro vývod PB3. ným ètení stavu tlaèítek.
;obnov registry:
POP REG ;obnov SREG
Program je nazván PROG_12.ASM a
je vypsán v tab. 6.8. Pøíklad najdete v [4]
OUT SREG,REG
POP REG
;ze zásobníku
;obnov REG
6.7. Pøíklad 12 v adresáøi PROGRAMY\PROG_12.
RETI ;konec obsluhy - Použití režimu PWM
Test programu
pro nastavení jasu LED
6.6. Pøíklad 11 Pøipojte pøípravky na urèené porty.
Pozorujte zmìnu jasu LED pøipoje-
Tento pøíklad ukazuje použití èítaèe/
- hardwarové blikání /èasovaèe 1 v režimu PWM generáto- né na vývod PB3 v závislosti na stisku
jednoho z tlaèítek S0 až S3.
LED na vývodu PB3 ru. V pøíkladu je jas LED regulován po-
mocí pulsnì-šíøkové modulace. Na obr. 6.10 je naznaèen vliv stisk-
nutého tlaèítka na jas LED pøipojené
Tento pøíklad ukazuje, že blikání LED Zadání: Pøipojte k vývojovému kitu na vývod PB3. Napøíklad po stisku tla-
lze zajistit i hardwarovì. Po provedení SDK2313 na port B pøípravek AT8LED. èítka S0 je proud do diody dodáván jen
inicializaèních operací není tøeba blikání Na port D pøipojte pøípravek ATSW. Po- po ètvrtinu periody generovaného sig-
již nijak obsluhovat. mocí tlaèítek S0 až S3 a 8bitového re- nálu. Pro tlaèítko S3 je proud dodáván
Zadání: Pøipojte k vývojovému kitu žimu PWM mìòte jas LED pøipojené témìø celou periodu (pomìr doby svitu
SDK2313 na port B pøípravek AT8LED. k vývodu PB3. ku délce periody je 255 : 256).
Nech bliká LED na vývodu PB3 Tlaèítka S0 až S3 nastavují støed-
v intervalu 0,5 s pomocí èítaèe/èasova- ní hodnotu proudu protékajícího LED
èe 1. Narozdíl od pøíkladu 10 (viz kapi- v rozsahu 25 až 100 %.
tolu 6.5) využijte schopností vývodu
PB3 v režimu Output Compare. Tento pøíklad vychází z pøíkladu 6
(viz kapitolu 3.4). Drobná zmìna je
Podstatný rozdíl proti pøíkladùm 9 a v pøidání dalšího tlaèíka (pùvodnì se
10 je v tom, že nebudeme používat ob- používala pouze tlaèítka S0 až S2).
služnou rutinu pøerušení. Po odpovídají- V tomto pøípadì je tedy nutné pøipojit
cí konfiguraci pobìží blikaè zcela nezá- pull-upy na vývody PD0 až PD3.
visle na realizovaném programu. Dùležitìjší je však konfigurace èíta-
K tomu staèí správnì konfigurovat èe/èasovaèe 1 do režimu PWM gene-
registr TCCR1A. Místo døíve používané rátoru. Bity COM1A1 a COM1A0 regis-
hodnoty 0b00000000 je nastaveno tru TCCR1A mají pro režim PWM jiný
0b01000000. Nyní je tedy vybrán režim význam, než bylo uvedeno na obr. 6.2 Obr. 6. 10. Prùbìh proudu tekoucího
Output Compare oznaèovaný jako tog- (viz tab. 6.5). Hodnota 0b11000001 od- diodou LED pøi stisku tlaèítek S0 až S3

Konstrukèní elektronika A Radio - 5/2006 29


Tab. 6.8. Program PROG_12.ASM
6.8. Shrnutí pøi shodì obsahù registrových párù
TCNT1H:TCNT1L = OCR1AH:OCR1AL.
PROG_12.ASM:
.INCLUDE “tn2313def.inc“ Nakonec si shrneme nejdùležitìjší • Registrový pár TCNT1H:TCNT1L
;definice registrú poznatky, které byly podány v pøedcho- pøedstavuje aktuální obsah èítaèe/èa-
zím textu: sovaèe 1. V normálním režimu se tato
.DEF REG=R16 ;pracovní registr
.DEF PWM=R17 ;jas LED • Režim èasovaèe dovoluje vytváøet hodnota zvyšuje každým pøíchozím im-
.DEF CNT1=R0 ;pocítadla periodicky se opakující signály. pulsem o 1 (pouze v režimu PWM se
.DEF CNT2=R1 ;pro USTAL pøepíná režim èítání nahoru/dolù).
• Jednotka Output Compare dovoluje
vytvoøit hardwarovì øízený impuls (kon- • Registrový pár OCR1AH:OCR1AL
SER REG ;REG=0b11111111
OUT DDRB,REG ;port B je výstupní èí úrovní „log. 0“ nebo „log. 1“), popø. pøedstavuje komparaèní registr, ve kte-
OUT PORTB,REG ;LED zhasnuty rém je hodnota neustále porovnávána
generovat periodický signál stanovené-
CLR REG ;REG=0b00000000 s aktuálním obsahem èítaèe/èasova-
OUT DDRD,REG ;port D je vstupní
ho kmitoètu.
èe. Pøi shodì se odpovídající výstup
LDI REG,0b00001111 • PWM generátor - jedná se o speciální OC1 (PB3) nastaví („log. 1“), vynuluje
OUT PORTD,REG ;pull-upy pro S0..S3 režim èítaèe/èasovaèe 1, který dovolu- („log. 0“) nebo zneguje (toggle).
LDI REG,RAMEND ;nastav SPL je na vývodu OC vytváøet signál odpoví-
OUT SPL,REG ;na konec RAM • Registrové páry se obsluhují kompli-
LDI PWM,255 ;maximální jas dající pulsnì-šíøkové modulaci. Pomocí kovanìji, je dùležité zachovat poøadí
LDI REG,0b11000001 ;invertovaná tohoto signálu lze mìnit výkon stejno- zápisu/ètení obou polovin páru. Pøi zá-
OUT TCCR1A,REG ;8bitová PWM smìrných spotøebièù (LED, žárovka, pisu se nejdøíve zapisuje do horního
LDI REG,0b00000001 ;f0=20 kHz ss motor).
OUT TCCR1B,REG registru páru. Pøi ètení se nejdøíve ète
CLR REG • Registr TCCR1A volí režim jednotky dolní registr páru.
;výchozí nastavení jasu: Output Compare nebo šíøku PWM ge- • Instrukce NOP slouží obvykle k èaso-
OUT OCR1AH,REG ;OCR1AH=$00 nerátoru (8 až 10 bitù). vání. Tato instrukce nemá žádný vedlejší
OUT OCR1AL,PWM ;OCR1AL=PWM ($FF)
• Registr TCCR1B volí pøedevším ho- efekt a její vykonání trvá právì jeden ho-
CYKL: ;hlavní smycka: dinový signál èítaèe/èasovaèe. Kromì dinový impuls (pro hodinový kmitoèet
;cekej na stisk: toho obsahuje další bity. Nejdùležitìj- 10 MHz tedy 100 ns). V uvedených pøí-
SM0: IN REG,PIND ;cti stav PD ší je patrnì bit CTC1, který v režim kladech byla tato instrukce zapsána
COM REG ;neguj stavy Output Compare umožòuje automatic- místo hlavního programu (takže hlavní
ANDI REG,0b00001111;zamaskuj další bity
BREQ SM0 ;pro REG=0 se vrat ky vynulovat obsah èítaèe/èasovaèe 1 program neprovádìl žádou akci).
RCALL USTAL ;ustal
IN REG,PIND ;cti stav PD

7. Použití piezomìnièe
COM REG ;neguj stavy
ANDI REG,0b00001111;zamaskuj další bity
BREQ SM0 ;pro REG=0 se vrat

;test tlacítek: V této kapitole se ukážeme, jak ván ani v pøípadì, že na piezomìniè
CPI REG,0b00000001 ;test S0
BREQ S0 používat piezomìniè. Dále bude u- pøiložíme ss napìtí.
CPI REG,0b00000010 ;test S1 veden pøípravek ATOUT, který kro-
mì piezomìnièe obsahuje obvody
BREQ S1
CPI REG,0b00000100 ;test S2 rozhraní pro ovládání výkonových 7.2. Zpùsoby buzení
BREQ S2
CPI REG,0b00001000 ;test S3
spotøebièù pomocí mikroøadièe (tri- piezomìnièe
BREQ S3 ak, relé a zpìtnovazební optoèlen).
RJMP CYKL ;jiná varianta Piezomìniè lze pøipojit ke zdroji sig-
nálu nìkolika zpùsoby. Obvyklé varian-
;reakce pro S0: 7.1. Princip funkce ty jsou na obr. 7.2:
S0: LDI PWM,64 ;25%
RJMP NASTAV piezomìnièe • Nesymetrické buzení je nejznámìjší
;reakce pro S1: variantou zapojení. Piezomìniè je pøi-
S1: LDI PWM,128 ;50% Piezomìniè využívá tzv. piezoe- pojen mezi vývod mikroøadièe (napø.
RJMP NASTAV lektrického jevu. Pøi pøiložení elektric- PB3) a GND. Výhodou tohoto øešení je
;reakce pro S2: kého napìtí se piezomateriál deformuje.
S2: LDI PWM,192 ;75% jednoduchost zapojení. Nevýhodou je
RJMP NASTAV
Druhé ze známých použití piezoelek- pomìrnì nízký rozkmit signálu. Z obr.
;reakce pro S3: trického jevu spoèívá v generování na- 7.3 je zøejmé, že rozkmit napìtí je 5 V.
S3: LDI PWM,255 ;99,61% pìtí pøi mechanické deformaci piezo-
RJMP NASTAV • Buzení vyšším napìtím je klasickým
materiálu (tohoto efektu využívají
;zapíše hodnotu: pøípadem, jak zvýšit rozkmit budicího
krystalové pøenosky gramofonù).
NASTAV: CLR REG signálu. I nyní platí èasový diagram
OUT OCR1AH,REG ;OCR1AH=$00 Aby byl piezomìnièem generován
podle obr. 7.3, maximální napìtí je však
OUT OCR1AL,PWM ;OCR1AL=PWM tón, musí být pøednì zajištìna èasová
24 V. Takže i rozkmit je 24 V.
zmìna pøiloženého napìtí. Zvuk je totiž
;cekej na uvolnení: vytváøen chvìním membrány piezomì- • Symetrické buzení je cestou, jak
SM1: IN REG,PIND ;cti stav PD zvýšit rozkmit budicího signálu v pøípa-
COM REG ;neguj stavy nièe.
ANDI REG,0b00001111;zamaskuj další bity Piezomìniè je zátìží s kapacitním
BRNE SM1 ;pro REG<>0 se vrat charakterem. Podobnì jako u bìžné-
RCALL USTAL ;ustal ho kondenzátoru teèe nejvyšší proud
IN REG,PIND ;cti stav PD pøi zmìnì pøiloženého napìtí. Pro ss
COM REG ;neguj stavy b) buzení
ANDI REG,0b00001111;zamaskuj další bity napìtí je proud piezomìnièem nulový. vyšším
BRNE SM1 ;pro REG<>0 se vrat Tohoto chování lze využít pøi ovlá- napìtím
RCALL USTAL ;ustal dání tónu. Tón se negeneruje nejen
RJMP CYKL ;návrat do smycky v pøípadì, že napìtí pøiložené na piezo-
;rutina pro ustálení: mìniè je rovno nule, ale není genero-
USTAL: CLR CNT1 ;CNT1=0 a) nesyme- c) symetrické
CLR CNT2 ;CNT2=0 trické buzení
USTALS: DEC CNT2 ;sniž CNT2 Obr. 7.1. buzení
BRNE USTALS ;test konec
DEC CNT1 ;sniž CNT1
Piezo-
BRNE USTALS ;test konec elektrický Obr. 7.2. Možné varianty buzení
RET ;návrat jev piezomìnièe

30 Konstrukèní elektronika A Radio - 5/2006


piezomìnièe obsahuje ještì obvody
pro ovládání výkonových spotøebièù
(pøíklad použití najdete v kapitole 8.5).
Schéma zapojení pøípravku ATOUT
je na obr. 7.6.
Obr. 7.3. Prùbìh napìtí piezomìnièe Bit D0 ovládá pomocí tranzistoru
pro nesymetrické buzení T1 relé RE1 typu RELEM15E05. Relé
má pøepínací kontakt (lze zapínat i vy-
pínat øízený okruh) dimenzovaný na
250V/8 A støídavého proudu. Relé však
lze použít i pro ovládání ss zátìží. Dio-
da D1 chrání tranzistor pøed pøepìtím,
které se indukuje v okamžiku vypnutí
proudu do cívky relé. Pøi D0 v úrovni
„log. 0“ je T1 vypnut, cívkou relé neteèe
proud a jsou spojeny kontakty K a K0.
Obr. 7.4. Prùbìh napìtí piezomìnièe Pøi D0 v úrovni „log. 1“ je T1 sepnut,
pøi symetrickém buzení cívkou relé teèe proud a jsou spojeny
kontakty K a K1.
Bit D1 ovládá pøes optoèlen OP1
(MOC3020) triak TR1, kterým lze ovlá-
dat støídavé zátìže. Použitý chladiè
DO1A dovoluje spínat proud maximál-
nì 2 A. Obr. 7.6. Schéma pøípravku ATOUT
Bit D2 je vstupní a je napojen na vý-
stup optoèlenu OP2 typu 4N33. Pokud Seznam souèástek pro ATOUT
pøípravek pøipojíme na port D, bude bitu (cena asi 180 Kè)
D2 odpovídat vstup pøerušení INT0 (to
bylo zámìrem). Pomocí bitu D2 mùže R1 3,3 kΩ/1 %/0,6 W
mikroøadiè sledovat napìtí v rozsahu R2 1 kΩ/1 %/0,6 W
0 až 50 V. Pøepólování brání dioda D2. R3 3,3 kΩ/1 %/0,6 W
Obr. 7.5. Generování signálù se
Podobnì jako u triaku TR1 slouží opto- R4 1 kΩ/1 %/0,6 W
vzájemným fázovým posuvem 180°
èlen jako oddìlovaè, takže sledované R5 1 kΩ/1 %/0,6 W
napìtí není galvanicky spojeno s mikro- D1 1N4007
dì, že nechceme používat zvýšené na- D2 1N4007
øadièem. Pokud mezi vstupy IN+ a IN-
pájecí napìtí. Pokud budou na vývo- pøipojíme napìtí alespoò 5 V, sepne se T1 BC548B
dech PB3 a PB4 generovány signály fototranzistor v optoèlenu a z vývodu TR1 TIC206
se vzájemným fázovým posuvem 180° D2 pøeèteme úroveò „log. 0“. Když je chladiè DO1A pro TR1
(tedy navzájem invertované), zvýší se mezi vstupy IN+ a IN- napìtí blížící se
rozkmit na dvojnásobnou velikost oproti nule, je tranzistor vypnut a z vývodu D2
pøípadu nesymerického buzení. Prùbìh pøeèteme úroveò „log. 1“.
napìtí na piezomìnièi je na obr. 7.4. Na bitech D3 a D4 je pøipojen pie-
Prùbìhy napìtí, které je tøeba genero- zomìniè. Pro optimální funkci je tøeba
vat na vývodech PB3 a PB4, jsou zøej- na tìchto bitech generovat vzájemnì
mé z obr. 7.5. negované signály (viz obr. 7.5).
Použití symetrického buzení však
vyžaduje, aby byl piezomìniè pøipojen Pozn.: Použití triaku TR1 a relé RE1
mezi dva vývody mikroøadièe (nebo je pro ovládání síového spotøebièe bude
nutné pøidat další invertor zajišující ge- ukázáno v kapitole 8.
nerování inverzního signálu). Souèástky pøípravku ATOUT jsou
pøipájeny na desce s jednostrannými
7.3. Pøípravek ATOUT plošnými spoji. Obrazec spojù je na
obr. 7.7. Rozmístìní souèástek na des-
Piezomìniè mùžete pøi trošce šikov- ce je na obr. 7.8., drátová propojka na
nosti pøipájet pøímo na desku vývojové- stranì spojù je na obr. 7.9 (propojka
ho kitu SDK2313. Druhou možností je z izolovaného drátu podstatnì zjedno- Obr. 7.9. Drátová propojka na stranì
použít pøípravek ATOUT, který kromì dušila návrh obrazce spojù). spojù na desce pøípravku ATOUT

Obr. 7.7.
Obrazec
plošných
spojù
pøípravku
ATOUT
(mìø.: 1 : 1)

Obr. 7.8.
Rozmístìní
souèástek
na desce
pøípravku
ATOUT

Konstrukèní elektronika A Radio - 5/2006 31


OP1 MOC3020 Jako obvykle zaèíná inicializace s kmitoètem 1 kHz. Signál bude aktivní
OP2 4N33 konfigurací portu B. Zápisem hodnoty asi 1 s, potom následuje 1 s mezera
RE1 RELEM15E05 0b11111111 do registru DDRB nasta- (poté se vše opakuje).
PIEZO KPE-112 víme celý port do výstupního režimu.
Tento pøíklad vychází z pøíkladu 13
P vidlice PSL10 Dále do registru PORTB zapíšeme
v kapitole 7.4.
deska s plošnými spoji ATOUT hodnotu 0b0001000, takže všechny vý-
Pro dosažení pøerušovaného tónu
vody kromì PB3 jsou v úrovni „log. 0“. bude tøeba poèítat aktivace obsluhy
Toto nastavení je zvláštì dùležité.
7.4. Pøíklad 13 Všimnìte si, že PB4 = 0 a PB3 = 1. Po-
pøerušení èasovaèe a po vypršení sta-
noveného intervalu pøepnout režim.
- vytvoøení tónu kud stav tìchto bitù znegujeme (což pro- Dále je tøeba mít k dispozici pomocný
vádí obsluha pøeteèení èasovaèe), bude bit, ve kterém se udržuje informace o re-
Pøíklad ukazuje, jak generovat sy- PB4 = 1 a PB3 = 0. Tím na piezomìnièi
metrický signál pro buzení piezomìnièe. žimu (zda zní tón nebo je prodleva).
dosáhneme rozkmitu napìtí ±5 V. Pro tyto úèely byly použity 16bitový re-
Zadání: Pøipojte k vývojovému kitu Dále je tøeba urèit nastavení èítaèe/ gistr X (lze zajistit i dlouhé intervaly) a
SDK2313 na port B pøípravek ATOUT. /èasovaèe 0. Požadovanému kmitoètu pøíznakový bit T. Registr X bude napl-
Mezi vývody PB3 a PB4 generujte sy- 1 kHz odpovídá perioda 1 ms, èasovaè nìn hodnotou 2000 (zavedeno jako
metrický signál pro buzení piezomìni- však musí být bìhem periody genero- symbol INTER), což zhruba odpovídá
èe (piezomìniè lze pøipájet i pøímo vaného signálu aktivován dvakrát (bì- èasu 1 s (2000·20·25,6 µs = 1,024 s).
mezi vývody PB3 a PB4, takže pøípra- hem periody se signál dvakrát zmìní). Pøíznakový bit T je pro pøípad aktivního
vek ATOUT není nutný). Kmitoèet sig- Takže požadovaný èas aktivace je signálu roven 0 (vynuluje se instrukcí
nálu bude 1 kHz, støída 1 : 1. Pro reali- 0,5 ms (tedy 500 µs). Uvažme napø. CLT) a pro pøípad prodlevy roven 1
zaci použijte èítaè/èasovaè 0. pøeddìlièku f0/256. Jestliže kmitoètu (nastaví se instrukcí SET). Vzhledem
mikroøadièe 10 MHz odpovídá jeden k tomu, že mikroøadièe AVR jsou 8bito-
Tento pøíklad vychází z pøíkladu 9 impuls periody 100 ns, tak pro zvole-
(viz kapitolu 6.5), nyní je však použit èí- vé, musí být 16bitový registr plnìn na-
ný dìlicí pomìr dostaneme periodu dvakrát. Nejdøíve se do dolní èásti (jmé-
taè/èasovaè 0 (pro generovaný kmito-
25,6 µs. Interval pak nastavíme 20 no XL) nahraje dolní bajt hodnoty
èet vyhoví a zùstane nám k dispozici
dokonalejší èítaè/èasovaè 1). (20·25,6 µs = 512 µs). Takže registr INTER (získá se pomocí funkce LOW),
Jedná se o pøíklad, ve kterém se TCCR0 obsahuje hodnotu 0b00000100 potom se do horní èásti (jméno XH)
musí používat vektor pøerušení pøi (což odpovídá dìlièce f 0 /256) a do nahraje horní bajt hodnoty INTER (zís-
pøeteèení èítaèe/èasovaèe 0 (symbol registru TCNT0 nahrajeme hodnotu ká se pomocí funkce HIGH).
OVF0addr). 256 - 20 (èítaè èítá nahoru, proto nedo- Zbytek inicializace je stejný jako
sazujeme interval pøímo, ale uváží- v pøíkladu 13.
Tab. 7.4. Program PROG_13.ASM me doplnìk do 256). Tak je zaveden Podstatnìjší zmìny jsou v obslužné
symbol KONST. Výpoètem tedy do- rutinì pøeteèení èasovaèe, která je za-
PROG_13.ASM: jdeme k výsledné hodnotì kmitoètu psána od návìští PISKNI. Nejdøíve mu-
.INCLUDE “tn2313def.INC“
;definice registrú 976,5625 Hz. síme uložit používané registry do zá-
.DEF REG=R16 ;pracovní registr Nakonec je tøeba povolit pøerušení sobníku.
.DEF MSKBIT=R15 ;maska bitù 3, 4 (nastavit masku pro èítaè/èasovaè 0 a Poté se testuje režim. Je-li T = 1,
.EQU KONST=256-20 ;cca 1 kHz nastavit pøíznakový bit I). musí se pøeskoèit ta èást obsluhy, kte-
Obsluha pøeteèení èasovaèe za- rá neguje stav vývodù PB3 a PB4 (pie-
.ORG $0000 ;RESET zomìniè totiž generuje tón jen pro pøí-
RJMP RESET ;inicializace
psaná od návìští PISKNI je podobná
.ORG OVF0addr ;pretecení c/c 0 jako v pøíkladu è. 10. Nejdøíve je tøeba pad napájení èasovì promìnným
RJMP PISKNI ;obsluha piezo uložit používané registry do zásobníku. prùbìhem napìtí; pro ss napìtí libovol-
Poté se pøeète stav portu B a pomo- né polarity se tón neozývá). Pro tento
;inicializace: cí masky obsažené v registru MSKBIT test je použita instrukce BRTS.
RESET: SER REG ;REG=0b11111111 (0b00011000) se neguje stav vývodù Dále je tøeba snížit obsah registru X
OUT DDRB,REG ;port B je výstupní o 1 (tak poèítáme, jak dlouho je signál
LDI REG,0b00001000 PB3 a PB4. Vzhledem k tomu, že pøi
OUT PORTB,REG ;pouze PB3 je 1 inicializaci mìly oba bity vzájemnì ne- aktivní, nebo jak dlouho trvá prodleva).
LDI REG,0b00011000 ;nahraj masku govanou hodnotu (PB3 = 1, PB4 = 0), Nejjednodušší je použít instrukci
MOV MSKBIT,REG ;bitù pro piezo budou po negaci oba vývody opìt vzá- SBIW XL,1 (sníží obsah registrového
LDI REG,RAMEND ;nastav SPL jemnì negovány. Otoèí se však polarita páru o zvolenou hodnotu). Pokud je po
OUT SPL,REG ;na konec RAM napìtí (PB3 = 0, PB4 = 1). Pøi novém této operaci registr X stále nenulový
LDI REG,0b00000100 ;nastav preddelicku (testujeme instrukcí BRNE), znamená
OUT TCCR0,REG ;na f0/256 vyvolání se stav opìt zmìní (PB3 = 1,
LDI REG,KONST ;nahraj konstantu PB4 = 0). Tak to pokraèuje neustále. to, že se v operaci bude pokraèovat
OUT TCNT0,REG ;do TCNT0 Protože je použit normální režim (ni- (nedojde k pøepnutí režimu, nevypršel
LDI REG,0b00000010 ;povol prerušení koli režim CTC), musíme ještì nastavit interval stanovený symbolem INTER).
OUT TIMSK,REG ;pri pretecení c/c 0 registr TCNT0 na hodnotu KONST. Program pak pøejde na konec obslu-
SEI ;povol prerušení hy pøerušení (zapsáno od návìští
;smycka hlavního programu: Nakonec obnovíme registry ze zá-
sobníku a zaøazením instrukce RETI PISKNK).
SMYCKA: NOP ;žádná akce Pokud po snížení obsahu registru X
RJMP SMYCKA ;nekonecný cyklus ukoèíme obsluhu pøerušení.
Program je nazván PROG_13.ASM a tento registr vynuluje, je tøeba pøepnout
;obsluha pretecení c/c 0: je vypsán v tab. 7.4. Pøíklad najdete v [4] režim. Proto je nutné znegovat pøízna-
PISKNI: ;ulož registry: v adresáøi PROGRAMY\PROG_13. kový bit. Nejjednodušší je nahrát obsah
PUSH REG ;ulož REG pøíznakového registru ze zásobníku (byl
IN REG,SREG ;ulož SREG tam uložen na zaèátku obsluhy pøeruše-
PUSH REG
;zmen stav:
;do zásobníku
7.5. Pøíklad 14 ní) a provést negaci bitu 6 (v registru
SREG je totiž bit T uložen jako bit 6,
IN REG,PORTB
EOR REG,MSKBIT
;cti stav
;negace bitù
- vytvoøení viz obr. 2.20) a takto aktualizovanou
hodnotu zase vrátit do zásobníku (mas-
OUT PORTB,REG
;nastav casovac:
;ulož nový stav
pøerušovaného tónu ku 0b01000000 pro negaci bitu 6 lze
LDI REG,KONST ;nahraj konstantu nahrát do registru XL, jeho obsah se
OUT TCNT0,REG ;do TCNT0 V pøíkladu se vytváøí pøerušovaný
tón, který je výraznìjší než tón stálý. totiž stejnì bude mìnit).
;obnov registry: Nakonec se do registru X nahraje
POP REG ;obnov SREG
OUT SREG,REG ;ze zásobníku Zadání: Pøipojte k vývojovému kitu hodnota INTER, a tak je vše pøipra-
POP REG ;obnov REG SDK2313 na port B pøípravek ATOUT. veno na odmìr intervalu v novì zvole-
RETI ;konec obsluhy Mezi vývody PB3 a PB4 generujte tón ném režimu.

32 Konstrukèní elektronika A Radio - 5/2006


Pøipomeòme ještì, že nová hodno-
ta pro registr SREG je uložena v zá-
7.6. Pøíklad 15 ších pøerušení) mìnit stav pøíznakové-
ho bitu T. Jinak nebude tón správnì
sobníku. Takže pøi závìreèné obnovì - vytvoøení sirény generován.
registrù se novì nastavená hodnota
pøíznakového bitu T pøenese do regist- Tento pøíklad vytváøí sirénu, která Program je nazván PROG_15.ASM a
ru SREG. Pøed tím je však ještì nutné generuje tón promìnného kmitoètu. je vypsán v tab. 7.6. Pøíklad najdete v [4]
nastavit èasovaè na hodnotu danou v adresáøi PROGRAMY\PROG_15.
Zadání: Pøipojte k vývojovému kitu
symbolem KONST.
SDK2313 na port B pøípravek ATOUT.
Vytvoøte sirénu, která pøepíná kmitoèet Tab. 7.6. Program PROG_15.ASM
Pozn.: Hlavní program (nebo obsluhy
dalších pøerušení) nesmí mìnit stav mezi 1 kHz a 2 kHz. Každý z kmitoètù PROG_15.ASM:
pøíznakového bitu T. Jinak nebude pøe- je aktivní po dobu 0,5 s. .INCLUDE “tn2313def.INC“
rušovaný tón správnì generován. ;definice registrú
Tento pøíklad vychází z pøíkladu 14
Program je nazván PROG_14.ASM a (viz kapitolu 7.5). Pro generování dvou .DEF REG=R16 ;pracovní registr
kmitoètù je nutné zavést konstanty F1 .DEF MSKBIT=R15 ;maska bitù 3, 4
je vypsán v tab. 7.5. Pøíklad najdete v [4] .DEF F=R17 ;aktuální kmitocet
v adresáøi PROGRAMY\PROG_14. a F2 obsahující nastavení èasovaèe .EQU F1=256-20 ;cca 1 kHz
pro oba pøípady. Aktuálnì zvolený kmi- .EQU F2=256-10 ;cca 2 kHz
Tab. 7.5. Program PROG_14.ASM toèet je pak uložen do registru F. Vzhle- .EQU INTER1=1000 ;doba trvání pro F1
dem k tomu, že doba trvání každého .EQU INTER2=2000 ;doba trvání pro F2
PROG_14.ASM: tónu je stanovena v poètu aktivací rutin
.INCLUDE “tn2313def.INC“ PISKNI, musí být také zavedeny dva .ORG $0000 ;RESET
;definice registrú RJMP RESET ;inicializace
.DEF REG=R16 ;pracovní registr symboly pro interval trvání tónu: INTER1
.ORG OVF0addr ;pretecení c/c 0
.DEF MSKBIT=R15 ;maska bitù 3, 4 (odpovídá F1) a INTER2 (odpovídá F2).
RJMP PISKNI ;obsluha piezo
.EQU KONST=256-20 Narozdíl od pøíkladu 14 je hodnota IN-
;cca 1 kHz TER1 = 1000 (což bude odpovídat in- ;inicializace:
.EQU INTER=2000 ;doba trvání 1 s tervalu 0,512 s) a INTER2 = 2000 (což RESET: SER REG ;REG=0b11111111
.ORG $0000 ;RESET
odpovídá stejné hodnotì, pro polovièní OUT DDRB,REG ;port B je výstupní
RJMP RESET ;inicializace periodu èasovaèe však musí být tento LDI REG,0b00001000
.ORG OVF0addr ;pretecení c/c 0 údaj dvojnásobný proti INTER1). OUT PORTB,REG ;pouze PB3 je 1
RJMP PISKNI ;obsluha piezo Podobnì jako v pøíkladu 14 bude re- LDI REG,0b00011000 ;nahraj masku
MOV MSKBIT,REG ;bitù pro piezo
žim (tedy použitý kmitoèet) indikován LDI REG,RAMEND ;nastav SPL
;inicializace: pøíznakovým bitem T. Pro T = 0 je F = F1
RESET: SER REG ;REG=0b11111111 OUT SPL,REG ;na konec RAM
OUT DDRB,REG ;port B je výstupní a X obsahuje výchozí hodnotu INTER1. CLT ;nuluj T
LDI REG,0b00001000 Pro T = 0 je F = F2 a X obsahuje vý- LDI XL,LOW(INTER1) ;nastav
OUT PORTB,REG ;pouze PB3 je 1 chozí hodnotu INTER2. LDI XH,HIGH(INTER1);interval
LDI REG,0b00011000 ;nahraj masku Další zmìny jsou v obslužné ruti- LDI REG,0b00000100 ;nastav preddelicku
MOV MSKBIT,REG ;bitù pro piezo nì pøeteèení èasovaèe (název je opìt OUT TCCR0,REG ;na f0/256
LDI REG,RAMEND ;nastav SPL LDI F,F1 ;nahraj kmitocet
OUT SPL,REG ;na konec RAM PISKNI). Po obvyklém uložení obsahù
OUT TCNT0,F ;do TCNT0
CLT ;nuluj T používaných registrù (vèetnì SREG) je LDI REG,0b00000010 ;povol prerušení
LDI XL,LOW(INTER) ;nastav tøeba snížit poèítadlo odmìøující dobu OUT TIMSK,REG ;pri pretecení c/d 0
LDI XH,HIGH(INTER) ;interval trvání tónu (instrukce SBIW XL,1). Po- SEI ;povol prerušení
LDI REG,0b00000100 ;nastav preddelicku kud je výsledek nenulový, je obsluha ;smycka hlavního programu:
OUT TCCR0,REG ;na f0/256 SMYCKA: NOP ;žádná akce
LDI REG,KONST ;nahraj konstantu
ukonèena (pøed tím se však ze zásob-
níku obnoví obsahy registrù). RJMP SMYCKA ;nekonecný cyklus
OUT TCNT0,REG ;do TCNT0
LDI REG,0b00000010 ;povol prerušení Pokud je poèítadlo (registr X) vynu-
;obsluha pretecení c/c 0:
OUT TIMSK,REG ;pri pretecení c/c 0 lováno, musí se zmìnit režim. Podob- PISKNI: ;ulož registry:
SEI ;povol prerušení nì jako v pøíkladu 14 se tedy nahraje
;smycka hlavního programu: PUSH REG ;ulož REG
kopie registru SREG uložená v zásob- IN REG,SREG ;ulož SREG
SMYCKA: NOP ;žádná akce
RJMP SMYCKA ;nekonecný cyklus níku a zneguje se bit 6, který odpovídá PUSH REG ;do zásobníku
pøíznakovému bitu T. Takto aktuali- ;zmení stav vývodù:
;obsluha pretecení c/c 0: zovaná hodnota je zase uložena do IN REG,PORTB ;cti stav
PISKNI: ;ulož registry: zásobníku. Navíc je však nutno novì EOR REG,MSKBIT ;negace bitù
PUSH REG ;ulož REG OUT PORTB,REG ;ulož nový stav
stanovenou hodnotu bitu T uvážit v ná- PISKNT: ;sníží X o 1:
IN REG,SREG ;ulož SREG
PUSH REG ;do zásobníku sledujících testech. Takže instrukce SBIW XL,1 ;snížení
BRTS PISKNT OUT SREG,REG zajistí nastavení novì BRNE PISKNK ;test vynulování
;zmení stav vývodù: vypoèítané hodnoty pøíznakového bitu ;po operaci je X=0:
IN REG,PORTB ;cti stav ve stavového registru. LDI XL,0b01000000 ;maska pro T
EOR REG,MSKBIT ;negace bitù Následující instrukce BRTS PISKTS POP REG ;nahraj SREG
OUT PORTB,REG ;ulož nový stav EOR REG,XL ;zneguj T
PISKNT: ;sníží X o 1:
pøejde na návìští PISKTS v pøípadì,
že je T = 1 (tedy, když se má kmitoèet PUSH REG ;ulož SREG
SBIW XL,1 ;snížení OUT SREG,REG ;nahraj
BRNE PISKNK ;test vynulování zmìnit na 2 kHz). Pøi pøeladìní na kmi- BRTS PISKTS ;test T
;po operaci je X=0: toèet 1 kHz je do registru F uložena hod- PISKTC: LDI F,F1 ;T=0, F=F1
LDI XL,0b01000000 ;maska pro T nota F1 a interval odpovídá INTER1. LDI XL,LOW(INTER1) ;nastav
POP REG ;nahraj SREG Pøi pøeladìní na kmitoèet 2 kHz je do LDI XH,HIGH(INTER1);interval
EOR REG,XL ;zneguj T
registru F uložena hodnota F2 a inter- RJMP PISKNK ;preskoc
PUSH REG ;ulož SREG
LDI XL,LOW(INTER) ;nastav val odpovídá INTER2. PISKTS: LDI F,F2 ;T=1, F=F2
LDI XH,HIGH(INTER) ;interval Dále musí být hodnota uložená v re- LDI XL,LOW(INTER2) ;nastav
PISKNK: ;nastav casovac: LDI XH,HIGH(INTER2);interval
gistru F pøenesena do registru TCNT0 PISKNK: ;nastav casovac:
LDI REG,KONST ;nahraj konstantu (tím se obnoví žádaná délka intervalu
OUT TCNT0,REG ;do TCNT0 OUT TCNT0,F ;nastav TCNT0
;obnov registry: pøeteèení èasovaèe) a nakonec se ob- ;obnov registry:
POP REG ;obnov SREG noví registry. POP REG ;obnov SREG
OUT SREG,REG ;ze zásobníku OUT SREG,REG ;ze zásobníku
POP REG ;obnov REG Pozn.: Podobnì jako v pøíkladu 14 ne- POP REG ;obnov REG
RETI ;konec obsluhy smí hlavní program (nebo obsluhy dal- RETI ;konec obsluhy

Konstrukèní elektronika A Radio - 5/2006 33


7.7. Shrnutí výhodné pro blokové zpracování dat).
Jinak je výhodné, že v instrukèním sou-
hodnotu (konstantu) v rozsahu 0 až 63.
V pøíkladech 14 a 15 byla tato instrukce
Shròme poznatky z pøedchozího textu: boru mikroøadièù AVR jsou instrukce použita pro snižování poèítadla pøed-
ADIW a SBIW, které dokážou pøièítat/ stavovaného registrem X. Tak bylo
• Pøíznakový bit T je jediný z bitù stavo-
/odeèítat pøímé hodnoty v rozsahu 0 až možno pomocí jediného èasovaèe øí-
vého registru SREG, který není mìnìn
63 od obsahù registrù X, Y a Z. dit jak generování tónu na piezomìni-
v dùsledku provádìných instrukcí (kro-
mì dále popsaných instrukcí CLT a • Instrukce CLT, SET nulují nebo na- èi, tak generovaný tón mìnit. Pøi zá-
SET). Proto jej lze používat libovolným stavují pøíznakový bit T, pisu instrukce se uvádí název spodního
zpùsobem. V pøíkladech 14 a 15 byl po- • Instrukce BRTS, BRTC umožòují tes- bajtu 16bitového registru. Tedy zápis
užit pro indikaci aktuálního režimu. tovat pøíznakový bit T. Jedná se o skoky. SBIW XL,1 odpovídá snížení obsahu
Instrukce BRTS pøejde na uvedené registru X o 1.
• 16bitový registr X - jedná se o pár re-
gistrù R26 (dolní polovina oznaèovaná návìští v pøípadì, že T = 1. Instrukce Pozn.: V pøíkladech mìní rutina ob-
jako XL) a R27 (horní polovina oznaèo- BRTC pøejde na uvedené návìští v pøí- sluhy pøerušení bit T stavového regist-
vaná jako XH). Speciální 16bitové re- padì, že T = 0. ru SREG. To je dosti zvláštní situace,
gistry X, Y, Z se obvykle používají pro • Instrukce SBIW sníží obsah zvolené- obsluha pøerušení obvykle nemá mìnit
tzv. nepøímé adresování pamìti (jsou ho 16bitového registru X, Y, Z o pøímou stav stavového registru.

8. LCD displej a jeho použití nost se obvykle používá pro definici


èeské diakritiky. Kódy tìchto znakù
jsou 00H až 07H. CG RAM se adresuje
V této kapitole bude používán až DB4. 4bitovou komunikaci ukazuje v rozsahu 6 bitù. Každý znak je defino-
modul øádkového displeje se dvì- pøípravek ATLCDTX2, který je popsán ván osmi po sobì jdoucími buòkami,
ma øádky po 16 sloupcích (znacích). v kapitole 8.2. rozmìr znakù je 5 × 7 bodù. Horní tøi
Po popisu ovládání vestavìným øa- Komunikaci øídí linky RS (výbìr pøe- bity nejsou použity (každý podøádek
dièem HD44780 je uveden pøípravek nosu dat nebo pøíkazu), /R/W (ètení znaku je definován spodními 5 bity),
ATLCDTX2, který je využit v násle- nebo zápis dat) a E (povolovací vstup). podøádkù zobrazení je 8, obvykle se
dujících pøíkladech. Vývody displeje jsou popsány v tab. 8.1, však používá pouze 7 (poslední podøá-
Prakticky budeme pracovat s mo- pøíklad èasových prùbìhù signálù pøi dek odpovídá místu zobrazení kurzoru).
dulem EL1602A-FL-YBW (cena asi zápisu pøíkazu/dat jsou na obr. 8.1. Situace je jasnìjší z tab. 8.3, zde je de-
220 Kè), který je nabízen na strán- Z praktického hlediska nás bude za- finován znak š jako první znak v CG
kách www.hw.cz. Tento modul dis- jímat pouze zápis na displej. Zpìtné RAM (adresy jsou pak binárnì 000000
ponuje i podsvícením. ètení není obvykle dùležité (údaje lze až 000111).
souèasnì se zápisem na displej uložit
8.1. Øadiè HD44780 do RAM mikroøadièe). Tímto zpùsobem Pøíkazy
se zjednoduší komunikace a uspoøíme V tab. 8.4 je seznam jednotlivých
Témìø všechny øádkové displeje jeden øídicí vodiè. Signál /R/W bude pøíkazù displeje. Èas provedení je inter-
jsou øízeny obvodem typu HD44780. proto napojen na úroveò „log. 0“ (spo- val, který musí uplynout do poslání dal-
Datasheet tohoto obvodu naleznete na jen se zemí).
šího pøíkazu, jinak nebude operace
doprovodném CD-ROM v adresáøi DA- úspìšná. Jednotlivé pøíkazy vysvìtlíme
TASHEET. 4bitová komunikace
ještì slovnì:
Zápis dat resp. pøíkazu probíhá tak,
Popis komunikace • Vymaž displej - vymaže displej a na-
že se vybaví signál RS podle toho, zda
staví kurzor na pozici prvního znaku a
Displeje øízené øadièem HD44780 se zapisují data nebo instrukce (/R/W
je trvale v úrovni „log. 0“). Poté se aktivu- prvního øádku (adresa je 00H),
mohou pøenášet data po ètyøech nebo
osmi datových linkách. V pøípadì ko- je vstup E (1) a následnì se na vodièe • Návrat na zaèátek - nastaví kurzor
munikace po ètyøech linkách probíhá DB7 až DB4 pøivedou horní 4 bity dat a na pozici prvního znaku a prvního øád-
zápis nadvakrát (nejdøíve horní a pak potvrdí se deaktivací vstupu E (0). Stejnì ku, obsah DD RAM zùstane zachován,
dolní polovina bajtu) po vodièích DB7 probìhne i zápis dolních 4 bitù (E =1, adresa DD RAM je nastavena na 00H,
vystavení dat na DB7 až DB4, E = 0).
Tab. 8.1. Obsazení vývodù displeje Tab. 8.3. Mapa CG RAM (znak š ulo-
EL1602A-FL-YBW DDRAM a CGRAM žený jako první znak CG RAM)
Displej má dva typy pamìtí:
• DD RAM obsahuje znaky, které se
zobrazují na displeji. Každému zapsa-
nému údaji odpovídá jeden zobrazený
znak podle tab. 8.2. DD RAM se adre-
suje v rozsahu 7 bitù. Pro dvouøádkové
displeje se 16 znaky na øádek jsou plat-
né adresy 00H až 0FH pro první øádek,
a 40H až 4FH pro druhý øádek.
• CG RAM umožòuje, aby uživatel vy-
tvoøil až 8 vlastních znakù. Tato mož-

Obr. 8.1.
Èasové
prùbìhy
zápisu
pøíkazu/dat
na displej
(èasy jsou
v ns)

34 Konstrukèní elektronika A Radio - 5/2006


Tab. 8.2. Generátor znakù • Ètení stavu displeje - ète stav dis-
pleje. Jedná se o pøíznak zaneprázdnì-
ní (tedy zda displej ještì zpracovává
pøedchozí požadavek) a aktuální stav
adresového èítaèe,
• Zápis dat do CG/DD RAM - zapisuje
data na zvolenou adresu v CG RAM
nebo DD RAM. Typ pamìti je urèen
pøedchozím použitím pøíkazu pro na-
stavení adresy,
• Ètení dat z CG/DD RAM - ète data
ze zvolené adresy v CG RAM nebo DD
RAM. Typ pamìti je urèen pøedchozím
použitím pøíkazu pro nastavení adresy.

Inicializaèní sekvence
pro 4bitovou komunikaci
Velmi dùležitá je tzv. inicializaèní
sekvence. Ta musí být provedena, aby
se s displejem dalo komunikovat.
4bitová komunikace vyžaduje odesí-
lání dat nadvakrát. Dále je složitìjší
úvodní sekvence volby režimu komuni-
kace. Nejdøíve se zaèíná s režimem
8bitovým (což je možné, protože pøi
nastavení komunikace není hodnota
spodních 4 bitù uvažována) a pak se
pøechází na 4bitový režim.
Na obr. 8.2 je horní bajt (posílá se
nejdøíve) oznaèen šedou barvou. Je
tedy zøejmé, že pro první 4 pøíkazy se
neposílá dolní bajt.

8.2. Pøípravek ATLCDTX2


Realizace pøípravku ATLCDTX2 vy-
šla z pùvodního pøípravku ATLCD1602,
který byl popsán v [3]. V druhé verzi
• Volba režimu - nastaví øízení posuvu následnì poslaná data jsou uložena
zobrazení/kurzoru (inkrementace/de- na tuto adresu. Adresa je 6bitová (uži-
krementace pozice) a režim práce, vatelských znakù je 8, každý znak má
• Zapni/vypni displej - zapíná/vypíná 8 podøádkù),
celý displej, kurzor a blikání kurzoru, • Nastavení adresy DD RAM - nastaví
adresu DD RAM do adresového èítaèe,
• Nastavení komunikace - nastavuje následnì poslaná data jsou uložena
šíøku komunikaèních dat (4 nebo 8 bitù) na tuto adresu. Adresa je 7bitová (plat-
a poèet øádkù displeje, né adresy pro dvouøádkový displej se
• Nastavení adresy CG RAM - nastaví 16 znaky jsou 00H až 0FH pro první øá-
adresu CG RAM do adresového èítaèe, dek a 40H až 4FH pro druhý øádek),
Tab. 8.4. Seznam pøíkazù

Obr. 8.2.
Inicializaèní
sekvence
pro 4bitovou
komunikaci

Konstrukèní elektronika A Radio - 5/2006 35


Výhoda tohoto øešení je zøejmá: Do
každého programu, který bude tento
pøípravek používat, vložíme direktivou
.INCLUDE soubor LCD.INC. Takže ovlá-
dací rutiny není tøeba pracnì kopírovat
nebo znovu zapisovat pro každý pøíklad.

Realizace
Pøednì byly zavedeny symboly pro
používané registry A a B (pøedávají se
v nich prakticky všechny parametry).
Dále je zaveden symbol PORT zastu-
pující port D (pokud chcete pøipojit pøí-
pravek na jiný port, staèí tento symbol
pouze pøedefinovat). Ještì jsou zave-
deny symboly RS, E a BCKLED pro
ovládání signálù RS a E displeje a
podsvícení displeje. Poslední symbol
ENDS pøedstavuje konec øetìzce (pou-
žívají jej rutiny WRSTR a WRSTRD).
Obr. 8.3. Schéma pøípravku Nejdùležitìjší, ale také nejkompliko-
ATLCDTX2 vanìjší, jsou rutiny INIT, WRDATA a
Obr. 8.5. Rozmístìní souèástek WRCMD.
na desce pøípravku ATLCDTX2
LCD displeje byl jednak použil levnìjší • Rutina INIT zajišuje inicializaci dis-
typ displeje (má navíc podsvícení) a pleje dle inicializaèní sekvence zapsa-
Pøipojení je provedeno tak, aby se
dále opraveny nìkteré nedostatky. né formou obr. 8.2.
pøípravek dal použít i pro port D. Tedy
Abychom zachovali zpìtnou kom- není použit vývod D7, který na tomto • Rutiny WRDATA a WRCMD jsou si
patibilitu k pøípravku ATLCD1602, byly portu není k dispozici. natolik podobné, že bylo úèelné zapsat
jednotlivé vývody zapojeny takto: Schéma pøípravku ATLCDTX2 je je za sebou. Jedná se o rutiny, které se
• datová sbìrnice DB7 až DB4 je pøi- na obr. 8.3. používají pro zápis dat nebo pøíkazù
pojena na vývody D6 až D3, Rezistor R1 omezuje proud báze (instrukcí) na displej. Rutina WRDATA
• signál E je øízen vývodem D2, tranzistoru T1, který ovládá podsvícení musí pøed vlastním odesláním dat vy-
displeje. Rezistor R2 omezuje proud stavit vodiè RS do úrovnì „log. 1“, ruti-
• signál RS je øízen vývodem D1, podsvìcovací LED (zmìnou velikosti na WRCMD naopak vodiè RS nuluje
• Vývod D0 ovládá podsvícení displeje odporu lze mìnit intenzitu podsvícení). (viz tab. 8.4). Aktivitu vodièe RS je nut-
(na pøípravku ATLCD1602 byl tento vý- Nejvyšší intenzity dosáhneme pøi ná- no zapamatovat (pro další testy) a pro-
vod použit k odpojování napájení a hradì rezistoru R2 drátovou propojkou. to se uloží do pøíznakového bitu T.
hardwarovému resetu LCD øadièe, nyní Rezistor R3 umožòuje nastavit kon- Formát 4bitové komunikace vyža-
to již není nutné). Vzhledem k požadav- trast displeje. Pro dosažení optimálního duje odeslání dat obsažených v regist-
ku co nejnižšího úbytku na spínacím kontrastu doporuèujeme na místo R3 ru A po 4bitových polovinách. Nejdøí-
tranzistoru byl použit typ PNP. Takže doèasnì pøipájet trimr o odporu 10 kΩ ve se odešle horní polovina. Pro tento
podsvícení je pøipojeno pro D0 = 0 a a nastavit vhodný odpor. Tento odpor úèel se data uchovají v registru B a
odpojeno pro pøípad D0 = 1. pak zmìøíme ohmmetrem a trimr na- zamaskují se spodní bity instrukcí
hradíme pevným rezistorem s nejbližší ANDI A,0b11110000.
hodnotou. Dále se musí takto pøipravené bity
posunout o jedno místo vpravo, protože
Souèástky pøípravku ATLCDTX2 vývody LCD modulu byly pøi pøipojení
jsou pøipájeny na desce s jednostran- na konektor PSL10 posunuty o jednu
nými plošnými spoji. Obrazec spojù pozici (všimnìte si napø., že nejvyšší
je na obr. 8.4, rozmístìní souèástek na bit LCD modulu je napojen na vývod
desce je na obr. 8.5. Modul LCD disple- D6). Dùvod je prostý, port D totiž neob-
je upevnìn na desce na stranì sou- sahuje nejvyšší bit. A byla tu snaha mít
èástek a je propojen s deskou krátkými možnost používat pøípravek ATLCDTX2
drátky. i na portu D. Posun o jeden bit vpravo
se tedy provede instrukcí LSR A.
Seznam souèástek pro ATLCDTX2 K takto sestavenému údaji musíme
(cena asi 260 Kè) pøipojit stav vodièe RS (hodnoty bitù
R1 10 kΩ/1 %/0,6 W D7 až D4 a signálù RS a E se totiž za-
R2 10 Ω/1 %/0,6 W píší najednou) a E = 1. Pøipomeòme,
R3 1 kΩ/1 %/0,6 W, viz text že stav vodièe RS byl uložen do pøí-
T1 BC558B znakového bitu T (instrukce BLD A,RS
M1 LCD displej 16 x 2 typu pøenese hodnotu uloženou v pøíznako-
EL1602A-FL-YBW vém bitu na bit s pozicí RS v registru A).
P vidlice PSL10 Nastavení signálu E se provede bito-
deska s plošnými spoji ATLCDTX2 vým souètem s maskou 0b00000100
(jednièka je pouze v místì bitu 2, který
odpovídá signálu E). Nakonec se vše
8.3. LCD.INC odešle na port.
- rutiny pro øízení displeje Vzhledem k tomu, že vykonávání in-
strukcí je pomìrnì rychlé, musí se po
Rutiny pro ovládání pøípravku AT- vystavení chvilku poèkat (celkovì asi
Obr. 8.4. Obrazec plošných spojù LCDTX2 byly zapsány do zvláštního 1000 ns) a poté se data potvrdí staže-
pøípravku ATLCDTX2 (mìø.: 1 : 1) souboru, který byl nazván LCD.INC. ním signálu E do úrovnì „log. 0“.

36 Konstrukèní elektronika A Radio - 5/2006


Zápis dolní poloviny bajtu probìhne WRDATA pøedpokládá data v registru Tab. 8.5. Soubor rutin LCD.INC
velmi podobným zpùsobem. Data se A, musí se tedy obsah registru R0 pøe- LCD.INC:
nejdøíve obnoví z registru B (tam byla nést do registru A. .DEF A=R16 ;pracovní registry
uložena jejich kopie), ještì se ustálí Dále musíme testovat, zda nebyl .DEF B=R17 ;rutin
signály z pøedchozího zápisu. Potom nalezen konec øetìzce. Výpis se totiž .EQU PORT=PORTD ;datová/rídicí
se vymaskuje dolní ètveøice bitù mas- musí ukonèit pro pøípad, že A = ENDS. ;sbernice
;bity rídicí sbernice:
kou 0b00001111 a data se musí posu- Pokud je tedy pøeètený znak rùzný .EQU RS=1 ;signál RS
nout na místo horní ètveøice (zde je tøe- od ENDS, provede se zápis rutinou .EQU E=2 ;signál E
ba provést ètyøi posuvy vlevo, tedy WRDATA. Dále je nutno zvýšit obsah .EQU BCKLED=0 ;rídí podsvícení
použít 4x instrukci LSL A) a zároveò se registru Z o 1 (posunout jej na adresu
opìt musí provést posun o jeden bit dalšího znaku) a vrátit se do smyèky. .EQU ENDS=$FE ;konec retezce
vpravo (posunutí bitù mezi LCD modu- Vše se bude provádìt tak dlouho, do- ;vypíše retezec z prog. pameti zakoncený ENDS
lem a konektorem pøípravku). Proto se kud se nenarazí na konec øetìzce ;adresa retezce je uložena v Z:
tedy provedou 3 posuny vlevo (nebo (znak s hodnotou ENDS). WRSTR: LPM ;cti znak retezce
4 – 1 = 3) instrukcí LSL A. MOV A,R0 ;dej do A
Dále se musí pøipojit stav signálu • Rutina WRSTRD slouží pro výpis øe- CPI A,ENDS ;test konce
RS nakopírovaný z bitu T a zápis za- tìzce uloženého v datové pamìti. Rea- BREQ WRSTRE ;Z=1, pokud je konec
lizace je velmi podobná jako u rutiny RCALL WRDATA ;zapiš
ène s nastaveným bitem E (podobnì ADIW ZL,1 ;zvyš ukazovátko
jako pøi zápisu horní ètveøice). WRSTR. Místo instrukce LPM (pro na-
RJMP WRSTR ;zpet do smycky
Data se zapíší a pøed potvrzením hrání údaje z programové pamìti) se WRSTRE: RET
(stažením E do úrovnì „log. 0“) se opìt používá instrukce LD A,Z+ (nahraje
musí poèkat. Po zápisu dat se vyžadu- data z adresy obsažené v registru Z a ;vypíše retezec z datové pameti zakoncený ENDS
je vložit odpovídající èekací interval pro- zároveò zvýší Z o 1; takže zvyšování ;adresa retezce je uložena v Z:
nemusíme provádìt sami). WRSTRD: LD A,Z+ ;cti znak retezce
to, aby byl pøíkaz úspìšnì dokonèen. CPI A,ENDS ;test konce
Pøednì se musí otestovat, zda se jed- • Rutina SETXY slouží pro nastavení BREQ WRSTDE ;Z=1, pokud je konec
ná o zápis dat nebo pøíkazu. Pøi zápisu pozice pro výpis textu. Registr A odpo- RCALL WRDATA ;zapiš
dat se totiž požaduje èekací interval vídá èíslu øádku (0 nebo 1), registr B RJMP WRSTRD ;zpet do smycky
pouze 40 µs. Zápis nìkterých instruk- WRSTDE: RET
odpovídá èíslu sloupce (1 až 16). Pro
cí však vyžaduje èekací intervaly až první øádek lze adresu DDRAM vypoèí- ;nastaví pozici na rádek, sloupec (A,B)
1,64 ms. Rozlišení typu dat/pøíkazu lze tat takto: ADR = (B - 1). Pro druhý øá- ;A-rádek (1 nebo 2)
nejsnáze zajistit testováním bitu T (pøi dek platí vzorec: ADR = 40H + (B - 1). ;B-sloupec (1 až 16)
zápisu dat je RS = 1 a tedy i bit T = 1). SETXY: DEC B ;B je 0 až 15
Takže pro zápis dat se pøejde na ná- Soubor rutin LCD.INC je vypsán v tab. DEC A ;A je 0 nebo 1
vìští WRDEL1, které odmìøí interval BREQ SETXY2 ;test rádku
8.5 a najdete ho v [4] v adresáøích ;druhý rádek:
100 µs (40 µs by staèilo, realizovaná PROGRAMY\PROG_16 nebo PROG_17. DEC A ;A je 0
èekací rutina však takto krátký interval ORI A,0b01000000 ;pridej $40
neumí vytvoøit). Test je proveden in- Uživatelský popis SETXY2: ADD A,B ;slož rádek a sloupec
strukcí BRTS. RJMP DDRAM ;nastav pozici
Nyní je tedy tøeba rozlišit typ pøíka- Dále je uveden seznam všech rutin
zu. Pøipomeòme, že podle tab. 8.4 vy- vèetnì jejich parametrù: ;smaže displej:
žadují dlouhé èekací intervaly pouze ty CLEAR: LDI A,0b00000001
• INIT - inicializuje displej, nemá para- RJMP WRCMD
instrukce, které mají nastavené bity 0 metry,
nebo 1 a ostatní bity jsou nulové. Nej- • WRCMD - zapíše instrukci stanove- ;vrátí kurzor na zacátek:
jednodušší rozlišení tìchto instrukcí HOME: LDI A,0b00000010
nou obsahem registru A,
bylo možné maskováním kódu instruk- RJMP WRCMD
ce (obnovíme jej z registru B) hodnotou • WRDATA - zapíše znak obsažený
0b11111100 (všimnìte si, že na místì v registru A, ;nastaví inkrementaci:
INCREM: LDI A,0b00000110
bitù 0 a 1 jsou nuly, tyto bity se tedy ne- • WRSTR - zapíše øetìzec uložený RJMP WRCMD
budou uvažovat). Je-li výsledek nenulo- v programové pamìti a zakonèený
vý, znamená to, že bity 2 až 7 jsou ne- znakem ENDS, adresa poèátku øetìz- ;nastaví dekrementaci:
nulové, tedy že se nejedná o instrukce ce je urèena obsahem registru Z, DECREM: LDI A,0b00000100
typu Vymaž displej nebo Návrat na RJMP WRCMD
• WRSTRD - zapíše øetìzec uložený
zaèátek, které vyžadují zvýšený èekací v datové pamìti a zakonèený znakem
interval. Proto program pøejde na ná- ;zapne displej:
ENDS, adresa poèátku je urèena obsa- DISON: LDI A,0b00001100
vìští WRDEL1, kde je pak realizováno hem registru Z, RJMP WRCMD
èekání 100 µs.
Pro dlouhý èekací interval nahra- • SETXY - nastaví pozici pro výpis ;zhasne displej:
jeme do registru A (definuje èekací znaku: A urèuje èíslo øádku (1 nebo 2), DISOFF: LDI A,0b00001000
interval) hodnotu 17, která odpovídá B urèuje èíslo sloupce (1 až 16), RJMP WRCMD
èasu 1,7 ms (což je o nìco více než • CLEAR - smaže displej a pøesune ;zobrazí kurzor:
1,64 ms; to však není na závadu). kurzor na pozici 1, 1, CURON: LDI A,0b00001110
Konec obsluhy vyvolá èekací rutinu • HOME - pøesune kurzor na pozici 1, 1, RJMP WRCMD
DELAY buï s hodnotou A = 1 (èekání
100 µs) nebo A = 17 (èekání 1,7 ms). • INCREM - navolí režim inkrementace ;schová kurzor:
(po zápisu se kurzor pøesune na násle- CUROFF: RJMP DISON
• Rutina WRSTR slouží pro výpis øe- dující pozici),
tìzce zakonèeného znakem ENDS. ;rozbliká kurzor:
• DECREM - navolí režim dekrementa- CURBL: LDI A,0b00001111
Øetìzec musí být uložen v programové ce (po zápisu se kurzor pøesune na RJMP WRCMD
pamìti (jako konstanta zapsaná spo- pøedchozí pozici),
leènì s programem). Adresa øetìzce ;nastaví adresu DD RAM podle A:
se zadává v ukazateli Z. • DISON - rozsvítí displej, DDRAM: ORI A,0b10000000
Pro ètení dat z programové pamìti • DISOFF - zhasne displej, RJMP WRCMD
se používá instrukce LPM (Load Pro- • CURON - zobrazí kurzor, ;nastaví adresu CG RAM podle A:
gram Memory), která nahraje údaj z ad- CGRAM: ORI A,0b01000000
resy urèené obsahem registru Z do re- • CUROFF - schová kurzor,
ANDI A,0b01111111
gistru R0. Vzhledem k tomu, že rutina • CURBL - rozbliká kurzor, RJMP WRCMD

Konstrukèní elektronika A Radio - 5/2006 37


;rozsvítí LED: NOP
BKLON: CBI PORT,BCKLED NOP
RET NOP
NOP
;zhasne LED: DEC B ;sniž pocítadlo
BKLOFF: SBI PORT,BCKLED BRNE DEL10L ;konec?
RET RET Obr. 8.6. Stav displeje po provedení
programu
;inicializacní sekvence: ;ceká zhruba 500 ns:
INIT: SER A ;celý PORT WRCDEL: NOP ;100 ns
OUT PORT-1,A ;je výstupní
Výpis druhého øetìzce probíhá po-
RET ;+400 ns dobnì. Upozornìme ještì na to, že oba
LDI A,150
RCALL DELAY ;cekání 15 ms øetìzce je tøeba zakonèit znakem ENDS.
RCALL SINIT0 ;pošli 03H • DDRAM - nastaví adresu DDRAM Rutiny obsažené v souboru LCD.INC
LDI A,41 podle hodnoty registru A, je tøeba vložit pseudoinstrukcí .INCLUDE
RCALL DELAY ;pockej 4,1 ms až na konec zdrojového textu. Pokud
RCALL SINIT0 ;pošli 03H • CGRAM - nastaví adresu CGRAM
RCALL SINIT0 ;pošli 03H podle hodnoty registru A, by byly rutiny vloženy na zaèátek zdro-
LDI A,0b00010100 jového textu, byla po resetu procesoru
• BLKON - zapne podsvícení displeje, provedena první instrukce první rutiny
OUT PORT,A
RCALL SINIT1 • BLKOFF - zhasne podsvícení displeje. ze souboru LCD.INC.
LDI A,0b00101000 Program je nazván PROG_16.ASM a
RCALL WRCMD ;dva rádky je vypsán v tab. 8.6. Pøíklad najdete v [4]
LDI A,0b00000001 8.4. Pøíklad 16 v adresáøi PROGRAMY\PROG_16.
RCALL WRCMD ;smaž displej
LDI A,0b00001100 - zobrazení textu na displeji Stav displeje po provedení progra-
RCALL WRCMD ;zapni displej mu je na obr. 8.6.
LDI A,0b00000110 Tento pøíklad ukazuje základní pou-
RCALL WRCMD ;inkrementace žití rutin ze souboru LCD.INC.
RET 8.5. Pøíklad 17
Zadání: Pøipojte k vývojovému kitu
;Pomocná rutina pro INIT SDK2313 na port D pøípravek ATLCDTX2. - èasový spínaè
;pošle 03H Zobrazte jednoduchý dvouøádkový text.
SINIT0: LDI A,0b00011100 Tento pøíklad ukazuje praktické po-
OUT PORT,A užití modulu ATOUT z kapitoly 7.3.
;pošle data co jsou na portu PORT: Nejdøíve musíme nastavit registr
SINIT1: RCALL WRCDEL ;ustálení SPL na konec RAM (jinak nelze použí-
Zadání: Pøipojte k vývojovému kitu
CBI PORT,E ;potvrzení vat podprogramy). Dále je tøeba zavolat
SDK2313 na port D pøípravek ATLCDTX2.
LDI A,1 ;ceká 100 µs rutinu INIT, teprve potom lze používat
RJMP DELAY další rutiny ze souboru LCD.INC. Na port B pøipojte pøípravek ATOUT.
;pošle instrukci z A na displej: Dále je ukázáno použití rutiny SET- Vytvoøte program, který sepne relé
WRCMD: CBI PORT,RS ;RS=0 (príkaz) XY pro nastavení pozice výpisu na prv- a triak z pøípravku ATOUT a potom od-
CLT ;ulož T=0 mìøuje interval 12 minut (zbývající èas
RJMP WRCD ;jdi na výkonnou cást ní øádek a první sloupec.
Následuje výpis øetìzce zapsaného je zobrazován na displeji a aktualizován
;pošle data z A na displej:
WRDATA: SBI PORT,RS ;RS=1 (data) od návìští TEXT1. Adresa dat ulože- každou sekundu). Po uplynutí intervalu
SET ;ulož T=1 ných v programové pamìti je dána jejich jsou relé i triak vypnuty a konec odmìru
WRCD: MOV B,A ;uchovej data návìštím. Pozor! Návìští se poèítají je oznámen pomocí pøerušovaného
ANDI A,0b11110000 ;vymaskuj horní pùlku v rozmìru slova, proto musí být adresa tónu v délce asi 5 s na piezomìnièi (je
LSR A ;posun o bit vpravo zapisovaná do registru Z vynásobena souèástí modulu ATOUT).
BLD A,RS ;uváží RS
ORI A,0b00000100 ;E=1 dvìma (aby byla v rozmìru bajtu). Dále Tento pøíklad lze chápat jako logické
OUT PORT,A ;vystavení dat pøipomeòme, že registr Z musí být pl- propojení již døíve uvedených pøíkladù.
RCALL WRCDEL ;ustálení nìn po bajtech, dolní a horní bajt adre-
Napø. se pøipomíná generace pøerušo-
CBI PORT,E ;E=0 (potvrzení) sy získáme funkcemi LOW a HIGH.
MOV A,B ;obnov data vaného tónu, která byla popsána v pøí-
RCALL WRCDEL ;ustálení kladu 14 v kapitole 7.5. Dále se jedná
ANDI A,0b00001111 ;vymaskuj dolní pùlku
Tab. 8.6. Program PROG_16.ASM o použití èítaèe/èasovaèe 1 v režimu
LSL A ;posun o 4 bity PROG_16.ASM: Output Compare (periodické odmìøo-
LSL A ;vlevo a jeden .INCLUDE “tn2313def.inc“ vání intervalù), které bylo uvedeno for-
LSL A ;bit vpravo ;definice registrú mou pøíkladu 10 v kapitole 6.4.
BLD A,RS ;uváží RS
ORI A,0b00000100 ;E=1 LDI A,RAMEND ;nastav SPL Nejdøíve je zavedeno oznaèení re-
OUT PORT,A ;vystavení dat OUT SPL,A ;na konec RAM gistrù pro specifické funkce v programu.
RCALL WRCDEL ;ustálení Dále je v datovém segmentu zaveden
CBI PORT,E ;E=0 (potvrzení) RCALL INIT ;inicializace
buffer obsahující 6 znakù pro zobrazení
BRTS WRDEL1 ;test dat/príkazu LDI A,1 ;nastav zbývajícího èasu. Jedná se o symbol
MOV A,B ;obnov A
ANDI A,0b11111100 ;test typu príkazu
LDI B,1 ;pozici TIMEST. Poté jsou definovány tøi ob-
RCALL SETXY ;na 1, 1 sluhy: RESET (inicializace), TIMER
BRNE WRDEL1 ;pro A není 1,2,3 skoc
;A=1,2,3->dlouhé cekání: LDI ZL,LOW(2*TEXT1) ;adresa (vektor Output Compare pro èítaè/èa-
LDI A,17 ;cekání asi 1,7 ms LDI ZH,HIGH(2*TEXT1) ;textu sovaè 1; pøedstavuje odmìøování inter-
RJMP WRDEL0 ;a skoc na cekání RCALL WRSTR ;výpis retezce valu 100 ms, ze kterého se odvodí in-
WRDEL1: LDI A,1 ;cekání asi 100 µs terval 1 s) a PIEZO (generace zvuku
WRDEL0: RCALL DELAY ;cekej LDI A,2 ;nastav
RET LDI B,4 ;pozici
na piezomìnièi pomocí pøeteèení èíta-
RCALL SETXY ;na 2, 4 èe/èasovaèe 0).
;ceká násobky 100 µs podle A: Inicializace nejdøíve nastaví požado-
DELAY: RCALL DEL100 ;100 µs LDI ZL,LOW(2*TEXT2) ;adresa vaný interval 12:00 minut do registrù
DEC A ;sniž pocítadlo LDI ZH,HIGH(2*TEXT2) ;textu MIN a SEK (všimnìte si, že hodnoty
BRNE DELAY ;konec? RCALL WRSTR ;výpis retezce
RET CYKL: RJMP CYKL ;zastav program jsou zapsány hexadecimálnì; to není
chyba, sledujte text dále!).
;ceká zhruba 100 µs: ;retezce pro výpis: Poté se provede obvyklá inicializace
DEL100: LDI B,100 ;pro 100 µs TEXT1: .DB “PROG_16:“,ENDS registrù SPL (na konec RAM), DDRB
DEL10L: NOP TEXT2: .DB “Test ATLCDTX2“,ENDS
NOP
(celý port B je výstupní). Registr PORTB
NOP ;vloží rutiny pro rízení displeje: je nastaven na hodnotu 0b00000011
NOP .INCLUDE “LCD.INC“ (zapne relé i triak).

38 Konstrukèní elektronika A Radio - 5/2006


Poté se nechá inicializovat LCD se odstaví èítaè/èasovaè 1, který od-
modul a na pozici 1, 1 je vypsán text mìøoval èas) a vypnou se relé i triak.
“ZBYVA: “. Pøipomeòme zejména, že Následnì se povolí pøerušení pøi pøete-
adresa návìští TEXT musí být násobe- èení èítaèe/èasovaèe 0 (bude použit
na 2x (pøekladaè totiž poèítá údaje pro generování pøerušovaného tónu
v programové pamìti po slovech, rutina na piezomìnièi).
WRSTR však vyžaduje adresu pro pøí- Nyní je tøeba nahrát masku bitù PB3
stup k jednotlivým bajtùm). Registr ZE- a PB4 do registru PIEZOF, tato maska
ROCH obsahuje znak '0'. Registr OFF je potøebná pro negaci stavu bitù PB3 a Obr. 8.7. Ovládání žárovky kontaktem
je vynulován, to znaèí, že odmìr ještì PB4 (tím se realizuje tón). Také se na- relé nebo triakem na pøípravku ATOUT
neskonèil. staví registr X na hodnotu 1000 (což
Nyní již konfigurujeme èítaèe/èaso- bude odpovídat 0,512 s; po tuto dobu
vaè 1 do režimu Output Compare. Je tón zní nebo je vypnut). PIEZO
použita pøeddìlièka f0/64 a interval Generování tónu je povoleno aktiva- Návìští PIEZO pøedstavuje obsluhu
je TINTER = 15625. Takže pøerušení cí pøerušovacího systému (instrukcí piezomìnièe (generování tónu). Reali-
OC1addr se aktivuje pøesnì po 100 ms. SEI), tón zní zhruba 5 s. Interval aktiva- zace je velmi podobná jako v pøíkladu
Pro odmìr doby 1 s se musí dané pøeru- ce piezomìnièe je odmìøen pomocí ru- 14 v kapitole 7.5. Nyní je však režim
šení aktivovat 10x (šlo by sice odmìøit tiny INTER. (tón/pauza) indikován nejvyšším bitem
èas 1 s pøímo, ale dosažený interval by Po uplynutí intervalu 5 s se zakáže registru PIEZOF. Tento registr zároveò
byl 1,024 s). Tuto režii zajišuje registr pøerušení (tím piezomìniè zmlkne) a obsahuje masku pro negaci bitù PB3 a
TBASE, který se z výchozí hodnoty 10 nakonec se program zablokuje. PB4, na které je piezomìniè pøipojen.
snižuje až k nule. Tím se tedy odmìøí 1 s.
Použití pøíznakového bitu T pro úèel
Hlavní smyèka nejdøíve testuje stav TIMER pøepínání režimu (jak tomu bylo v pøí-
registrù OFF a TBASE. Je-li OFF = 1,
Návìští TIMER pøedstavuje obsluhu kladu 4) totiž mùže být v nìkterých pøí-
znaèí to, že odmìr byl proveden (uply-
nul tedy stanovený èas). Pro tento pøí- jednotky Output Compare èítaèe/èaso- padech problematické.
pad se pøejde na návìští END. Je-li vaèe 1, tedy odmìøení intervalu 100 ms. Pokud je nejvyšší bit registru PIE-
TBASE nastaven na hodnotu 10, znaèí Nejdøíve je stav pøíznakového registru ZOF (bit 7) vynulován, generuje se tón.
to, že uplynul interval 1 s. Pro tento pøí- SREG uložen do zásobníku (ostatní re- V opaèném pøípadì se stav vývodù PB3
pad je tøeba zaktualizovat stav displeje, gistry se nemìní). a PB4 nezmìní a piezomìniè tón nevy-
v opaèném pøípadì se program vrací Dále se obsah registru TBASE sní- dává (pøejde se na návìští PIEZOD).
do hlavní smyèky. ží o 1 a následnì se testuje pøípadné Pokud se generuje tón, musí se tedy
Výpis aktuálního èasu zaèíná nasta- vynulování (pokud byl registr vynulován, znegovat stav vývodù PB3 a PB4.
vením pozice pro výpis 1, 8 pomocí ru- znaèí to odmìr doby 1 s, a pøejde se Dále je tøeba odmìøit zbývající èas
tiny SETXY. na návìští TIMERO; v opaèném pøípa- generování tónu nebo pauzy. Tedy sní-
Dále se registr Z nastaví na adresu dì se pøejde na návìští TIMERE). žit obsah registru X. Pokud je interval
bufferu TIMEST. Návìští TIMERO realizuje snížení odmìøen, je X = 0. Pak je do registru X
Minuty a sekundy jsou uloženy v kó- èasu o 1 s (je tøeba nastavit registr uložena hodnota 1000 a pøepne se re-
du BCD. To umožòuje snadno zobrazit TBASE zpìt na hodnotu 10, aby bylo žim (negací bitu 7 registru PIEZOF).
èasový údaj. Horní èíslice minut (napø. možné realizovat další odmìr). Nejdøí- Nakonec se musí nastavit registr
pro èas 10:56 je to 1) je uložena v hor- ve se tedy registr SEK sníží o 1, musí TCNT0 (èítaè/èasovaè 0 totiž nemá
ních 4 bitech registru MIN. Dolní èíslice se však sledovat pøípad podteèení (po- autoreload) a obnovit registr SREG
(0) je pak v dolních 4 bitech registru MIN. kud od $00 odeèteme 1). ze zásobníku.
U sekund je používán registr SEK. Pokud podteèení nenastalo, nemá- Rutiny obsažené v souboru LCD.INC
Do bufferu je tedy tøeba nejdøíve ulo- me ještì vyhráno! Údaj se mohl zmìnit je tøeba vložit pseudoinstrukcí .INCLUDE
žit horní èíslici minut. Obsah registru napø. z $50 na $4F. Po $50 má však až na konec zdrojového textu. Pokud by
MIN je pøekopírován do registru REG a následovat $49. Èili pro tento pøípad (a byly rutiny vloženy na zaèátku zdrojové-
jsou zamaskovány spodní bity. Dále je podobné pøípady) je nutno odeèíst 6. ho textu, zaèínal by program první in-
tøeba pøesunout vymaskované horní Hodnotu 6 ale neodeèítáme vždy (napø. strukcí první rutiny ze souboru LCD.INC.
bity na místo spodních bitù. Poslední $54 - $01 = $53, což je v poøádku). Program je nazván PROG_17.ASM a
fází je pøiètení hodnoty obsažené v re- Všimnìte si, že pokud dolní èíslice je vypsán v tab. 8.7. Pøíklad najdete v [4]
gistru ZEROCH. Napøíklad hodnotu 1 BCD kódu nepodteèe, není nastaven v adresáøi PROGRAMY\PROG_17.
nelze zobrazit pøímo, musíme ji pøevést pøíznakový bit H (pomocný pøíznak pøe-
na znak odpovídající '1', což je prove- teèení nebo také pøíznak polovièního Test pøíkladu
deno pøiètením hodnoty odpovídající pøeteèení). Podle obr. 2.20 je pøízna- Pøipojte pøípravky na urèené porty a
znaku '0'. Uložení zkonvertované hod- kový bit H umístìn v bitu 5 registru podle obr. 8.7 pøipojte k pøípravku
noty do bufferu probìhne pomocí in- SREG. Takže test polovièního pøenosu ATOUT žárovku.
strukce ST Z+,REG. Výhodou je auto- byl proveden tak, že se hodnota SREG Po resetu sepne relé i triak a na dis-
matické zvýšení obsahu registru Z uložila do registru IREG a pøeskokem pleji se zobrazuje zbývající èas odmì-
(posune se na následující adresu). SBRC IREG,5 se testoval tento pøí- ru. Po uplynutí odmìru relé i triak vypnou.
Pøevod dolní èíslice minut probìhne znak (to byl nejjednodušší zpùsob, jak
podobnì. Maska je však nyní 0b00001111, test provést).
protože uvažujeme spodní 4 bity. Pokud pøi snižování registru SEK 8.6. Shrnutí
Za èíslice zobrazující minuty vloží- nastalo podteèení, musí být údaj opra-
me znak ':'. ven na $59 (59 sekund z další minuty) Nakonec si shrneme nejdùležitìjší
Pøevod obsahu registru SEK na zob- a obsah registru MIN se musí snížit o 1. poznatky z pøedchozího textu.
razené sekundy probíhá podobnì jako I nyní se testuje podteèení (pokud na- • Registr Z a adresa konstant v pro-
zobrazení minut. stane, pøejde se na návìští TIMERF). gramové pamìti - pokud si do progra-
Nakonec do bufferu pøidáme znak V pøípadì, že údaj registru MIN ne- mové pamìti uložíme nìjakou konstan-
ENDS, který rutina WRSTRD považuje podtekl, musí se provést BCD korekce tu (obvykle se používá pro øetìzce)
za konec øetìzce. podobnì jako u registru SEK. pomocí direktivy .DB, musíme si uvì-
Po sestavení øetìzce jej vypíšeme Pro pøípad podteèení registru MIN domit, že pøekladaè uvažuje všechny
rutinou WRSTRD a vrátíme se do hlav- je tøeba údaj minut a sekund vynulovat adresy v rozmìru slova. Proto je nutno
ní smyèky. a nastavit registr OFF na 1. Tak se in- návìští poskytované pøekladaèem vy-
Pokud ubìhne stanovený interval dikuje konec odmìru. násobit 2x. Dále je tøeba pøipomenout,
12 minut, pøejde procesor na návìští Nakonec musí být registr SREG ob- že procesory AVR jsou 8 bitové. Pro-
END. Nejprve se zakáže pøerušení (tím noven ze zásobníku. to nemohou pracovat se 16bitovým ope-

Konstrukèní elektronika A Radio - 5/2006 39


Tab. 8.7. Program PROG_17.ASM ST Z,REG ;retezce randem (v tomto rozmìru je adresa)
LDI ZL,LOW(TIMEST) ;nastav Z pøímo. Funkce LOW a HIGH zajišují
PROG_17.ASM: LDI ZH,HIGH(TIMEST);na adresu retezce
.INCLUDE “tn2313def.inc“ RCALL WRSTRD ;vypiš retezec získání dolní a horní 8bitové poloviny
;definice registrú RJMP MAIN ;zpet do smycky 16bitového operandu a tak poskytují
.DEF REG=R18 ;obecný registr
.DEF IREG=R19 ;registr pro
;konec odmeru: možnost nahrávat tyto èásti adresy do
END: CLI ;zakaž prerušení registrù ZL a ZH
;obsluhu prerušení LDI REG,0b00001000 ;vypni
.DEF SEK=R20 ;sekundy OUT PORTB,REG ;relé a triak • Registr Z a adresa konstant v dato-
.DEF MIN=R21 ;minuty
.DEF TBASE=R22 ;casová základna
LDI REG,0b00000010 ;zakaž OC1 vé pamìti - pro datovou pamì platí, že
OUT TIMSK,REG ;a povol se adresuje pøímo po bajtech. Zde tedy
.DEF ZEROCH=R23 ;znak '0' ;OVF0 prerušení
.DEF OFF=R24 ;indikuje vypnutí LDI REG,0b00011000 ;nahraj masku žádné násobení návìští neprovádíme.
.DEF PIEZOF=R1 ;príznaky pro piezo
.DEF CNT1=R2 ;registry
MOV PIEZOF,REG ;bitù pro piezo • BCD kód - BCD kód pøedstavuje mož-
LDI XL,LOW(1000) ;nastav interval nost, jak pracovat s desítkovými èísly
.DEF CNT2=R3 ;pro realizaci LDI XH,HIGH(1000) ;trvání tónu
.DEF CNT3=R4 ;cekání LDI REG,0b00000100 ;nastav preddelicku v rozsahu 0 až 99 pøesto, že procesor
.EQU TINTER=15625 ;interval pro casovac OUT TCCR0,REG ;na f0/256 vnitønì používá dvojkovou soustavu.
;(100 ms) LDI REG,PIEZOC ;nahraj konstantu V BCD kódu se každá ze dvou èíslic
.EQU PIEZOC=256-20 ;cca 1 kHz OUT TCNT0,REG ;do TCNT0 ukládá do jedné poloviny bajtu. Dolní
SEI ;povol generaci èíslice je uložena v dolních 4 bitech,
.DSEG ;data: RCALL INTER ;pockej
TIMEST: .BYTE(6) ;retezec pro výpis CLI ;zastav generaci horní pak v horních 4 bitech. Napø. hod-
;casu na LCD ENDL: RJMP ENDL ;zacykli nota $56 pøedstavuje BCD èíslo 56.
;obsluha casovace 100 ms: • Rozklad BCD kódu na èíslice. Dolní
.CSEG ;program: TIMER: IN IREG,SREG ;ulož SREG
RJMP RESET ;reset PUSH IREG ;do zásobníku èíslice je pøedstavována dolními 4 bity
.ORG OC1Aaddr ;vektor OC c/c 1A DEC TBASE ;sniž TBASE registru, horní èíslice je pak pøedstavo-
RJMP TIMER ;odmerování casu BRNE TIMERE ;je TBASE=0?
.ORG OVF0addr ;vektor OVF c/c 0 vána horními 4 bity registru. Pro získání
TIMERO: ;TBASE=0, uplynul cas 1 s: tìchto polovin je tøeba maskovat bity
RJMP PIEZO ;ovládání piezo LDI TBASE,10 ;nastav TBASE=10
SUBI SEK,1 ;sniž SEK o 1 hodnotami 0b00001111 a 0b11110000.
;inicializace: BRCS TIMERS ;podteklo?
RESET: LDI MIN,$12 ;cas pro odmerení: • BCD korekce je operace, která má
;nepodteklo: zajistit úpravu BCD èíslic po provedené
LDI SEK,$00 ;12:00 IN IREG,SREG ;testuj bit
LDI REG,RAMEND ;nastav SPL SBRC IREG,5 ;H z reg. SREG operaci sèítání nebo odeèítání, protože
OUT SPL,REG ;na konec RAM SUBI SEK,6 ;H=1, musí se procesor nemùže pøedpokládat, že mís-
LDI REG,0b11111111 ;port B
OUT DDRB,REG ;je výstupní
RJMP TIMERE ;odecíst 6 to binárních hodnot obdržel BCD kód.
TIMERS: ;SEK podtekly-uplynula minuta: Pokud jsou dolní 4 bity daného registru
LDI REG,0b00000011 ;stav LDI SEK,$59 ;nastav SEK=59
OUT PORTB,REG ;PB0=1, PB1=1 SUBI MIN,1 ;sniž MIN o 1 vyšší než 9 nebo pokud je nastaven pøí-
RCALL INIT ;inicializace LCD BRCS TIMERF ;podteklo? znakový bit H, musí být k obsahu regis-
LDI ZEROCH,'0' ;obsahuje znak '0' ;nepodteklo: tru pøiètena hodnota 6. Podobnì pokud
LDI A,1 ;pozice pro IN IREG,SREG ;testuj bit
LDI B,1 ;výpis je: 1, 1 jsou horní 4 bity registru vyšší než 9
SBRC IREG,5 ;H z reg. SREG nebo pokud je nastaven pøíznakový bit
RCALL SETXY ;nastav pozici SUBI MIN,6 ;H=1, musí se
LDI ZL,LOW(2*TEXT) ;nahraj do Z RJMP TIMERE ;odecíst 6 C, musí se k obsahu registru pøièíst
LDI ZH,HIGH(2*TEXT);adresu retezce TIMERF: ;MIN podtekly-interval uplynul: èíslo 60H. Mikroøadièe AVR nemají in-
RCALL WRSTR ;výpis LDI OFF,1 ;nastav konec
LDI OFF,0 ;zatím zapnuto strukci BCD korekce v instrukèním
LDI MIN,$0 ;nuluj minuty souboru zavedenu (což je škoda, napø.
LDI REG,0b00000000 ;normální LDI SEK,$0 ;a sekundy
OUT TCCR1A,REG ;režim c/c 1 TIMERE: ;obnova registrù: v instrukèních souborech procesorù
LDI REG,0b00001011 ;f0/64 POP IREG ;obnov SREG øady 8051 je tato instrukce bìžná), a
OUT TCCR1B,REG ;CTC1=1 OUT SREG,IREG ;ze zásobníku proto se korekce musí „poskládat“ z jed-
LDI REG,HIGH(TINTER) RETI ;konec obsluhy
;nastav nodušších instrukcí.
OUT OCR1AH,REG ;casovací ;generace tónu:
LDI REG,LOW(TINTER);interval PIEZO: IN IREG,SREG ;ulož SREG
OUT OCR1AL,REG
LDI TBASE,10
;pro OC režim
;pocet prùchodù TIMER
LDI REG,0b01000000 ;povol
PUSH IREG
SBRC PIEZOF,7
RJMP PIEZOD
;do zásobníku
;testuj bit 7
;vypnutý tón
Literatura
OUT TIMSK,REG ;prerušení OC1 ;pískni: [1] Matoušek, D.: Práce s mikrokontrolé-
SEI ;povol prerušení IN IREG,PORTB ;cti stav ry ATMEL AT89C2051, BEN - technická
;hlavní smycka: EOR IREG,PIEZOF ;negace bitù literatura Praha, 2002.
MAIN: CPI OFF,1 ;je konec? OUT PORTB,IREG ;ulož nový stav [2] Matoušek, D.: Práce s mikrokontrolé-
BREQ END ;konec pro OFF=1 PIEZOD: SBIW XL,1 ;sniž X ry ATMEL AT89C8252, BEN - technická
CPI TBASE,10 ;je TBASE=10? BRNE PIEZOE ;test nuly
BRNE MAIN ;pokud ne, vrat se LDI XL,0b10000000 ;neguj literatura Praha, 2002.
LDI A,1 ;pozice pro EOR PIEZOF,XL ;bit 7 reg. PIEZOF [3] Matoušek, D.: Práce s mikrokontrolé-
LDI B,8 ;výpis je: 1, 8 LDI XL,LOW(1000) ;nastav interval ry ATMEL AVR, BEN - technická literatu-
RCALL SETXY ;nastav pozici LDI XH,HIGH(1000) ;trvání tónu ra Praha, 2003.
LDI ZL,LOW(TIMEST) ;nahraj do Z PIEZOE: ;nastav casovac:
LDI ZH,HIGH(TIMEST);adresu retezce LDI IREG,PIEZOC ;nahraj konstantu [4] Doprovodné CD-ROM k tomuto
MOV REG,MIN ;vem horní OUT TCNT0,IREG ;do TCNT0 èlánku. Lze je objednat u autora nebo
ANDI REG,0b11110000;císlici ;obnov registry: jeho obsah stáhnout ze stránek:
SWAP REG ;minut a preved POP IREG ;obnov SREG www.vspji.cz/matousek.php
ADD REG,ZEROCH ;ji na znak OUT SREG,IREG ;ze zásobníku
ST Z+,REG ;ulož RETI ;konec obsluhy
MOV REG,MIN ;vem dolní
ANDI REG,0b00001111;císlici
INTER:
;cekací rutina (ceká asi 5
CLR CNT1 ;CNT1=0
s) Závìr
ADD REG,ZEROCH ;minut a preved Vzhledem k tomu, že èlánek vychází
ST Z+,REG ;ji na znak CLR CNT2 ;CNT2=0
LDI REG,':' ;vlož znak CLR CNT3 ;CNT3=0 ve formì èasopisu, není jeho souèástí
ST Z+,REG ;':' INTERL: DEC CNT3 CD-ROM. Soubory, ze kterých lze CD
MOV REG,SEK ;vem horní BRNE INTERL ;smycka 1 -ROM vypálit, najdete na webové strán-
ANDI REG,0b11110000;císlici DEC CNT2 ce: www.vspji.cz/matousek.php
SWAP REG ;sekund a preved BRNE INTERL ;smycka 2 Druhou možností je si CD-ROM ob-
ADD REG,ZEROCH ;ji na znak DEC CNT1 jednat od autora (poštou na dobírku, cena
ST Z+,REG ;ulož BRNE INTERL ;smycka 3
RET ;návrat vèetnì poštovného je 100 Kè), a to buï
MOV REG,SEK ;vem dolní pomocí e-mailu: matousekd@quick.cz ,
ANDI REG,0b00001111;císlici ;text pro výpis:
ADD REG,ZEROCH ;sekund a preved nebo písemnì na adrese: Ing. David
ST Z+,REG ;ji na znak TEXT: .DB “ZBYVA: “,ENDS ;text pro výpis Matoušek, Vysoká škola polytechnická,
LDI REG,ENDS ;vlož konec .INCLUDE “LCD.INC“ ;vložení rutin Tolstého 16, 586 01 Jihlava

40 Konstrukèní elektronika A Radio - 5/2006

You might also like