●モーションセンサとPIC16F84で暗くなると点灯するライトを作成する

光センサが手元に無かったため、100均の電卓の太陽電池を光センサの代わりに使用しています。
もしフォトレジスタが手に入るなら1MΩの場所と入れ替えて、太陽電池を適当な可変抵抗に取り換えれば良いと思います。
モーションセンサはパナソニックのNaPiOnを取り付けました。
動作電圧は3Vから5Vです。
出力にはMOSFETをかましてあり、模型用モーターや懐中電灯などのスイッチ替わりに使用できます。
暗くなって、モーションセンサが人体を検出するとライトが約30秒ほど点灯します。








PIC16F84に書き込んだプログラム

	LIST      P=16F84
	#include 

	__CONFIG _CP_OFF & _LP_OSC & _PWRTE_ON & _WDT_ON

;コンフィグレーションビットの設定
;_LP_OSC		低電力振動子(一般的に200kHz以下)
;_XT_OSC		低周波数振動子(4MHzまで)
;_HS_OSC		高周波数振動子(4-20MHzまで)
;_RC_OSC		抵抗とコンデンサによる発振

;_WDT_ON		ウォッチドッグタイマを有効にする
;_WDT_OFF		ウォッチドッグタイマを無効にする

;_PWRTE_ON		電源投入直後のリセット期間を有効にする
;_PWRTE_OFF		電源投入直後のリセット期間を無効にする

;_CP_ON			プログラムの読み取りを可能にする
;_CP_OFF		プログラムの読み取りを不可能にする

;---------------------------------------------------------------
;アドレスに名前を付ける
;---------------------------------------------------------------


;割り込み時にレジスタを退避させるメモリ
w_temp		equ	0x0C
status_temp	equ	0x0D

pos1			equ	0x0E
pos2			equ	0x0F
;ウェイト用メモリ
wait_val1		equ	0x10
wait_val2		equ	0x11

;PIC16F84では0x0Cから0x4Fまでが使用可能
;***************************************************************
;リセットベクタ
;***************************************************************
		org	0
		goto	start
;***************************************************************
;割り込みベクタ
;***************************************************************
;割り込みの設定
;  INTCONレジスタ
;     0bit   RBIF   RB4〜RB7の状態変化割込みフラグ
;     1bit   INTF   RB0/INTの割込みフラグ
;     2bit   T0IF   TMR0タイマ割込みフラグ
;     3bit   RBIE   RB4〜RB7の割込み許可ビット
;     4bit   INTE   RB0/INTの割込み許可ビット
;     5bit   T0IE   TMR0タイマの割込み許可ビット
;     6bit   EEIE   データEEPROM書き込み完了割込み許可
;     7bit   GIE    全体割込み許可ビット
;***************************************************************
		org	4

		;レジスタの退避
		movwf	w_temp
		movf	STATUS,w
		clrf	STATUS
		movwf	status_temp
		
		;各割り込みに対して適切なアドレスにジャンプさせる
		btfsc	INTCON,RBIF
		goto	int0
		btfsc	INTCON,INTF
		goto	int1
		btfsc	INTCON,T0IF
		goto	int2
intret
		bcf	INTCON,RBIF		;RB4~RB7割り込みフラグリセット
		bcf	INTCON,INTF		;RB0/INT割り込みフラグリセット
		bcf	INTCON,T0IF		;タイマー割り込みフラグリセット
		;レジスタの復帰
		clrf	STATUS
		movf	status_temp,w
		movwf	STATUS
		swapf	w_temp,f
		swapf	w_temp,w
		retfie			;割り込みから復帰

;---------------------------------------------------------------
;RB4〜RB7割り込みにより実行
;---------------------------------------------------------------
int0					;RB4~RB7割り込み

		;割り込み時の処理をここに記述
		;ライト点灯タイマーをリセット
;		MOVLW	0x01
;		MOVWF	pos1
		goto	intret
;---------------------------------------------------------------
;RB0/INT割り込みにより実行
;---------------------------------------------------------------
int1					;RB0/INT割り込み

		;割り込み時の処理をここに記述
		;ライト点灯タイマーをリセット
		MOVLW	0x1E	;30秒ライト点灯
		MOVWF	pos1
		goto	intret
;---------------------------------------------------------------
;タイマー割り込みにより実行
;---------------------------------------------------------------
int2		;タイマー割り込み
		;タイマーにはクロックが1/4周期で供給されるため、
		;10MHzクロックでは 1/2500000secとなる
		;1/19200 sec(52 usec)毎にタイマー割り込みを入れるために
		;減算タイマー値に256-130=0x7Eを設定
		;しかし、割り込みから、ここまでに0x0Eほどかかるため加算する
		movlw	0x7E+0x0E		;タイマー値リセット
		movwf	TMR0

		;割り込み時の処理をここに記述
		goto	intret		;ジャンプ
