• 検索結果がありません。

マイコンプログラミング講座

N/A
N/A
Protected

Academic year: 2021

シェア "マイコンプログラミング講座"

Copied!
71
0
0

読み込み中.... (全文を見る)

全文

(1)

マイコンプログラミング講座

(2)

2008/03/04 & 2008/03/11 マイコンプログラミング講座 2

はじめに

はじめに

回路ができてもプログラムが書けなければ意味がない

回路ができてもプログラムが書けなければ意味がない

ソフトゼミで触れた部分は、ソフトゼミの資料を見直すな

ソフトゼミで触れた部分は、ソフトゼミの資料を見直すな

どして

どして

ちょっと難しめに書いた気がするけど、そこは口頭で補足

ちょっと難しめに書いた気がするけど、そこは口頭で補足

ハードウェアマニュアル嫁

ハードウェアマニュアル嫁

ググれ

ググれ

(3)

使用するマイコン

使用するマイコン

マイコンキット

マイコンキット

モデル

モデル

:

:

秋月電子通商

秋月電子通商

AKI-H8/3664F(QFP)

AKI-H8/3664F(QFP)

タイニーマイコン

タイニーマイコン

キット

キット

価格

価格

:

:

¥

¥

1600

1600

サイズ

サイズ

: 40mm×25mm

: 40mm×25mm

クロック

クロック

: 16MHz

: 16MHz

(メイン)

(メイン)

32.768KHz

32.768KHz

(サブ)

(サブ)

3

3

端子レギュレーター、シリアル通信用の

端子レギュレーター、シリアル通信用の

IC

IC

等が実装済み

等が実装済み

(4)

2008/03/04 & 2008/03/11 マイコンプログラミング講座 4

マイコン

マイコン

マイコンキットの中央の黒いチップ

マイコンキットの中央の黒いチップ

Renesas H8/3664F

Renesas H8/3664F

16bit CPU

16bit CPU

タイマ

タイマ

A

A

、タイマ

、タイマ

V

V

、タイマ

、タイマ

W

W

10bit A/D

10bit A/D

変換器

変換器

シリアル通信インターフェース

シリアル通信インターフェース

フラッシュ

フラッシュ

ROM

ROM

(プログラム書き込み)

(プログラム書き込み)

32KB

32KB

RAM

RAM

(メモリ)

(メモリ)

2KB

2KB

(5)

必要なもの

必要なもの

マイコンキットと説明書

マイコンキットと説明書

秋月で買ってくる

秋月で買ってくる

3664

3664

の説明書は秋月の

の説明書は秋月の

Web

Web

サイトに置いてある

サイトに置いてある

H8/3664

H8/3664

グループ ハードウェアマニュアル

グループ ハードウェアマニュアル

HEW

HEW

(コンパイラと開発環境)無償評価版

(コンパイラと開発環境)無償評価版

FDT

FDT

(書き込みソフト)無償評価版

(書き込みソフト)無償評価版

3

3

つとも

つとも

Renesas

Renesas

からダウンロード

からダウンロード

USB→RS232C

USB→RS232C

変換ケーブル(ポートが無ければ)

変換ケーブル(ポートが無ければ)

秋月に安いのがある

秋月に安いのがある

(6)

2008/03/04 & 2008/03/11 マイコンプログラミング講座 6

とりあえずプログラムを書いてみよう

(7)

プロジェクトの作成

プロジェクトの作成

プロジェクトとソースコードを保存するディレクトリを設定

プロジェクトとソースコードを保存するディレクトリを設定

CPU

CPU

の種類を「

の種類を「

H8/300

H8/300

」に設定する

」に設定する

(8)

2008/03/04 & 2008/03/11 マイコンプログラミング講座 8

プロジェクトの作成

プロジェクトの作成

ツールチェインバージョンはそのまま

ツールチェインバージョンはそのまま

CPU

CPU

シリーズは「

シリーズは「

300H

300H

」 タイプは「

」 タイプは「

3664F

3664F

(9)

プロジェクトの作成

プロジェクトの作成

2

2

ページ目は変更せずに次へ

ページ目は変更せずに次へ

ハードウェアセットアップ関数生成を

ハードウェアセットアップ関数生成を

C/C++ source file

C/C++ source file

にする

にする

(10)

2008/03/04 & 2008/03/11 マイコンプログラミング講座 10

プロジェクトの作成

プロジェクトの作成

他のページもそのまま「次へ」をクリック

他のページもそのまま「次へ」をクリック

出来上がったワークスペース

出来上がったワークスペース

(11)

プログラム

プログラム

1

1

LED

LED

点滅プログラム

点滅プログラム

main

main

関数(

関数(

{$

{$

プロジェクト名

プロジェクト名

}.c

}.c

に作成されている)に次の

に作成されている)に次の

プログラムを入力

プログラムを入力

次のページ

次のページ

出来上がったら「ビルド」

出来上がったら「ビルド」

エラーが無ければ、プロジェクトディレクトリの

エラーが無ければ、プロジェクトディレクトリの

Debug

Debug

フォ

フォ

ルダに

ルダに

mot

mot

ファイルが作成される

ファイルが作成される

(12)

2008/03/04 & 2008/03/11 マイコンプログラミング講座 12

プログラム

