マイコンロボット実習

124
マイコン・ロボット実習 2005103日~ 7Takehiko YOSHIDA マイコンロボット『ワクチン君』を使用したマイコン制御実習

Transcript of マイコンロボット実習

Page 1: マイコンロボット実習

マイコン・ロボット実習

2005年10月3日~ 7日

Takehiko YOSHIDA

マイコンロボット『ワクチン君』を使用したマイコン制御実習

Page 2: マイコンロボット実習

実習スケジュール

• 1日目 (月) 概要説明 プログラム開発環境構築 単純なモータ制御

• 2日目 (火) ライン検知処理 高度なモータ制御 (PWM制御)

• 3日目 (水) 敵(障害物)検知処理

Page 3: マイコンロボット実習

実習スケジュール

• 4日目 (木) 割り込み処理 相撲プログラム作成実習(1)

• 5日目 (金) 相撲プログラム作成実習(2) まとめ(報告資料作成)

Page 4: マイコンロボット実習

ワクチンくん

マイコン内臓の自律型ロボット

Page 5: マイコンロボット実習

ワクチンくんの概要

• モータ × 2 ⇒ 前進、後退、旋回など

• 底面赤外線センサ × 4 ⇒ ライン(白黒)検知

• 前面赤外線センサ × 2 ⇒ 障害物検知

Page 6: マイコンロボット実習

マイコン(MPU)

• 汎用(パソコン向け)マイコン

– Intel社 Pentium

– Motorola社 / IBM社 PowerPC

• 組込用マイコン

–日立製作所 SH-3、SH-4

– ルネサステクノロジ(旧日立) H8

– ARM社 ARM9

– Microchip Technology社 PIC

Page 7: マイコンロボット実習

マイコンの比較

汎用マイコン

• 高速処理

• 大メモリ容量

• 高消費電力

組込み向けマイコン

• 低消費電力

• 低価格

• 耐環境特性 温度特性、耐ノイズ

• 多機能 時計、A/Dコンバータ、

シリアル通信回路

Page 8: マイコンロボット実習

PICの特徴

• RISC

• ハーバード・アーキテクチャ

• ROM/RAM内臓

Page 9: マイコンロボット実習

RISC(縮小命令セットコンピュータ)

⇔ CISC(複合命令セットコンピュータ)

個々の命令を簡略化することによりパイプライン処理の効率を高め、処理性能の向上をはかる。

・ 命令数が少ない。 (PIC16F84の場合、35命令)

・ 命令語長が一定。 (PIC16F84の場合、14ビット)

Page 10: マイコンロボット実習

ノイマン・アーキテクチャ ハーバード・アーキテクチャ

CPU

CPU メモリ (プログラム/データ)

データバス

プログラムメモリ

データメモリ

プログラムバス

データバス

例) Texas Instruments社 DSP

Page 11: マイコンロボット実習

メモリアーキテクチャ (PIC16F84)

• プログラムメモリ フラッシュ 1Kword

• データメモリ RAM 68byte EEPROM 64byte

Page 12: マイコンロボット実習

フラッシュROM

• 電気的に内容を書き換えることが出来るROM

• 専用の書込器(ROMライター)が必要

(参考)

・ マスクROM : 工場製造時に書込み

・ UVPROM : 紫外線消去型

・ EEPROM

Page 13: マイコンロボット実習

その他のPICの特徴

• 広範な動作電圧 ・・・ 2V~6Vで動作

• I/O ・・・ LED直接駆動可能な容量 入出力プログラマブル

• 開発環境 ・・・ 統合開発環境(アセンブラ、 シミュレータ)が無償提供

Page 14: マイコンロボット実習

マイコンロボット実習 第1部

単純なモータ制御の方法

Page 15: マイコンロボット実習

モーター制御 (PART1)

• I/O書き込みによるモータ駆動方法

• ウェイト・ループによる ロボットの動きの時間制御方法

学習のポイント

Page 16: マイコンロボット実習

1 ;***************************************

2 ; SAMPLE PROGRAM

3 ; source file : spin.asm

4 ; function : only right spin

