19. おまじない (3)
18 INIT
19 ; --- Initilize PORT A & B ---
20 clrf PORTA ; clear Port A latch
21 clrf PORTB ; clear Port B latch
22 bsf STATUS,RP0 ; switch BANK 0 -> 1
23 movlw B'11100000' ; 0:Output / 1:Input
24 movwf TRISA ; set I/O Port A
25 movlw B'11110011' ; 0:Output / 1:Input
26 movwf TRISB ; set I/O Port B
27 bcf OPTION_REG,7; set Pull-up of Input B Port
28 bcf STATUS, RP0 ; switch BANK 1 -> 0
I/Oポートの初期化 (入出力設定/プルアップ設定)
20. おまじない (4)
30 ; --- Initilize Device ---
31 movlw B'00000000' ; stop motor
32 movwf PORTA ; write to PORT A
33 movlw B'11110011' ; off front LED
34 movwf PORTB ; write to PORT B
デバイス(I/Oポート出力)の初期化
(モータ停止 / LED消灯)
50. サンプルコード説明
22 ORG H'00' ; reset vector
23 goto INIT
24
25
26 INIT
27 ; --- Initilize PORT A & B ---
28 clrf PORTA ; clear Port A latch
29 clrf PORTB ; clear Port B latch
30 bsf STATUS,RP0 ; switch BANK 0 -> 1
31 movlw B'11100000' ; 0:Output / 1:Input
32 movwf TRISA ; set I/O Port A
33 movlw B'11110011' ; 0:Output / 1:Input
34 movwf TRISB ; set I/O Port B
35 bcf OPTION_REG,7; set Pull-up of Input B Port
36 bcf STATUS, RP0 ; switch BANK 1 -> 0
37
38 ; --- Initilize Device ---
39 movlw B'00000000' ; stop motor
40 movwf PORTA ; write to PORT A
41 movlw B'11110011' ; off front LED
42 movwf PORTB ; write to PORT B
おまじない
(初期化)
53. 47 MAIN
48
49 ; --- check bottom sensors ---
50 btfss PORTB, 4 ; check “FRONT LEFT”
51 goto RIGHT_TURN ; go to RIGHT_TURN
52 goto LEFT_TURN ; go to LEFT_TURN
I/Oポートのビットによる分岐
プログラムの『実質的な』開始位置
PORTBの“4thビット”をテスト
ラベル “RIGHT_TURN” へ
ラベル “LEFT_TURN” へ
54. 『 btfss PORTB, 4 』 命令の説明
Bit Test F-register, Skip if Setの略
第1オペランド:Fレジスタのアドレス(または別名)
第2オペランド:テストするビットの位置
0
ポートB
(PORTB)
LSBMSB
Bit 4Bit 5Bit 6Bit 7 Bit 3 Bit 2 Bit 1 Bit 0
[クリア] 次の命令を実行
1 [セット] 次の命令をスキップ
55. 47 MAIN
48
49 ; --- check bottom sensors ---
50 btfss PORTB, 4 ; check "FRONT LEFT"
51 goto RIGHT_TURN ; go to RIGHT_TURN
52 goto LEFT_TURN ; go to LEFT_TURN
ビット・テストによる分岐
IF 左前センサ = “1”(非検知)
左前センサをテスト
IF 左前センサ = “0”(検知)
問:なぜ “call”命令ではなく
“goto”命令を使うの?
答:“call”では、returnで戻り、
いつも “LEFT_TURN” へ飛ぶ
56. 54 RIGHT_TURN
55 ; --- Control Motor (1) ---
56 movlw B'00000100' ; Left=Forward, Right=Stop
57 movwf PORTA ; write to PORT A
58 goto MAIN
59
60 LEFT_TURN
61 ; --- Control Motor (2) ---
62 movlw B'00000010' ; Left=Stop, Right=Forward
63 movwf PORTA ; write to PORT A
64 goto MAIN
ビット・テストによる分岐
左輪=前進で右旋回
右輪=前進で左旋回
81. 『 andlw B‘11110011’』 命令の説明
And Literal with Wの略
XXXXW X X X X
LSBMSB
1111Literal 0 0 1 1
Bit 4Bit 5Bit 6Bit 7 Bit 3 Bit 2 Bit 1 Bit 0
XXXXW 0 0 X X
AND (論理積)
=
82. 『 movwf 』 命令の説明
Move W-register to F-registerの略
Wレジスタの内容をFレジスタに書き込む。
B ‘XXXX00XX’
B ‘XXXX00XX’
Wレジスタ
Movwf PORTB を実行
B ‘XXXXXXXX’
B ‘XXXX00XX’
Fレジスタ
PORTB
84. 前面LEDの点灯
67 ; --- Light ON Front LED ---
68 movf PORTB, W
69 iorlw B'00001100' ; LIGHT ON Front LED
70 movwf PORTB ; write to PORT B
“PORTB” を “W” へ
B’00001100’ OR “W”
“W” を “PORTB” へ
85. 『 iorlw B‘00001100’』 命令の説明
Inclusive Or Literal with Wの
略
XXXXW X X X X
LSBMSB
0000Literal 1 1 0 0
Bit 4Bit 5Bit 6Bit 7 Bit 3 Bit 2 Bit 1 Bit 0
XXXXW 1 1 X X
OR (論理和)
=
87. 媒介変数の初期化
79 ; --- clear MOTOR ---
80 movlw B'00000000‘
81 movwf MOTOR
媒介変数 “MOTOR” の初期化
88. PORTB(前面センサ)の読み取り
83 ; --- read EYES ---
84 movfw PORTB ; PORT B -> W
85 movwf EYES ; W -> EYES
“PORTB”(前面センサ)の値を“EYES”に格納
89. 左目の検出有無による分岐
87 ; --- check Left EYE ---
88 movlw B'00000000' ; Left=Stop, Right=Stop
89 btfss EYES, 0
90 movlw B'00000010' ; Left=Stop, Right=Forward
91 iorwf MOTOR, F
If (Bit 0 = 0) then w = 00000010
If (Bit 0 = 1) then w = 00000000
MOTOR = MORTOR || W
90. 右目の検出有無による分岐
93 ; --- check Right EYE ---
94 movlw B'00000000' ; Left=Stop, Right=Stop
95 btfss EYES, 1
96 movlw B'00000100' ; Left=Forward, Right=Stop
97 iorwf MOTOR, F
If (Bit 0 = 0) then w = 00000100
If (Bit 0 = 1) then w = 00000000
MOTOR = MORTOR || W
91. 媒介変数(MOTOR)をポートBへ反映
99 ; --- Control Motor ---
100 movfw MOTOR ; MOTOR -> W
101 movwf PORTA ; write to PORT A
102
103 goto MAIN ; go to the Top of Program
MOTORの値をポートBへ書き込み、
モータを駆動する。