プログラム

1

1

#include

#include ""iodefine.hiodefine.h"" #ifdef … #ifdef … 中略 中略 #endif #endif void main(void) { void main(void) { unsigned long i; unsigned long i; IO.PCR8 = 0xff; IO.PCR8 = 0xff; for (;;) { for (;;) { IO.PDR8.BYTE = 0xff; IO.PDR8.BYTE = 0xff; for (i = 0; i < 500000; i++); for (i = 0; i < 500000; i++); IO.PDR8.BYTE = 0x00; IO.PDR8.BYTE = 0x00; for (i = 0; i < 500000; i++); for (i = 0; i < 500000; i++); } } } }

(13)

プログラムを転送

プログラムを転送

出来上がったプログラムをマイコンに転送する

出来上がったプログラムをマイコンに転送する

転送には

(14)

2008/03/04 & 2008/03/11 マイコンプログラミング講座 14

FDT

FDT

プロジェクトの作成

プロジェクトの作成

H8/300H

(15)

FDT

FDT

プロジェクトの作成

プロジェクトの作成

ポートはマイコンを接続するポートを選択する

ポートはマイコンを接続するポートを選択する

ポート番号はデバイスマネージャで確認

ポート番号はデバイスマネージャで確認

(16)

2008/03/04 & 2008/03/11 マイコンプログラミング講座 16

FDT

FDT

プロジェクトの作成

プロジェクトの作成

入力クロックを

(17)

FDT

FDT

プロジェクトの作成

プロジェクトの作成

「ポーレート」を

「ポーレート」を

9600[bps]

9600[bps]

に設定

に設定

Use Default

Use Default

」のチェックを外す

」のチェックを外す

他のページは初期設定のままで

(18)

2008/03/04 & 2008/03/11 マイコンプログラミング講座 18

プロジェクトに追加

プロジェクトに追加

画面左のツリー上の作成されたプロジェクトを右クリックし

画面左のツリー上の作成されたプロジェクトを右クリックし

て「ファイルの追加」

て「ファイルの追加」

コンパイルして出来上がった

コンパイルして出来上がった

mot

mot

ファイルを選ぶ

ファイルを選ぶ

(19)

マイコンとの接続&書き込み

マイコンとの接続&書き込み

マイコンの電源を切る

マイコンの電源を切る

マイコンをブートモードに設定する

マイコンをブートモードに設定する

今回の場合は、ジャンパーピンを

今回の場合は、ジャンパーピンを

2

2

本挿す

本挿す

ケーブルを接続してマイコンの電源を入れる

ケーブルを接続してマイコンの電源を入れる

mot

mot

ファイルを右クリックして「

ファイルを右クリックして「

Download File

Download File

」をクリック

」をクリック

書き込みが始まる

書き込みが始まる

書き込みが終了したら「デバイス」→「デバイスの切断」

書き込みが終了したら「デバイス」→「デバイスの切断」

マイコンの電源を切る

マイコンの電源を切る

ブートモードを解除する

ブートモードを解除する

(20)

2008/03/04 & 2008/03/11 マイコンプログラミング講座 20

書き込んだプログラムを実行する

書き込んだプログラムを実行する

通常モードの状態でマイコンの電源を入れると、

通常モードの状態でマイコンの電源を入れると、

main

main

数が実行される

数が実行される

(21)

プログラミングの基礎知識

(22)

2008/03/04 & 2008/03/11 マイコンプログラミング講座 22

ビット

ビット

(bit)

(bit)

とバイト

とバイト

(byte)

(byte)

ビットとバイト

ビットとバイト

1[byte] = 8[bit]

1[byte] = 8[bit]

1[bit]

1[bit]

0

0

1

1

2

2

進数)

進数)

int

int

型のサイズはそのコンパイラで汎用的な大きさ

型のサイズはそのコンパイラで汎用的な大きさ

ex) PC

ex) PC

用のコンパイラ

用のコンパイラ

32bit

32bit

3664

3664

のコンパイラ

のコンパイラ

16bit

16bit

ong

ong

32bit

32bit

char

char

8bit

8bit

ここから先は

(23)

符号付き整数と符号なし整数

符号付き整数と符号なし整数

符号付き

符号付き

負の数も扱える

負の数も扱える

int

int

(signed int

(signed int

)

)

-32,768

-32,768

32,767

32,767

long

long

型(

型(

signed long

signed long

型)

型)

-2,147,483,648

-2,147,483,648

2,147,483,648

2,147,483,648

符号なし

符号なし

0

0

以上の数しか扱えない

以上の数しか扱えない

unsigned int

unsigned int

0

0

65,535

65,535

unsigned long

(24)

2008/03/04 & 2008/03/11 マイコンプログラミング講座 24

ビット演算

ビット演算

AND

AND

0 & 0 = 0

0 & 0 = 0

0 & 1 = 0

0 & 1 = 0

1 & 0 = 0

1 & 0 = 0

1 & 1 = 1

1 & 1 = 1

(0101)

(0101)

22

& (0100)

& (0100)

22

= (0100)

= (0100)

22

OR

OR

0 | 0 = 0

0 | 0 = 0

0 | 1 = 1

0 | 1 = 1

1 | 0 = 1

1 | 0 = 1

1 | 1 = 1

