;************************************************** ;*** ハザード点灯  '01.02.18 *** ;*** Odyssey *** ;************************************************** include f:\PICPROG\MPASM\p12c509.inc ;----- FUSES -------------------; ; Internal RC(4MHz) ; ; Reset Enabled ; ; WDT Enabled ; ; ;----- RAM ---------------------; wait equ 07 ;遅延用RAM1 kaisuu equ 08 ;ロック動作回数 loop_h equ 09 ;loop用RAM loop_l equ 0a ;max 16bit kakutei equ 0b ;動作確定用 tenmetu equ 0c ;点滅回数用 ; ;----- I/O ---------------------; lock equ 00 ;ロック信号入力(ウェイクアップ)) un_lock equ 01 ;アンロック信号(ウェイクアップ) spare_1 equ 02 ;空きピン(入力) _mclr equ 03 ;リセット入力 acc equ 04 ;アクセサリー信号入力 haz equ 05 ;リレー出力 ; ;************************************************************************ ;******************************** ; 初期設定 * ;******************************** ; movlw b'01001111' ;変化によるウエークアップ(0,1,3) option ;WDT 1:128 ; movlw b'00011111' ;1=in 0=out tris gpio ; clrf gpio ;出力クリア ; btfsc gpio,acc ;accをチェック sleep ;Hならsleep ; ;************************************************************************* ; ロック信号確認 in_sig clrf gpio ;出力クリア ; btfsc gpio,lock ; goto a_lock ;ロック信号あればjp ; btfsc gpio,un_lock ; goto a_un_l ;アンロック信号あればjp ; sleep ;信号なければsleep ;************************************************************************* a_lock ; movlw h'01' ;タイムオーバー500mSをセット movwf loop_h ; movlw h'f4' ; movwf loop_l ; ; a_l0 movlw d'50' ;信号確定用に50mSをセット movwf kakutei ; ; call t_over ;タイムオーバー確認 ; a_l1 call wait_1m ;1mSec Wait btfss gpio,lock ; goto a_l0 ;ロック信号Lならjp ;-------------------------------; decfsz kakutei,f ;ロック信号Hなら-1 goto a_l1 ;再確認へ戻る ;===============================; movlw d'3' ;回数 movwf tenmetu ; ; on_sy1 bsf gpio,haz ; ; movlw d'200' ;200*2mSec=400mSec movwf kakutei ;リレーON ; out1_h call wait_1m ;1mSec Wait call wait_1m ; btfsc gpio,un_lock ;アンロック信号あれば goto in_sig ;in_sigに戻る ; decfsz kakutei,f ;ロック信号Hなら-1 goto out1_h ; ;-------------------------------; bcf gpio,haz ;リレーoff ; movlw d'150' ;150*2mSec=300mSec movwf kakutei ; ; out1_l call wait_1m ; call wait_1m ; btfsc gpio,un_lock ; goto in_sig ; ; decfsz kakutei,f ; goto out1_l ; ; decfsz tenmetu,f ; goto on_sy1 ; ;-------------------------------; clrf gpio ;リレーをOFF sleep ;スリープ ; ;************************************************************************ a_un_l ; movlw h'01' ;タイムオーバー500mSをセット movwf loop_h ; movlw h'f4' ; movwf loop_l ; ; a_un0 movlw d'50' ;信号確定用に50mSecをセット movwf kakutei ; ; call t_over ;タイムオーバー確認 ; a_un1 call wait_1m ;1mSec Wait btfss gpio,un_lock ; goto a_un0 ;アンロック信号Lならjp ;-------------------------------; decfsz kakutei,f ;アンロック信号Hなら-1 goto a_un1 ;再確認へ戻る ;-------------------------------; movlw d'1' ;回数 movwf tenmetu ; ; on_sy2 bsf gpio,haz ;リレーON ; movlw d'200' ;200*2mSec=400mSec movwf kakutei ;リレーON ; out2_h call wait_1m ;1mSec Wait call wait_1m ; btfsc gpio,lock ;ロック信号あれば goto in_sig ;in_sigに戻る ; decfsz kakutei,f ;-1 goto out2_h ; ;-------------------------------; bcf gpio,haz ;リレーoff ; movlw d'150' ;150*2mSec=300mSec movwf kakutei ; ; out2_l call wait_1m ; call wait_1m ; btfsc gpio,lock ; goto in_sig ; ; decfsz kakutei,f ; goto out2_l ; ; decfsz tenmetu,f ; goto on_sy2 ; ;-------------------------------; clrf gpio ;リレーをOFF sleep ;スリープ ; ;************************************************************************* ;**************************************************************** ;[タイムオーバーチェック] ; * t_over ; * clrwdt ;WDTクリア * movf loop_l,w ;loop_lがゼロかチェック * btfsc status,z ; * decf loop_h,f ;loop_lがゼロならloop_hを-1 * decf loop_l,f ;loop_lを-1 * ; * movf loop_l,w ; * iorwf loop_h,w ;loop_hとloop_lをor * btfss status,z ;タイムオーバーかチェック * return ;違えば戻る * ; * ;----タイムオーバー処理---------; * clrf gpio ;リレーをOFF * sleep ;スリープ * ;**************************************************************** ;******************************************************** ;[遅延ルーチン 約1mSec] ; * wait_1m ; * movlw d'249' ; 1 * movwf wait ; 1 * clrwdt ; 1 * ; * wa1 nop ; 1*249 * decfsz wait,f ; 1*(249-1)+2 * goto wa1 ; 2*(249-1) * ; * return ; 2 * ;******************************************************** end