●モーションセンサとPIC16F84で暗くなると点灯するライトを作成する
光センサが手元に無かったため、100均の電卓の太陽電池を光センサの代わりに使用しています。
もし CdSセル(フォトレジスタ)が手に入るなら太陽電池の場所と入れ替えて、1MΩの抵抗を10KΩ程度の抵抗もしくは20KΩ程度の可変抵抗に取り換えれば良いと思います。
モーションセンサはパナソニックのNaPiOnと、もう一台はパナソニックのPaPIRsを取り付けました。
他の人体感応赤外線センサー(焦電センサ)でも動作します。
動作電圧は3Vから5Vです。
出力にはMOSFETをかましてあり、模型用モーターや懐中電灯などのスイッチ替わりに使用できます。
暗くなって、モーションセンサが人体を検出するとライトが約20秒ほど点灯します。
点灯時間を調整するには、約23行目の赤文字部分を変更してください。
PIC16F84に書き込んだプログラム
LIST P=16F84
#include <p16F84.inc>
__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 プログラムの読み取りを不可能にする
;ライト点灯時間(10を設定すると約20秒)
#DEFINE ON_TIME 10
;---------------------------------------------------------------
;アドレスに名前を付ける
;---------------------------------------------------------------
;割り込み時にレジスタを退避させるメモリ
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割り込み
;割り込み時の処理をここに記述
goto intret
;---------------------------------------------------------------
;RB0/INT割り込みにより実行
;---------------------------------------------------------------
int1 ;RB0/INT割り込み
;割り込み時の処理をここに記述
;ライト点灯タイマーをリセット
MOVLW ON_TIME
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を1:入力、0:出力 全てを出力に設定
movlw b'00010001
movwf TRISB ;portBを1:入力、0:出力 RB0とRB4を入力に設定
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
;起動時に2回ライトを点滅させる
MOVLW b'00011110
MOVWF PORTA ;WレジスタからFレジスタに代入
call short_wait_loop
MOVLW b'00000000
MOVWF PORTA ;WレジスタからFレジスタに代入
call short_wait_loop
MOVLW b'00011110
MOVWF PORTA ;WレジスタからFレジスタに代入
call short_wait_loop
MOVLW b'00000000
MOVWF PORTA ;WレジスタからFレジスタに代入
call wait_loop ;消灯時のノイズでセンサーが反応しても無視するループ
call wait_loop
main
bcf INTCON,GIE ;割り込み発生停止
CLRWDT ;ウオッチドックタイマで起こされた後にそのままSLEEPするとWDTで再起動するため
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 ON_TIME ;ライト点灯時間をセット
MOVWF pos1
test
call wait_loop
decfsz pos1,F
goto test
;ライト消灯
MOVLW b'00000000
MOVWF PORTA ;WレジスタからFレジスタに代入
call wait_loop ;消灯時のノイズでセンサーが反応しても無視するループ
call wait_loop
goto main
;---------------------------------------------------------------
;ウエイト
;---------------------------------------------------------------
wait_loop
MOVLW 0x00
MOVWF wait_val1
wait_loop1
CLRWDT ;ウォッチドックタイマとプリスケーラをクリア
MOVLW 0x09
MOVWF wait_val2
wait_loop2
CLRWDT ;ウォッチドックタイマとプリスケーラをクリア
decfsz wait_val2,F
goto wait_loop2
decfsz wait_val1,F
goto wait_loop1
return
;---------------------------------------------------------------
;短いウエイト
;---------------------------------------------------------------
short_wait_loop
MOVLW 0x00
MOVWF wait_val1
short_wait_loop1
CLRWDT ;ウォッチドックタイマとプリスケーラをクリア
decfsz wait_val1,F
goto short_wait_loop1
return
END
2022年6月23日 WDTリセット位置と消灯時のノイズに対する修正
▲トップページ
>
マイコンなど