;***************************************************************
;スタート
;***************************************************************
start
;---------------------------------------------------------------
;ポートの設定
;---------------------------------------------------------------
		clrf	PORTA
		clrf	PORTB
		bsf	STATUS,5		;ページを1に切り替え
		movlw	b'00000000
		movwf	TRISA		;portAをbit 00000000 を入力に設定
		movlw	b'00010001
		movwf	TRISB		;portBを11101110 を出力に設定
		bcf	STATUS,5		;ページを0に切り替え
;---------------------------------------------------------------
;***************************************************************
;割り込みの設定
;  INTCONレジスタ
;     0bit   RBIF   RB4〜RB7の状態変化割込みフラグ
;     1bit   INTF   RB0/INTの割込みフラグ
;     2bit   T0IF   TMR0タイマ割込みフラグ
;     3bit   RBIE   RB4〜RB7の割込み許可ビット
;     4bit   INTE   RB0/INTの割込み許可ビット
;     5bit   T0IE   TMR0タイマの割込み許可ビット
;     6bit   EEIE   データEEPROM書き込み完了割込み許可
;     7bit   GIE    全体割込み許可ビット
;***************************************************************
		clrf	INTCON
;---------------------------------------------------------------
;RB0/INT割り込みの設定
;---------------------------------------------------------------
		bsf	STATUS,5		;ページを1に切り替え
		bcf	OPTION_REG,6	;RB0のエッジ設定は立ち上がり
		bcf	STATUS,5		;ページを0に切り替え
		bsf	INTCON,INTE		;RB0/INT割り込み発生許可
;---------------------------------------------------------------
;RB4〜RB7割り込みの設定
;---------------------------------------------------------------
;		bsf	INTCON,RBIE		;RB4〜RB7割り込み
;---------------------------------------------------------------
;タイマー割り込みの設定
;---------------------------------------------------------------
;		movlw	0x00		;タイマー値リセット
;		movwf	TMR0
;		bsf	STATUS,5		;ページを1に切り替え
;		bsf	OPTION_REG,0	;PS0	プリスケーラの設定
;		bsf	OPTION_REG,1	;PS1	
;		bsf	OPTION_REG,2	;PS2	
;		bsf	OPTION_REG,3	;PSA	プリスケーラをTMRで使用する場合は0,WDTで使用する場合は1
;		bcf	OPTION_REG,5	;T0CS	タイマ0の入力先 1でRA4ピン入力,0でクロック1/4入力
;		bcf	STATUS,5		;ページを0に切り替え
;		bsf	INTCON,T0IE		;タイマ割り込み発生許可
;---------------------------------------------------------------
;割り込みの開始
;---------------------------------------------------------------
;		bsf	INTCON,GIE		;割り込み許可
;***************************************************************
;メイン
;***************************************************************
init

main
		MOVLW	b'00000000
		MOVWF	PORTA		;WレジスタからFレジスタに代入

		bcf	INTCON,GIE	;割り込み発生停止

		SLEEP			;INT端子(ポートB)に信号が来るまでPICマイコンがここで停止します
		NOP

		;STATUS TO 4bit目 システム内部の起動タイマーの状態を表す
		;1:電源投入後、CLRWDT命令、SLEEP命令実行後
		;0:ウォッチドッグタイマがタイムアップした時

		BTFSS	STATUS,4	;TOが0ならウオッチドックタイマで起こされた
		goto	main		;もう一度眠る

		BTFSC	PORTB,RB4	;周辺が明るい
		goto	main		;もう一度眠る

		bsf	INTCON,GIE	;割り込み発生許可




;*********************************************
;ライト点灯
		MOVLW	b'00011110
		MOVWF	PORTA		;WレジスタからFレジスタに代入

		MOVLW	0x1E		;30秒ライト点灯
		MOVWF	pos1
test

		CLRWDT			;ウォッチドックタイマとプリスケーラをクリア
		call wait_loop
		decfsz	pos1,F
		goto	test


		goto	main

;---------------------------------------------------------------
;ウエイト
;---------------------------------------------------------------
wait_loop
		MOVLW	0x00
		MOVWF	wait_val1
wait_loop1
		MOVLW	0x09
		MOVWF	wait_val2
wait_loop2	
		decfsz	wait_val2,F
		goto	wait_loop2
		decfsz	wait_val1,F
		goto	wait_loop1

		return




		END


▲トップページ > マイコンなど