31 SCS. Semestrální práce. Dálkově ovládaný stmívač s ATTiny 15L. Martin Pospíšilík ČVUT FEL. 0 Martin Pospíšilík

Podobné dokumenty
1. MIKROPROCESOR ATMEGA A/D PŘEVODNÍK MÓDY PŘEVODNÍKU Single Conversion Mode Auto Triggering Start...

Mikrokontroléry. Doplňující text pro POS K. D. 2001

DIGI Timer 8 8 kanálové stopky se záznamem dat

Návrh konstrukce odchovny 2. dil

BASPELIN MRP Popis obsluhy indikační a řídicí jednotky MRP T2

Manuál přípravku FPGA University Board (FUB)

PŘIJÍMAČ DÁLKOVÉHO OVLÁDÁNÍ FLOXR

Rozšiřující desce s dalšími paralelními porty Rozšiřující desce s motorkem Elektrickém zapojení Principu činnosti Způsobu programování

Mikropočítačová vstupně/výstupní jednotka pro řízení tepelných modelů. Zdeněk Oborný

Činnost CPU. IMTEE Přednáška č. 2. Několik úrovní abstrakce od obvodů CPU: Hodinový cyklus fáze strojový cyklus instrukční cyklus

Řízení IO přenosů DMA řadičem

MĚŘICÍ PŘÍSTROJ PRO PC. 4 VSTUPY: 0 10 V ZESÍLENÍ : 1x, 2x, 4x, 8x VÝSTUP: LINKA RS232 RS232 DRAK 4 U1 U2 U3 U4

Jízda po čáře pro reklamní robot

Vzdálené ovládání po rozvodné síti 230V

Přerušovací systém s prioritním řetězem

Program "Světla" pro mikropočítač PMI-80

Quido RS 2/16 OC. 2 vstupy pro kontakt 16 digitálních výstupů 1 teploměr -55 až +125 C komunikace přes RS485 nebo RS232

Programovatelná řídící jednotka REG10. návod k instalaci a použití 2.část Program pro regulaci kaskády čerpadel v závislosti na tlaku SGC3

Návod na obsluhu Pípáku2 verse V0.1 (PŘEDBĚŽNÝ NÁVOD).

DÁLKOVÝ OVLADAČ (SADA) RXH-1K

Universita Pardubice Fakulta elektrotechniky a informatiky. Mikroprocesorová technika. Semestrální práce

Programovatelný časový spínač 1s 68h řízený jednočip. mikroprocesorem v3.0a

Registrační teploměr

Zařízení pro měření teploty, atmosférického tlaku a nadmořské výšky

MSP 430F1611. Jiří Kašpar. Charakteristika

18A - PRINCIPY ČÍSLICOVÝCH MĚŘICÍCH PŘÍSTROJŮ Voltmetry, A/D převodníky - principy, vlastnosti, Kmitoměry, čítače, fázoměry, Q- metry

Přednáška - Čítače. 2013, kat. měření, ČVUT - FEL, Praha J. Fischer. A3B38MMP, 2013, J.Fischer, ČVUT - FEL, kat. měření 1

Základní parametry pětimístných digitálních číselníků SU1/5

Témata profilové maturitní zkoušky

Snížení příkonu MCU. Vybavení pro MCU. Snížení příkonu MCU. Možnosti snížení příkonu

NÁVOD NA MONTÁŽ A OBSLUHU SXS 20

Implementace regulátoru otáček do budičů BLDC motorů

TW15 KONCOVÝ PRVEK MSKP. Popis výrobku Technická data Návod k obsluze. Technologie 2000 s.r.o., Jablonec nad Nisou

Architekura mikroprocesoru AVR ATMega ( Pokročilé architektury počítačů )

Převodník Ethernet ARINC 429

VETRONICS 770. Technická specifikace mobilní jednotky

Adresovatelné RGB LED

Paměti Flash. Paměti Flash. Základní charakteristiky

BEZDRÁTOVÉ ZABEZPEČOVACÍ ZAŘÍZENÍ

rádiové přijímače Instrukce a upozornění pro montéry

9. Rozšiřující desky Evb_Display a Evb_keyboard

Na trh byl uveden v roce 1971 firmou Signetics. Uvádí se, že označení 555 je odvozeno od tří rezistorů s hodnotou 5 kω.

SW24x3 programovatelné relé

ŘÍDÍCÍ JEDNOTKA A60 - MOBYKIT

NÁVOD K OBSLUZE konfigurační SW CS-484

Napájení mikroprocesorů. ČVUT- FEL, katedra měření, přednášející Jan Fischer. studenty zapsané v předmětu: A4B38NVS

ČESKÉ VYSOKÉ UČENÍ TECHNICKÉ V PRAZE

DRAK 3 INTELIGENTNÍ A/D PŘEVODNÍK. 3 VSTUPY: 0(4) - 20mA, 0-5/10V VÝSTUP: LINKA RS485 MODUL NA DIN LIŠTU RS485

Úvod do mobilní robotiky AIL028

PROGRAMOVATELNÝ TERMOSTAT CT Citherm 6.0 Návod k obsluze

Struktura a architektura počítačů (BI-SAP) 7

UC485P. Převodník RS232 na RS485 nebo RS422. Průmyslové provedení s krytím

1. Univerzální watchdog WDT-U2

Číslicový zobrazovač CZ 5.7

Autonomní zámek LOG2

Vstupní jednotka E10 Návod na použití

Gymnázium a Střední odborná škola, Rokycany, Mládežníků 1115

Zvyšující DC-DC měnič

Vysoká škola Báňská. Technická univerzita Ostrava

11.27 Centralis Uno RTS

DÁLKOVÉ OVLÁDÁNÍ SMILO

Kódová klávesnice a čtečka čipů CP1000 Čtečka RFID čipů 125 khz

ADEX SL3.3 REGULÁTOR KOTLE VARIMATIK

SPÍNACÍ HODINY. Nastavení hodin a předvolby. Obr. 1

Princip funkce počítače

GFK-2004-CZ Listopad Rozměry pouzdra (šířka x výška x hloubka) Připojení. Skladovací teplota -25 C až +85 C.

INSTRUKCE A UPOZORNĚNÍ PRO MONTÉRY

EZO-3P - návod k elektronickému zobrazovači cen PHM

Řídicí obvody (budiče) MOSFET a IGBT. Rozdíly v buzení bipolárních a unipolárních součástek

Obsah. Zobrazovací a ovládací prvky na čelním panelu. Účel použití. Elektrické zapojení. Obr : Binární vstupní / výstupní modul 07 DC 92

2 ZAPOJENÍ, OŽIVENÍ A PROGRAMOVÁNÍ SYSTÉMOVÉ

4IOT-SEN-01 Sensor pro IoT aplikace Technická dokumentace

AD4RS. měřící převodník. 4x vstup pro měření unifikovaného signálu 0 10 V, 0 20 ma, 4 20 ma. komunikace linkami RS232 nebo RS485

Modul LCD displeje se čtyřmi tlačítky. Milan Horkel

Katalogový list WIA101

Sekvenční shift light SL-06. verze fw 1.3

SAUNOVÝ REGULÁTOR S 500

Výuková laboratorní sestava seminář pro učitele

Tel-30 Nabíjení kapacitoru konstantním proudem [V(C1), I(C1)] Start: Transient Tranzientní analýza ukazuje, jaké napětí vytvoří proud 5mA za 4ms na ka

REGULÁTOR TEPLOTY. typ REGU REGU2198 Technická dokumentace. REGU2198 Technická dokumentace

INTERFACE GSM VT-GSM-007

Návod k elektronickému zobrazovači cen DS2214

Uživatelská příručka

Vánoční hvězda 2. Publikované: , Kategória: Blikače a optika.

Jednočipové mikropočítače

Digitální indikátor přeřazení

24 bitový dvoukanálový AD převodník s obvodem HX711

Sekvenční shift light SL-06. verze fw 1.1

Projekt BROB B13. Jízda po čáře pro reklamní robot. Vedoucí projektu: Ing. Tomáš Florián