1 | 1 = 1

(0101)

(0101)

22

| (0010)

| (0010)

22

= (0111)

= (0111)

22

(25)

ビット演算

ビット演算

NOT

NOT

~0 = 1

~0 = 1

~1 = 0

~1 = 0

~(0101)

~(0101)

22

= (1010)

= (1010)

22

XOR

XOR

0 ^ 0 = 0

0 ^ 0 = 0

0 ^ 1 = 1

0 ^ 1 = 1

1 ^ 0 = 1

1 ^ 0 = 1

1 ^ 1 = 0

1 ^ 1 = 0

(0101)

(0101)

22

| (0010)

| (0010)

22

= (0111)

= (0111)

22

(26)

2008/03/04 & 2008/03/11 マイコンプログラミング講座 26

ビット演算

ビット演算

ビットシフト

ビットシフト

符号なしの場合

符号なしの場合

(10000010) (10000010)22 << 1 = (00000100) << 1 = (00000100)22 (00100011) (00100011)22 >> 1 = (00010001) >> 1 = (00010001)22 (10010000) (10010000)22 >> 2 = (00100100) >> 2 = (00100100)22

符号付きの場合

符号付きの場合

(00100010) (00100010)22 >> 1 = (00010001) >> 1 = (00010001)22 (10001000) (10001000)22 >> 2 = (11100010) >> 2 = (11100010)22

(27)

C

C

言語でビット演算

言語でビット演算

優先順位

優先順位

~

~

>

>

&

&

>

>

^

^

>

>

|

|

C

C

言語で

言語で

16

16

進数の書き方

進数の書き方

0xFF = (11111111)

0xFF = (11111111)

22

= (255)

= (255)

1010

(28)

2008/03/04 & 2008/03/11 マイコンプログラミング講座 28

問題

問題

変数

変数

x

x

2bit

2bit

目が

目が

1

1

であるかの条件文は?

であるかの条件文は?

0から数える(

0から数える(

1

1

から数える場合もある)

から数える場合もある)

1

1

の位…

の位…

0bit

0bit

if ( ) { if ( ) { /* x /* xのの2bit2bit目は目は1 */1 */ } }

(29)

問題

問題

(

(

回答

回答

)

)

変数

変数

x

x

2bit

2bit

目が

目が

1

1

であるかの条件文は?

であるかの条件文は?

0から数える(

0から数える(

1

1

から数える場合もある)

から数える場合もある)

1

1

の位…

の位…

0bit

0bit

if (x & 4 != 0) { if (x & 4 != 0) { /* x /* xのの2bit2bit目は目は1 */1 */ } } x = 6 → 0110 & 0100 = 0100 x = 6 → 0110 & 0100 = 0100 x = 10 → 1010 & 0100 = 0000 x = 10 → 1010 & 0100 = 0000

(30)

2008/03/04 & 2008/03/11 マイコンプログラミング講座 30

プリプロセッサ

プリプロセッサ

#define

#define

#define NAME TEXT

#define NAME TEXT

ソースコード中に現れた

ソースコード中に現れた

NAME

NAME

を単純に

を単純に

TEXT

TEXT

に置き換える。

に置き換える。

定数を宣言するときに使う事が多い

定数を宣言するときに使う事が多い

今は

今はconstconstを使いましょう を使いましょう const int MAX_SIZE = 10;const int MAX_SIZE = 10; #define HOGE printf("test\n")

#define HOGE printf("test\n")

#define N 10 #define N 10 int main(void) int main(void) { { HOGE; HOGE; printf("%d\n", N); printf("%d\n", N); return 0; return 0; } } の実行結果は? の実行結果は?

(31)

プリプロセッサ

プリプロセッサ

ヘッダーファイル

ヘッダーファイル

C

C

言語ファイルと拡張子以外の違いは無い

言語ファイルと拡張子以外の違いは無い

インクルードして使う場合は慣例的に「 インクルードして使う場合は慣例的に「.h.h」」

主に構造体の宣言や関数のプロトタイプ宣言を複数のソース

主に構造体の宣言や関数のプロトタイプ宣言を複数のソース

ファイルで共有するときに使う

ファイルで共有するときに使う

#include

#include

指定したファイルの内容を

指定したファイルの内容を

#include

#include

が書かれた位置に単純に挿

が書かれた位置に単純に挿

入する

入する

#include <headerfile.h>

#include <headerfile.h>

headerfile.h headerfile.hをインクルードパスに設定されたディレクトリから探すをインクルードパスに設定されたディレクトリから探す

#include

(32)

2008/03/04 & 2008/03/11 マイコンプログラミング講座 32

構造体と共用体

構造体と共用体

構造体

構造体

複数のメンバー変数を

複数のメンバー変数を

1

1

つにまとめる

つにまとめる

共用体

共用体

1

1

つの領域を複数のメンバーで共有する

つの領域を複数のメンバーで共有する

u.x = 0xFF00

u.x = 0xFF00

と代入することは

と代入することは

u.a = 0xFF, u.b = 0x00

u.a = 0xFF, u.b = 0x00

と同じ

と同じ