5 ; author : Yoshida Takehiko

6 ; date : 2002.3.11

7 ;***************************************

コメント文

; (セミコロン)の後に記述した

文はコメントとして解釈される。

ソースコードの先頭には、『機能』や『作者』 、 『日付』を記述したコメントを

記述するように心がけましょう。

Page 17: マイコンロボット実習

9 list p=16f84, f=INHX8M

10 #include p16f84.inc

11

12 __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_OFF & _XT_OSC

おまじない (1) プロセッサの型名: “16F84” と

出力形式 : “INTEL HEX 8ビット”

を指定する。

インクルード・ファイルの指定

コンフィグレーション・ビットの指定

コードプロテクト:OFF, ウォッチドックタイマ:OFF

パワータイマイネーブル:OFF, オシレータ:XT

Page 18: マイコンロボット実習

おまじない (2)

14 ORG H'00' ; reset vector

15 goto INIT

リセット・ベクタの設定

パワーオン・リセット “00” が発生したら

ラベル “INIT” へジャンプしなさい。

Page 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ポートの初期化 (入出力設定/プルアップ設定)

Page 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消灯)

Page 21: マイコンロボット実習

ウェイト・ループ

37 MAIN

38 ; --- idle wait loop ---

39 movlw D'10'

40 movwf H'13

<< 途中省略 >>

53 nop

54 decfsz H'13', F

55 goto LOOP3

(意味のないループを回すことで)

時間稼ぎ

実質的なプログラム開始点 実習でプログラムを書換えるときは

“MAIN”以降を編集すること。

Page 22: マイコンロボット実習

モータ制御

58 ; --- Control Motor ---

59 movlw D‘05’

60 movwf PORTA

wレジスタに値“05”を代入する

wレジスタの内容を“PORTA”

に書き込む

Page 23: マイコンロボット実習

『 movlw 』 命令の説明

Move Literal to W-register の略

リテラル(ある特定の値)をWレジスタに代入する。

Wレジスタ=値を格納する入れ物(PICには一つしかない)

Wレジスタ

Movlw D’05’ を実行

例えば

Page 24: マイコンロボット実習

数値の表記法

進数 表記 例

2進数 B’~’

~b

B’01001101’

1001101B

8進数 O’~’ O’115’

10進数 D’~’

.~

D’77’

.77

16進数

H’~’

0x~

~h

H’4D’

0x4D

4Dh

文字(ASCII) A’~’

’~’

A’M’

’M’

~b

01001101B

.~

.77

0x~

~h

0x4D

4Dh

’~’

’M’

Page 25: マイコンロボット実習

『 movwf 』 命令の説明

Move W-register to F-register の略

Wレジスタの内容をFレジスタに書き込む。

Fレジスタ は PICの中に複数ある。

『 PORTA』という名前を指定することで区別する。

Wレジスタ

Movwf PORTA を実行

FレジスタPORTA

Page 26: マイコンロボット実習

後始末

63 goto $ ; Infinite Loop

64

65 END

アセンブラに対して、ソースコードの

「おしまい」を教える。

※プログラムがここで止まるわけではない

ので注意!!

自分自身(63行目から63行目)へジャンプ =プログラマの意図しない

「遠い彼方」へジャンプすることを防止する。

Page 27: マイコンロボット実習

58 ; --- Control Motor ---

59 movlw D‘05’

60 movwf PORTA

ここまでのまとめ

問:PORTAに直接、値5を書き込めないのか?

答:書き込めません。 PICでは、基本的に 『W(ワーキング)レジスタ』 を 中心に、値の読み書きや演算(加減算など)、比較を行なわなければなりません。

Page 28: マイコンロボット実習

I/Oポートの説明

RA0

10進数の “5” = 2進数の “0101”

RA1

RA2

RA3

⇒ High

1 0 1 0 ポートA

(PORTA)

⇒ Low

⇒ High

⇒ Low

右輪

左輪

端子 電位

Page 29: マイコンロボット実習

マイコン・ロボット(ワクチン君)内部

Page 30: マイコンロボット実習

マイコン(PIC)のピン配列

1

2

3

4

5

