;------------------------------------------------------------------------------ ; Copyright 2005 Koichi Tanaka ; 4チャンネルデコーダー (PIC12C509A) ; irxs400.asm ; GP0: CH1出力(正極性) ; GP1: CH2出力(正極性) ; GP2: CH3出力(正極性) ; GP3: 入力(負極性) ; GP4: CH4出力(正極性) ;------------------------------------------------------------------------------ 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(CH1)にHighを出力 CALL WAIT ;1つが100μsec待ち CALL WAIT CALL WAIT CALL WAIT CALL WAIT ;合計500μsec経過したときにはすでに入力はHigh CALL WAIT CALL WAIT CALL WAIT ;合計800μsec待ち ;-------------------- ; チャンネル2の出力 ;-------------------- LP4 BTFSC GPIO, 3 ;入力がLowになったらスキップ GOTO LP4 ;入力がHighの間ここでループ BCF GPIO, 0 ;GP3を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 ;-------------------- ; チャンネル4の出力 ;-------------------- LP6 BTFSC GPIO, 3 ;入力がLowになったらスキップ GOTO LP6 ;入力がHighの間ここでループ BCF GPIO, 2 ;GP2をLowに BSF GPIO, 4 ;GP4をHighに CALL WAIT CALL WAIT CALL WAIT CALL WAIT CALL WAIT CALL WAIT CALL WAIT CALL WAIT LP7 BTFSC GPIO, 3 ;入力がLowになったらスキップ GOTO LP7 ;入力がHighの間ここでループ BCF GPIO, 4 ;GP4をLowに GOTO LP1 ;-------------------------- ; 100μs WAIT サブルーチン ;-------------------------- WAIT MOVLW 17H MOVWF WAITCNT WP1 NOP DECFSZ WAITCNT, F GOTO WP1 GOTO $+1 NOP RETLW 0 END