ただし ただしH8H8(ビッグエンディアン)の場合(ビッグエンディアン)の場合 int x; char a; char b; char a; char b; struct EXAMPLE1 { struct EXAMPLE1 { char a; char a; char b; char b; } } union EXAMPLE2 { union EXAMPLE2 { int x; int x;

struct EXAMPLE1 ex;

struct EXAMPLE1 ex;

} u;

(33)

構造体と共用体

構造体と共用体

ex2

ex2

の領域を

の領域を

ex (struct EXAMPE1

ex (struct EXAMPE1

)

)

としてアクセスする

としてアクセスする

か、

か、

x (int

x (int

)

)

としてアクセスするか選べる

としてアクセスするか選べる

int w; int w; char z; char z;

struct EXAMPLE1 ex1;

struct EXAMPLE1 ex1;

struct EXAMPLE2 ex2;

struct EXAMPLE2 ex2;

ex2.ex.a = 1; ex2.ex.a = 1; ex2.ex.b = 0; ex2.ex.b = 0; とすると、 とすると、 ex2.x ex2.xはは256256になるになる w w z z ex1.a ex1.a ex1.b ex1.b ex1 ex1 メモリー メモリー

(34)

2008/03/04 & 2008/03/11 マイコンプログラミング講座 34

ビットフィールド

ビットフィールド

構造体をビット単位で作ることができる

構造体をビット単位で作ることができる

struct TEST { struct TEST { unsigned char B76:2; unsigned char B76:2; unsigned char B54:2; unsigned char B54:2; unsigned char B32:2; unsigned char B32:2; unsigned char B1 :1; unsigned char B1 :1; unsigned char B0 :1; unsigned char B0 :1; } }

全体は8bit

B76

B54

B32

B1

B0

0 1 1 0 0 0 0 1 struct TEST t; struct TEST t; t.B76 = 1; t.B76 = 1; t.B54 = 2; t.B54 = 2; t.B32 = 0; t.B32 = 0; t.B1 = 0; t.B1 = 0; t.B0 = 1; t.B0 = 1;

(35)

汎用入出力ポート

(36)

2008/03/04 & 2008/03/11 マイコンプログラミング講座 36

汎用入出力ポート

汎用入出力ポート

ポート

ポート

マイコンの足

マイコンの足

それぞれのポートにはアドレス(ポインタ)が割り当てられている

それぞれのポートにはアドレス(ポインタ)が割り当てられている

1

1

つのポートには複数の機能が割り当てられている

つのポートには複数の機能が割り当てられている

ポートコントロールレジスタに値を設定し、どの機能を使うか選択 ポートコントロールレジスタに値を設定し、どの機能を使うか選択 ex) P50

ex) P50ととWKP0WKP0、、PB4PB4ととAN0AN0

そもそもレジスタって何よ

そもそもレジスタって何よ

CPU

CPU

に配置された変数

に配置された変数

ポインタが割り当てられているので

ポインタが割り当てられているので

C

C

言語からアクセスできる

言語からアクセスできる

(37)

汎用入出力ポート

汎用入出力ポート

汎用入出力ポート

汎用入出力ポート

P1

P1

(ポート

(ポート

1

1

)、

)、

P2

P2

P5

P5

P7

P7

P8

P8

PB

PB

がある

がある

出力

出力

データレジスタに設定した値に応じてポートの電圧が変わる データレジスタに設定した値に応じてポートの電圧が変わる 0→0V 0→0V、、1→5V 1→5V ((GNDGNDをを0V0Vとした場合)とした場合)

入力

入力

ポートの電圧に応じてデータレジスタの値が変わる( ポートの電圧に応じてデータレジスタの値が変わる(0, 10, 1))

P8

P8

大電流ポート(他より大きな電流が流れる)

大電流ポート(他より大きな電流が流れる)

実験用基板で

実験用基板で

LED

LED

が接続されている

が接続されている

ハードウェアマニュアルを見てみよう

ハードウェアマニュアルを見てみよう

(38)

2008/03/04 & 2008/03/11 マイコンプログラミング講座 38

LED

LED

を点滅させる

を点滅させる

ポート

ポート

8

8

を汎用出力に設定する

を汎用出力に設定する

PCR8

PCR8

(ポートコントロールレジスタ

(ポートコントロールレジスタ

8

8

)を

)を

1

1

にする

にする

出力する

出力する

PDR8

PDR8

(ポートデータレジスタ

(ポートデータレジスタ

8

8

)に値を代入すると

)に値を代入すると

値に応じた電圧が出力される

値に応じた電圧が出力される

レジスタとポートの対応

レジスタとポートの対応

PCR8

PCR8

PDR8

PDR8

)レジスタのビット

)レジスタのビット

0 → P80

0 → P80

CN2-9

CN2-9

PCR8

PCR8

PDR8

PDR8

)レジスタのビット

)レジスタのビット

1 → P81

1 → P81

CN2-10

CN2-10

PCR8

PCR8

PDR8

PDR8

)レジスタのビット

)レジスタのビット

7 → P87

7 → P87

CN2-16

CN2-16

(39)

LED

LED

を点滅させる

を点滅させる

C

C

言語で書くと

言語で書くと