6

7

8

9 10

11

12

13

14

15

16

17

18

VDD VSS

OSC1

OSC2 MCLR

RA0

RA1 RA2

RA3

Page 31: マイコンロボット実習

モータ駆動(ブリッジ)回路

Low

Low High

Low

Low

High

後退

RA0

RA0

RA1

RA1

PORTA

0 1

Page 32: マイコンロボット実習

モータ駆動(ブリッジ)回路

Low Low

Low Low High

High

前進

RA0

RA0

RA1

RA1

PORTA

0 1

Page 33: マイコンロボット実習

モータ駆動とポートAの値の関係

左輪 右輪 2進数 16進数

停止 停止 B’0000’ H’00’

停止 後退 B’0001’ H’01’

停止 前進 B’0010’ H’02’

前進 停止 B’0100’ H’04’

後退 停止 B’1000’ H’08’

後退 前進 B’1010’ H’0A’

前進 後退 B’0101’ H’05’

前進 前進 B’0110’ H’06’

後退 後退 B’1001’ H’09’

Page 34: マイコンロボット実習

ウェイト・ループの説明

45 movlw D'255‘

46 movwf H'11‘

47 LOOP1

48 decfsz H'11', F

49 goto LOOP1

50 nop

Wレジスタに値“255”を代入する。

Wレジスタの値をアドレス11に

書き込む。

ラベル:goto文のジャンプ先

条件文(分岐命令)

LOOP1へジャンプ

何もしない。 (No Operation)

Page 35: マイコンロボット実習

『 movlw D’255’ 』 の説明

255(10進表記)をWレジスタに代入。

なぜ D‘255’ ?

Wレジスタのサイズは8ビット

8ビットで表現できる最大値は B‘11111111’

= D‘255’

Page 36: マイコンロボット実習

『 movwf H’11’ 』 の説明

Wレジスタの内容をFレジスタに書き込む。

Fレジスタは、H‘00’~H‘4F’番地

の80個(80バイト)

但し、H‘00’~H‘0B’は、特別な用途に予約

実は、H‘05’番地の別名が 『PORTA』

Page 37: マイコンロボット実習

『 decfsz H'11', F 』 の説明

Fレジスタ(11番地)の内容を‘-1’(デクリメント)

Decrement F-register, Skip if Zero の略

Fレジスタの内容が0ならば、

次の命令(行)をスキップ

Page 38: マイコンロボット実習

ウェイト・ループの説明

45 movlw D'255‘

46 movwf H'11‘

47 LOOP1

48 decfsz H'11', F

49 goto LOOP1

50 nop

255

255

254 ≠0 253 ≠0 252 ≠0 3 =0 2 1 0

Page 39: マイコンロボット実習

ウェイト・ループの入れ子構造

42 movlw D'255'

43 movwf H'12'

44 LOOP2

<< LOOP1 >>

54 decfsz H'12', F

55 goto LOOP2

56 nop

Page 40: マイコンロボット実習

ウェイト・ループの時間調整

• Fレジスタ(××番地)の初期値を変える。 利点:微妙な時間調整が可能 欠点:大きな(256倍以上)調整が不可

• ループの階層を増やす/減らす。 利点:大きな(256倍以上)調整が不可 欠点:微妙な時間調整が不可能

2つの方法の利点を組み合わせて、

適切な時間調整を行う。

Page 41: マイコンロボット実習

本日の課題

• 机の上に、消しゴムや筆箱などの障害物を 置いて適当なコースを作り、そのコースを いち早く駆け抜けるプログラムを作る。

<< ポイント >> 1.モータ駆動制御を操り、 前進、後退、旋廻などをおこなう。 2.ウェイト・ループを調整することで、 適切なタイミングで、ロボットの動きを操る。

Page 42: マイコンロボット実習

マイコンロボット実習 第2部

単純なセンサー検知の方法

Page 43: マイコンロボット実習

センサー検知 (PART1)

• I/O読み込みによる底面光センサの 検出方法

• 条件分岐命令による動作制御

• ポーリング処理

学習のポイント

Page 44: マイコンロボット実習