Projekt Operačního programu Praha Adaptabilita. Mezinárodní spolupráce při rozvoji magisterského a doktorského programu na ČVUT-FEL v Praze

Uživatelský manuál. KNXgal. řízení zabezpečovacích ústředen. Galaxy ze sběrnice KNX. napájeno ze sběrnice KNX. indikace komunikace na KNX

A8B32IES Úvod do elektronických systémů

Aplikace. Hlásič SMS

Pokojový termostat řízený pomocí SMS zpráv v síti GSM

5. A/Č převodník s postupnou aproximací

Kódový zámek k rodinnému domu

Základní pojmy z oboru výkonová elektronika

Kompaktní mikroprocesorový regulátor MRS 04

Návod na obsluhu Pub Keyeru verse V0.4 (PŘEDBĚŽNÝ NÁVOD BETA VERSE).

Digitální sekvenční indikátor přeřazení (Shift Light)

Transkript:

31 SCS Semestrální práce Dálkově ovládaný stmívač s ATTiny 15L Martin Pospíšilík ČVUT FEL 0 Martin Pospíšilík

1 Úvod K návrhu dálkově ovládaného stmívače mne vedly čistě pragmatické duvody chtěl jsem si osahat programování osmibitových procesorů Atmel AVR ATTiny 15 a zároveň vyřešit problém dálkového ovládání osvětlení. Návrh výše zmíněného zařízení je předmětem této semestrální práce. Problematiku jsem zatím stihl rozpracovat jen v teoretické rovině práce obsahuje princip ovládání, vývojové diagramy, okomentované programy pro vysílač i přijímač a schémata zapojení. 1 Martin Pospíšilík

2 Proč ATTiny 15L? V této kapitole se pokusím vysvětlit, proč jsem se ke svému konstrukčnímu návrhu rozhodl použít procesory ATTiny 15L. 2.1 Atmel Atmel Corporation je výrobce polovodičů a integrovaných obvodů založený roku 1984. Mezi jeho produkty patří mikrokontrolery (včetně klonů 8051, AT91SAM založených na architektuře ARM), jeho vlastní Atmel AVR a AVR32 architektura, rádiové (RF) zařízení, EEPROM and Flash paměťové čipy, ASIC, WiMAX, a mnoho jiných. Je schopen nabídnout řešení 'system on chip'. Atmel podniká ve velkém okruhu aplikačních segmentů včetně: konzumní sektor, telekomunikace, počítače a počítačové sítě, průmysl, zdravotnictví, automobilový průmysl, letecký a vojenský průmysl. Atmel je vedoucí firmou na trhu bezpečnostních systémů, hlavně díky čipovým kartám smart card a RFID. 2.2 ATMEL AVR Jak již bylo zmíněno, AVR je vlastní architektura procesorů firmy Atmel. Údajně ji vytvořili dva norští studenti, Alf-Egil Bogen a Vegard Wollan Norskeho technologického institutu. Architektura je přizpůsobena tak, aby na osmibitových procesorech typu RISC bylo možné co nejefektivně využívat programovací jazyk C. Přitom je samozřejmě možné programovat v assembleru. Procesory AVR lze rozdělit do několika rodin podle složitosti, výkonu a stupně jejich výbavy. V současnosti jsou vyráběny jen skupiny Tiny a Mega. 2.3 ATTiny 15L Procesor ATTiny 15L patří do skupiny Tiny. Tyto procesory jsou určeny pro jednodušší aplikace. ATTiny15L je v pozdře DIL8 a ke své funkcí potřebuje minimum součástek. Dokonce i RC článek oscilátoru je implementován na čipu. Korekce pracovní frekvence se provádí zapsáním kalibračních dat do příslušného registru. Procesor je typu RISC a využívá celkem 90 instrukcí, z nichž většina je vykonávána v jednom strojovém cyklu. Jmenovitá pracovní frekvence je 1,6MHz, přičemž jeden takt odpovídá jednomu strojovému cyklu. Procesor obsahuje 32 osmibitových registrů. Programová paměť má velikost 1kB, paměť EEPROM pro ukládání dat a konstant pak 64B. Vzhledem k použitému pouzdru je k dispozici jen 6 vstupně výstupních PINů. K těm lze ale přiřadit velmi rozličnou paletu implementovaných modulů např. A/D převodníky, PWM modul, analogový komparátor, časovač atd. Ve své konstrukci jsem si tento procesor vybral proto, že je snadno dostupný, dobře se programuje, dobře se zládá jeho instrukční sada a v neposlední řadě s ním lze vytvořit velmi jednoduché obvodové řešení. 2 Martin Pospíšilík

3 Koncepce návrhu Návrh předpokládá dva moduly. Jeden modul je umístěn u ovládaného lustru. Je osazen dvěma tlačítky a infračerveným přijímačem povelů dálkového ovládání. Modul vyžaduje zemnění. Jas se ovládá buď dvěma tlačítky, nebo pomocí osmibitového slova přijatého IR přijímačem. Minimální jas odpovídá zcela zhasnutému lustru. Modul je přitom stále aktivní, připraven reagovat na další povely. Jeho úplné vypnutí se provede vypnutím vypínače lustru. Po zapnutí vypínače jsou žárovky lustru rozsvíceny na hodnotu, která byla nastavena před jeho vypnutím. Rozsvěcování se provádí plynule, aby se šetřilo vlákno žárovky, které má za studena menší odpor a při jeho žhavení dochází k proudovým rázům. Úrovní jasu je 25. Jsou definovány tabulkou nahranou v procesoru tak, aby jednotlivé kroky mezi úrovněmi byly vnímány jako lineární změny; tabulka se zkusmo upraví na základě praktických zkušeností po zahrnutí vlivu teploty vlákna žárovky, procházejícího proudu a citlivosti lidského zraku na různé úrovně osvětlení. Aby se zamezilo blikání žárovek při nízkých úrovních osvětlení, je síťové napájecí napětí usměrněno a vyhlazeno a žárovky jsou buzeny proporcionálně modulovaným signálem (PWM) o frekvenci cca 25kHz (je odvozena dělením od pracovní frekvence procesoru s ohledem na možnosti spínacího prvku a snahu zabránit pískání vlákna žárovky v akustickém pásmu). Druhý modul je dálkový ovladač. Je rovněž osazen procesorem. Napájení je prováděno pomocí jednoho monočlánku velikosti AA, doporučený je NiMH akumulátor. Dálkový ovladač je opatřen dvěma tlačítky a vysílací infradiodou. Procesor je v režimu SLEEP, kdy má minimální odběr proudu. Po stisknutí libovolného tlačítka je vyvoláno přerušení. Procesor si zjistí, jestli je v monočlánku (akumulátoru) dostatek energie, a pokud ano, vyšle příslušný povel, odpovídající stisknutému tlačítku. Možné povely jsou dva snížit jas a zvýšit jas. Jedná se o dvě osmibitová slova. 3 Martin Pospíšilík