void main(void) void main(void) { { unsigned long i; unsigned long i; IO.PCR8 = 0xff; IO.PCR8 = 0xff; //P80//P80~~P87P87を出力に設定を出力に設定 for (;;) { for (;;) { IO.PDR8.BIT.B0 = 0x01; IO.PDR8.BIT.B0 = 0x01; //P81//P81にに11を出力を出力 for (i = 0; i < 100000; i++) { for (i = 0; i < 100000; i++) { ; // ; //何もしない(時間稼ぎ)何もしない(時間稼ぎ) } } IO.PDR8.BIT.B0 = 0x00; IO.PDR8.BIT.B0 = 0x00; //P81//P81にに00を出力を出力 for (i = 0; i < 100000; i++) { for (i = 0; i < 100000; i++) { ; // ; //何もしない(時間稼ぎ)何もしない(時間稼ぎ) } }

(40)

2008/03/04 & 2008/03/11 マイコンプログラミング講座 40

レジスタへのアクセス

レジスタへのアクセス

IO.PCR8

IO.PCR8

って一体どうなってるの?

って一体どうなってるの?

iodefine.h

iodefine.h

で定義されている

で定義されている

IO

IO

struct st_io struct st_io型でレジスタが指定されている型でレジスタが指定されている st_io

st_ioのメンバーにのメンバーにPCR8PCR8がある(がある(unsigned charunsigned char型)型)

volatile

volatile

最適化禁止

最適化禁止

詳しい話は各自調べて

詳しい話は各自調べて

(41)

レジスタへのアクセス

レジスタへのアクセス

んじゃ、

んじゃ、

IO.PDR.BIT.B0

IO.PDR.BIT.B0

は?

は?

PDR8

PDR8

は共用体 アクセス方法を選べる

は共用体 アクセス方法を選べる

unsigned char BYTE;

unsigned char BYTE;

struct {} struct {}

BIT

BIT

は構造体でビットフィールド

は構造体でビットフィールド

ビットに直接アクセス ビットに直接アクセス

アクセス方法を選べる

アクセス方法を選べる

IO.PDR.BIT.B0 = 1

IO.PDR.BIT.B0 = 1

IO.PDR.BYTE = IO.PDR.BYTE | 0x01

IO.PDR.BYTE = IO.PDR.BYTE | 0x01

は同じ

は同じ

前者の方が便利

(42)

2008/03/04 & 2008/03/11 マイコンプログラミング講座 42

プログラム

プログラム

2

2

8

8

個の

個の

LED

LED

のうち

のうち

4

4

個ずつ交互に点灯するプログラム

個ずつ交互に点灯するプログラム

まずは

まずは

BIT.B0 = 1

BIT.B0 = 1

を使って書く

を使って書く

次はビット演算を使ってみよう

次はビット演算を使ってみよう

こっちの方が、かなり楽だよね? こっちの方が、かなり楽だよね?

(43)

プログラム

プログラム

3

3

8

8

つの

つの

LED

LED

1

1

個ずつ順に点灯

個ずつ順に点灯

[○○…○○◎] → [○○…○◎○] → … → [◎○…○○○]

[○○…○○◎] → [○○…○◎○] → … → [◎○…○○○]

最初に戻る

最初に戻る

ビットシフトを使ってみよう

ビットシフトを使ってみよう

BIT BITを使うと、かなりメンドクサイを使うと、かなりメンドクサイ

(44)

2008/03/04 & 2008/03/11 マイコンプログラミング講座 44

入力を使ってみる

入力を使ってみる

P50

P50

CN1-14

CN1-14

)に接続されたボタンが押されると…

)に接続されたボタンが押されると…

GND

GND

と接続されるので

と接続されるので

P50

P50

0V

0V

になる

になる

放された状態だと

放された状態だと

5V

5V

ポートを入力に設定すると、

ポートを入力に設定すると、

PDR

PDR

のビットに値が格納され

のビットに値が格納され

P50

P50

の状態は

の状態は

PDR5

PDR5

0

0

ビット目

ビット目

P50

P50

を汎用入力に設定するには

を汎用入力に設定するには

P50

P50

は標準状態で汎用入力に設定されている

は標準状態で汎用入力に設定されている

ハードウェアマニュアルを見る

ハードウェアマニュアルを見る