検知センサーのしくみ

Page 45: マイコンロボット実習

底面センサー回路図

High Low

黒 High

白 Low

論理の逆転

(負論理)に注意!!

フォトレフレクタ

(広義の)フォトカプラ

Page 46: マイコンロボット実習

マイコン(PIC)のピン配列

1

2

3

4

5

6

7

8

9 10

11

12

13

14

15

16

17

18

VDD VSS

OSC1

OSC2 MCLR

RA0

RA1 RA2

RA3

RB4

RB5

RB6

RB7

Page 47: マイコンロボット実習

I/Oポートの説明

⇒ RB4

⇒ RB5

⇒ RB6

⇒ RB7

Low

ポートB

(PORTB)

High

High

High

端子 電位

左前:白

左後:黒

右後:黒

右前:黒

0 1 1 1

LSB MSB

Bit 4 Bit 5 Bit 6 Bit 7

Page 48: マイコンロボット実習

サンプルコード説明

1 ;***************************************

2 ; SAMPLE PROGRAM

3 ; source file : detect.asm

4 ; function : detect one bottom sensor

5 ; author : Yoshida Takehiko

6 ; date : 2002.3.13

7 ;***************************************

8

9 list p=16f84, f=INHX8M

10 #include p16f84.inc

11

12 __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_OFF & _XT_OSC

Page 49: マイコンロボット実習

定数の定義

15 ;--- define constants ---------

16 COUNTER1 equ 0x11

17 COUNTER2 equ 0x12

18 COUNTER3 equ 0x13

19 ;--- define constants <END> ---

メモリアドレス値を直接記述すると紛らわしいので

文字列を別名として定義する。

Page 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

おまじない

(初期化)

Page 51: マイコンロボット実習

サブルーチン呼び出し

44 ; --- idle wait loop ---

45 call WAIT

サブルーチン呼び出し(コール)

呼び出し(ジャンプ)先から “return”命令で戻る。

※ “goto”命令はジャンプしたまま(戻ってこない)。

電源ON直後は不安定なので、必ずWAIT(待ち)を

入れてから、動き出すようにプログラムしましょう。

Page 52: マイコンロボット実習

ウェイト・サブルーチンの説明

66 ;-----------

67 ; Idle Wait

68 ;-----------

69 WAIT

70 movlw H'0A'

71 movwf COUNTER3

<< 途中省略 >>

85 decfsz COUNTER3, F

86 goto LOOP3

87 return

“spin.asm” と同じ

ウェイト・ループ

ループ・カウンタの初期値を

変えることで、待ち時間を調整。

アドレスをH’13’と直接指定する

代わりに“COUNTER3”と書く。

呼び出し元の“call”命令に戻る。

Page 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” へ

Page 54: マイコンロボット実習

『 btfss PORTB, 4 』 命令の説明

Bit Test F-register, Skip if Set の略

第1オペランド:Fレジスタのアドレス(または別名)

第2オペランド:テストするビットの位置

ポートB

(PORTB)

LSB MSB

Bit 4 Bit 5 Bit 6 Bit 7 Bit 3 Bit 2 Bit 1 Bit 0

[クリア] 次の命令を実行

1 [セット] 次の命令をスキップ

Page 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” へ飛ぶ

Page 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

ビット・テストによる分岐

左輪=前進で右旋回

右輪=前進で左旋回

Page 57: マイコンロボット実習

プログラム全体の構成

左前センサ

テスト

右旋回 左旋回

白線あり 白線なし

ポーリング

Page 58: マイコンロボット実習

課題

• 4つ全ての底面(白線検出)センサの 検出条件を利用し、ロボットが土俵から 落ちないように制御する。

<< ポイント >> 1.各々のセンサが検出したとき、どのような 動きをさせれば、落ちないか考える。

(註)二つ以上同時検出する場合は考えない。

2.プログラムがポーリング処理となるように、 常に先頭に戻り、同じ処理を繰り返す。

Page 59: マイコンロボット実習

マイコンロボット実習 第3部

高度なモータ制御の方法

Page 60: マイコンロボット実習

モーター制御 (PART2)