4 Konstrukční řešení Zde jsou rozebrána schémata zapojení obou modulů a návrhy na jejich konstrukční řešení. 4.1 Přijímač Obr. 1: Schéma zapojení přijímače Schéma zapojení přijímače je uvedeno na obrázku 1. Ke svorkam X1 a X2 je připojeno napájení. Ke svorkám X2-1 a X2-2 pak samotný lustr. Vzhledem ke spektru PWM signálu bude možná nutné zařadit do série s žárovkami přiměřený induktor, aby nedocházelo k rušení v elektrické síti. Napájecí napětí je usměrněno diodovým můstkem B1 a vyfiltrováno kondenzátorem C1. Napětí na něm bude cca 310V. Rezistor R2 spolu s kondenzátorem C2 zajištují napájení mikroprocesoru IC1 (ATTiny15L), rezistor R3 vybíjí kondenzátor C2 po vypnutí napájení. Záporná půlvlna napájí LED D1, která signalizuje zapnuté napájení (praktické v případě, že je nastaven minimální jas/zhasnuto), kladná půlvlna nabíjí kondenzátor C3 přes diodu D2. Zenerova dioda D3 stabilizuje napájecí napětí na 5V. Tranzistor T1 je ovládán přes ochranný rezistor R1 z PIN6. K tomu je softwarově uvnitř procesoru přiřazen PWM modul. Zenerova dioda D4 slouží jako ochrana hradla tranzistoru před případnými napěťovými špičkami. Tranzistor T1 spíná zátěž (žárovky). Dále jsou k procesoru připojena tři tlačítka. Příslušné PINy, ke kterým jsou tlačítka připojena, jsou díky softwarové konfiguraci procesoru připojeny pomocí interních pull-up rezistorů ke kladnému napájecímu napětí. Při stisknutí kteréhokoliv z nich se tedy stav na příslušném PINu změní z H na L. Jejich význam je následující: zvýšení jasu, snížení jasu a kalibrace. Podle konfigurace PINů na pouzře IC1 budou jednotlivým tlačítkům přiřazeny příslušné funkce podle toho, jak se nejvodněji podaří navrhnout desku s plošnými spoji. Tlačítka ovládající jas budou přístupná na panelu modulu, tlačítko kalibrace bude přístupné jen po sejmutí krytu. Kalibrace je nutná proto, že interní oscilátor procesoru může pracovat v rozsahu frekvencí 0,8 1,6MHz a je nutné, aby procesor v přijímači i procesor ve vysílači pracovaly na stejné frekvenci, resp. s maximálně takovou odchylkou, aby bylo možné přenést 8 bitový povel bez ztráty synchronizace (pomocná synchronizace není zajištěna). Software je navržen tak, že po stisknutí kalibračního tlačítka se změní funkce tlačítek pro zvýšení a snížení jasu. Tlačítkem pro zvýšení jasu se kalibrační hodnota inkrementuje. Dojde-li k přetečení kalibrační hodnoty, začíná se cyklicky od nejnižší možné hodnoty. Tlačítkem pro snížení jasu se pak nastavená kalibrační hodnota uloží do paměti procesoru. Kalibrační hodnota je pak vyvolána po každém zapnutí procesoru. Měření frekvence se provádí osciloskopem nebo čítačem na PINu6. Během nastavování kalibrace je střída signálu nastavena na 50%. Konstrukční řešení je zatím ve stadiu návrhu. 4 Martin Pospíšilík

4.2 Vysílač Schéma vysílače je uvedeno na obrázku 2. Ke svorkám A a B se připojí NiMH akumulátor o jmenovitém napětí 1,2V. Obr. 2: Schéma zapojení vysílače O zvýšení napětí na úroveň cca 3,3V se postará měnič IO101 LT1073 v katalogovém zapojení. Integrovaný obvod LT1073 se vyznačuje velmi malým odběrem proudu naprázdno (cca 90µA) a vlastní procesor ATTiny 15L (IO102) má v režimu SLEEP odběr zcela zanedbatelný, proto může být měnič trvale připojen k akumulátoru. IO101 je zapojen podle katalogu. Zapojení je doplněno tranzistorem T101, který umožňuje vypnutí měniče při podpětí, aby se zabránilo hlubokému vybití akumulátoru. Hodnoty rezistorů jsou voleny s ohledem na minimalizaci proudového odběru. Odporový dělič R105, R106 nastavuje výstupní napětí měniče. Dělič R103, R104 pak definuje práh sepnutí podpěťové ochrany. Odpor R101 nastavuje proudové omezení měniče na cca 5mA. Obr. 3: Rozložení součástek na desce plošných spojů vysílače 5 Martin Pospíšilík

Kladný pól akumulátoru je rovněž připojen k PINu 1 mikroprocesoru IO102. Softwarově je k němu přiřazen A/D převodník. Pokud je napětí akumulátoru již nízké, ale ještě ne kritické, je tento stav detekován A/D převodníkem a software během stisknutí tlačítek rozsvítí LED D102. Prahová hodnota napětí akumulátoru pro rozsvícení výstražné kontrolky byla stanovena na 1,05V. Zablokování měniče nastane při poklesu napětí pod cca 0,9V. Tlačítka jsou zapojena obdobně jako v případě přijímače (viz. kap. 4.1.). Jejich funkce jsou přiřazeny následovně: TL101 zvyšuje jas, TL102 snižuje jas a TL103 slouží ke kalibraci pracovní frekvence. Ve výchozím stavu je procesor v režimu SLEEP s minimálním odběrem elektrické energie. Stisknutím některého z povelových tlačítek je vyvoláno přerušení. Probuzený procesor si pomocí A/D převodníku zkontroluje napětí na akumulátoru (podle jeho velikosti buď rozsvítí nebo nerozsvítí výstražnou kontrolku) a provede vyslání příslušného povelu. Povely jsou vysílány infradiodou D103, která je spínána tranzistorem T102. Jeho báze je spojena s PINem 5 IO102 přes rezistor omezující proud do báze. Jelikož je proud infradiodou značný, nelze jej dodávat přímo z měniče. Impulzní odběr diody D103 je kryt z kondenzátoru C102, který se pomalu nabíjí přes rezistor R110. To umožňuje napěťovému měniči pracovat s malým proudem a na místě cívky L101 použít miniaturní typ pro malé proudové namáhání. Další výhodou tohoto řešení je omezení vlivu proudových špiček odebíraných vysílací diodou na stabilitu napájecího napětí procesoru. Prodleva mezi jednotlivými povely v případě, že je některé z tlačítek TL101 a TL102 trvale stisknuto, je volena tak, aby se kondenzátor C102 stihl mezi vysláním jednotlivých povelů vždy plně nabít. K tomuto modulu je již navrhnuta deska s plošnými spoji. Rozložení součástek je uvedeno na obrázku 3. 6 Martin Pospíšilík

5 Software V této části dokumentu je popsán software napsaný pro procesory v obou modulech. Autor nepřipouští jeho komerční použití bez předchozího souhlasu. 5.1 Přijímač Program byl vytvořen v prostředí AVR Studio. Je napsán v assembleru. Vývojový diagram je uveden na obrázku 4. Výpisu programu je věnována podkaitola 5.1.1. Program zabírá cca 300B. Jeho větvení je zřejmé z vývojového diagramu. V následujícím textu budou jednotlivé jeho části stručně okomentovány. Obr. 4: Vývojový diagram programu přijímače Po připojení napájení (zapnutí vypínače světla) proběhne inicializace procesoru. Nastaví se konfigurace vstupně/výstupních PINů a registrů definujících chování procesoru. Veškerá přerušení jsou zakázána. Z paměti EEPROM se nahraje kalibrační hodnota pro nastavení pracovní frekvence procesoru. K PINu 6 je přiřazen PWM modul. Jeho pracovní frekvence je nastavena na 25kHz, aby bylo vlákno 7 Martin Pospíšilík

