マイコンプログラミング講座
2008/03/04 & 2008/03/11 マイコンプログラミング講座 2
はじめに
はじめに
回路ができてもプログラムが書けなければ意味がない
回路ができてもプログラムが書けなければ意味がない
ソフトゼミで触れた部分は、ソフトゼミの資料を見直すな
ソフトゼミで触れた部分は、ソフトゼミの資料を見直すな
どして
どして
ちょっと難しめに書いた気がするけど、そこは口頭で補足
ちょっと難しめに書いた気がするけど、そこは口頭で補足
ハードウェアマニュアル嫁
ハードウェアマニュアル嫁
ググれ
ググれ
使用するマイコン
使用するマイコン
マイコンキット
マイコンキット
モデル
モデル
:
:
秋月電子通商
秋月電子通商
AKI-H8/3664F(QFP)
AKI-H8/3664F(QFP)
タイニーマイコン
タイニーマイコン
キット
キット
価格
価格
:
:
¥
¥
1600
1600
サイズ
サイズ
: 40mm×25mm
: 40mm×25mm
クロック
クロック
: 16MHz
: 16MHz
(メイン)
(メイン)
32.768KHz
32.768KHz
(サブ)
(サブ)
3
3
端子レギュレーター、シリアル通信用の
端子レギュレーター、シリアル通信用の
IC
IC
等が実装済み
等が実装済み
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
必要なもの
必要なもの
マイコンキットと説明書
マイコンキットと説明書
秋月で買ってくる
秋月で買ってくる
3664
3664
の説明書は秋月の
の説明書は秋月の
Web
Web
サイトに置いてある
サイトに置いてある
H8/3664
H8/3664
グループ ハードウェアマニュアル
グループ ハードウェアマニュアル
HEW
HEW
(コンパイラと開発環境)無償評価版
(コンパイラと開発環境)無償評価版
FDT
FDT
(書き込みソフト)無償評価版
(書き込みソフト)無償評価版
3
3
つとも
つとも
Renesas
Renesas
からダウンロード
からダウンロード
USB→RS232C
USB→RS232C
変換ケーブル(ポートが無ければ)
変換ケーブル(ポートが無ければ)
秋月に安いのがある
秋月に安いのがある
2008/03/04 & 2008/03/11 マイコンプログラミング講座 6
とりあえずプログラムを書いてみよう
プロジェクトの作成
プロジェクトの作成
プロジェクトとソースコードを保存するディレクトリを設定
プロジェクトとソースコードを保存するディレクトリを設定
CPU
CPU
の種類を「
の種類を「
H8/300
H8/300
」に設定する
」に設定する
2008/03/04 & 2008/03/11 マイコンプログラミング講座 8
プロジェクトの作成
プロジェクトの作成
ツールチェインバージョンはそのまま
ツールチェインバージョンはそのまま
CPU
CPU
シリーズは「
シリーズは「
300H
300H
」 タイプは「
」 タイプは「
3664F
3664F
」
」
プロジェクトの作成
プロジェクトの作成
2
2
ページ目は変更せずに次へ
ページ目は変更せずに次へ
ハードウェアセットアップ関数生成を
ハードウェアセットアップ関数生成を
C/C++ source file
C/C++ source file
にする
にする
2008/03/04 & 2008/03/11 マイコンプログラミング講座 10
プロジェクトの作成
プロジェクトの作成
他のページもそのまま「次へ」をクリック
他のページもそのまま「次へ」をクリック
出来上がったワークスペース
出来上がったワークスペース
プログラム
プログラム
1
1
LED
LED
点滅プログラム
点滅プログラム
main
main
関数(
関数(
{$
{$
プロジェクト名
プロジェクト名
}.c
}.c
に作成されている)に次の
に作成されている)に次の
プログラムを入力
プログラムを入力
次のページ
次のページ
出来上がったら「ビルド」
出来上がったら「ビルド」
エラーが無ければ、プロジェクトディレクトリの
エラーが無ければ、プロジェクトディレクトリの
Debug
Debug
フォ
フォ
ルダに
ルダに
mot
mot
ファイルが作成される
ファイルが作成される
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++); } } } }
プログラムを転送
プログラムを転送
出来上がったプログラムをマイコンに転送する
出来上がったプログラムをマイコンに転送する
転送には
2008/03/04 & 2008/03/11 マイコンプログラミング講座 14
FDT
FDT
プロジェクトの作成
プロジェクトの作成
H8/300H
FDT
FDT
プロジェクトの作成
プロジェクトの作成
ポートはマイコンを接続するポートを選択する
ポートはマイコンを接続するポートを選択する
ポート番号はデバイスマネージャで確認
ポート番号はデバイスマネージャで確認
2008/03/04 & 2008/03/11 マイコンプログラミング講座 16
FDT
FDT
プロジェクトの作成
プロジェクトの作成
入力クロックを
FDT
FDT
プロジェクトの作成
プロジェクトの作成
「ポーレート」を
「ポーレート」を
9600[bps]
9600[bps]
に設定
に設定
「
「
Use Default
Use Default
」のチェックを外す
」のチェックを外す
他のページは初期設定のままで
2008/03/04 & 2008/03/11 マイコンプログラミング講座 18
プロジェクトに追加
プロジェクトに追加
画面左のツリー上の作成されたプロジェクトを右クリックし
画面左のツリー上の作成されたプロジェクトを右クリックし
て「ファイルの追加」
て「ファイルの追加」
コンパイルして出来上がった
コンパイルして出来上がった
mot
mot
ファイルを選ぶ
ファイルを選ぶ
マイコンとの接続&書き込み
マイコンとの接続&書き込み
マイコンの電源を切る
マイコンの電源を切る
マイコンをブートモードに設定する
マイコンをブートモードに設定する
今回の場合は、ジャンパーピンを
今回の場合は、ジャンパーピンを
2
2
本挿す
本挿す
ケーブルを接続してマイコンの電源を入れる
ケーブルを接続してマイコンの電源を入れる
mot
mot
ファイルを右クリックして「
ファイルを右クリックして「
Download File
Download File
」をクリック
」をクリック
書き込みが始まる
書き込みが始まる
書き込みが終了したら「デバイス」→「デバイスの切断」
書き込みが終了したら「デバイス」→「デバイスの切断」
マイコンの電源を切る
マイコンの電源を切る
ブートモードを解除する
ブートモードを解除する
2008/03/04 & 2008/03/11 マイコンプログラミング講座 20
書き込んだプログラムを実行する
書き込んだプログラムを実行する
通常モードの状態でマイコンの電源を入れると、
通常モードの状態でマイコンの電源を入れると、
main
main
関
関
数が実行される
数が実行される
プログラミングの基礎知識
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
l
l
ong
ong
型
型
32bit
32bit
char
char
型
型
8bit
8bit
ここから先は
符号付き整数と符号なし整数
符号付き整数と符号なし整数
符号付き
符号付き
負の数も扱える
負の数も扱える
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
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)
22OR
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ビット演算
ビット演算
NOT
NOT
~0 = 1
~0 = 1
~1 = 0
~1 = 0
~(0101)
~(0101)
22= (1010)
= (1010)
22XOR
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)
222008/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)22C
C
言語でビット演算
言語でビット演算
優先順位
優先順位
「
「
~
~
」
」
>
>
「
「
&
&
」
」
>
>
「
「
^
^
」
」
>
>
「
「
|
|
」
」
C
C
言語で
言語で
16
16
進数の書き方
進数の書き方
0xFF = (11111111)
0xFF = (11111111)
22= (255)
= (255)
10102008/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 */ } }問題
問題
(
(
回答
回答
)
)
変数
変数
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 = 00002008/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; } } の実行結果は? の実行結果は?
プリプロセッサ
プリプロセッサ
ヘッダーファイル
ヘッダーファイル
C
C
言語ファイルと拡張子以外の違いは無い
言語ファイルと拡張子以外の違いは無い
インクルードして使う場合は慣例的に「 インクルードして使う場合は慣例的に「.h.h」」主に構造体の宣言や関数のプロトタイプ宣言を複数のソース
主に構造体の宣言や関数のプロトタイプ宣言を複数のソース
ファイルで共有するときに使う
ファイルで共有するときに使う
#include
#include
指定したファイルの内容を
指定したファイルの内容を
#include
#include
が書かれた位置に単純に挿
が書かれた位置に単純に挿
入する
入する
#include <headerfile.h>
#include <headerfile.h>
headerfile.h headerfile.hをインクルードパスに設定されたディレクトリから探すをインクルードパスに設定されたディレクトリから探す#include
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;
構造体と共用体
構造体と共用体
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 メモリー メモリー
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;汎用入出力ポート
2008/03/04 & 2008/03/11 マイコンプログラミング講座 36
汎用入出力ポート
汎用入出力ポート
ポート
ポート
マイコンの足
マイコンの足
それぞれのポートにはアドレス(ポインタ)が割り当てられている
それぞれのポートにはアドレス(ポインタ)が割り当てられている
1
1
つのポートには複数の機能が割り当てられている
つのポートには複数の機能が割り当てられている
ポートコントロールレジスタに値を設定し、どの機能を使うか選択 ポートコントロールレジスタに値を設定し、どの機能を使うか選択 ex) P50ex) P50ととWKP0WKP0、、PB4PB4ととAN0AN0
そもそもレジスタって何よ
そもそもレジスタって何よ
CPU
CPU
に配置された変数
に配置された変数
ポインタが割り当てられているので
ポインタが割り当てられているので
C
C
言語からアクセスできる
言語からアクセスできる
汎用入出力ポート
汎用入出力ポート
汎用入出力ポート
汎用入出力ポート
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
が接続されている
が接続されている
ハードウェアマニュアルを見てみよう
ハードウェアマニュアルを見てみよう
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
)
)
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++) { ; // ; //何もしない(時間稼ぎ)何もしない(時間稼ぎ) } }2008/03/04 & 2008/03/11 マイコンプログラミング講座 40
レジスタへのアクセス
レジスタへのアクセス
IO.PCR8
IO.PCR8
って一体どうなってるの?
って一体どうなってるの?
iodefine.h
iodefine.h
で定義されている
で定義されている
IO
IO
struct st_io struct st_io型でレジスタが指定されている型でレジスタが指定されている st_iost_ioのメンバーにのメンバーにPCR8PCR8がある(がある(unsigned charunsigned char型)型)
volatile
volatile
最適化禁止
最適化禁止
詳しい話は各自調べて
詳しい話は各自調べて
レジスタへのアクセス
レジスタへのアクセス
んじゃ、
んじゃ、
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
は同じ
は同じ
前者の方が便利
2008/03/04 & 2008/03/11 マイコンプログラミング講座 42
プログラム
プログラム
2
2
8
8
個の
個の
LED
LED
のうち
のうち
4
4
個ずつ交互に点灯するプログラム
個ずつ交互に点灯するプログラム
まずは
まずは
BIT.B0 = 1
BIT.B0 = 1
を使って書く
を使って書く
次はビット演算を使ってみよう
次はビット演算を使ってみよう
こっちの方が、かなり楽だよね? こっちの方が、かなり楽だよね?プログラム
プログラム
3
3
8
8
つの
つの
LED
LED
が
が
1
1
個ずつ順に点灯
個ずつ順に点灯
[○○…○○◎] → [○○…○◎○] → … → [◎○…○○○]
[○○…○○◎] → [○○…○◎○] → … → [◎○…○○○]
→
→
最初に戻る
最初に戻る
ビットシフトを使ってみよう
ビットシフトを使ってみよう
BIT BITを使うと、かなりメンドクサイを使うと、かなりメンドクサイ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) { // //ボタンが押されているボタンが押されている } }プログラム
プログラム
4
4
次のプログラムを作ってみよう
次のプログラムを作ってみよう
ボタンが押されている→
ボタンが押されている→
LED
LED
全点灯
全点灯
ボタンが放されている→
ボタンが放されている→
LED
LED
消灯
消灯
ヒント
ヒント
ひたすら、スイッチの状態をチェックする
ひたすら、スイッチの状態をチェックする
2008/03/04 & 2008/03/11 マイコンプログラミング講座 46
プログラム
プログラム
5
5
電子ルーレットを作ってみよう
モータードライバー
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)
ブレーキ
ブレーキ
プログラム
プログラム
6
6
モーターを正転させるプログラムを書いてみよう
モーターを正転させるプログラムを書いてみよう
モータードライバは
モータードライバは
P80
P80
が
が
IN1
IN1
に
に
P81
P81
が
が
IN2
IN2
に接続されている
に接続されている
一定間隔で正転と逆転を切り替えるプログラムを書いて
一定間隔で正転と逆転を切り替えるプログラムを書いて
みよう
2008/03/04 & 2008/03/11 マイコンプログラミング講座 50
割り込み
割り込み
割り込み
現在実行しているプログラムを中断して、指定された処
現在実行しているプログラムを中断して、指定された処
理を実行する
理を実行する
この処理が終わったら、元の処理に戻る
この処理が終わったら、元の処理に戻る
割り込みの要因に対応した、割り込み処理を定義する
割り込みの要因に対応した、割り込み処理を定義する
main()main() INT_WKP()INT_WKP() (割り込み)
(割り込み)
中断
2008/03/04 & 2008/03/11 マイコンプログラミング講座 52
割り込みのメリット
割り込みのメリット
今までの方法では、入力待ちの間、無駄なループがあっ
今までの方法では、入力待ちの間、無駄なループがあっ
た
た
他の作業ができない
他の作業ができない
この動作が白線検知であれば、敵を見つけられない
この動作が白線検知であれば、敵を見つけられない
割り込み
割り込み
主な割り込みの種類
主な割り込みの種類
NMI
NMI
NMI
NMI
端子が
端子が
0
0
になると発生する
になると発生する
優先度が最も高い& 優先度が最も高い&NMINMIを止めることはできない(緊急停止など)を止めることはできない(緊急停止など)
IRQ
IRQ
端子
端子
WKP
WKP
端子が指定した条件を満たすと発生する
端子が指定した条件を満たすと発生する
0 0からから11に変化したとき(立ち上がりエッジ)に変化したとき(立ち上がりエッジ) 1 1からから00に変化したとき(立ち下がりエッジ)に変化したとき(立ち下がりエッジ)タイマ タイマーカウンタが設定値に達したとき
タイマ タイマーカウンタが設定値に達したとき
A/D
A/D
変換やシリアル通信の処理が終了したとき
変換やシリアル通信の処理が終了したとき
優先順位
優先順位
高い優先順位の割り込みは、低い優先順位の割り込み処理中
高い優先順位の割り込みは、低い優先順位の割り込み処理中
にも割り込める
にも割り込める
2008/03/04 & 2008/03/11 マイコンプログラミング講座 54
割り込み
割り込み
IRQ
IRQ
ポートと
ポートと
WKP
WKP
ポートの違い
ポートの違い
IRQ
IRQ
ポート
ポート
IRQ0IRQ0~~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)割り込み関数の書き方
割り込み関数の書き方
割り込み処理を割り込み関数として書く
割り込み処理を割り込み関数として書く
HEW
HEW
で自動生成された
で自動生成された
intprg.c
intprg.c
を編集する
を編集する
__interrupt(vect=18) void INT_WKP(void) {
__interrupt(vect=18) void INT_WKP(void) {
/* /* * * 空の関数が用意されているので、編集する空の関数が用意されているので、編集する * * ここに割り込み処理を書くここに割り込み処理を書く */ */ } }
2008/03/04 & 2008/03/11 マイコンプログラミング講座 56
割り込みを使ってみる
割り込みを使ってみる
スイッチが
スイッチが
WKP0
WKP0
端子(
端子(
CN1-14
CN1-14
)に接続されている
)に接続されている
実は
実は
IRQ0
IRQ0
に接続するつもりで間違えた…
に接続するつもりで間違えた…
ポートの初期化(ポートモードの設定など)は
ポートの初期化(ポートモードの設定など)は
hwsetup.c
hwsetup.c
の
の
HardwareSetup
HardwareSetup
関数に書く
関数に書く
前半で使用した
前半で使用した
PCR
PCR
の設定も
の設定も
自動生成されたソースコードを追えば分かるはず
自動生成されたソースコードを追えば分かるはず
割り込み禁止状態で呼び出される
割り込み禁止状態で呼び出される
割り込みを使ってみる(準備)
割り込みを使ってみる(準備)
ポートモードの変更
ポートモードの変更
ポートモードレジスタ
ポートモードレジスタ
(PMR)
(PMR)
で
で
WKP0
WKP0
を有効にする
を有効にする
条件の設定
条件の設定
割り込みエッジセレクトレジスタで条件を設定
割り込みエッジセレクトレジスタで条件を設定
割り込みの有効
割り込みの有効
割り込みイネーブルレジスタ(
割り込みイネーブルレジスタ(
IENR
IENR
)で
)で
WKP
WKP
による割り込みを有
による割り込みを有
効にする
効にする
参照
参照
ハードウェアマニュアル
ハードウェアマニュアル
3. 3.例外処理例外処理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ポートの割り込みを有効化 ポートの割り込みを有効化 */*/ } }割り込みを使ってみる(処理)
割り込みを使ってみる(処理)
割り込み関数を編集する
割り込み関数を編集する
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;
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);プログラム
プログラム
7
7
プログラム
プログラム
6
6
を改造して、ボタンが押されたらモーターを
を改造して、ボタンが押されたらモーターを
止めるプログラムを書いてみよう
止めるプログラムを書いてみよう
main
main
関数は終了してしまうと困るので、今回は無限ループを入
関数は終了してしまうと困るので、今回は無限ループを入
れておく
れておく
2008/03/04 & 2008/03/11 マイコンプログラミング講座 62
タイマ
タイマ
タイマ
今までは無駄な
今までは無駄な
for
for
文で時間調整をしていた
文で時間調整をしていた
正確な時間を計りたい
正確な時間を計りたい
他の作業ができない→割り込みを使いたい
他の作業ができない→割り込みを使いたい
タイマ
タイマ
一定間隔でタイマレジスタをカウントアップ
一定間隔でタイマレジスタをカウントアップ
タイマーレジスタの値が条件を満たせば、割り込みを発生
タイマーレジスタの値が条件を満たせば、割り込みを発生
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出力)など出力)などタイマ
タイマ
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; } }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; } }
プログラム
プログラム
8
8
4
4
秒ごとにモーターの回転方向を変えるプログラムを書い
秒ごとにモーターの回転方向を変えるプログラムを書い
てみよう
てみよう
8
8
回
回
0.5
0.5
秒の割り込みが発生
秒の割り込みが発生
大域変数を使う(または
大域変数を使う(または
static
static
変数)
変数)
2008/03/04 & 2008/03/11 マイコンプログラミング講座 68
その他の機能
その他の機能
(相撲ロボットには必要)
シリアル通信
シリアル通信
RS232C
RS232C
を通して、
を通して、
PC
PC
に文字列を送信したりするのに使う
に文字列を送信したりするのに使う
デバッグなどに便利
デバッグなどに便利
新月用に軽量版
新月用に軽量版
stdio
stdio
ライブラリがある
ライブラリがある
流用するなり、参考にするなり…
流用するなり、参考にするなり…
2008/03/04 & 2008/03/11 マイコンプログラミング講座 70