• モータのスピード(トルク)調整 ⇒ PWM制御方式

• CPUサイクル(クロック)の理解

学習のポイント

Page 61: マイコンロボット実習

サンプルコード説明

1 ;***************************************

2 ; SAMPLE PROGRAM

3 ; source file : slowturn.asm

4 ; function : PWM Control

5 ; author : Yoshida Takehiko

6 ; date : 2002.3.14

7 ;*************************************** === 48行目まで省略 ===

Page 62: マイコンロボット実習

メイン・ルーチンの説明

49 MAIN

50 call FORWARD

51

52 call WAIT100

53

54 call RIGHT_TURN

55

56 call WAIT100

57

58 goto MAIN

“FORWARD” へ

“WAIT100” へ

“RIGHT_TURN”へ

“WAIT100” へ

“MAIN” へ戻る

Page 63: マイコンロボット実習

FORWARDルーチンの説明

62 FORWARD

63 ; --- Control Motor ---

64 movlw B'00000110‘

65 movwf PORTA

66 return

右輪:前進

左輪:前進 ⇒ ロボット:直進

Page 64: マイコンロボット実習

RIGHT_TURNルーチンの説明

69 RIGHT_TURN

70 ; --- Control Motor ---

71 movlw B'00000100‘

72 movwf PORTA

73 return

右輪:停止

左輪:前進 ⇒ ロボット:右旋回前進

Page 65: マイコンロボット実習

WAIT100ルーチンの説明

102 ; --- wait 100 micro sec (250cycle) ---

103 WAIT100

104 movlw H'52'

105 movwf COUNT

106 nop

107 LOOP100

108 decfsz COUNT, F

109 goto LOOP100

110 return

Page 66: マイコンロボット実習

CPUサイクル

PICの場合

movlw、movwf、nop など 一般の命令

⇒ 実行時間 = 1cycle

goto、call、return など 無条件ジャンプ命令

⇒ 実行時間 = 2cycle

btfss、btfsc、decfsz など 条件分岐命令

分岐(スキップ)なし ⇒ 実行時間 = 1cycle

分岐(スキップ)あり ⇒ 実行時間 = 2cycle

Page 67: マイコンロボット実習

CPUサイクルの計算

LOOP100の場合、250Cycle

このマイコンは 2.5MHz で動作

1[sec] / 2.5×106[Hz] = 400×10-9 [sec/cycle]

= 400 [nsec/cycle]

400×10-9[sec/cycle]×250[cycle] = 100×10-6 [sec]

= 100 [μsec]

Page 68: マイコンロボット実習

モーター駆動

右輪

左輪

High

High

Low

Low

回る、回る、回る、・・・

回 止 回 止 回

パワー50%OFF

Page 69: マイコンロボット実習

PWM(Pulse Width Modulation)

PWM:一定周期、一定振幅のパルスの幅 (ON/OFF比)を変えることにより、 出力を制御する方法

ON/OFF周期は、短くても長くても関係ないか?

⇒ 極端に短い周期では、回路(素子)の駆動が間に合わない。

⇒ 極端に長い周期では、なめらかな回転(走行)にならない。

周期(=可聴周波数)によっては、モータやギアがうなる。

Page 70: マイコンロボット実習

課題

• 白線検知とPWM制御を組み合わせて、 速度を抑えた制御をおこなう。 ⇒ 相撲プログラムとしては、これで80%の仕上り

<< ポイント >>

1.白線検知とPWM制御を、いかに同一の

ループ(ポーリング)処理におさめるか。

2.相撲ロボットらしく、土俵の中を

探し回るような動きになれば、Good!

Page 71: マイコンロボット実習

マイコンロボット実習 第4部

高度なセンサー検知の方法

Page 72: マイコンロボット実習

センサー検知(PART2)

• センサーの感度調整 ⇒ タイマ(ウェイトループ)を利用した 積分検知方式

学習のポイント

Page 73: マイコンロボット実習

検知センサーのしくみ

Page 74: マイコンロボット実習

障害物(前面)センサー回路図

左:RA2 右:RA3

左:RA0 右:RA1

