PIC16F84電子遊戯(17) |
最終更新日:2001年4月1日 |
ミラクルライト(1ページ)へ (2ページ)へ (3ページ) (4ページ)へ |
|
ミラクルライトの色仕様 |
今回のミラクルライトで設定した色を説明します。
目に見えて色を変えようとするとなかなか難しいです。
皆さんも、自分でいろいろ変更してみて試して下さい。(◎=全灯、△=半灯、×=消灯)
どれも私から見た色の名前を付けています。(個人差はあると思います。) |
|
key_sub.0=0 |
key_sub.0=1 |
ビット位置 |
色 |
赤 |
緑 |
青 |
色 |
赤 |
緑 |
青 |
key_count.0 |
赤色 |
◎ |
× |
× |
桃色 |
◎ |
× |
△ |
key_count.1 |
緑色 |
× |
◎ |
× |
黄緑色 |
△ |
◎ |
× |
key_count.2 |
青色 |
× |
× |
◎ |
水緑色 |
× |
◎ |
△ |
key_count.3 |
黄色 |
◎ |
◎ |
× |
青紫色 |
△ |
× |
◎ |
key_count.4 |
水色 |
× |
◎ |
◎ |
薄青色 |
× |
△ |
◎ |
key_count.5 |
紫色 |
◎ |
× |
◎ |
深黄色 |
△ |
△ |
× |
key_count.6 |
白色 |
◎ |
◎ |
◎ |
深水色 |
× |
△ |
△ |
key_count.7 |
橙色 |
◎ |
△ |
× |
深紫色 |
△ |
× |
△ |
|
(16色設定内容) |
それぞれのLEDに対して、全灯、半灯、消灯の設定を行います。
まず、全灯、半灯、消灯に使用する時間を定数定義しておきます。 |
time0 |
time1 |
time2 |
time3 |
00h |
70h |
20h |
50h |
|
(時間設定用定数) |
これらの時間を組み合わせてそれぞれのLEDに全灯、半灯、消灯の時間を設定します。
赤色LEDに対するソースを記します。他のLEDも同様の処理です。 |
赤色LEDの定数設定set_hi_red movlw time1
movwf red_on
movlw time0
movwf red_off
return
set_mid_red movlw time2
movwf red_on
movlw time3
movwf red_off
return
set_lo_red movlw time0
movwf red_on
movlw time1
movwf red_off
return
|
ミラクルライトのオート時間処理 |
自動に色を変える処理の基本となるのが約200usecの割り込み処理です。
この時間を利用して自動に色を切り換える処理にします。
正確には192usecで割り込みが入ります。これをカウントした時の時間を計算します。 |
ビット数 |
カウント数 |
時間 |
8bit |
256 |
49msec |
|
9bit |
512 |
98msec |
|
10bit |
1024 |
196msec |
|
11bit |
2048 |
393msec |
0.4秒 |
12bit |
4096 |
786msec |
0.8秒 |
13bit |
8192 |
1572msec |
1.6秒 |
14bit |
16384 |
3145msec |
3.1秒 |
15bit |
32768 |
6291msec |
|
|
(カウント数と時間) |
私好みの時間として上記の4種類を選択しました。
カウント値として14bitが必要ですので、2バイトのRAMを用意しました。
このRAMを割り込みごとにカウントUPします。 |
acount2 |
acount1 |
オート時間カウント2 |
オート時間カウント1 |
|
(オート時間カウントRAM) |
時間判定処理を簡単にするためにこのRAMのどこにビットが立っているかで判断します。 |
|
ビット位置 |
時間 |
時間(1) |
acount2.3 |
0.4秒 |
時間(2) |
acount2.4 |
0.8秒 |
時間(3) |
acount2.5 |
1.6秒 |
時間(4) |
acount2.6 |
3.1秒 |
|
(オート時間判定ビット位置) |
ミラクルライトのオート時間設定変更処理 |
オートモード中のSW1の処理としてオート時間を切り換えますが、そのRAMを準備します。この切り換えも簡単にするために、色の切り換えと同じ様にビットをシフトしながら切り換えます。 |
auto_sub |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
-- |
-- |
-- |
-- |
時間(4) |
時間(3) |
時間(2) |
時間(1) |
|
(オート時間切り換えRAM) |
オート時間の切り換えauto_time btfss auto_sub,3
goto auto_time2
movlw 01h
movwf auto_sub
return
auto_time2 rlf auto_sub,1
bcf auto_sub,0
return
|
1)オート時間切り換えRAM(auto_sub)の3bit目が「1」のときは(auto_sub)を「1」にする。
2)3bit目が「1」でないときはオート時間切り換えRAM(auto_sub)を左回転します。このとき0bit目には「0」を入れます。 |
この処理によって、オートモード時にSW1を押すごとに、色が変わる時間が変化します。
3.1秒の次は0.4秒になります。この時間の初期値は1.6秒を設定しています。 |
ミラクルライトの割り込みでのオート時間処理 |
以上を踏まえて割り込み内でのオート時間処理のソースを見て下さい。 btfss led_mode,0
goto red_leds
;---------------------------------
movlw 01h ;LED mode auto shori
addwf acount1,1
btfsc STATUS,0
incf acount2
btfsc auto_sub,0
goto auto4
btfsc auto_sub,1
goto auto5
btfsc auto_sub,2
goto auto6
goto auto7
auto4 btfss acount2,3
goto red_leds
goto autoe
auto5 btfss acount2,4
goto red_leds
goto autoe
auto6 btfss acount2,5
goto red_leds
goto autoe
auto7 btfss acount2,6
goto red_leds
autoe call led_change
call led_set
movlw 00h ;LED auto count clear
movwf acount1
movwf acount2
;-----------------------
red_leds
|
1)オートモードでないときはLEDの処理へ飛びます。
2)オート時間カウント1RAM(acount1)をインクリメントします。桁が繰り上がるときはオート時間カウント2RAM(acount2)をインクリメントします。
3)オート時間切り換えRAM(auto_sub)の内容に応じてオート時間カウント2RAM(acount2)の内容を調べて、カウントアップしていればLEDの色変更処理を行います。
4)オート時間を変更したときはオート時間カウントRAMをクリアします。 |
以上で各部分の説明は終了です。次回は全てのソースを公開します。お楽しみに。 |
この続きは(4ページ)へ |
|
不明点などあればメールお願いいたします。nonchansoft@nifty.com |
|
|