žárovky buzeno frekvencí mimo slyšitelné spektrum a nehrozilo jeho pískání. PWM modul umožňuje nastavit střídu výstupního signálu ve 255 krocích zápisem příslušného čísla do registru OCR1A, který je v programu přejmenován na JAS. Přiřazení hodnoty JAS ke kroku regulace je prováděno pomocí tabulky definované v rámci procedury WR. Tuto tabulku bude nutné odladit po uvedení modulu do provozu. Vzhledem k tomu, že je pro napájení žárovek použito usměrněné napětí cca 310V, musí být maximální hodnota střídy PWM asi 75% (191/255), aby nebylo překročeno jmenovité napětí žárovek. Životnost žárovek je nepřímo úměrně závislá na napájecím napětí, a to velmi strmě a nelineárně. Po proběhnutí inicializace je z paměti EEPROM načtena hodnota regulačního kroku, na kterém byl modul naposled vypnut a jas je po krocích s prodlevou 0,1s zvyšován (cyklicky je volána procedura WR) až do dosažení tohoto regulačního kroku. Doba startu se tedy pohybuje od 0 do 2,4s. Hlavní tělo programu cyklicky testuje následující možnosti v uvedeném pořadí: bylo stisknuto tlačítko Zvýšit jas, bylo stisknuto tlačítko Snížit jas, bylo stisknuto tlačítko Kalibrace, byl zaznamenán signál z dálkového ovládání. Pokud některá ze skutečností nastane, program se dále větví podle vývojového diagramu na obrázku 4. Je tedy zřejmé, že tlačíka jsou nadřazena přijímači dálkového ovládání a pokud právě probíhá obsluha některého z nich, povel vyslaný dálkovým ovladačem nebude zpracován. Pokud bylo stisknuto tlačítko Zvýšit jas, je zavolána procedura UP1. Ta zajišťuje obsluhu tlačítka Zvýšit jas. Po prodlevě 300ms je zavolána procedura INCR, která je zodpovědná přímo za obsluhu inkrementace jasu. Načte informaci o regulačním kroku z paměti EEPROM (Poznámka: procedury pro čtení a zápis do paměti EEPROM jsou popsány v kapitole 5.2) pomocí procedury EER a porovná ji s maximálním krokem, který je po inicializaci uložen v registru R17(MAX). Tato hodnota definuje maximální počet kroků regulace a lze ji měnit, nicméně nesmí být vyšší než je počet řádků převodní tabulky pro přepočet čísla kroku na střídu PWM signálu (hodnota JAS)! Defaultně je hodnota MAX nastavena na 24, což odpovídá 25 krokům regulace jasu. Pokud je již nastavena maximální hodnota jasu, program se vrátí do hlavní smyčky a na tlačítko Zvýšit jas nezareaguje. Lze-li hodnotu jasu zvýšit, je inkrementován krok regulace a zavolána procedura WR, která podle převodní tabulky přiřadí aktuálnímu kroku novou střídu PWM signálu. Nová hodnota kroku regulace je zapsána do paměti EEPROM pomocí procedury EEW a následuje návrat do procedury UP1. Ta nyní otestuje, je-li tlačítko Zvýšit jas stále stisknuto. Pokud ano, po 100ms prodlevě je znovu zavolána procedura INCR. Pokud již bylo tlačítko uvolněno, následuje návrat do hlavní smyčky. Pokud bylo stisknuto tlačítko Snížit jas, je zavolána procedura DN1. Ta má stejnou strukturu jako UP1, s tím rozdílem, že místo procedury INCR je volána procedura DECR, která místo zvýšení kroku regulace provede jeho snížení, za předpokladu, že je regulační krok vyšší než hodnota MIN nastavená v registru R18. Po stisknutí tlačítka Kalibrace je zavolána procedura KAL. Ta nastaví střídu PWM na 50%, načte z paměti EEPROM aktuální kalibrační hodnotu pracovní frekvence a následně cyklicky čte stav tlačítek Zvýšit jas a Snížit jas. Pokud je nyní stisknuto tlačítko Snížit jas, aktuální kalibrační hodnota se zapíše do registru OSCCAL a do paměti EEPROM a program se vrátí do hlavní smyčky. Pokud stiskneme tlačítko Zvýšit jas, kalibrační hodnota je zvýšena o jeden stupeň a následně uložena do registru OSCCAL a do paměti EEPROM. Zvýšení kalibrační hodnoty se projeví na zvýšení frekvence střídy PWM signálu. Jelikož je střída 50%, můžeme ji s výhodou měřit čítačem nebo osciloskopem. Doba periody pro frekvenci 25kHz musí být 40µs ±3,2% (tato problematika je popsána v kapitole 5.2). Po dosažení maximální kalibrační hodnoty (255) se pokračuje cyklicky od nejnižší hodnoty. Na přesnosti nastavení vnitřního oscilátoru procesoru závisí spolehlivost přijímání povelu z vysílače. Zbývá ještě popsat proceduru RP, která se stará o rozpoznání povelu přijatého přijímačem DO. Tato procedura je zavolána v případě, že je v hlavní smyčce zjištěna přítomnost signálu přijímaného pomocí IR přijímače. V současnosti je procedura napsána tak, že je nekompatibilní s přijímačem. Předpokládaný datový tok bude muset být snížen z 30 na 1,2 kb/s. V případě procedury RP se jedná jen o prodloužení čekacích časů mezi jednotlivými bity. Procedura je napsána tak, že vždy počká přesně definovaný časový interval a pak přečte stav PINu 5. Toto udělá 8x, až načte všech 8 předpokládaných 8 Martin Pospíšilík

bitů do registru R19. Potom porovná obsah registru R19 (načtený povel) s obsahy registrů R23 a R24, ve kterých jsou uloženy povely, jež má přijímač rozpoznat. V R23 je uloženo číslo 10100111 odpovídající povelu pro zvýšení jasu, v registru R24 je uloženo číslo 10001101, odpovídající povelu pro snížení jasu. Pokud se číslo načtené do R19 rovná některému z těchto povelů, je volána příslušná procedura INCR nebo DECR. Mezi jednotlivými povely vysílanými dálkovým ovladačem je odstup 300 nebo 100ms (300ms je po prvním stisknutí, 100ms pak při cyklickém vysílání povelu), což zajistí vhodné časování povelů. O časování se tedy není nutné starat na přijímací straně. Problematika nutnosti přechodu na jiné časování při přenosu povelů je popsána v kapitole 5.2. 5.1.1 Výpis programu pro přijímač Zde je uveden výpis programu pro přijímač. Program je okomentován. ; Prijimac DO a PWM driver, verze 1.0 ; By Drobek, 2007 ; Přiřazení portů: PB1 - PWM výstup, PB3 - vstup UP (pull up), PB4 - vstup DOWN (pull up), PB0 - vstup čidlo, PB2 - kalibrační tlačítko (pull up), (PB5 - výstup LED) ; Počet možných PWM úrovní: 255 ; Počet koků regulace: 25 ; PWM frekvence: 25kHz ; Kalibrační data jsou v paměti EEPROM na adrese 0x01 ; Informace o naposledy nastaveném jasu jsou v paměti EEPROM na adrese 0x02 ; Podporované povely: 10100111 (UP), 10001101 (DOWN) ; Popis procedur ; UP1 Obsluha tlačítka UP (zvýšení jasu) ; DN1 Obsluha tlačítka DOWN (snížení jasu) ; KAL Obsluha tlačítka CAL (kalibrace vnitřního oscilátoru) ; DEL Prodleva 100ms ; INCR Obsluha inkrementace jasu (volá ji buď procedura UP1 nebo RP) ; DECR Obsluha dekrementace jasu (volá ji buď procedura DN1 nebo RP) ; RP Rozpoznání příchozího povelu z DO ; WR Nastavení výstupního parametru JAS - podle hodnoty kroku v registru R20 a vnitřní tabulky přiřadí výstupu definovanou střídu ; EEW Zápis do paměti EEPROM. Adresa se předává registrem R21, zapisovaná hodnota R22 ; EER Čtení z paměti EEPROM. Adresa se předává registrem R21, čtená hodnota je v R22 ; Zabrané registry ; R16 REG Pracovní registr ; R17 MAX Maximální počet kroků ; R18 MIN Minimální počet kroků + 1 ; R19 Načtený povel z IR přijímače ; R20 Předává hodnotu proceduře WR ; R21 Předává adresu proceduře EEW,EER ; R22 Předává data proceduře EEW,EER ; R23 Udává, jak vypadá povel UP ; R24 Udává, jak vypadá povel DOWN.NOLIST.INCLUDE "tn15def.inc".list ;*** Definování proměnných ***.CSEG ; kodový segment.def REG=R16 ; pracovní registr.def MAX=R17 ; přejmenování registru R17 na MAX.DEF MIN=R18 ; přejmenování registru R18 na MIN.EQU DDR=DDRB ; řízení směru toku dat.equ PORT=PORTB ; definice portu.equ JAS=OCR1A ; přejmenování registru vstupní proměnné pro PWM.EQU VSTUP=PINB ; přejmenování registru PINB na vstup ;*** Inicializace procesoru *** LDI REG,0x22 ; do pracovního registru nahraji konfiguraci vstupů/výstupů (100010) OUT DDR,REG ; nastavení registru DDR LDI REG,0x1C ; do pracovního registru nahraji konfiguraci pull-up rezistorů (011100) OUT PORT,REG ; zapíšu hodnoty na PORT LDI REG,0x63 ; zapíšu nastavení registru TTCR1 (povolena PWM, not inverted, clock = CK*4) (01100011) OUT TCCR1,REG ; nastavení registru TTCR1 SER REG OUT OCR1B,REG ; nastavení registru OCR1B na maximální hodnotu (počet kroků PWM je 255) CLR REG OUT JAS,REG ; nastavení položky JAS na 0 (OCR1A=0) 9 Martin Pospíšilík