コンデンサ

Page 75: マイコンロボット実習

入力ポートの電位

時間

電位

反射光なし ←|→ 反射光あり

コンデンサ保持 さらに光が弱い

Page 76: マイコンロボット実習

センサ入力の積分処理の利点

• 微小な信号を時間軸で足し合わせることで、

感度を上げたり、ノイズの影響を打ち消すことができる。

• 積分する時間を変えることで、センサの 感度を調整できる。

Page 77: マイコンロボット実習

サンプルコード説明

1 ;***************************************

2 ; SAMPLE PROGRAM

3 ; source file : follow.asm

4 ; function : front sensor

5 ; author : Yoshida Takehiko

6 ; date : 2002.4.1

7 ;***************************************

=== 49行目まで省略 ===

Page 78: マイコンロボット実習

媒介変数の初期化

50 ; --- clear MOTOR ---

51 movlw B'00000000‘

52 movwf MOTOR

媒介変数 “MOTOR” の初期化

Page 79: マイコンロボット実習

前面LEDの消灯

55 MAIN

56 ; --- Light OFF Front LED ---

57 movf PORTB, W

58 andlw B'11110011‘

59 movwf PORTB

“PORTB” を “W” へ

B’11110011’ AND “W”

“W” を “PORTB” へ

Page 80: マイコンロボット実習

『 movf 』 命令の説明

Mov F-register の略

※ mov(コピー) 命令としては無意味。

但し、Fレジスタがゼロor 非ゼロでゼロ・フラグが変化する。

movf H‘20’, F ; 20H番地から20H番地へコピー

第1オペランド:コピー元アドレス (Source)

第2オペランド:コピー先 (Destination) [W|F]

Page 81: マイコンロボット実習

『 andlw B‘11110011’』 命令の説明

And Literal with W の略

X X X X W X X X X

LSB MSB

1 1 1 1 Literal 0 0 1 1

Bit 4 Bit 5 Bit 6 Bit 7 Bit 3 Bit 2 Bit 1 Bit 0

X X X X W 0 0 X X

AND (論理積) =

Page 82: マイコンロボット実習

『 movwf 』 命令の説明

Move W-register to F-register の略

Wレジスタの内容をFレジスタに書き込む。

B ‘XXXX00XX’

B ‘XXXX00XX’

Wレジスタ

Movwf PORTB を実行

B ‘XXXXXXXX’

B ‘XXXX00XX’

FレジスタPORTB

Page 83: マイコンロボット実習

コンデンサ放電のためのウェイト

61 call WAIT100

62 call WAIT100

63 call WAIT100

64 call WAIT100

65 call WAIT100

LED消灯(反射光なし)を一定時間保ち、 検知なし(コンデンサ放電)状態にする

Page 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” へ

Page 85: マイコンロボット実習

『 iorlw B‘00001100’』 命令の説明

Inclusive Or Literal with W の

X X X X W X X X X

LSB MSB

0 0 0 0 Literal 1 1 0 0

Bit 4 Bit 5 Bit 6 Bit 7 Bit 3 Bit 2 Bit 1 Bit 0

X X X X W 1 1 X X

OR (論理和) =

Page 86: マイコンロボット実習

コンデンサ放電のためのウェイト

72 call WAIT10

73 call WAIT10

74 call WAIT10

75 call WAIT10

76 call WAIT10

77 call WAIT10

反射光検知による電圧降下を待つ。

Page 87: マイコンロボット実習

媒介変数の初期化

79 ; --- clear MOTOR ---

80 movlw B'00000000‘

81 movwf MOTOR

媒介変数 “MOTOR” の初期化

Page 88: マイコンロボット実習

PORTB(前面センサ)の読み取り

83 ; --- read EYES ---

84 movfw PORTB ; PORT B -> W

85 movwf EYES ; W -> EYES

“PORTB”(前面センサ)の値を“EYES”に格納

Page 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

Page 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

Page 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へ書き込み、

モータを駆動する。

Page 92: マイコンロボット実習

プログラム作成

• 相撲プログラムの作成

白線検出による土俵ワレ回避ロジック

