PIC16F84電子遊戯(34)
最終更新日:2001年7月28日
携帯着信ランプ(1ページ)へ (2ページ)へ (3ページ) (4ページ)へ

携帯着信ランプのミラクルライト部のケースへの取り付け
さてミラクルライト部が完成したら、ケース本体に取り付けます。
私はケースからマイクスタンドのように取り付けてみました。
ミラクルライトの軸は銅線が入っているので、フレキシブルに曲げることが可能ですので、その自由な曲げに対応出来るように、ケースにはしっかり取り付けましょう。
いかがでしょうか。結構しっかりと取り付けることができました。
要所は2液の透明エポキシ接着剤で補強しておきましょう。
ライト部はLEDの光が漏れないようにアクリル系塗料で黒く塗っておくと完成した後、LED表示が綺麗に見えます。
携帯着信ランプの完成の姿
まずは完成した姿を見て下さい。コンパクトなケースにまとめてみました。
皆さんも自由な発想で組み込んで下さい。レモンスカッシュのオブジェがカワイイですね。
LEDの電流制限用の抵抗は後で調整しやすいように、ミラクルライト部の根元の部分に配置しました。
携帯着信ランプの割り込み処理
今回の着信ランプは2種類の割り込みを使用します。
従来から使用しているタイマー割り込みと今回新しくRB4−7の状態変化割り込みを使用します。実際にはRB6,RB7を入力ポートにして割り込み入力にします。
main_sleep
		bcf	INTCON,GIE
		nop
		bcf	INTCON,T0IE
		nop
		bcf	INTCON,T0IF
		nop
		bcf	INTCON,RBIF
		nop
		bsf	INTCON,RBIE
		nop
		call	icnt_clear
		movlw	0c0h
		movwf	PORTB
		nop
		sleep
		nop
		bcf	INTCON,RBIE
		nop
		call	icnt_clear
		bsf	INTCON,GIE
		nop
		bsf	INTCON,T0IE
		nop
main_loop
;-------------------------------------- led tentou		
		movf	led_data,0
		iorlw	0c0h
		movwf	PORTB
;--------------------------------------

		btfss	int_count2,7
		goto	main_loop
		goto	main_sleep
では実際のソースを見ながら説明します。
まず初期設定が終わると上記の main_sleep のところに処理が来ます。
ここで全体の割り込み許可フラグ(GIE)を禁止します。こうすると割り込みが掛かっても割り込みアドレスに飛ばなくなります。
その後にタイマー割り込み(T0IE/T0IF)を禁止します。
次にRB割り込み(RBIF/RBIE)を許可します。
さらにタイマー割り込みカウンタをクリアします。(後で説明します。)
PORTBの設定をLED全て消灯にして、SLEEPモード(低消費電力モード)にして割り込みを待ち続けます。(処理的にはここでストップします。)
割り込みが設定されているのはRB割り込みですので、今回の製作の場合RB6かRB7の入力ポートが変化すればSLEEPから起き上がり、次の命令に進みます。
最初にRB割り込みを禁止して、RBポートの変化に対して割り込みが掛からないようにします。タイマー割り込みカウンタをクリアします。
次にGIE割り込みを許可して割り込みが入ると割り込みアドレスに飛ぶようにします。
さらにタイマー割り込み(T0IE/T0IF)を許可します。
メインループではLEDの点灯処理をします。
タイマー割り込みカウンタが一定値を超えるまでメインループでLEDを点灯させます。
一定値を超えれば再びSLEEPモードに入る処理に飛びます。
いかがですか、ややこしいですが、メインやっていることは簡単です。
後はタイマー割り込み処理内で色々しています。
このタイマー割り込み内の処理も基本は以前の製作の「ミラクルライト」と同じです。
以降は「ミラクルライト」の製作と違っている部分を中心に説明します。
携帯着信ランプのタイマー割り込み処理
タイマー割り込み処理ではLEDの色が順次変化する処理をしています。
(これは「ミラクルライト」の製作記事を見て下さいね。)
ここではもうひとつの処理をしています。
着信センサーの出力でRB7割り込みが掛かりSLEEPモードから起き上がったら一定時間だけLEDを点滅したいものです。今回は約6秒間LEDを点滅します。
この6秒をカウントするのにタイマー割り込みに何回入ったかでカウントします。
int_count2 int_count1
タイマー割り込み時間カウント2 タイマー割り込み時間カウント1
このカウントに上記の2バイトを用意しました。
このカウント値を調べれば時間の経過を知ることが出来ます。
あまり詳細な時間をチェックすると大変なので、各ビットが「1」かどうかを調べることにより時間を判断します。
各ビットが「1」になるカウント値と時間は次のようになります。
ビット数 カウント数 時間
11bit 2048 393msec 0.4秒
12bit 4096 786msec 0.8秒
13bit 8192 1572msec 1.6秒
14bit 16384 3145msec 3.1秒
15bit 32768 6291msec 6.3秒
タイマー割り込み時間カウントの15bit目が「1」になれば約6.3秒の時間が経過したことになります。(チェックビットはint_count2,7になります。)
携帯着信ランプの色仕様
前回の「ミラクルライト」ではLEDの色を変えるのに、かなり強引な処理をしていました。
今回は「マトリックス」で使った retlw 命令を使用してLEDのデータをセットすることにします。
まず、LEDの色の種類を決めるRAMを用意します。
color_count
LEDの色番号
このLED色番号を順次変化させながら retlw 命令でLEDを駆動するデータを読み出しながら色を変化させます。初期値として10hを設定しこれを順にデクリメントすることにより色を変化させます。デクリメント後「0」になれば一巡したとして初期値に戻します。
led_change	decf	color_count,1
		btfsc	STATUS,2
		goto	led_change2
		return