OUT SREG,REG ; nastavení SREG na 0, zakáže všechna přerušení OUT MCUCR,REG ; nastavení MCU Control Register na 0 (zákaz sleep a idle režimu) LDI REG,0x05 OUT TCCR0,REG ; nastavení děličky časovače TIMER0 na 1024 (0,64ms) LDI MAX,0x18 ; nastavení hodnoty maximálního počtu kroků LDI MIN,0x01 ; nastavení nuly LDI R23,0xA7 ; nastavení povelu UP (příjem z dálkového ovladače) LDI R24,0x8D ; nastavení povelu DOWN (příjem z DO) LDI R21,0x01 ; nastavení adresy s kalibračními daty RCALL EER ; načtení kalibračních dat OUT OSCCAL,R22 ; zápis kalibračních dat do registru OSCCAL CLR R22 ; vymazání registru R22 ;*** Měkký start po připojení napájení *** CLR R20 ; vymaže pomocný registr 20 CLR R22 ; vymaže pomocný registr 22 RCALL WR ; nastaví registr JAS na hodnotu uloženou v R20 (0) LDI R21,0x05 ; nastaví adresu, ze které se budou číst data RCALL EER ; načtení naposledy uložené hodnoty z paměti do registru R22 TST R22 ; testuje registr R22 na nulu BREQ M1 ; pokud je v R22 nula (naposledy světlo nesvítilo), měkký start se přeskočí REP1: RCALL DEL ; zavolá zpoždění 100ms INC R20 ; inkrementace pomocného registru 20 RCALL WR ; nastaví registr JAS na hodnotu uloženou v R1 CP R20,R22 ; porovná registry R20 a R22 BRLO REP1 ; pokud je R20<R22, provede se skok zpět na REP1 ;*** Hlavní smyčka programu *** M1: IN REG,PINB ; přečte stav portů SBRS REG,3 ; pokud je hodnota PB3 (UP) H, následující řádek se přeskočí RCALL UP1 ; zavolá proceduru zvýšení jasu SBRS REG,4 ; pokud je hodnota PB4 (DOWN) H, následující řádek se přeskočí RCALL DN1 ; zavolá proceduru snížení jasu SBRS REG,2 ; pokud je hodnota PB2 (CAL) H, následující řádek se přeskočí RCALL KAL ; zavolá proceduru kalibrace pracovní frekvence SBRC REG,0 ; pokud je vstup z čidla nulový, následující řádek se přeskočí RCALL RP ; zavolá proceduru rozpoznání povelu RJMP M1 ;*** Procedury *** UP1: ; ** zvýšení jasu po stisknutí tlačítka UP ** RCALL DEL ; zpoždění 100ms RCALL DEL ; zpoždění 100ms UP2: RCALL DEL ; zpoždění 100ms RCALL INCR ; zavolá proceduru inkrementace jasu IN REG,PINB ; přečte stav portů SBRS REG,3 ; pokud již tlačítko UP není stisknuto, následující řádek se přeskočí RJMP UP2 ; tlačítko je stisknuto, následuje cyklický návrak volání procedury INCR v intervalech 100ms I DN1: ; ** snížení jasu po stisknutí tlačítka DOWN ** RCALL DEL ; zpoždění 100ms RCALL DEL ; zpoždění 100ms DN2: RCALL DEL ; zpoždění 100ms RCALL DECR ; zavolá proceduru dekrementace jasu IN REG,PINB ; přečte stav portů SBRS REG,4 ; pokud již tlačítko DOWN není stisknuto, následující řádek se přeskočí RJMP DN2 ; tlačítko je stisknuto, následuje cyklický návrat volání procedury INCR v intervalu 100ms I KAL: ; ** kalibrace pracovní frekvence (50% střída, tlačítkem UP se nastaví frekvence, tlačítkem DOWN se ukončí nastavování) ** LDI R21,0x01 ; nastaví adresu kalibračních dat v EEPROM RCALL EER ; načte aktuální kalibrační hodnotu do R22 LDI REG,0xF7 ; OUT JAS,REG ; do registru JAS nastaví 50% střídu (hodnota 127) KAL1: IN REG,PINB ; přečte stav portů SBRS REG,4 ; pokud není stisknuto tlačítko DOWN, přeskočí se následující řádek SBRC REG,3 ; pokud je stisknuto tlačítko UP, přeskočí se následující řádek RJMP KAL1 ; skok na začátek kalibrace INC R22 ; kalibrační hodnota se inkrementuje OUT OSCCAL,R22 ; kalibrační hodnota se zapíše do kalibračního registru LDI R21,0x01 ; nastaví adresu kalibračních dat v EEPROM RCALL EEW ; provede zápis kalibračních dat do EEPROM RCALL DEL ; zavolá se procedura čekání po stisku tlačítka RJMP KAL ; skok na začátek kalibrace DEL: ; ** čekání 100ms po stisku tlačítka ** CLR REG OUT TCNT0,REG ; reseruje TIMER0 10 Martin Pospíšilík

DEL1: IN REG,TCNT0 ; načte do REG hodnotu TIMER0 CPI REG,0x9C ; porovná hodnotu čítače s číslem 156 (odpovídá cca 100ms čítání) BRLO DEL1 ; pokud je hodnota menší, provede se další porovnání INCR: ; ** vlastní inkrementace jasu ** LDI R21,0x02 ; adresa paměťových dat v paměti EEPROM RCALL EER ; načte aktuální jas z paměti EEPROM CP R22,MAX ; porovná hodnotu jasu s maximálním limitem 24 (uložen v registru R17 = MAX) BRLO INC2 ; pokud je hodnota jasu nižší než maximální, přeskočí se následující řádek I INC2: INC R22 ; inkrementace registru R22 LDI R21,0x02 ; nastaví se adresa dat MOV R20,R22 ; přepíše hodnotu v registru R22 do registru R20, kterým se předává hodnota funkci WR RCALL WR ; zavolá proceduru zapisující hodnotu JAS podle čísla kroku dle tabulky RCALL EEW ; zapíše novou hodnotu do paměti DECR: ; ** vlastní dekrementace jasu ** LDI R21,0x02 ; adresa paměťových dat v paměti EEPROM RCALL EER ; načte aktuální jas z paměti EEPROM CP R22,MIN ; porovná hodnotu jasu s minimálním limitem 1 (uložen v registru R18 = MIN) BRGE DEC2 ; pokud je hodnota jasu rovna alespoň jedné, přeskočí se následující řádek I DEC2: DEC R22 ; dekrementace R22 LDI R21,0x02 ; nastaví se adresa dat MOV R20,R22 ; přepíše hodnotu v registru R22 do registru R20, kterým se předává hodnota funkci WR RCALL WR ; zavolá proceduru zapisující hodnotu JAS podle čísla kroku dle tabulky RCALL EEW ; zapíše novou hodnotu do paměti EER: ; ** čtení z paměti EEPROM ** OUT EEAR,R21 ; nastaví se adresa podle registru R21 ; SBI EECR,EERE ; nastaví se čtení (proč to nechce??) SBIC EECR,0 ; pokud je bit 0 EECR hardwarově vymazán, je čtení ukončeno a přeskočí se následující řádek RJMP PC-1 ; není ukončeno čtení - skok o řádek zpět IN R22,EEDR ; čtení bylo ukončeno, do R22 se uloží, co se načetlo v EEDR CLR R21 ; vymaže se registr R21, který obsahoval adresu EEW: ; ** zápis do paměti EEPROM ** SBIC EECR,1 ; pokud je bit 1 EECR nulový, lze zapisovat RJMP PC-1 ; v opačném případě se čeká OUT EEAR,R21 ; nastaví se adresa podle registru R21 OUT EEDR,R22 ; nastaví se ukládaná hodnota podle registru R22 SBI EECR,2 ; aktivuje se bit 2 (EEPROM Master Write Enable) SBI EECR,1 ; aktivuje se bit 1 (EEPROM Write Enable) SBIC EECR,1 ; pokud je bit 1 EECR vynulován hardwarově, lze pokračovat RJMP PC-1 ; v opačném případě se čeká CLR R21 ; smazání adresy CLR R22 ; smazání zadávané hodnoty RP: ; ** rozpoznávání povelu ** ; nastavení prodlevy LDI R19,0x01 ; obsadí se první bit registru R19 (první bit byl přijat) LSL R19 ; rotace vlevo; pro čekání 33us je třeba udělat 53 cykly CLR REG ; vymazání REG BREQ RP2 ; pokud se REG rovná zadané hodnotě, skok na RP2 RP2: SBIC PINB,0 ; přeskoč, pokud je na vstupu P0 úroveň L SBR R19,1 ; nastaví první bit R19 na jedničku SBRS R19,7 ; přeskoč, když je MSB v R19 již jednička ; dorovnání délky cyklu na 53 ; dorovnání délky cyklu na 53 RJMP PC-11 ; skok o 9 kroků zpět CP R23,R19 ; porovnají se registry R23 a R19 BREQ RP3 ; pokud jsou si rovny, odskok na RP3 CP R24,R19 ; porovnají se registry R24 a R19 BREQ RP4 ; pokud se rovnají, odskok na RP4 11 Martin Pospíšilík