敵検出による攻撃(押出し)ロジック

土俵を動き回って敵を探す索敵ロジック

Page 93: マイコンロボット実習

マイコンロボット実習 第5部

割込み処理

Page 94: マイコンロボット実習

割込み処理

•割込み処理の理解と実装

学習のポイント

Page 95: マイコンロボット実習

割込みの種類

ソフトウェア割込み

ハードウェア割込み

CPU外部からの要因で発生

CPU内部からの要因で発生

例)割込命令、ゼロ除算、ページフォルト

Page 96: マイコンロボット実習

『割込み』とは

何か仕事をしている最中に電話が

掛かってきました。

さて、どうしますか?

Page 97: マイコンロボット実習

ポイント

• 2つ以上の処理を同時に実行できない。

• 割込みの原因が外部にある。 ⇒いつ、どこで割込みが発生するか分からない。

• 割込む処理を出来るだけ速やかに 着手する。

• 中断した処理を確実に再開する。

Page 98: マイコンロボット実習

割込み処理の流れ

割込み発生

戻り番地の退避

0004H番地へジャンプ

レジスタの退避

割込禁止(GIEビットのクリア)

割込ビットのセット

割込処理本体

割込ビットのクリア

レジスタの復帰

割込許可(GIEビットのセット)

RETFIE命令

割込前の処理に復帰

Page 99: マイコンロボット実習

割込み処理の準備

• ハードウェアが正しく結線されている

• 4番地から始まる割込み処理がある

• INTCONレジスタのGIEビットがONである

• INTCONレジスタの割込み要因毎の 許可ビットがONである

Page 100: マイコンロボット実習

サンプルコード説明

1 ;***************************************

2 ; SAMPLE PROGRAM

3 ; source file : intrpt.asm

4 ; function : interrupt function

5 ; author : Yoshida Takehiko

6 ; date : 2002.4.12

7 ;***************************************

8 === 25行目まで省略 ===

Page 101: マイコンロボット実習

割込みベクター初期化

19 ORG H'00' ; reset vector

20 goto INIT

21

22 ORG H'04' ; interrupt vector

23 goto INTRPT

割込みが発生したときに実行する命令 (へのジャンプ先)を設定する。

Page 102: マイコンロボット実習

媒介変数の初期化

43 ; --- clear MOTOR ---

44 movlw B'00000000‘

45 movwf MOTOR

媒介変数 “MOTOR” の初期化

Page 103: マイコンロボット実習

割り込み処理の設定

47 ; --- set interrupt ---

48 bcf INTCON, RBIF

49 bsf INTCON, RBIE

50 bsf INTCON, GIE

割り込みの設定 『INTCON』割込設定のための特殊なレジスタ

Page 104: マイコンロボット実習

メイン・ループ

52 MAIN

53 ; --- Control Motor ---

54 movfw MOTOR ; MOTOR -> W

55 movwf PORTA ; write to PORT A

56

57 goto MAIN

Page 105: マイコンロボット実習

割り込み処理

59 INTRPT

60 ; --- push register ---

61 movwf STACK_W ; push Wreg

62 swapf STATUS, W

63 movwf STACK_S ; push STATUS reg

レジスタの退避 『Wレジスタ』と『STATUSレジスタ』の値(内容)を

“STACK_W”と“STACK_S”に保存する。

Page 106: マイコンロボット実習

ポートB (PORTB) を参照

65 ; --- Read Sensor Status ---

66 movf PORTB, W

割り込みが発生したことで分かることは、 監視しているポート(PORTB)の値(bit)が

変化したことだけ。

Page 107: マイコンロボット実習

媒介変数 MOTOR のビット反転

68 ; --- Change MOTOR value ---

69 movlw B'00000110‘

70 xorwf MOTOR, F

Page 108: マイコンロボット実習

『 xorlf B‘00000110’』 命令の説明

eXclusive OR Literal with F の略

0 0 0 0 W 0 0 0 0

LSB MSB

0 0 0 0 Literal 0 1 1 0

Bit 4 Bit 5 Bit 6 Bit 7 Bit 3 Bit 2 Bit 1 Bit 0

