;shutter1.asm
 
LIST P=12C509
INCLUDE <P12C509.INC>
 
;変数のレジスタへの割り当て設定
WAIT1 EQU 07H ;07H 〜 1FH とバンク切り替えにより 30H 〜 3FHが
;汎用レジスタとして使える (25 + 16) @12C509
RESET
GOTO START ;ラベル START へジャンプ
ORG 04H
START
MOVLW 09FH ;1001 1111 を W レジスタにロード
OPTION ;W レジスタの内容を OPTION レジスタに転送
;bit 7: ウェイクアップ(GP0,GP1,GP3) = Disable
;bit 6: 弱プルアップ(GP0,GP1,GP3) = Enable
;bit 5: タイマ 0 クロックソース選択ビット = 内部
;bit 4: タイマ 0 ソースエッジ選択ビット = High から Low
;bit 3: プリスケーラ割り当てビット = WDT へ割り当て
;bit 2-0: プリスケーラ・レート選択ビット
;以上マニュアル記載 今のところよくわからない
;設定しないと 1111 1111 に初期設定されている
MOVLW 08H ;0000 1000 を W レジスタにロード
TRIS GPIO ;TRIS レジスタに書き込んで GP3 つまり
4 PIN を入力に設定
SETUP
MOVLW 00H ;0000 0000 を W レジスターにロード
MOVWF GPIO ;GPIO レジスタをクリア
 
;100μsec 以上の Low があるかチェック (最初のパルスはここで取り込みを拒否)
LOOP1
BTFSC GPIO, 3 ;GP3 が 0 なら次をスキップ
GOTO LOOP1 ;GP3 が 1 なら LOOP1 へ
CALL W100U ;サブルーチンコール
BTFSC GPIO, 3 GP3 が 0 なら次をスキップ
GOTO LOOP1 ;1 なら LOOP1 へ
 
;パルスの立ち上がり待ち (次の立ち上がりまでここで待機)
CHECK1
BTFSS GPIO, 3 ;GP3 が 1 なら次をスキップ
GOTO CHECK1 ;GP3 が 0 なら CHECK1 へ
 
;800μsec 待つ (パルスが立ち上がったら 800μsec カウント)
CALL W100U ;サブルーチンコール
CALL W100U
CALL W100U
CALL W100U
CALL W100U
CALL W100U
CALL W100U
CALL W100U
 
;High を確認 (立ち上がりパルスがまだあるかチェックしてなければ戻る)
BTFSS GPIO, 3 ;GP3 が 1 なら次をスキップ
GOTO CHECK1 ;GP3 が 0 なら CHECK1 へ
 
;1100μsec 待つ
CALL W100U ;サブルーチンコール
CALL W100U
CALL W100U
CALL W100U
CALL W100U
CALL W100U
CALL W100U
CALL W100U
CALL W100U
CALL W100U
CALL W100U
 
;1900μsec なら OUT1900 へ
BTFSS GPIO, 3 ;GP3 が 1 なら次をスキップ
GOTO LOOP1 ;GP3 が 0 なら LOOP1 へ
 
;出力
OUT1900
MOVLW 04H ;000 0100 を W レジスタにロード
MOVWF GPIO ;GP4 を High に
GOTO LOOP1
 
;100μsec のウエイトルーチン
W100U
MOVLW 17H ;17H(23) を W レジスタにロード
MOVWF WAIT1 ;W レジスタの内容を WAIT1 レジスタに格納
W1 NOP
DECFSZ WAIT1, F ;WAIT1 - 1 を WAIT1 に、WAIT1 = 0 なら次をスキップ
GOTO W1 ;WAIT1 が 1 なら W1 へ
NOP
NOP
NOP
RETLW 00H ;W レジスタに 00H をセットしてリターン
END