31 SCS - České vysoké učení technické v Praze
Transkript
České vysoké učení technické v Praze 31SCS:Dálkově ovládaný stmívač s ATTiny15L 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 České vysoké učení technické v Praze 31SCS:Dálkově ovládaný stmívač s ATTiny15L 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 České vysoké učení technické v Praze 31SCS:Dálkově ovládaný stmívač s ATTiny15L 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 České vysoké učení technické v Praze 31SCS:Dálkově ovládaný stmívač s ATTiny15L 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 České vysoké učení technické v Praze 31SCS:Dálkově ovládaný stmívač s ATTiny15L 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 České vysoké učení technické v Praze 31SCS:Dálkově ovládaný stmívač s ATTiny15L 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 České vysoké učení technické v Praze 31SCS:Dálkově ovládaný stmívač s ATTiny15L 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 České vysoké učení technické v Praze 31SCS:Dálkově ovládaný stmívač s ATTiny15L 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 České vysoké učení technické v Praze 31SCS:Dálkově ovládaný stmívač s ATTiny15L žá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 České vysoké učení technické v Praze 31SCS:Dálkově ovládaný stmívač s ATTiny15L 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 ; DN1 ; KAL ; DEL ; INCR ; DECR ; RP ; WR střídu ; EEW ; EER ; ; ; ; ; ; ; ; ; ; Obsluha tlačítka UP (zvýšení jasu) Obsluha tlačítka DOWN (snížení jasu) Obsluha tlačítka CAL (kalibrace vnitřního oscilátoru) Prodleva 100ms Obsluha inkrementace jasu (volá ji buď procedura UP1 nebo RP) Obsluha dekrementace jasu (volá ji buď procedura DN1 nebo RP) Rozpoznání příchozího povelu z DO Nastavení výstupního parametru JAS - podle hodnoty kroku v registru R20 a vnitřní tabulky přiřadí výstupu definovanou Zápis do paměti EEPROM. Adresa se předává registrem R21, zapisovaná hodnota R22 Čtení z paměti EEPROM. Adresa se předává registrem R21, čtená hodnota je v R22 Zabrané registry R16 REG R17 MAX R18 MIN R19 R20 R21 R22 R23 R24 Pracovní registr Maximální počet kroků Minimální počet kroků + 1 Načtený povel z IR přijímače Předává hodnotu proceduře WR Předává adresu proceduře EEW,EER Předává data proceduře EEW,EER Udává, jak vypadá povel UP Udává, jak vypadá povel DOWN .NOLIST .INCLUDE "tn15def.inc" .LIST ;*** Definování proměnných *** .CSEG .DEF REG=R16 .DEF MAX=R17 .DEF MIN=R18 .EQU DDR=DDRB .EQU PORT=PORTB .EQU JAS=OCR1A .EQU VSTUP=PINB ;*** Inicializace procesoru *** LDI REG,0x22 OUT DDR,REG LDI REG,0x1C OUT PORT,REG LDI REG,0x63 OUT TCCR1,REG SER REG OUT OCR1B,REG CLR REG OUT JAS,REG 9 ; ; ; ; ; ; ; ; kodový segment pracovní registr přejmenování registru přejmenování registru řízení směru toku dat definice portu přejmenování registru přejmenování registru ; ; ; ; ; ; do pracovního registru nahraji konfiguraci vstupů/výstupů (100010) nastavení registru DDR do pracovního registru nahraji konfiguraci pull-up rezistorů (011100) zapíšu hodnoty na PORT zapíšu nastavení registru TTCR1 (povolena PWM, not inverted, clock = CK*4) (01100011) nastavení registru TTCR1 R17 na MAX R18 na MIN vstupní proměnné pro PWM PINB na vstup ; nastavení registru OCR1B na maximální hodnotu (počet kroků PWM je 255) ; nastavení položky JAS na 0 (OCR1A=0) Martin Pospíšilík České vysoké učení technické v Praze OUT OUT LDI OUT LDI LDI LDI LDI LDI RCALL OUT CLR SREG,REG MCUCR,REG REG,0x05 TCCR0,REG MAX,0x18 MIN,0x01 R23,0xA7 R24,0x8D R21,0x01 EER OSCCAL,R22 R22 31SCS:Dálkově ovládaný stmívač s ATTiny15L ; nastavení SREG na 0, zakáže všechna přerušení ; nastavení MCU Control Register na 0 (zákaz sleep a idle režimu) ; ; ; ; ; ; ; ; ; nastavení děličky časovače TIMER0 na 1024 (0,64ms) nastavení hodnoty maximálního počtu kroků nastavení nuly nastavení povelu UP (příjem z dálkového ovladače) nastavení povelu DOWN (příjem z DO) nastavení adresy s kalibračními daty načtení kalibračních dat zápis kalibračních dat do registru OSCCAL 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 SBRS REG,3 RCALL UP1 SBRS REG,4 RCALL DN1 SBRS REG,2 RCALL KAL SBRC REG,0 RCALL RP RJMP M1 ;*** Procedury *** UP1: RCALL DEL RCALL DEL UP2: RCALL DEL RCALL INCR IN REG,PINB SBRS REG,3 RJMP UP2 RETI DN1: DN2: RCALL DEL RCALL DEL RCALL DEL RCALL DECR IN REG,PINB SBRS REG,4 RJMP DN2 RETI ; ; ; ; ; ; ; ; ; přečte stav portů pokud je hodnota PB3 (UP) H, následující řádek se přeskočí zavolá proceduru zvýšení jasu pokud je hodnota PB4 (DOWN) H, následující řádek se přeskočí zavolá proceduru snížení jasu pokud je hodnota PB2 (CAL) H, následující řádek se přeskočí zavolá proceduru kalibrace pracovní frekvence pokud je vstup z čidla nulový, následující řádek se přeskočí zavolá proceduru rozpoznání povelu ; ; ; ; ; ; ; ; ; ** zvýšení jasu po stisknutí tlačítka UP ** zpoždění 100ms zpoždění 100ms zpoždění 100ms zavolá proceduru inkrementace jasu přečte stav portů pokud již tlačítko UP není stisknuto, následující řádek se přeskočí tlačítko je stisknuto, následuje cyklický návrak volání procedury INCR v intervalech 100ms návrat z procedury ; ; ; ; ; ; ; ; ; ** snížení jasu po stisknutí tlačítka DOWN ** zpoždění 100ms zpoždění 100ms zpoždění 100ms zavolá proceduru dekrementace jasu přečte stav portů pokud již tlačítko DOWN není stisknuto, následující řádek se přeskočí tlačítko je stisknuto, následuje cyklický návrat volání procedury INCR v intervalu 100ms návrat z procedury KAL: ukončí nastavování) ** LDI R21,0x01 RCALL EER LDI REG,0xF7 ; OUT JAS,REG KAL1: IN REG,PINB SBRS REG,4 RET SBRC REG,3 RJMP KAL1 INC R22 OUT OSCCAL,R22 LDI R21,0x01 RCALL EEW RCALL DEL RJMP KAL ; ; ; ; ; ; ; ; ; ; ; ; DEL: ; ** čekání 100ms po stisku tlačítka ** CLR OUT 10 REG TCNT0,REG ; ** kalibrace pracovní frekvence (50% střída, tlačítkem UP se nastaví frekvence, tlačítkem DOWN se ; nastaví adresu kalibračních dat v EEPROM ; načte aktuální kalibrační hodnotu do R22 do registru JAS nastaví 50% střídu (hodnota 127) přečte stav portů pokud není stisknuto tlačítko DOWN, přeskočí se následující řádek návrat z procedury pokud je stisknuto tlačítko UP, přeskočí se následující řádek skok na začátek kalibrace kalibrační hodnota se inkrementuje kalibrační hodnota se zapíše do kalibračního registru nastaví adresu kalibračních dat v EEPROM provede zápis kalibračních dat do EEPROM zavolá se procedura čekání po stisku tlačítka skok na začátek kalibrace ; reseruje TIMER0 Martin Pospíšilík České vysoké učení technické v Praze DEL1: IN CPI BRLO RET REG,TCNT0 REG,0x9C DEL1 LDI RCALL CP BRLO RETI INC LDI MOV RCALL RCALL RET R21,0x02 EER R22,MAX INC2 LDI RCALL CP BRGE RETI DEC LDI MOV RCALL RCALL RET R21,0x02 EER R22,MIN DEC2 OUT SBI SBIC RJMP IN CLR RET EEAR,R21 EECR,EERE EECR,0 PC-1 R22,EEDR R21 SBIC RJMP OUT OUT SBI NOP NOP NOP NOP SBI SBIC RJMP CLR CLR RET EECR,1 PC-1 EEAR,R21 EEDR,R22 EECR,2 INCR: INC2: R22 R21,0x02 R20,R22 WR EEW DECR: DEC2: R22 R21,0x02 R20,R22 WR EEW EER: ; EEW: EECR,1 EECR,1 PC-1 R21 R22 RP: RP2: 11 NOP NOP NOP NOP NOP NOP NOP LDI LSL CLR INC CPI BREQ RJMP SBIC SBR SBRS NOP NOP RJMP CP BREQ CP BREQ 31SCS:Dálkově ovládaný stmívač s ATTiny15L ; načte do REG hodnotu TIMER0 ; porovná hodnotu čítače s číslem 156 (odpovídá cca 100ms čítání) ; pokud je hodnota menší, provede se další porovnání ; ; ; ; ; ; ; ; ; ; ; ; ** vlastní inkrementace jasu ** adresa paměťových dat v paměti EEPROM načte aktuální jas z paměti EEPROM porovná hodnotu jasu s maximálním limitem 24 (uložen v registru R17 = MAX) pokud je hodnota jasu nižší než maximální, přeskočí se následující řádek návrat z procedury inkrementace registru R22 nastaví se adresa dat přepíše hodnotu v registru R22 do registru R20, kterým se předává hodnota funkci WR zavolá proceduru zapisující hodnotu JAS podle čísla kroku dle tabulky zapíše novou hodnotu do paměti návrat z procedury ; ; ; ; ; ; ; ; ; ; ; ; ** vlastní dekrementace jasu ** adresa paměťových dat v paměti EEPROM načte aktuální jas z paměti EEPROM porovná hodnotu jasu s minimálním limitem 1 (uložen v registru R18 = MIN) pokud je hodnota jasu rovna alespoň jedné, přeskočí se následující řádek návrat z procedury dekrementace R22 nastaví se adresa dat přepíše hodnotu v registru R22 do registru R20, kterým se předává hodnota funkci WR zavolá proceduru zapisující hodnotu JAS podle čísla kroku dle tabulky zapíše novou hodnotu do paměti návrat z procedury ; ; ; ; ; ; ; ; ** čtení z paměti EEPROM ** nastaví se adresa podle registru R21 nastaví se čtení (proč to nechce??) pokud je bit 0 EECR hardwarově vymazán, je čtení ukončeno a přeskočí se následující řádek není ukončeno čtení - skok o řádek zpět čtení bylo ukončeno, do R22 se uloží, co se načetlo v EEDR vymaže se registr R21, který obsahoval adresu návrat z procedury ; ; ; ; ; ; ** zápis do paměti EEPROM ** pokud je bit 1 EECR nulový, lze zapisovat v opačném případě se čeká nastaví se adresa podle registru R21 nastaví se ukládaná hodnota podle registru R22 aktivuje se bit 2 (EEPROM Master Write Enable) ; ; ; ; ; ; aktivuje se bit 1 (EEPROM Write Enable) pokud je bit 1 EECR vynulován hardwarově, lze pokračovat v opačném případě se čeká smazání adresy smazání zadávané hodnoty návrat z procedury ; ** rozpoznávání povelu ** ; nastavení prodlevy R19,0x01 R19 REG REG REG,0x09 RP2 PC-3 PINB,0 R19,1 R19,7 PC-11 R23,R19 RP3 R24,R19 RP4 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; obsadí se první bit registru R19 (první bit byl přijat) rotace vlevo; pro čekání 33us je třeba udělat 53 cykly vymazání REG inkrementace REG nastaví se doba čekání (ideální interval je 33us) pokud se REG rovná zadané hodnotě, skok na RP2 skok o 3 řádky zpět přeskoč, pokud je na vstupu P0 úroveň L nastaví první bit R19 na jedničku přeskoč, když je MSB v R19 již jednička dorovnání délky cyklu na 53 dorovnání délky cyklu na 53 skok o 9 kroků zpět porovnají se registry R23 a R19 pokud jsou si rovny, odskok na RP3 porovnají se registry R24 a R19 pokud se rovnají, odskok na RP4 Martin Pospíšilík České vysoké učení technické v Praze RP3: RP4: RET RCALL RET RCALL RET INCR DECR WR: CPI BREQ CPI BREQ CPI BREQ CPI BREQ CPI BREQ CPI BREQ CPI BREQ CPI BREQ CPI BREQ CPI BREQ CPI BREQ CPI BREQ CPI BREQ CPI BREQ CPI BREQ CPI BREQ CPI BREQ CPI BREQ CPI BREQ CPI BREQ CPI BREQ CPI BREQ CPI BREQ CPI BREQ CPI BREQ RET R20,0x00 K0 R20,0x01 K1 R20,0x02 K2 R20,0x03 K3 R20,0x04 K4 R20,0x05 K5 R20,0x06 K6 R20,0x07 K7 R20,0x08 K8 R20,0x09 K9 R20,0x0A KA R20,0x0B KB R20,0x0C KC R20,0x0D KD R20,0x0E KE R20,0x0F KF R20,0x10 K10 R20,0x11 K11 R20,0x12 K12 R20,0x13 K13 R20,0x14 K14 R20,0x15 K15 R20,0x16 K16 R20,0x17 K17 R20,0x18 K18 LDI RJMP LDI RJMP LDI RJMP LDI RJMP LDI RJMP LDI RJMP LDI RJMP LDI RJMP LDI RJMP LDI RJMP LDI RJMP REG,0x00 ; K19 REG,10 K19 REG,20 K19 REG,30 K19 REG,40 K19 REG,50 K19 REG,60 K19 REG,70 K19 REG,80 K19 REG,90 K19 REG,100 K19 31SCS:Dálkově ovládaný stmívač s ATTiny15L ; ; ; ; ; návrat z procedury volání inkrementace návrat z procedury volání dekrementace návrat z procedury ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ** Tabulka přiřazující krokům 0 - 24 hodnotu JAS (parametr se předává v R20!!)** je R1 nastaven na krok 0? pak skok na řádek K0 atd. návrat v případě chyby, kdy dojde k přetečení tabulky ; ____VLASTNÍ DATA_______ K0: K1: K2: K3: K4: K5: K6: K7: K8: K9: KA: 12 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; Martin Pospíšilík České vysoké učení technické v Praze KB: KC: KD: KE: KF: K10: K11: K12: K13: K14: K15: K16: K17: K18: K19: LDI RJMP LDI RJMP LDI RJMP LDI RJMP LDI RJMP LDI RJMP LDI RJMP LDI RJMP LDI RJMP LDI RJMP LDI RJMP LDI RJMP LDI RJMP LDI OUT RET REG,110 K19 REG,120 K19 REG,130 K19 REG,140 K19 REG,150 K19 REG,160 K19 REG,170 K19 REG,0x00 K19 REG,0x00 K19 REG,0x00 K19 REG,0x00 K19 REG,0x00 K19 REG,0x00 K19 REG,0x00 JAS,REG 31SCS:Dálkově ovládaný stmívač s ATTiny15L ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; hodnota se zapíše do registru JAS ; návrat z procedury 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 RET 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 České vysoké učení technické v Praze 31SCS:Dálkově ovládaný stmívač s ATTiny15L 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 České vysoké učení technické v Praze 31SCS:Dálkově ovládaný stmívač s ATTiny15L Obr. X: Vývojový diagram programu vysílače 15 Martin Pospíšilík České vysoké učení technické v Praze 31SCS:Dálkově ovládaný stmívač s ATTiny15L 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 PB1 PB2 PB3 PB4 PB5 výstup povelů tlačítko UP tlačítko DOWN tlačítko CAL signalizační LED 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 R17 R21 R22 R23 REG Pracovní registr Pomocný registr Předává adresu proceduře EEW,EER Předává data proceduře EEW,EER Minimální hodnota napětí baterie MIH Popis procedur EEW EER DEL INTR UP DN KAL Zápis do paměti EEPROM. Adresa se předává registrem R21, zapisovaná hodnota R22 Čtení z paměti EEPROM. Adresa se předává registrem R21, čtená hodnota je v R22 Definované zpoždění 100ms Obsluha přerušení Obsluha stisku tlačítka UP (volá se po přerušení) Obsluha stisku tlačítka DOWN (volá se po přerušení) Obsluha stisku tlačítka CAL (volá se po přerušení) .NOLIST .INCLUDE "tn15def.inc" .LIST ;*** Definování proměnných *** .CSEG .DEF REG=R16 .DEF MIH=R23 .EQU PORT=PORTB .EQU VSTUP=PINB .EQU DDR=DDRB START:RJMP Init NOP RCALL INTR RJMP MAIN ; *** Inicializace procesoru *** Init: SBI PORT,4 CBI PORT,0 LDI MIH,0x69 LDI REG,0x11 OUT DDR,REG LDI REG,0x0E OUT PORT,REG LDI REG,0x05 OUT TCCR0,REG RCALL EER OUT OSCCAL,R22 CLR R22 LDI REG,0xA0 OUT ADMUX,REG LDI REG,0x87 OUT ADCSR,REG RCALL RCALL RCALL 16 DEL DEL DEL ; ; ; ; ; ; kodový segment pracovní registr minimální hodnota napětí baterie (konstanta) definice portu přejmenování registru PINB na vstup řízení směru toku dat ; Skok na návěstí inicializace procesoru ; Volá obsluhu přerušení po stisku tlačítka ; ; ; ; ; ; ; zhasne LED nastaví 0 na výstupu povelů minimální hodnota napětí baterie = 1,05V do pracovního registru nahraji konfiguraci vstupů/výstupů (010001) nastavení registru DDR do pracovního registru nahraji konfiguraci pull-up rezistorů (001110) zapíšu hodnoty na PORT ; ; ; ; ; nastavení děličky časovače TIMER0 na 1024 (0,64ms) načtení kalibračních dat zápis kalibračních dat do registru OSCCAL vymazání registru R22 nastavení multiplexeru AD převodníku (vnitřní reference 2,56V, vstup na PB5), zarovnání dat vlevo ; nastavení vlastního AD převodníku - zákaz přerušení, frekvence 12,5kHz, jeden převod na povolení ; zpoždění 300ms ; ; Martin Pospíšilík České vysoké učení technické v Praze N1: MAIN: CBI LDI RCALL DEC BRLT RJMP SBI LDI OUT LDI OUT LDI OUT SEI SLEEP RJMP PORT,4 REG,0x09 DEL REG N1 PC-2 PORT,4 REG,0x20 GIMSK,REG REG,0x30 MCUCR,REG REG,0x20 GIFR,REG MAIN ; *** Procedury *** EER: OUT EEAR,R21 ; SBI EECR,EERE SBIC EECR,0 RJMP PC-1 IN R22,EEDR CLR R21 RET EEW: SBIC RJMP OUT OUT SBI NOP NOP NOP NOP SBI SBIC RJMP CLR CLR RET EECR,1 PC-1 EEAR,R21 EEDR,R22 EECR,2 CLR OUT IN CPI BRLO RET REG TCNT0,REG REG,TCNT0 REG,0x9C DEL1 EECR,1 EECR,1 PC-1 R21 R22 DEL: DEL1: CLI IN SBI IN SBRS RJMP IN CP BRSH CBI SBRS RCALL SBRS RCALL SBRS RCALL SBI LDI OUT SEI RJMP REG,PINB ADCSR,ADSC R17,ADCSR R17,ADSC PC-2 R17,ADCH R17,MIH BOK PORT,4 REG,1 UP REG,2 DN REG,3 KAL PORT,4 REG,0x20 GIFR,REG 17 ; konfigurace General Interrupt Mask Register - povoleno přerušení piny ; konfigurace MCU Control Register - povolena funkce SLEEP v režimu POWER DOWN ; vymazání příznaku přerušení ; povolení přerušení ; úsporný režim, ze kterého se probudí po stisku tlačítka ; skok na předchozí řádek ; ; ; ; ; ; ; ; ** čtení z paměti EEPROM ** nastaví se adresa podle registru R21 nastaví se čtení (proč to nechce??) pokud je bit 0 EECR hardwarově vymazán, je čtení ukončeno a přeskočí se následující řádek není ukončeno čtení - skok o řádek zpět čtení bylo ukončeno, do R22 se uloží, co se načetlo v EEDR vymaže se registr R21, který obsahoval adresu návrat z procedury ; ; ; ; ; ; ** zápis do paměti EEPROM ** pokud je bit 1 EECR nulový, lze zapisovat v opačném případě se čeká nastaví se adresa podle registru R21 nastaví se ukládaná hodnota podle registru R22 aktivuje se bit 2 (EEPROM Master Write Enable) ; ; ; ; ; ; aktivuje se bit 1 (EEPROM Write Enable) pokud je bit 1 EECR vynulován hardwarově, lze pokračovat v opačném případě se čeká smazání adresy smazání zadávané hodnoty návrat z procedury CLR SBI CLR INC CPI ; ; ; ; reseruje TIMER0 načte do REG hodnotu TIMER0 porovná hodnotu čítače s číslem 156 (odpovídá cca 100ms čítání) pokud je hodnota menší, provede se další porovnání ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ** obsluha přerušení ** zákaz všech přerušení přečte stav portů spustí A/D převod ADCSR se načte do pomocného registru R17 jakmile je převod ukončen (ADSC=0), přeskočí následující řádek skok o dva řádky zpět ADCH se načte do pomocného registru R17 porovná hodnotu přečtenou AD převodníkem s hodnotou MIH pokud ADCH => MIH, baterie je OK rozsvítí LED pokud je hodnota PB1 (UP) H, následující řádek se přeskočí zavolá proceduru zvýšení jasu pokud je hodnota PB2 (DOWN) H, následující řádek se přeskočí zavolá proceduru snížení jasu pokud je hodnota PB3 (CAL) H, následující řádek se přeskočí zavolá proceduru kalibrace pracovní frekvence zhasne LED v případě, že tlačítka již nejsou stisknuta MAIN ; vymazání příznaku přerušení ; povolení přerušení ; návrat z přerušení R17 PORT,0 REG REG REG,0x09 ; ; ; ; ; ; UP: RP1: rozsvítí LED *** zpoždění 1s --> do REG se uloží počet opakování procedur DEL volá zpoždění 100ms dekrementace REG skočí na návěstí N1, pokud je REG menší než 0 skočí o dva řádky zpět !!! POZOR ZMENIT NA PC-3!! zhasne LED ; ** čekání 100ms po stisku tlačítka ** INTR: BOK: ; ; ; ; ; ; ; 31SCS:Dálkově ovládaný stmívač s ATTiny15L obsluha tlačítka UP (voláno z přerušení) vymaže pomocný registr R17 vyšle na výstup jedničku vymaže REG a spustí cyklus čekání 33us inkrementace REG nastaví se doba čekání (ideální interval je 33us) Martin Pospíšilík České vysoké učení technické v Praze RP2: RP3: RP4: RP5: RP6: RP7: RP8: RP9: RP9A: BREQ RP2 RJMP PC-3 CBI PORT,0 CLR REG INC REG CPI REG,0x09 BREQ RP3 RJMP PC-3 SBI PORT,0 CLR REG INC REG CPI REG,0x09 BREQ RP4 RJMP PC-3 CBI PORT,0 CLR REG INC REG CPI REG,0x09 BREQ RP5 RJMP PC-3 CBI PORT,0 CLR REG INC REG CPI REG,0x09 BREQ RP6 RJMP PC-3 SBI PORT,0 CLR REG INC REG CPI REG,0x09 BREQ RP7 RJMP PC-3 SBI PORT,0 CLR REG INC REG CPI REG,0x09 BREQ RP8 RJMP PC-3 SBI PORT,0 CLR REG INC REG CPI REG,0x09 BREQ RP9 RJMP PC-3 CBI PORT,0 RCALL DEL CPI R17,0x00 BREQ RP9A RCALL DEL RCALL DEL SBI PORT,4 IN REG,PINB SBRC REG,1 RJMP PC+3 INC R17 RJMP RP1 LDI REG,0x20 OUT GIFR,REG SEI RJMP MAIN ; vymazání příznaku přerušení ; povolení přerušení ; návrat z přerušení CLR SBI CLR INC CPI BREQ RJMP CBI CLR INC CPI BREQ RJMP CBI CLR INC CPI BREQ RJMP CBI ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; DN: RP10: RP11: RP12: RP13: 18 31SCS:Dálkově ovládaný stmívač s ATTiny15L R17 PORT,0 REG REG REG,0x09 RP11 PC-3 PORT,0 REG REG REG,0x09 RP12 PC-3 PORT,0 REG REG REG,0x09 RP13 PC-3 PORT,0 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; pokud se REG rovná zadané hodnotě, skok na RP2 skok o 3 řádky zpět vyšle na výstup nulu vymaže REG a spustí cyklus čekání 33us inkrementace REG nastaví se doba čekání (ideální interval je 33us) pokud se REG rovná zadané hodnotě, skok na RP3 skok o 3 řádky zpět vyšle na výstup jedničku vymaže REG a spustí cyklus čekání 33us inkrementace REG nastaví se doba čekání (ideální interval je 33us) pokud se REG rovná zadané hodnotě, skok na RP4 skok o 3 řádky zpět vyšle na výstup nulu vymaže REG a spustí cyklus čekání 33us inkrementace REG nastaví se doba čekání (ideální interval je 33us) pokud se REG rovná zadané hodnotě, skok na RP5 skok o 3 řádky zpět vyšle na výstup nulu vymaže REG a spustí cyklus čekání 33us inkrementace REG nastaví se doba čekání (ideální interval je 33us) pokud se REG rovná zadané hodnotě, skok na RP6 skok o 3 řádky zpět vyšle na výstup jedničku vymaže REG a spustí cyklus čekání 33us inkrementace REG nastaví se doba čekání (ideální interval je 33us) pokud se REG rovná zadané hodnotě, skok na RP7 skok o 3 řádky zpět vyšle na výstup jedničku vymaže REG a spustí cyklus čekání 33us inkrementace REG nastaví se doba čekání (ideální interval je 33us) pokud se REG rovná zadané hodnotě, skok na RP8 skok o 3 řádky zpět vyšle na výstup jedničku vymaže REG a spustí cyklus čekání 33us inkrementace REG nastaví se doba čekání (ideální interval je 33us) pokud se REG rovná zadané hodnotě, skok na RP9 skok o 3 řádky zpět vynuluje výstup zpoždění 300ms v prvním cyklu, 100ms v dalších cyklech přeskočí následující zpoždění, jestli R1=0 pokud R1=0, skok na RP9A ; ; ; ; ; ; zhasne LED (pokud svítila) přečte stav portů pokud je hodnota PB1 (UP) L, následující řádek se přeskočí skok o 3 řádky níže inkrementuje pomocný registr R17 skok na RP1 obsluha tlačítka DN (voláno z přerušení) vymaže pomocný registr R17 vyšle na výstup jedničku vymaže REG a spustí cyklus čekání 33us inkrementace REG nastaví se doba čekání (ideální interval je 33us) pokud se REG rovná zadané hodnotě, skok na RP11 skok o 3 řádky zpět vyšle na výstup nulu vymaže REG a spustí cyklus čekání 33us inkrementace REG nastaví se doba čekání (ideální interval je 33us) pokud se REG rovná zadané hodnotě, skok na RP12 skok o 3 řádky zpět vyšle na výstup jedničku vymaže REG a spustí cyklus čekání 33us inkrementace REG nastaví se doba čekání (ideální interval je 33us) pokud se REG rovná zadané hodnotě, skok na RP13 skok o 3 řádky zpět vyšle na výstup nulu Martin Pospíšilík České vysoké učení technické v Praze RP14: RP15: RP16: RP17: RP18: CLR REG INC REG CPI REG,0x09 BREQ RP14 RJMP PC-3 SBI PORT,0 CLR REG INC REG CPI REG,0x09 BREQ RP15 RJMP PC-3 SBI PORT,0 CLR REG INC REG CPI REG,0x09 BREQ RP16 RJMP PC-3 CBI PORT,0 CLR REG INC REG CPI REG,0x09 BREQ RP17 RJMP PC-3 SBI PORT,0 CLR REG INC REG CPI REG,0x09 BREQ RP18 RJMP PC-3 CBI PORT,0 RCALL DEL CPI R17,0x00 BREQ RP18 RCALL DEL RCALL DEL SBI PORT,4 IN REG,PINB SBRC REG,1 RJMP PC+3 INC R17 RJMP RP1 LDI REG,0x20 OUT GIFR,REG SEI RJMP MAIN KAL: LDI R21,0x01 RCALL EER RCALL DEL RCALL DEL RCALL DEL SBI PORT,0 RCALL DEL RCALL DEL RCALL DEL CBI PORT,0 CLR REG OUT TCNT0,REG IN REG,TCNT0 SBRS REG,1 RJMP PC-2 CBI PORT,0 IN REG,PINB SBRS REG,4 RJMP PC+9 SBRC REG,3 RJMP KAL INC R22 OUT OSCCAL,R22 LDI R21,0x01 RCALL EEW RCALL DEL RJMP KAL LDI REG,0x20 OUT GIFR,REG SEI RJMP MAIN 19 31SCS:Dálkově ovládaný stmívač s ATTiny15L ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; vymaže REG a spustí cyklus čekání 33us inkrementace REG nastaví se doba čekání (ideální interval je 33us) pokud se REG rovná zadané hodnotě, skok na RP14 skok o 3 řádky zpět vyšle na výstup nulu vymaže REG a spustí cyklus čekání 33us inkrementace REG nastaví se doba čekání (ideální interval je 33us) pokud se REG rovná zadané hodnotě, skok na RP15 skok o 3 řádky zpět vyšle na výstup jedničku vymaže REG a spustí cyklus čekání 33us inkrementace REG nastaví se doba čekání (ideální interval je 33us) pokud se REG rovná zadané hodnotě, skok na RP16 skok o 3 řádky zpět vyšle na výstup jedničku vymaže REG a spustí cyklus čekání 33us inkrementace REG nastaví se doba čekání (ideální interval je 33us) pokud se REG rovná zadané hodnotě, skok na RP17 skok o 3 řádky zpět vyšle na výstup jedničku vymaže REG a spustí cyklus čekání 33us inkrementace REG nastaví se doba čekání (ideální interval je 33us) pokud se REG rovná zadané hodnotě, skok na RP18 skok o 3 řádky zpět vynuluje výstup zpoždění 300ms v prvním cyklu, 100ms v dalších cyklech přeskočí následující zpoždění, jestli R17=0 pokud R1=0, skok na RP18 ; ; ; ; ; ; zhasne LED (pokud svítila) přečte stav portů pokud je hodnota PB1 (UP) L, následující řádek se přeskočí skok o 3 řádky níže inkrementuje pomocný registr R17 skok na RP1 ; vymazání příznaku přerušení ; povolení přerušení ; návrat z přerušení ; ** kalibrace pracovní frekvence (tlačítkem UP se nastaví frekvence, tlačítkem DOWN se ukončí nastavování) ** ; nastaví adresu kalibračních dat v EEPROM ; načte aktuální kalibrační hodnotu do R22 ; zpoždění 300ms ; ; ; zhasne LED (pokud svítila) ; zpoždění 300ms ; ; ; rozsvítí LED ; reseruje TIMER0 ; ; ; ; ; ; ; ; ; ; ; ; ; ; následující řádek se přeskočí, když TIMER0 načte dvojku (1,28ms) skok na předchozí řádek zhasne LED přečte stav portů pokud není stisknuto tlačítko DOWN, přeskočí se následující řádek skok o 9 řádků níže pokud je stisknuto tlačítko UP, přeskočí se následující řádek skok na začátek kalibrace kalibrační hodnota se inkrementuje kalibrační hodnota se zapíše do kalibračního registru nastaví adresu kalibračních dat v EEPROM provede zápis kalibračních dat do EEPROM zavolá se procedura čekání po stisku tlačítka skok na začátek kalibrace ; vymazání příznaku přerušení ; povolení přerušení ; návrat z přerušení Martin Pospíšilík České vysoké učení technické v Praze 31SCS:Dálkově ovládaný stmívač s ATTiny15L 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 České vysoké učení technické v Praze 31SCS:Dálkově ovládaný stmívač s ATTiny15L 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 České vysoké učení technické v Praze 31SCS:Dálkově ovládaný stmívač s ATTiny15L 7 Literatura [1] Datasheet k ATTiny 15L 22 Martin Pospíšilík
Podobné dokumenty
vysoké učení technické v brně laditelná smyčková
Anténa je zařízení, sloužící k vysílání a přijímání radiového signálu. Je nejdůležitější částí
radiokomunikačního zařízení protože ji nelze nahradit žádným jiným zařízením nebo elektrickým
obvodem ...
Senzory pro malé mobilní roboty - České vysoké učení technické v
část, která robotovi umožňuje autonomní pohyb po prostoru, aniž by narážel do
překážek. To je realizováno pomocí senzoru vzdálenosti Sharp GP2D12, který pracuje
v rozsahu 10 až 80cm pro detekovatel...
náš rozhovor - AMIS, spol. s ro
Proudový odběr:
30 až 50 mA (v klidovém
stavu i při všech měřeních).
Indikace poklesu napájecího napětí:
asi při 6,8 V.
Automatické vypnutí: asi za 5 minut.
Rozměry:
3,7 x 9,0 x 19,2 cm.
Hmotnost:
...
elektronika A Radio
Inteligentní rychlonabíjeè NiCd (DPS) ...................................... 16/1
Ekvitermní termostat a rozdílový termostat (DPS) .................. 25/1
HM-300 hlídaè pøetíení malých motorù (DPS...
Použití analýzy nezávislých komponent při zpracování biologických
3. Počet hledaných nezávislých komponent (independent component, IC) je menší nebo
roven počtu elektrod.
4. Nezávislé komponenty mají negaussovské rozdělení (ve skutečnosti jedna IC může
mít gausso...
Plakátová sdělení - Institute of Experimental Botany AS CR
dat v jednom běhu sekvenátoru, který trvá 10 hodin. Při průměrné délce čtení kolem 400 bazí to představuje
přes milion jednotlivých čtení. Bakteriální genom lze při těchto parametrech stanovit již ...
Zde - Martin Uhlík
jedinečné. Pro vysoký počet bitů se stejná kombinace bitů sériového čísla prakticky nemůže opakovat
po celou dobu výroby čipu.
Komunikaci ovládá vždy Master a zahajuje tak přenos dat jak z, tak i d...