RP3: RCALL INCR ; volání inkrementace RP4: RCALL DECR ; volání dekrementace WR: ; ** Tabulka přiřazující krokům 0-24 hodnotu JAS (parametr se předává v R20!!)** CPI R20,0x00 ; je R1 nastaven na krok 0? BREQ K0 ; pak skok na řádek K0 CPI R20,0x01 ; atd. BREQ K1 ; CPI R20,0x02 ; BREQ K2 ; CPI R20,0x03 ; BREQ K3 ; CPI R20,0x04 ; BREQ K4 ; CPI R20,0x05 ; BREQ K5 ; CPI R20,0x06 ; BREQ K6 ; CPI R20,0x07 ; BREQ K7 ; CPI R20,0x08 ; BREQ K8 ; CPI R20,0x09 ; BREQ K9 ; CPI R20,0x0A ; BREQ KA ; CPI R20,0x0B ; BREQ KB ; CPI R20,0x0C ; BREQ KC ; CPI R20,0x0D ; BREQ KD ; CPI R20,0x0E ; BREQ KE ; CPI R20,0x0F ; BREQ KF ; CPI R20,0x10 ; BREQ K10 ; CPI R20,0x11 ; BREQ K11 ; CPI R20,0x12 ; BREQ K12 ; CPI R20,0x13 ; BREQ K13 ; CPI R20,0x14 ; BREQ K14 ; CPI R20,0x15 ; BREQ K15 ; CPI R20,0x16 ; BREQ K16 ; CPI R20,0x17 ; BREQ K17 ; CPI R20,0x18 ; BREQ K18 ; ; návrat v případě chyby, kdy dojde k přetečení tabulky ; VLASTNÍ DATA K0: LDI REG,0x00 ; K1: LDI REG,10 ; K2: LDI REG,20 ; K3: LDI REG,30 ; K4: LDI REG,40 ; K5: LDI REG,50 ; K6: LDI REG,60 ; K7: LDI REG,70 ; K8: LDI REG,80 ; K9: LDI REG,90 ; KA: LDI REG,100 ; 12 Martin Pospíšilík

KB: LDI REG,110 ; KC: LDI REG,120 ; KD: LDI REG,130 ; KE: LDI REG,140 ; KF: LDI REG,150 ; K10: LDI REG,160 ; K11: LDI REG,170 ; K12: LDI REG,0x00 ; K13: LDI REG,0x00 ; K14: LDI REG,0x00 ; K15: LDI REG,0x00 ; K16: LDI REG,0x00 ; K17: LDI REG,0x00 ; K18: LDI REG,0x00 ; K19: OUT JAS,REG ; hodnota se zapíše do registru JAS Poznámka: Tento kód je pouze zkušební. Pro jeho správnou funkci bude nutné udělat několik úprav. Např. se při simulaci ukázalo, že instrukce neprovede návrat do procedury, ze které byla příslušná rocedura volána, ale vrátí programový čítač do hlavní smyčky. Je tedy nutné nahradit ji příkazem RJMP s odkazy na příslušná návěští. Dále bude nutné upravit převodní tabulku v proceduře WR a časování při příjmu povelů. 13 Martin Pospíšilík

5.2 Vysílač Program byl vytvořen v prostředí AVR Studio. Je napsán v assembleru. Vývojový diagram je uveden na obrázku 6. Výpisu programu je věnována podkaitola 5.2.1. Program zabírá cca 300B. Jeho větvení je zřejmé z vývojového diagramu. V následujícím textu budou jednotlivé jeho části stručně okomentovány. Po připojení napájecího napětí dojde k inicializaci programu. Nastaví se konfigurace vstupně/výstupních PINů a příslušných registrů, které ovládají vlastnosti procesoru. Z paměti EEPROM je do příslušného registru zapsána hodnota kalibrace pracovní frekvence. Během inicializace se rozsvítí kontrolka D102. Jakmile inicializace skončí, povolí se přerušení a procesor je uspán do režimu SLEEP. Stiskneme-li nyní libovolné tlačítko, procesor začne vykonávat instrukce od 3. řádku programu (vektor přerušení). Tím je zavolána procedura INTR. Ta zakáže přerušení, provede A/D převod pro zjištění stavu akumulátoru a testuje které tlačítko bylo stisknuto. Pokud již není stisknuto žádné tlačítko a přerušení bylo vyvoláno jakoukoliv chybou, je přerušení povoleno a procesor se vrátí do režimu SLEEP. V případě, že některé z tlačítek stisknuto je, je zavolána jemu odpovídající procedura UP, DN nebo KAL. Procedura UP zajistí vyslání povelu pro zvýšení jasu. Je to osmibitové číslo 10100111. Tuto část programu bude nutné přepsat z důvodu zajištění kompatibility s hardwarem, konkrétně přijímačem IR signálu v modulu vysílače. Program předpokládá přenos dat rychlostí 30kb/s. Ukázalo se však, že moduly IR přijímačů pro dálková ovládání používají frekvenci 30kHz jako nosnou, na kterou se povely napomodulují rychlostí obvykle max. 1,2kb/s. Tuto skutečnost bude nutné v praxi respektovat přepsáním části programu. Jakmile je odesláno všech 8 bitů, program vyčká 300ms a otestuje, je-li ještě stisknuto tlačítko pro zvýšení jasu. Pokud ano, proběhne cyklus odeslání povelu znovu s tím, že další prodleva již není 300 ale jen 100ms. Pokud tlačítko již stisknuto není, procesor se vrátí do režimu SLEEP. Procedura DN se chodá stejně jako procedura UP, ovšem s tím rozdílem, že vysílá číslo 10001101. Stejně jako v případě procedury UP bude nutné upravit rychlost datového toku a zavést modulaci na frekvenci 30kHz. Procedura KAL slouží ke změně kalibrační hodnoty vnitřního oscilátoru. Pro zajištění kompatibility vysílače s přijímačem je nutné, aby oba procesory běžely na stejné frekvenci, tj. 1,6MHz. Pokud bude datový tok upraven na 1,2kb/s, vyslání povelu bude trvat cca 6,7ms. Tato doba se nesmí odchýlit více než o délku jedné čtvrtiny trvání doby, po kterou je odesílán jeden bit, tedy 0,2ms. Z toho plyne, že odchylka pracovní frekvence smí být maximálně ± 3,2%. To je poněkud přísný požadavek a je možné, že nakonec bude třeba filosofii vysílání povelů zcela změnit. Frekvenci měříme osciloskopem nebo čítačem připojeným k PINu 2 (aby nedocházelo ke zbytečnému vybíjení akumulátoru pulzními proudy do vysílací IR diody, bliká při kalibraci kontrolka D102). Průběh napětí na tomto PINu musí odpovídat obrázku X. Tlačítkem Zvýšit jas se v režimu nastavování kalibrace cyklicky zvyšuje kalibrační hodnota od nejmenší po největší, tlačítkem Snížit jas se nastavená hodnota uloží do paměti EEPROM a procesor přejde do režimu SLEEP. Obr. 5: Průběh napětí na PINu 2 IO102 při měření pracovní frekvence Zápis do paměti EEPROM obstarává procedura EEW. Před jejím voláním musí být do registru R21 uložena adresa, na kterou se má zapisovat, a do registru R22 musí být uložena zapisovaná hodnota. Oba registry jsou po provedení zápisu vymazány. Čtení z paměti EEPROM je prováděnou procedurou EER. Před jejím voláním je třeba do registru R21 uložit adresu, ze které se má číst. Výstupem je načtená hodnota v registru R22. 14 Martin Pospíšilík

