31 SCS - České vysoké učení technické v Praze

Transkript

31 SCS - České vysoké učení technické v Praze
Č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á

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

Více

Senzory pro malé mobilní roboty - České vysoké učení technické v

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

Více

náš rozhovor - AMIS, spol. s ro

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: ...

Více

elektronika A Radio

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

Více

Použití analýzy nezávislých komponent při zpracování biologických

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

Více

Plakátová sdělení - Institute of Experimental Botany AS CR

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ž ...

Více

Zde - Martin Uhlík

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

Více