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