led_change2	movlw	10h
		movwf	color_count
		return
このLED番号を基にLEDにデータをセットするルーチンです。
led_set		call	set_on_red
		movwf	red_on
		call	set_off_red
		movwf	red_off

		call	set_on_green
		movwf	green_on
		call	set_off_green
		movwf	green_off

		call	set_on_blue
		movwf	blue_on
		call	set_off_blue
		movwf	blue_off
		
		return
次はこのLED色番号によるLEDのデータの読み出し部のソースです。
例として赤色LEDの点灯データをセットする場合を示します。
set_on_red	movf	color_count,0
		movwf	taihi
		movlw	low(red_on_table)
		addwf	taihi,1
		movlw	high(red_on_table)
		movwf	PCLATH
		addcf	PCLATH,1
		movf	taihi,0
		movwf	PCL
red_on_table	retlw	70h
		retlw	20h
		retlw	00h
		retlw	20h
		retlw	00h
		retlw	20h
		retlw	00h
		retlw	20h
		retlw	70h
		retlw	70h
		retlw	70h
		retlw	70h
		retlw	00h
		retlw	70h
		retlw	00h
		retlw	00h
		retlw	70h
色の変化の詳細は前回の「ミラクルライト」と同じですが、今一度示しておきます。
color_count
16 赤色 × ×
15 緑色 × ×
14 青色 × ×
13 黄色 ×
12 水色 ×
11 紫色 ×
10 白色
9 橙色 ×
8 桃色 ×
7 黄緑色 ×
6 水緑色 ×
5 青紫色 ×
4 薄青色 ×
3 深黄色 ×
2 深水色 ×
1 深紫色 ×
(◎=全灯、△=半灯、×=消灯)
それぞれのLEDに対して、全灯、半灯、消灯の設定を行います。
モード LED全灯 LED半灯 LED消灯
点灯時間 70h 20h 0h
消灯時間 0h 50h 70h
ということで、今回はこの辺で締めましょう。次回は全ソースリスト大公開です。
これからも益々面白くなる「PIC16F84電子遊戯」をよろしくお願いいたします。

不明点などあればメールお願いいたします。nonchansoft@nifty.com

Copyright(c)2000-2001 nonchansoft