;************************************************** ;*** トランクオープナー '00.8.21 *** ;************************************************** 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 ;動作確定用 ; ;----- I/O ---------------------; spare_0 equ 00 ;空きピン(入力) lock equ 01 ;ロック信号入力(ウェイクアップ) spare_2 equ 02 ;空きピン(入力) _mclr equ 03 ;リセット入力 acc equ 04 ;アクセサリー信号入力 relay equ 05 ;リレー出力 ; ;************************************************************************ ;******************************** ; 初期設定 * ;******************************** ; movlw b'01001111' ;変化によるウエークアップ(0,1,3) option ;WDT 1:128 ; movlw b'00011111' ;1=in 0=out tris gpio ; clrf gpio ; ; btfss gpio,lock ;lockをチェック sleep ;lockがLならsleep ; ;******************************** ; loop回数設定 * ;******************************** movlw d'03' ;3回をセット movwf kaisuu ; ; ;************************************************************************* ;ロック信号が50mSec連続してHか判定 ********************************** ;************************************************************************* ; ** start btfsc gpio,acc ;アクセサリーがONならsleep ** sleep ; ** ; ** movlw h'07' ;タイムオーバー値=2000mSecをセット ** movwf loop_h ; ** movlw h'd0' ; ** movwf loop_l ; ** ; ** ; ** lh_0 movlw d'50' ;動作確定用に50mSecをセット ** movwf kakutei ; ** ; ** lh_1 call t_over ;タイムオーバーならsleep ** ; ** lh_2 call wait_1m ;1mSec wait ** btfss gpio,lock ;lock信号をチェック ** goto lh_0 ;Lならlh_0へ戻る ** ; ** ;-------------------------------; ** ; lockがHの時の処理 ; ** decfsz kakutei,f ;kakuteiを-1 ** goto lh_2 ;動作確定まだならlh_2へ戻る ** ; ** ;************************************************************************* ;ロック信号が50mSec連続してLか判定 ********************************** ;************************************************************************* ; ** movlw h'03' ;タイムオーバー値=1000mSecをセット ** movwf loop_h ; ** movlw h'e8' ; ** movwf loop_l ; ** ; ** ll_0 movlw d'50' ;動作確定用に50mSecをセット ** movwf kakutei ; ** ; ** ll_1 call t_over ;タイムオーバーならsleep ** ; ** ll_2 call wait_1m ;1mSec wait ** btfsc gpio,lock ;lock信号をチェック ** goto ll_0 ;Hならll_0へjp ** ; ** ;-------------------------------; ** ; lockがLの時の処理 ; ** decfsz kakutei,f ;kakuteiを-1 ** goto ll_2 ;動作確定まだならll_2へ戻る ** ; ** ;************************************************************************* ;ロック動作3回終了かチェック ****************************************** ;************************************************************************* ; ** decfsz kaisuu,f ;kaisuuを-1 ** goto start ;まだならstartへ戻る ** ; ** ;************************************************************************* ;リレー出力処理 ****************************************** ;************************************************************************* ; ** btfsc gpio,acc ;ACCをチェック ** sleep ;ACCがONならsleep ** ; ** bsf gpio,relay ;リレーをON ** ; ** movlw h'01' ;500mSecをセット ** movwf loop_h ; ** movlw h'f4' ; ** movwf loop_l ; ** ; ** rel call wait_1m ;1mSec wait ** call t_over ;タイムオーバーならリレーoff後sleep ** goto rel ; ** ;************************************************************************* ;************************************************************************* ;**************************************************************** ;[タイムオーバーチェック] ; * 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 * nop ; 1 * ; * wa1 nop ; 1*249 * decfsz wait,f ; 1*(249-1)+2 * goto wa1 ; 2*(249-1) * ; * return ; 2 * ;******************************************************** end