0 0 0 0 W 0 1 1 0

XOR (排他的論理和) =

Page 109: マイコンロボット実習

『 xorlf B‘00000110’』 命令の説明

eXclusive OR Literal with F の略

0 0 0 0 W 0 1 1 0

LSB MSB

0 0 0 0 Literal 0 1 1 0

Bit 4 Bit 5 Bit 6 Bit 7 Bit 3 Bit 2 Bit 1 Bit 0

0 0 0 0 W 0 0 0 0

XOR (排他的論理和) =

Page 110: マイコンロボット実習

割込フラグのクリア

72 ; --- Clear RB Interrupt Flag ---

73 bcf INTCON, RBIF

次の割込処理(割込トリガ)を 受入れるための準備

Page 111: マイコンロボット実習

割り込み処理の後始末

75 ; --- pop register ---

76 swapf STACK_S, W

77 movwf STATUS

78 swapf STACK_W, F

79 swapf STACK_W, W

80 retfie

レジスタの復帰 『Wレジスタ』と『STATUSレジスタ』の値(内容)を

“STACK_W”と“STACK_S”から復帰する。

割込処理実行直前の命令へ戻る

Page 112: マイコンロボット実習

マイコンロボット実習 第5部

タイマ処理

Page 113: マイコンロボット実習

割込み処理

• タイマの使い方の理解

学習のポイント

Page 114: マイコンロボット実習

タイマとは

• 時間を計る周辺装置

• CPUサイクル毎にカウントアップする カウンタ

• カウンタがオーバーフローするたびに 割込みを発生させることが出来る。

Page 115: マイコンロボット実習

タイマ0

• PIC16F84に内蔵されているタイマは 『タイマ0』の一個だけ

• タイマ0のサイズは8ビット ⇒数えられる数は、0~255 255を超えると、オーバーフローして 0に戻る

Page 116: マイコンロボット実習

タイマの限界

• 単純にCPUの命令サイクルを数えるだけだと、2.5MHzで動作する場合

タイマの(オーバーフロー)周期

=(1/(周波数))*4 * タイマサイズ

=(1/(2.5*106)) * 4 * 256

=409.6*10-6 [sec] ≒ 400 [μsec]

1

Page 117: マイコンロボット実習

長い時間を計るためには?

• 解1:タイマのサイズを大きくする ⇒ 8ビット ⇒ 16ビット ⇒ 32ビット 回路が複雑になり、コストがかさむ

Page 118: マイコンロボット実習

長い時間を計るためには?

• 解2:分周する 複数サイクル毎にカウントアップさせる。 例えば、2サイクル毎に1カウントアップ 4サイクル毎に1カウントアップ ↓ 256サイクル毎に1カウントアップ

Page 119: マイコンロボット実習

プリスケーラ

• OPTION_REGの 0th~2th ビットで設定

2th 1th 0th スケール値

0 0 0 1:2

0 0 1 1:4

0 1 0 1:8

--- 途中省略 ---

1 1 1 1:256

Page 120: マイコンロボット実習

プリスケーラによる拡張

スケール値 1:2のとき

400 [μsec] * 2 = 800 [μsec]

スケール値 1:256のとき

400 [μsec] * 256 = 102400 [μsec] ≒ 100 [msec]

Page 121: マイコンロボット実習

その他のタイマの使い方

• 周波数カウンタ TOCKIピンに入力される信号の High/Lowの回数を数える。 ※信号の立ち上がり/立ち下がり どちらでカウントアップするか設定できる

Page 122: マイコンロボット実習

信号の模式図

High

Low

時間

立ち上がり 立ち下がり

Page 123: マイコンロボット実習

ウォッチドッグ・タイマ(WDT)

• 番犬

• システムの健全動作をチェックする

• WDTがオーバーフローすると マイコンがリセットされる

Page 124: マイコンロボット実習

WDTの使い方

• ユーザプログラムは定期的に

CLRWDT命令を実行してWDTをクリアする

• 万一、プログラムが暴走した場合は、CLRWDT命令が実行されないため、WDTがオーバーフローしてリセットが掛かる