Obr. X: Vývojový diagram programu vysílače 15 Martin Pospíšilík

Procedura DEL zajišťuje přesně definované zpoždění 100ms (za předpokladu pracovní frekvence 1,6MHz). Využívá se přitom vnitřní čítač TIMER0. 5.2.1 Výpis programu pro vysílač Zde je uveden výpis programu pro vysílač. Kód je okomentován. ; Vysílač DO, verze 1.0 ; By Drobek, 2007 ; Přiřazení portů: ; PB0 výstup povelů ; PB1 tlačítko UP ; PB2 tlačítko DOWN ; PB3 tlačítko CAL ; PB4 signalizační LED ; PB5 A/D převodník zjišťující stav baterie ; ; Kalibrační data jsou v paměti EEPROM na adrese 0x01 ; Informace o naposledy nastaveném jasu jsou v paměti EEPROM na adrese 0x02 ; Podporované povely: 10100111 (UP), 10001101 (DOWN) ; ; Zabrané registry ; ; R16 REG Pracovní registr ; R17 Pomocný registr ; R21 Předává adresu proceduře EEW,EER ; R22 Předává data proceduře EEW,EER ; R23 MIH Minimální hodnota napětí baterie ; ; Popis procedur ; EEW Zápis do paměti EEPROM. Adresa se předává registrem R21, zapisovaná hodnota R22 ; EER Čtení z paměti EEPROM. Adresa se předává registrem R21, čtená hodnota je v R22 ; DEL Definované zpoždění 100ms ; INTR Obsluha přerušení ; UP Obsluha stisku tlačítka UP (volá se po přerušení) ; DN Obsluha stisku tlačítka DOWN (volá se po přerušení) ; KAL Obsluha stisku tlačítka CAL (volá se po přerušení).nolist.include "tn15def.inc".list ;*** Definování proměnných ***.CSEG ; kodový segment.def REG=R16 ; pracovní registr.def MIH=R23 ; minimální hodnota napětí baterie (konstanta).equ PORT=PORTB ; definice portu.equ VSTUP=PINB ; přejmenování registru PINB na vstup.equ DDR=DDRB ; řízení směru toku dat START:RJMP Init ; Skok na návěstí inicializace procesoru RCALL INTR ; Volá obsluhu přerušení po stisku tlačítka RJMP MAIN ; *** Inicializace procesoru *** Init: SBI PORT,4 ; zhasne LED CBI PORT,0 ; nastaví 0 na výstupu povelů LDI MIH,0x69 ; minimální hodnota napětí baterie = 1,05V LDI REG,0x11 ; do pracovního registru nahraji konfiguraci vstupů/výstupů (010001) OUT DDR,REG ; nastavení registru DDR LDI REG,0x0E ; do pracovního registru nahraji konfiguraci pull-up rezistorů (001110) OUT PORT,REG ; zapíšu hodnoty na PORT LDI REG,0x05 OUT TCCR0,REG ; nastavení děličky časovače TIMER0 na 1024 (0,64ms) RCALL EER ; načtení kalibračních dat OUT OSCCAL,R22 ; zápis kalibračních dat do registru OSCCAL CLR R22 ; vymazání registru R22 LDI REG,0xA0 ; nastavení multiplexeru AD převodníku (vnitřní reference 2,56V, vstup na PB5), zarovnání dat vlevo OUT ADMUX,REG LDI REG,0x87 OUT ADCSR,REG ; nastavení vlastního AD převodníku - zákaz přerušení, frekvence 12,5kHz, jeden převod na povolení RCALL DEL ; zpoždění 300ms RCALL DEL ; RCALL DEL ; 16 Martin Pospíšilík

CBI PORT,4 ; rozsvítí LED LDI REG,0x09 ; *** zpoždění 1s --> do REG se uloží počet opakování procedur DEL RCALL DEL ; volá zpoždění 100ms DEC REG ; dekrementace REG BRLT N1 ; skočí na návěstí N1, pokud je REG menší než 0 RJMP PC-2 ; skočí o dva řádky zpět!!! POZOR ZMENIT NA PC-3!! N1: SBI PORT,4 ; zhasne LED LDI REG,0x20 OUT GIMSK,REG ; konfigurace General Interrupt Mask Register - povoleno přerušení piny LDI REG,0x30 OUT MCUCR,REG ; konfigurace MCU Control Register - povolena funkce SLEEP v režimu POWER DOWN LDI REG,0x20 OUT GIFR,REG ; vymazání příznaku přerušení SEI ; povolení přerušení MAIN: SLEEP ; úsporný režim, ze kterého se probudí po stisku tlačítka RJMP MAIN ; skok na předchozí řádek ; *** Procedury *** EER: ; ** čtení z paměti EEPROM ** OUT EEAR,R21 ; nastaví se adresa podle registru R21 ; SBI EECR,EERE ; nastaví se čtení (proč to nechce??) SBIC EECR,0 ; pokud je bit 0 EECR hardwarově vymazán, je čtení ukončeno a přeskočí se následující řádek RJMP PC-1 ; není ukončeno čtení - skok o řádek zpět IN R22,EEDR ; čtení bylo ukončeno, do R22 se uloží, co se načetlo v EEDR CLR R21 ; vymaže se registr R21, který obsahoval adresu EEW: ; ** zápis do paměti EEPROM ** SBIC EECR,1 ; pokud je bit 1 EECR nulový, lze zapisovat RJMP PC-1 ; v opačném případě se čeká OUT EEAR,R21 ; nastaví se adresa podle registru R21 OUT EEDR,R22 ; nastaví se ukládaná hodnota podle registru R22 SBI EECR,2 ; aktivuje se bit 2 (EEPROM Master Write Enable) SBI EECR,1 ; aktivuje se bit 1 (EEPROM Write Enable) SBIC EECR,1 ; pokud je bit 1 EECR vynulován hardwarově, lze pokračovat RJMP PC-1 ; v opačném případě se čeká CLR R21 ; smazání adresy CLR R22 ; smazání zadávané hodnoty DEL: ; ** čekání 100ms po stisku tlačítka ** CLR REG OUT TCNT0,REG ; reseruje TIMER0 DEL1: IN REG,TCNT0 ; načte do REG hodnotu TIMER0 CPI REG,0x9C ; porovná hodnotu čítače s číslem 156 (odpovídá cca 100ms čítání) BRLO DEL1 ; pokud je hodnota menší, provede se další porovnání INTR: ; ** obsluha přerušení ** CLI ; zákaz všech přerušení IN REG,PINB ; přečte stav portů SBI ADCSR,ADSC ; spustí A/D převod IN R17,ADCSR ; ADCSR se načte do pomocného registru R17 SBRS R17,ADSC ; jakmile je převod ukončen (ADSC=0), přeskočí následující řádek RJMP PC-2 ; skok o dva řádky zpět IN R17,ADCH ; ADCH se načte do pomocného registru R17 CP R17,MIH ; porovná hodnotu přečtenou AD převodníkem s hodnotou MIH BRSH BOK ; pokud ADCH => MIH, baterie je OK CBI PORT,4 ; rozsvítí LED BOK: SBRS REG,1 ; pokud je hodnota PB1 (UP) H, následující řádek se přeskočí RCALL UP ; zavolá proceduru zvýšení jasu SBRS REG,2 ; pokud je hodnota PB2 (DOWN) H, následující řádek se přeskočí RCALL DN ; zavolá proceduru snížení jasu SBRS REG,3 ; pokud je hodnota PB3 (CAL) H, následující řádek se přeskočí RCALL KAL ; zavolá proceduru kalibrace pracovní frekvence SBI PORT,4 ; zhasne LED v případě, že tlačítka již nejsou stisknuta LDI REG,0x20 OUT GIFR,REG ; vymazání příznaku přerušení SEI ; povolení přerušení RJMP MAIN ; návrat z přerušení UP: ; obsluha tlačítka UP (voláno z přerušení) CLR R17 ; vymaže pomocný registr R17 RP1: SBI PORT,0 ; vyšle na výstup jedničku 17 Martin Pospíšilík

