;------------------------------------------------------------------------------ ; Copyright 2005 Koichi Tanaka ; 3チャンネルデコーダー (PIC12C509A) ; irxs300.asm ; GP0: ch1出力(正極性) ; GP1: ch2出力(正極性) ; GP2: ch3出力(正極性) ; GP3: 入力(負極性) ;------------------------------------------------------------------------------ LIST P=PIC12C509A INCLUDE "P12C509A.INC" ;------------------------------------ ; コンフィギュレーションビットの設定 ;------------------------------------ __CONFIG _MCLRE_OFF & _CP_OFF & _WDT_OFF & _IntRC_OSC COUNT EQU 07H ;12C509Aでは07H番地から64バイトがユーザーエリア WAITCNT EQU 08H ORG 0 MOVWF OSCCAL ;発振周波数校正値をOSCCALレジスタにセット MOVLW B'10011111' OPTION MOVLW B'00001000' TRIS GPIO ;GP3を入力に設定 CLRF GPIO ;-------------- ; ギャップ検出 ;-------------- LP1 MOVLW D'25' ;2.5ms以上のギャップを検出するための25を MOVWF COUNT ;COUNTにセット LP2 BTFSS GPIO, 3 ;入力がHighならスキップしてギャップかチェック GOTO LP1 ;入力がLowの間ここでループ CALL WAIT ;100μs待ち DECF COUNT, F ;COUNTをデクリメント BTFSC STATUS, Z ;ギャップでなければスキップ GOTO LP3 ;ギャップなら検出完了でLP3へ BTFSC GPIO, 3 ;入力がLowならスキップして GOTO LP2 GOTO LP1 ;ギャップを検出するためにLP1へ ;-------------------- ; チャンネル1の出力 ;-------------------- LP3 BTFSC GPIO, 3 ;入力がLowになったらスキップ GOTO LP3 ;入力がHighの間ここでループ BSF GPIO, 0 ;GP0をHighに CALL WAIT ;100μs待ち CALL WAIT ;200μs待ち CALL WAIT ;300μs待ち CALL WAIT ;400μs待ち CALL WAIT ;500μs待ち(このあたりで入力がHighになっている) CALL WAIT ;600μs待ち CALL WAIT ;700μs待ち CALL WAIT ;800μs待ち ;-------------------- ; チャンネル2の出力 ;-------------------- LP4 BTFSC GPIO, 3 ;入力がLowになったらスキップ GOTO LP4 ;入力がHighの間ここでループ BCF GPIO, 0 ;GP0をLowに BSF GPIO, 1 ;GP1をHighに CALL WAIT CALL WAIT CALL WAIT CALL WAIT CALL WAIT CALL WAIT CALL WAIT CALL WAIT ;-------------------- ; チャンネル3の出力 ;-------------------- LP5 BTFSC GPIO, 3 ;入力がLowになったらスキップ GOTO LP5 ;入力がHighの間ここでループ BCF GPIO, 1 ;GP1をLowに BSF GPIO, 2 ;GP2をHighに CALL WAIT CALL WAIT CALL WAIT CALL WAIT CALL WAIT CALL WAIT CALL WAIT CALL WAIT LP6 BTFSC GPIO, 3 ;入力がLowになったらスキップ GOTO LP6 ;入力がHighの間ここでループ BCF GPIO, 2 ;GP2をLowに GOTO LP1 ;-------------------------- ; 100μs WAIT サブルーチン ;-------------------------- WAIT MOVLW 17H MOVWF WAITCNT WP1 NOP DECFSZ WAITCNT, F GOTO WP1 GOTO $+1 NOP RETLW 0 END