;**********************************************************************
; < trcar.asm >
; Kuroki Fukuzo 2003.08.27
; DEVICE : PIC16F84A
; CLOCK : 10MHz
; トレースロボットプログラム for MPASM
;**********************************************************************
list p=16F84
#include <P16F84a.INC>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_OFF & _HS_OSC
;**********************************************************************
CBLOCK H'0C' ;ファイルアドレス0Ch番地から変数を割り当てる
CNT0,CNT1 ;遅延用カウンタ
IN_SEN ;センサー
ENDC ;CBLOCK終了
;
SEN_LR_BL EQU B'00000011' ;左右センサ=黒
SEN_L_BL EQU B'00000010' ;左センサ=黒(右=白)
SEN_R_BL EQU B'00000001' ;右センサ=黒(左=白)
SEN_LR_WH EQU B'00000000' ;左右センサ=白
;TIMER10 EQU D'10' ;TIMER10x1024サイクル遅延させる
TIMER50 EQU D'50' ;TIMER50x1024サイクル遅延させる
;--------------------------------
ORG 00H ; processor reset vector
GOTO MAIN ; go to beginning of program
;
MAIN
BSF STATUS,RP0 ;メモリーバンクを1にセット
MOVLW B'11111111' ;WレジスタにFFHをセット
MOVWF TRISA ;set ra0~4 input
MOVLW B'00000011' ;Wレジスタに03Hをセット
MOVWF TRISB ;set rb0,1 input rb2~7 output
MOVLW 080H ;Wレジスタに80Hをセット
MOVWF OPTION_REG ;OPTION_REGに80Hをセット PORT-B PULL UPなし
BCF STATUS,RP0 ;メモリーバンクを0にセット
;*************************************************************************
;
;PORT-Bに出力{モーター2個(M2,M2)、ドライブIC=TA7291S}で制御及びLED点滅
;
;<< I/Oマップ >>
;< RA0(出力)/NC(接続なし)
;< RA1(出力)/NC(接続なし)
;< RA2(出力)/NC(接続なし)
;< RA3(入力)/NC(接続なし)
;
;< RB0(入力)/右光センサー(L=白、H=黒)
;< RB1(入力)/左光センサー(L=白、H=黒)
;< RB2(出力)/IN2(モータードライブIC1)
;< RB3(出力)/IN1(モータードライブIC1)
;< RB4(出力)/IN2(モータードライブIC2)
;< RB5(入力)/IN1(モータードライブIC2)
;< RB6(出力)/LED(L=点灯、H=消灯)
;< RB7(出力)/LED(L=点灯、H=消灯)
;*************************************************************************
;
LOOP
MOVF PORTB,W ;PORTB->W
ANDLW B'00000011' ;マスク処理
MOVWF IN_SEN ;W->IN_SEN
;
SUBLW SEN_LR_WH ;左右センサ=白?
BTFSC STATUS,Z ;zero=0?(1-->次行実行、0-->次々行)
GOTO FORWARD ;前進
MOVF IN_SEN,W ;IN_SEN->W
SUBLW SEN_LR_BL ;左右センサ=黒?
BTFSC STATUS,Z ;zero=0?(1-->次行実行、0-->次々行)
GOTO FORWARD2 ;前進
MOVF IN_SEN,W ;IN_SEN->W
SUBLW SEN_L_BL ;左センサ=黒?
BTFSC STATUS,Z ;zero=0?(1-->次行実行、0-->次々行)
GOTO FORW_LEFT ;左タイヤ前進(右ブレーキ)
MOVF IN_SEN,W ;IN_SEN->W
SUBLW SEN_R_BL ;左センサ=黒?
BTFSC STATUS,Z ;zero=0?(1-->次行実行、0-->次々行)
GOTO FORW_RIGHT ;右タイヤ前進(左ブレーキ)
GOTO LOOP
;
BRAKE
;モータドライブIC1(TA7291S)M1(IN1~2(rb3~2)=00->BRAKE)
;モータドライブIC2(TA7288P)M2(IN1~2(rb5~4)=00->BRAKE),rb6,7=1->LED-OFF
MOVLW B'11000011' ;Wレジスタにc3Hをセット(IC1,2=brake)
MOVWF PORTB ;PORTBに出力する
GOTO LOOP ;
;
FORW_RIGHT
MOVLW B'10100011' ;Wレジスタにa3Hをセット(IC2=brake)/rb6=0=右LED-ON,7=1=左LED-OFF
MOVWF PORTB ;PORTBに出力する
;MOVF TIMER50,W
;CALL DELAY
GOTO LOOP
;
FORW_LEFT
MOVLW B'01001011' ;Wレジスタに4bHをセット(IC2:M2=CW)/rb6=1=右LED-OFF,7=0=左LED-ON
MOVWF PORTB ;PORTBに出力する
;MOVF TIMER50,W
;CALL DELAY
GOTO LOOP
;
FORWARD
MOVLW B'11101011' ;WレジスタにebHをセット(IC1:M1=CW,IC2:M2=CW)/rb6,7=1=左右LED-OFF
MOVWF PORTB ;PORTBに出力する
;MOVF TIMER50,W
;CALL DELAY
GOTO LOOP
;
FORWARD2
MOVLW B'00101011' ;Wレジスタに2bHをセット(IC1:M1=CW,IC2:M2=CW)/rb6,7=0=左右LED-ON
MOVWF PORTB ;PORTBに出力する
;MOVF TIMER50,W
;CALL DELAY
GOTO LOOP
;--------------------------------
DELAY ;約(Wの内容)x1024サイクル遅延させる
MOVWF CNT0 ;Wの内容をCNT0へ入れる
DELAY_0
CLRF CNT1 ;CNT1の内容を0にする
DELAY_1
NOP
DECFSZ CNT1,F ;CNT1から1を引いて、
GOTO DELAY_1 ;0以外ならDELAY_1へ跳ぶ
DECFSZ CNT0,F ;CNT0から1を引いて、
GOTO DELAY_0 ;0以外ならDELAY_1へ跳ぶ
RETURN
;--------------------------------
END
戻る