BREQ RP2 ; pokud se REG rovná zadané hodnotě, skok na RP2 RP2: CBI PORT,0 ; vyšle na výstup nulu BREQ RP3 ; pokud se REG rovná zadané hodnotě, skok na RP3 RP3: SBI PORT,0 ; vyšle na výstup jedničku BREQ RP4 ; pokud se REG rovná zadané hodnotě, skok na RP4 RP4: CBI PORT,0 ; vyšle na výstup nulu BREQ RP5 ; pokud se REG rovná zadané hodnotě, skok na RP5 RP5: CBI PORT,0 ; vyšle na výstup nulu BREQ RP6 ; pokud se REG rovná zadané hodnotě, skok na RP6 RP6: SBI PORT,0 ; vyšle na výstup jedničku BREQ RP7 ; pokud se REG rovná zadané hodnotě, skok na RP7 RP7: SBI PORT,0 ; vyšle na výstup jedničku BREQ RP8 ; pokud se REG rovná zadané hodnotě, skok na RP8 RP8: SBI PORT,0 ; vyšle na výstup jedničku BREQ RP9 ; pokud se REG rovná zadané hodnotě, skok na RP9 RP9: CBI PORT,0 ; vynuluje výstup RCALL DEL ; zpoždění 300ms v prvním cyklu, 100ms v dalších cyklech CPI R17,0x00 ; přeskočí následující zpoždění, jestli R1=0 BREQ RP9A ; pokud R1=0, skok na RP9A RCALL DEL RCALL DEL RP9A: SBI PORT,4 ; zhasne LED (pokud svítila) IN REG,PINB ; přečte stav portů SBRC REG,1 ; pokud je hodnota PB1 (UP) L, následující řádek se přeskočí RJMP PC+3 ; skok o 3 řádky níže INC R17 ; inkrementuje pomocný registr R17 RJMP RP1 ; skok na RP1 LDI REG,0x20 OUT GIFR,REG ; vymazání příznaku přerušení SEI ; povolení přerušení RJMP MAIN ; návrat z přerušení DN: ; obsluha tlačítka DN (voláno z přerušení) CLR R17 ; vymaže pomocný registr R17 RP10: SBI PORT,0 ; vyšle na výstup jedničku BREQ RP11 ; pokud se REG rovná zadané hodnotě, skok na RP11 RP11: CBI PORT,0 ; vyšle na výstup nulu BREQ RP12 ; pokud se REG rovná zadané hodnotě, skok na RP12 RP12: CBI PORT,0 ; vyšle na výstup jedničku BREQ RP13 ; pokud se REG rovná zadané hodnotě, skok na RP13 RP13: CBI PORT,0 ; vyšle na výstup nulu 18 Martin Pospíšilík

BREQ RP14 ; pokud se REG rovná zadané hodnotě, skok na RP14 RP14: SBI PORT,0 ; vyšle na výstup nulu BREQ RP15 ; pokud se REG rovná zadané hodnotě, skok na RP15 RP15: SBI PORT,0 ; vyšle na výstup jedničku BREQ RP16 ; pokud se REG rovná zadané hodnotě, skok na RP16 RP16: CBI PORT,0 ; vyšle na výstup jedničku BREQ RP17 ; pokud se REG rovná zadané hodnotě, skok na RP17 RP17: SBI PORT,0 ; vyšle na výstup jedničku BREQ RP18 ; pokud se REG rovná zadané hodnotě, skok na RP18 CBI PORT,0 ; vynuluje výstup RCALL DEL ; zpoždění 300ms v prvním cyklu, 100ms v dalších cyklech CPI R17,0x00 ; přeskočí následující zpoždění, jestli R17=0 BREQ RP18 ; pokud R1=0, skok na RP18 RCALL DEL RCALL DEL RP18: SBI PORT,4 ; zhasne LED (pokud svítila) IN REG,PINB ; přečte stav portů SBRC REG,1 ; pokud je hodnota PB1 (UP) L, následující řádek se přeskočí RJMP PC+3 ; skok o 3 řádky níže INC R17 ; inkrementuje pomocný registr R17 RJMP RP1 ; skok na RP1 LDI REG,0x20 OUT GIFR,REG ; vymazání příznaku přerušení SEI ; povolení přerušení RJMP MAIN ; návrat z přerušení KAL: ; ** kalibrace pracovní frekvence (tlačítkem UP se nastaví frekvence, tlačítkem DOWN se ukončí nastavování) ** LDI R21,0x01 ; nastaví adresu kalibračních dat v EEPROM RCALL EER ; načte aktuální kalibrační hodnotu do R22 RCALL DEL ; zpoždění 300ms RCALL DEL ; RCALL DEL ; SBI PORT,0 ; zhasne LED (pokud svítila) RCALL DEL ; zpoždění 300ms RCALL DEL ; RCALL DEL ; CBI PORT,0 ; rozsvítí LED CLR REG OUT TCNT0,REG ; reseruje TIMER0 IN REG,TCNT0 SBRS REG,1 ; následující řádek se přeskočí, když TIMER0 načte dvojku (1,28ms) RJMP PC-2 ; skok na předchozí řádek CBI PORT,0 ; zhasne LED IN REG,PINB ; přečte stav portů SBRS REG,4 ; pokud není stisknuto tlačítko DOWN, přeskočí se následující řádek RJMP PC+9 ; skok o 9 řádků níže SBRC REG,3 ; pokud je stisknuto tlačítko UP, přeskočí se následující řádek RJMP KAL ; skok na začátek kalibrace INC R22 ; kalibrační hodnota se inkrementuje OUT OSCCAL,R22 ; kalibrační hodnota se zapíše do kalibračního registru LDI R21,0x01 ; nastaví adresu kalibračních dat v EEPROM RCALL EEW ; provede zápis kalibračních dat do EEPROM RCALL DEL ; zavolá se procedura čekání po stisku tlačítka RJMP KAL ; skok na začátek kalibrace LDI REG,0x20 OUT GIFR,REG ; vymazání příznaku přerušení SEI ; povolení přerušení RJMP MAIN ; návrat z přerušení 19 Martin Pospíšilík

Poznámka: Vypsaný kód je v pracovní verzi a k jeho finální podobě bude ještě nutné udělat několik úprav, zejména odladit algoritmus vysílání povelů. 20 Martin Pospíšilík

6 Závěr Tato práce nastiňuje řešení dálkově ovládaného stmívače pokojového osvětlení s využitím velmi levných, jednoduchých a dostupných procesorů AVR ATTiny15L. Ačkoliv se nejedná o konečné řešení, současný stav nepoukazuje na žádné větší záludnosti, které by mohly bránit ve finální realizaci celého zařízení. Pokud se ukázalo, že některá část řešení je neschůdná, je to v práci uvedeno i spolu s nástinem možností řešení problému. 21 Martin Pospíšilík

7 Literatura [1] Datasheet k ATTiny 15L 22 Martin Pospíšilík