;玄関補助LED灯 Ver 1.22			NAO TECHUNOHUT	2008-12-07(日)
;
;[プログラム概要]
; ･通常スリープ状態として､MPモーションセンサー感知で目覚めさせる｡
;　　その後cdsセンサーを動作させ､暗いと判断した場合にLEDを点灯させる｡
;
; ･タイマー0を使用する｡(オーバーフローフラッグは10FXXXの仕様に無い)
;　　1/4000000x1024x256=0.065536秒 (256はプリスケーラ値)
;　　最長設定で約0.065秒になる｡x195/256で約0.05秒｡
;
; ･ウォッチドックタイマーは面倒なので使用しない｡
;
;[PIC選定その他仕様]
; ･PIC10F200-I/OT使用｡(秋月電子通商で600円/10個)
; ･動作速度は内蔵4MHz固定｡
; ･MCLRは内部接続モードとする｡
;			     ┌──┐
;	LEDスイッチ	 GP0 ┥･PIC┝ GP3	MPモーションセンサー入力
;			 Vss ┥ 10F┝ Vdd
;	cds入力		 GP1 ┥ 200┝ GP2	cds電源
;			     └──┘
;
;メモリーは10hから
;Bank1以降はPIC10FXXXの仕様に無い
;
;-------PIC初期状態確認-----------------;(△:変更必要)
;Bank0
;	tmr0		xxxxxxxx	;(xは不定)
;	status		00-1xxxx	;
;	osccal		11111110	;内蔵RCオシレーター微調整
;	gpio		----xxxx	;
;	trisgpio	----1111	;
;	option		11111111	;
;
;[凡例] (自分で分かりやすいように目印を付ける)
; mXXX:メモリー  rXXX:ラベル  sXXX:サブルーチン  vXXX:変数  ★:調整箇所など
;
;-------PICコンフィギュレーション設定---;(CVASM16アセンブラ用記述)

	include	'10f200.inc'

	fuses _intrc_osc		;内蔵オシレーターを使う(仕様は4MHzのみ)
	fuses _wdt_off			;ウォッチドックタイマー→無効
	fuses _mclre_off		;MCLR端子(リセット)→設定しない
	fuses _cp_off			;コードプロテクト→無効

;	id	'0122'			;10FXXXでは設定機能無し?!

;-------プログラムメモリー割当----------;

mTMR_C		=	10h		;

;=======プログラム初期設定==============;

	clr	gpio			;
	mov	!gpio,#    1010b	;入出力ピン設定
	mov	!option,#01000111b	;目覚め有効､プルアップ無効､1:256､設定
	mov	osccal,#00101100b	;内蔵RCオシレーター微調整
	clr	mTMR_C			;

	jnb	not_pd,rWAKEUP		;電源投入orスリープ後？判定

;電源投入動作チェック
	setb	gpio.0			;LED点灯
	call	s01WAIT			;約0.1秒待つ
	clrb	gpio.0			;LED消灯

	call	s10WAIT			;約10秒待つ

	setb	gpio.0			;LED点灯
	call	s01WAIT			;約0.1秒待つ
	clrb	gpio.0			;LED消灯

;↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ;
;***[ メインループ ]********************;

rREPEAT
	sleep				;

;目覚め後動作
rWAKEUP
	setb	gpio.2			;cdsへ電源供給
	call	s01WAIT			;約0.1秒待つ
	jb	gpio.1,rLED_ON		;暗かった場合はLED点灯

;明るかった場合
	clrb	gpio.2			;cds電源カット
	call	s10WAIT			;
	call	s10WAIT			;
	call	s10WAIT			;
	call	s10WAIT			;
	call	s10WAIT			;
	call	s10WAIT			;約60秒待つ
	jmp	rREPEAT			;

rLED_ON
	clrb	gpio.2			;cds電源カット
	setb	gpio.0			;LED点灯

;MPセンサー再チェック
	call	s10WAIT			;約10秒待つ

	jnb	gpio.3,rLED_OF		;反応無ければ消灯へ
	call	s3WAIT			;約3秒待つ
	jnb	gpio.3,rLED_OF		;反応無ければ消灯へ
	call	s3WAIT			;約3秒待つ

rLED_OF
	clrb	gpio.0			;LED消灯
	call	s10WAIT			;約10秒待つ
	jmp	rREPEAT			;

;***[ メインループここまで ]************;
;↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ ;





;sss[ サブルーチン ]ssssssssssssssssssss;

;約0.1秒待ち
s01WAIT
	clr	tmr0			;
	cjne	tmr0,#195,$		;約0.05秒経過するまでここで待つ
	inc	mTMR_C			;
	cjne	mTMR_C,#2,s01WAIT	;0.05x2=0.1
	clr	mTMR_C			;
	ret

;約0.5秒待ち
s05WAIT
	clr	tmr0			;
	cjne	tmr0,#195,$		;約0.05秒経過するまでここで待つ
	inc	mTMR_C			;
	cjne	mTMR_C,#10,s05WAIT	;0.05x10=0.5
	clr	mTMR_C			;
	ret

;約3秒待ち
s3WAIT
	clr	tmr0			;
	cjne	tmr0,#195,$		;約0.05秒経過するまでここで待つ
	inc	mTMR_C			;
	cjne	mTMR_C,#60,s3WAIT	;0.05x60=3
	clr	mTMR_C			;
	ret

;約10秒待ち
s10WAIT
	clr	tmr0			;
	cjne	tmr0,#195,$		;約0.05秒経過するまでここで待つ
	inc	mTMR_C			;
	cjne	mTMR_C,#200,s10WAIT	;0.05x200=10
	clr	mTMR_C			;
	ret
