センサは車体前部(フロント)の左右のライン・センサ(ライン上(白)だと1、ライン外(黒) だと0)、駆動系は車体後部(リアドライブ)の左右の独立したモータである。モータは 左右それぞれ、正転(前進)、逆転(後進)、停止(ブレーキ)、空転(フリー)できる。
すなわち、
見所は、ラベルTABLEの「ADDWF PCL」命令によるWレジスタの値によるテーブル・ジャンプ、
および、Wレジスタに値を入れてサブルーチンから値を返す「RETLW B'01101010'」
などでしょう。かなり高級な技です。しかしC言語の文法をよく理解していればこういう
発想が有効だということもすぐに思い浮かぶのではないでしょうか?
参照用のPICの命令一覧はここにあります。
;******************************************************** ; TRACE.ASM 2002/6 T.Fujii ;******************************************************** ; トレースカーのプログラム ;******************************************************** ; RB0,OUT 左LED1の赤=ライン外 フ ; RB1,OUT 左LED1の緑=ライン内 リ 正 逆 停 ; RB2,OUT 右LED2の赤=ライン外 ー 転 転 止=ブレーキ ; RB3,OUT 右LED2の緑=ライン内 ↓ ↓ ↓ ↓ ; RB4,OUT 左モータードライバ1ピン1= 0 0 1 1 ; RB5,OUT 左モータードライバ1ピン2= 0 1 0 1 ; RB6,OUT 右モータードライバ2ピン1= 0 0 1 1 ; RB7,OUT 右モータードライバ2ピン2= 0 1 0 1 ; RA0,IN 左フォトトランジスタ1= 1でライン上(白:反射あり) ; RA1,IN 右フォトトランジスタ2= 0でライン外(黒:反射なし) ; RA2,OUT N.C ; RA3,OUT N.C ; RA4,OUT N.C ;*************************************************** list p=16f84a #include__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC RADIX DEC CBLOCK 0CH TEMP ENDC ORG 00H CALL SETUP ;初期化サブルーチンコール:PortA,PortBの入出力方向の決定 MAINLOOP ;メインループ CALL SETUP ; 不要 MOVFW PORTA ; WレジスタにPortAの値を入力する。(アセンブラ拡張命令) IORLW 00H ; Wレジスタに関するフラグを立てるための BTFSS STATUS,Z ; Wレジスタの内容が0(コースオフ)だったら、スキップする。 MOVWF TEMP ; コースオフしていなければ「以前の値」としてTEMPに保存する。 ANDLW B'00000011' ; Wレジスタの第0および1ビットをマスクする。(他を0とする) CALL TABLE ; 現在の状態判定用サブルーチンを呼ぶ。 MOVWF PORTB ; サブルーチンから戻り値であるWレジスタの値をPortBに出力する。 GOTO MAINLOOP ; 無限ループ TABLE ;状態判定用サブルーチン ADDWF PCL ; テーブル・ジャンプ:Wレジスタの値に対応した分スキップする。 GOTO OUTOF_LINE ; 00→完全に外れたとき、アウト・オブ・ライン処理に移る。 RETLW B'01110110' ; 01→右センサだけ白,左に外れてる それぞれの場合の、 RETLW B'11101001' ; 10→左センサ白、右に外れてる モータ、LEDの出力値を RETLW B'01101010' ; 11→両センサ白、ライン上にある Wレジスタに入れて戻る。 OUTOF_LINE ;アウト・オブ・ライン処理 BTFSC TEMP,0 ; TEMPのbit0が0(左センサ白、右に外れてる)だったらスキップ RETLW B'01110101' ; 前回右センサだけ白だったとき RETLW B'11100101' ; 前回左センサだけ白だったとき SETUP ;初期化サブルーチン:PortA,PortBの入出力方向の決定 BSF STATUS,RP0 ; レジスタ・ファイルをバンク1に切り替える。 MOVLW B'00000011' ; PortAのbit0,1を入力に設定する。 MOVWF TRISA ; に設定する。 MOVLW B'00000000' ; PortBの全bitを出力に設定する。 MOVWF TRISB ; に設定する。 BCF STATUS,RP0 ; レジスタ・ファイルをバンク0に切り替える(戻す)。 RETURN ; サブルーチンから戻る。 END