if (IO.PDR5.BIT.B0 == 0) { if (IO.PDR5.BIT.B0 == 0) { // //ボタンが押されているボタンが押されている } }

(45)

プログラム

プログラム

4

4

次のプログラムを作ってみよう

次のプログラムを作ってみよう

ボタンが押されている→

ボタンが押されている→

LED

LED

全点灯

全点灯

ボタンが放されている→

ボタンが放されている→

LED

LED

消灯

消灯

ヒント

ヒント

ひたすら、スイッチの状態をチェックする

ひたすら、スイッチの状態をチェックする

(46)

2008/03/04 & 2008/03/11 マイコンプログラミング講座 46

プログラム

プログラム

5

5

電子ルーレットを作ってみよう

(47)

モータードライバー

(48)

2008/03/04 & 2008/03/11 マイコンプログラミング講座 48

モータードライバー

モータードライバー

IC

IC

の使い方

の使い方

TA8428K

TA8428K

東芝セミコンダクターの小型モーター用、モータードライバ

東芝セミコンダクターの小型モーター用、モータードライバ

信号ピン(

信号ピン(

IN1

IN1

IN2

IN2

)の値で回転方向をコントロールする優れも

)の値で回転方向をコントロールする優れも

新月のモータードライバは、高出力で、速度も変えられる 新月のモータードライバは、高出力で、速度も変えられる

データシートを見てみよう

データシートを見てみよう

入力と動作

入力と動作

IN1, IN2

IN1, IN2

=

=

(0, 0)

(0, 0)

ストップ

ストップ

(1, 0)

(1, 0)

正転

正転

(0, 1)

(0, 1)

逆転

逆転

(1, 1)

(1, 1)

ブレーキ

ブレーキ

(49)

プログラム

プログラム

6

6

モーターを正転させるプログラムを書いてみよう

モーターを正転させるプログラムを書いてみよう

モータードライバは

モータードライバは

P80

P80

IN1

IN1

P81

P81

IN2

IN2

に接続されている

に接続されている

一定間隔で正転と逆転を切り替えるプログラムを書いて

一定間隔で正転と逆転を切り替えるプログラムを書いて

みよう

(50)

2008/03/04 & 2008/03/11 マイコンプログラミング講座 50

割り込み

(51)

割り込み

割り込み

現在実行しているプログラムを中断して、指定された処

現在実行しているプログラムを中断して、指定された処

理を実行する

理を実行する

この処理が終わったら、元の処理に戻る

この処理が終わったら、元の処理に戻る

割り込みの要因に対応した、割り込み処理を定義する

割り込みの要因に対応した、割り込み処理を定義する

main()

main() INT_WKP()INT_WKP() (割り込み)

(割り込み)

中断

(52)

2008/03/04 & 2008/03/11 マイコンプログラミング講座 52

割り込みのメリット

割り込みのメリット

今までの方法では、入力待ちの間、無駄なループがあっ

今までの方法では、入力待ちの間、無駄なループがあっ

他の作業ができない

他の作業ができない

この動作が白線検知であれば、敵を見つけられない

この動作が白線検知であれば、敵を見つけられない

(53)

割り込み

割り込み

主な割り込みの種類

主な割り込みの種類

NMI

NMI

NMI

NMI

端子が

端子が

0

0

になると発生する

になると発生する

優先度が最も高い& 優先度が最も高い&NMINMIを止めることはできない(緊急停止など)を止めることはできない(緊急停止など)

IRQ

IRQ

端子 

端子 

WKP

WKP

端子が指定した条件を満たすと発生する

端子が指定した条件を満たすと発生する

0 0からから11に変化したとき(立ち上がりエッジ)に変化したとき(立ち上がりエッジ) 1 1からから00に変化したとき(立ち下がりエッジ)に変化したとき(立ち下がりエッジ)

タイマ タイマーカウンタが設定値に達したとき

タイマ タイマーカウンタが設定値に達したとき

A/D

A/D

変換やシリアル通信の処理が終了したとき

変換やシリアル通信の処理が終了したとき

優先順位

優先順位

高い優先順位の割り込みは、低い優先順位の割り込み処理中

高い優先順位の割り込みは、低い優先順位の割り込み処理中

にも割り込める

にも割り込める

(54)

2008/03/04 & 2008/03/11 マイコンプログラミング講座 54

割り込み

割り込み

IRQ

IRQ

ポートと

ポートと

WKP

WKP

ポートの違い

ポートの違い

IRQ

IRQ

ポート

ポート

IRQ0

IRQ0~~IRQ3IRQ3があり、それぞれに対して割り込み処理を定義できるがあり、それぞれに対して割り込み処理を定義できる void INT_IRQ0(void) void INT_IRQ0(void) void INT_IRQ1(void) void INT_IRQ1(void) void INT_IRQ2(void) void INT_IRQ2(void) void INT_IRQ3(void) void INT_IRQ3(void)

WKP

WKP

ポート

ポート

WKP0 WKP0~~WKP5WKP5があり、共通の割り込み処理を定義するがあり、共通の割り込み処理を定義する 割り込み発生条件はポート別に設定できる 割り込み発生条件はポート別に設定できる void INT_WKP(void) void INT_WKP(void)

(55)

割り込み関数の書き方

割り込み関数の書き方

割り込み処理を割り込み関数として書く

割り込み処理を割り込み関数として書く

HEW

HEW

で自動生成された

で自動生成された

intprg.c

intprg.c

を編集する

を編集する

__interrupt(vect=18) void INT_WKP(void) {

__interrupt(vect=18) void INT_WKP(void) {

/* /* * * 空の関数が用意されているので、編集する空の関数が用意されているので、編集する * * ここに割り込み処理を書くここに割り込み処理を書く */ */ } }

(56)

2008/03/04 & 2008/03/11 マイコンプログラミング講座 56

割り込みを使ってみる

割り込みを使ってみる

スイッチが

スイッチが

WKP0

WKP0

端子(

端子(

CN1-14

CN1-14

)に接続されている

)に接続されている

実は

実は

IRQ0

IRQ0

に接続するつもりで間違えた…

に接続するつもりで間違えた…

ポートの初期化(ポートモードの設定など)は

ポートの初期化(ポートモードの設定など)は

hwsetup.c

hwsetup.c

HardwareSetup

HardwareSetup

関数に書く

関数に書く

前半で使用した

前半で使用した

PCR

PCR

の設定も

の設定も

自動生成されたソースコードを追えば分かるはず

自動生成されたソースコードを追えば分かるはず

割り込み禁止状態で呼び出される

割り込み禁止状態で呼び出される

(57)

割り込みを使ってみる(準備)

割り込みを使ってみる(準備)

ポートモードの変更

ポートモードの変更

ポートモードレジスタ

ポートモードレジスタ

(PMR)

(PMR)

WKP0

WKP0

を有効にする

を有効にする

条件の設定

条件の設定

割り込みエッジセレクトレジスタで条件を設定

割り込みエッジセレクトレジスタで条件を設定

割り込みの有効

割り込みの有効

割り込みイネーブルレジスタ(

割り込みイネーブルレジスタ(

IENR

IENR

)で

)で

WKP

WKP

による割り込みを有

による割り込みを有

効にする

効にする

参照

参照

ハードウェアマニュアル

ハードウェアマニュアル

3. 3.例外処理例外処理

(58)

2008/03/04 & 2008/03/11 マイコンプログラミング講座 58

割り込みを使ってみる(準備)

割り込みを使ってみる(準備)

ポートを設定する

ポートを設定する

void HardwareSetup(void) void HardwareSetup(void) { { 他のポートの設定 他のポートの設定 IO.PMR5.BIT.WKP0 = 1; IO.PMR5.BIT.WKP0 = 1; /* WKP0/* WKP0として使う として使う */*/ IEGR2.BIT.WPEG0 = 0; IEGR2.BIT.WPEG0 = 0; /* /* 立ち下がりエッジで割り込み 立ち下がりエッジで割り込み */*/ IENR1.BIT.IENWP = 1; IENR1.BIT.IENWP = 1; /* WKP/* WKPポートの割り込みを有効化 ポートの割り込みを有効化 */*/ } }

(59)

割り込みを使ってみる(処理)

割り込みを使ってみる(処理)

割り込み関数を編集する

割り込み関数を編集する

iodefine.h

iodefine.h

のインクルードを忘れずに

のインクルードを忘れずに

!!

!!

まず割り込み要求フラグをクリアする

まず割り込み要求フラグをクリアする

IRQ

IRQ

ポートなど、他の割り込みの場合も、相当する要求フラグを

ポートなど、他の割り込みの場合も、相当する要求フラグを

クリアする

クリアする

割り込み処理完了通知 割り込み処理完了通知 クリアしないと、何度も割り込み関数が実行されてしまう クリアしないと、何度も割り込み関数が実行されてしまう

__interrupt(vect=18) void INT_WKP(void) {

__interrupt(vect=18) void INT_WKP(void) {

/* WKP0

/* WKP0の割り込み要求フラグをクリア の割り込み要求フラグをクリア */*/

IWPR.BIT.IWPF0 = 0;

(60)

2008/03/04 & 2008/03/11 マイコンプログラミング講座 60

割り込み禁止

割り込み禁止

割り込みを禁止すると、割り込みが発生できなくできる

割り込みを禁止すると、割り込みが発生できなくできる

割り込みが発生するとマズイタイミングで使用する

割り込みが発生するとマズイタイミングで使用する

詳細は各自調べて(相撲ロボットのプログラムでは必要)

詳細は各自調べて(相撲ロボットのプログラムでは必要)

割り込み禁止

割り込み禁止

set_imask_ccr(1);

set_imask_ccr(1);

割り込み禁止解除

割り込み禁止解除

set_imask_ccr(0);

set_imask_ccr(0);

割り込み禁止区間に入る際に、状態が分からない場合

割り込み禁止区間に入る際に、状態が分からない場合

unsigned char ccr; unsigned char ccr; ccr = get_imask_ccr(); ccr = get_imask_ccr();  /* /* 状態を待避 状態を待避 */*/ set_imask_ccr(1); set_imask_ccr(1); 割り込み禁止で実行する処理 割り込み禁止で実行する処理 set_imask_ccr(ccr); set_imask_ccr(ccr);

(61)

プログラム

プログラム

7

7

プログラム

プログラム

6

6

を改造して、ボタンが押されたらモーターを

を改造して、ボタンが押されたらモーターを

止めるプログラムを書いてみよう

止めるプログラムを書いてみよう

main

main

関数は終了してしまうと困るので、今回は無限ループを入

関数は終了してしまうと困るので、今回は無限ループを入

れておく

れておく

(62)

2008/03/04 & 2008/03/11 マイコンプログラミング講座 62

タイマ

(63)

タイマ

タイマ

今までは無駄な

今までは無駄な

for

for

文で時間調整をしていた

文で時間調整をしていた

正確な時間を計りたい

正確な時間を計りたい

他の作業ができない→割り込みを使いたい

他の作業ができない→割り込みを使いたい

タイマ

タイマ

一定間隔でタイマレジスタをカウントアップ

一定間隔でタイマレジスタをカウントアップ

タイマーレジスタの値が条件を満たせば、割り込みを発生

タイマーレジスタの値が条件を満たせば、割り込みを発生

(64)

2008/03/04 & 2008/03/11 マイコンプログラミング講座 64

タイマの種類

タイマの種類

タイマの種類(詳しくはハードウェアマニュアル)

タイマの種類(詳しくはハードウェアマニュアル)

タイマ

タイマ

A →

A →

今回はこれを使う

今回はこれを使う

1 1~~8kHz8kHz 時計 時計 広い間隔 広い間隔 AKI-H8/3664 AKI-H8/3664ではでは32.768KHz32.768KHzのクリスタルが接続されているのクリスタルが接続されている

タイマ

タイマ

V

V

8bit 8bitタイマタイマ

タイマ

タイマ

W

W

16bit 16bitタイマタイマ 短い間隔 短い間隔 PWM PWM(最大(最大33出力)など出力)など

(65)

タイマ

タイマ

A

A

の初期化

の初期化

0.5

0.5

秒タイマに設定し、割り込みを有効にする

秒タイマに設定し、割り込みを有効にする

ハードウェアマニュアルのタイマ

ハードウェアマニュアルのタイマ

A

A

を参照

を参照

void HardwareSetup(void) void HardwareSetup(void) { { TA.TMA.BIT.CKSI = 0x09; TA.TMA.BIT.CKSI = 0x09; /* (1001)2 0.5/* (1001)2 0.5秒タイマ 秒タイマ */*/ IENR1.BIT.IENTA = 1; IENR1.BIT.IENTA = 1; /* /* タイマタイマAAの割り込みを有効 の割り込みを有効 */*/ /* LED /* LED点滅用 点滅用 */*/ IO.PCR8 = 0xff; IO.PCR8 = 0xff; } }

(66)

2008/03/04 & 2008/03/11 マイコンプログラミング講座 66

タイマ

タイマ

A

A

の割り込み関数

の割り込み関数

他の割り込みと同様に

他の割り込みと同様に

intprg.c

intprg.c

を編集する

を編集する

__interrupt(vect=19) void INT_TimerA(void) {

__interrupt(vect=19) void INT_TimerA(void) {

/* /* タイマタイマAA((TATA)の割り込み要求フラグをクリア )の割り込み要求フラグをクリア */*/ IRR1.BIT.IRRTA = 0; IRR1.BIT.IRRTA = 0; /* /* ここに割り込み処理を書く ここに割り込み処理を書く */*/ /* LED /* LED点滅 点滅 */*/ IO.PDR8.BYTE = ~IO.PDR8.BYTE; IO.PDR8.BYTE = ~IO.PDR8.BYTE; } }

(67)

プログラム

プログラム

8

8

4

4

秒ごとにモーターの回転方向を変えるプログラムを書い

秒ごとにモーターの回転方向を変えるプログラムを書い

てみよう

てみよう

8

8

0.5

0.5

秒の割り込みが発生

秒の割り込みが発生

大域変数を使う(または

大域変数を使う(または

static

static

変数)

変数)

(68)

2008/03/04 & 2008/03/11 マイコンプログラミング講座 68

その他の機能

その他の機能

(相撲ロボットには必要)

(69)

シリアル通信

シリアル通信

RS232C

RS232C

を通して、

を通して、

PC

PC

に文字列を送信したりするのに使う

に文字列を送信したりするのに使う

デバッグなどに便利

デバッグなどに便利

新月用に軽量版

新月用に軽量版

stdio

stdio

ライブラリがある

ライブラリがある

流用するなり、参考にするなり…

流用するなり、参考にするなり…

(70)

2008/03/04 & 2008/03/11 マイコンプログラミング講座 70

A/D

A/D

変換

変換

アナログ→デジタル変換

アナログ→デジタル変換

ポートの電圧を測定し

ポートの電圧を測定し

10bit

10bit

の整数として取得する

の整数として取得する

汎用入力では、ポートの電圧が閾値より高いと

汎用入力では、ポートの電圧が閾値より高いと

1

1

、低いと

、低いと

0

0

新月の

新月の

PSD

PSD

センサーは距離に応じた電圧を出力

センサーは距離に応じた電圧を出力

電圧を測定して、距離を計算する

電圧を測定して、距離を計算する

(71)

その他

その他

PWM

PWM

出力(タイマ

出力(タイマ

W

W

サーボモーターの制御やモーターの速度制御に必要

サーボモーターの制御やモーターの速度制御に必要

ポートプルアップ

ポートプルアップ

ポートをプルアップする

ポートをプルアップする

参照

関連したドキュメント

IDLE 、 STOP1 、 STOP2 モードを解除可能な割り込みは、 INTIF を経由し INTIF 内の割り. 込み制御レジスター A で制御され CPU へ通知されます。

【通常のぞうきんの様子】

であり、 今日 までの日 本の 民族精神 の形 成におい て大

、肩 かた 深 ふかさ を掛け合わせて、ある定数で 割り、積石数を算出する近似計算法が 使われるようになりました。この定数は船

大阪府では、これまで大切にしてきた、子ども一人ひとりが違いを認め合いそれぞれの力

「就労に向けたステップアップ」と設定し、それぞれ目標値を設定した。ここで

あれば、その逸脱に対しては N400 が惹起され、 ELAN や P600 は惹起しないと 考えられる。もし、シカの認可処理に統語的処理と意味的処理の両方が関わっ

マニピュレータで、プール 内のがれきの撤去や燃料取 り出しをサポートする テンシルトラスには,2本 のマニピュレータが設置さ