PIC16F84Aで出力が反転してしまう
PIC16F84Aを用いて、矩形波を出そうとしています。
下記のようなプログラムを動かそうとしているのですが、
PORTA,1をONした時、出力がすべて反転してしまいます。
原因はどのような事が考えられますでしょうか?
PORTA,0:矩形波の波長
PORTA,1:入力トリガが立ち上がりか立ち下がりか?
PORTA,2:矩形波を立ち上がりにするか、立ち下がりにするか?
PORTA,3:LED用出力
PORTA,4:手動トリガスイッチ
PORTB,4~7:出力
で行っています。
ラベルL_Hの所で、出力はBCFで0になっているはずですが、
すべて1出力になります。
トリガを入れた時の出力も反転された状態になります。
-----------------------
LIST P=PIC16F84A ; LIST宣言で使用するPICを16F84Aと定義する。
INCLUDE P16F84A.INC ; 設定ファイルp16f84a.incを読み込む。
__CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF ;
;変数の設定(タイマ用カウンタ)*********************
CNT1 EQU 0CH
CNT2 EQU 0DH
CNT3 EQU 0EH
CNT4 EQU 0FH
CNT5 EQU 10H
CNT6 EQU 11H
;リセット**************
ORG 0 ;リセット
;初期設定*************
CLRF PORTB ;PORT-Bをオール0
BSF STATUS,RP0 ;バンク1へ
MOVLW B'00001111' ;00001111
MOVWF TRISB ;PORT Bを0-3を入力、4-7を出力として設定
MOVLW B'10111' ;00010111
MOVWF TRISA ;PORT Aを0-3を入力、4を出力として設定
NOP
BCF PORTB,4 ;PORTB,4~7をオール0
BCF PORTB,5 ;PORTB,4~7をオール0
BCF PORTB,6 ;PORTB,4~7をオール0
BCF PORTB,7 ;PORTB,4~7をオール0
BSF PORTA,3 ;PORTA,3を1
CLRF CNT1
CLRF CNT2
CLRF CNT3
CLRF CNT4
CLRF CNT5
CLRF CNT6
;入力が1か0か?************************
Trig_Direc
NOP
BTFSS PORTA,1 ;入力判定が立ち上がりの時
GOTO Diec_Hight
GOTO Direc_Low
;入力立ち上がり、出力判定*******************
Diec_Hight
BTFSS PORTB,2 ;連続波出力の時
GOTO H_Comti
BTFSS PORTA,2 ;出力判定が立ち上がりの時
GOTO H_H ;入力立ち上がり、出力立ち上がり
GOTO H_L ;入力立ち上がり、出力立ち下がり
;入力立ち下がり、出力判定*****************************************
Direc_Low
BTFSS PORTB,2 ;連続波出力の時
GOTO L_Comti
BTFSS PORTA,2 ;出力判定が立ち上がりの時
GOTO L_H ;入力立ち下がり、出力立ち上がり
GOTO L_L ;入力立ち下がり、出力立ち下がり
;入力立ち上下がり、出力立ち上がり トリガ入力判定と出力************
H_H
BCF PORTB,4 ;Trig出力1 OFF
BCF PORTB,5 ;Trig出力2 OFF
BCF PORTB,6 ;Trig出力3 OFF
BCF PORTB,7 ;Trig出力4 OFF
BSF PORTA,4 ;LED点灯 off
~正常出力
・
・
・
;入力立ち上下がり、出力立ち上がり トリガ入力判定と出力***************
L_H
BCF PORTB,4 ;Trig出力1 OFF
BCF PORTB,5 ;Trig出力2 OFF
BCF PORTB,6 ;Trig出力3 OFF
BCF PORTB,7 ;Trig出力4 OFF
BSF PORTA,3 ;LED点灯 off
L_H_ON
BTFSS PORTB,0 ;トリガ入力1に入力があった場合
GOTO L_H_Time
BTFSS PORTB,1 ;トリガ入力2に入力があった場合
GOTO L_H_Time
BTFSS PORTA,4 ;手動トリガ入力に入力があった場合
GOTO L_H_Time
GOTO Trig_Direc ;トリガ入力がなかった場合、初期判定に戻る
L_H_Time
BCF PORTA,3 ;トリガ判定LED点灯
BTFSS PORTA,0 ;パルス幅が50ms指定の場合」
GOTO L_H_50
GOTO L_H_200
L_H_50
BSF PORTB,4 ;Trig出力1 ON
BSF PORTB,5 ;Trig出力2 ON
BSF PORTB,6 ;Trig出力3 ON
BSF PORTB,7 ;Trig出力4 ON
CALL Timer_50ms
BCF PORTB,4 ;Trig出力1 OFF
BCF PORTB,5 ;Trig出力2 OFF
BCF PORTB,6 ;Trig出力3 OFF
BCF PORTB,7 ;Trig出力4 OFF
CALL Timer_50ms
GOTO L_H_Loop
L_H_200
BSF PORTB,4 ;Trig出力1 ON
BSF PORTB,5 ;Trig出力2 ON
BSF PORTB,6 ;Trig出力3 ON
BSF PORTB,7 ;Trig出力4 ON
CALL Timer_200ms
BCF PORTB,4 ;Trig出力1 OFF
BCF PORTB,5 ;Trig出力2 OFF
BCF PORTB,6 ;Trig出力3 OFF
BCF PORTB,7 ;Trig出力4 OFF
CALL Timer_200ms
GOTO L_H_Loop
L_H_Loop
BTFSC PORTB,0 ;トリガ入力1が出力状態だった場合
GOTO L_H_Loop
BTFSC PORTB,1 ;トリガ入力2が出力状態だった場合
GOTO L_H_Loop
BTFSS PORTA,4 ;手動トリガ入力に入力があった場合
GOTO L_H_Loop
BSF PORTA,3 ;トリガ判定LED消灯
GOTO Trig_Direc ;初期へ戻る
・
・
・
以下略
お礼
御回答有難うございます。 出力の状態も含めてIOのデータが格納する事が判っただけでもばんばいざいです。ANDを取ってやれば良いのですよね、正論理では0、負論理では1でキャンセルする事が出来ますね。 C言語は一度も使った事が無くちんぷんかんぷんです。