OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 ›...

63
OAKS16基礎テキスト

Transcript of OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 ›...

Page 1: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16基礎テキスト

Page 2: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

目次

はじめに ....................................................................................................................................4 1.マイコンとは ..........................................................................................................................5

1.1.マイコンの基本構成 .........................................................................................................6 1.2.マイコンの基本動作 .......................................................................................................10 1.3.マイコンの扱うデータと言語......................................................................................... 11

1.3.1.数値を表すデータ ....................................................................................................12 1.3.3.文字コード...............................................................................................................13 1.3.3.プログラムに使われるデータ(言語)....................................................................14

2.M30620FCAFP概要 .............................................................................................................16 2.1.中央演算処理装置(CPU).........................................................................................17 2.2.周辺機能.........................................................................................................................19 2.3.メモリマップ..................................................................................................................19 2.4.リセット.........................................................................................................................20 2.5.M16Cの基本動作 ...........................................................................................................21

3.OAKS16 で開発するということ ........................................................................................22 3.1.OAKS16 の開発手順 ......................................................................................................23 3.2.メモリマップ..................................................................................................................24

3.2.1 デバッグ時...............................................................................................................25 3.2.2.ROM書き込み時 ......................................................................................................26

4.OAKS16 のプログラミング(sampleA解説)...................................................................28 4.1.sampleAの仕様 ..............................................................................................................28

4.1.1.I/O回路図.................................................................................................................28 4.1.2.I/Oインターフェース仕様........................................................................................29 4.1.3.フローチャート .......................................................................................................29 4.1.4.ファイル分割 ...........................................................................................................30 4.1.5.ファイル構成とオブジェクトファイルができるまで ..............................................31

4.2.サブルーチンの考え方 ...................................................................................................32 4.3.アセンブリ言語の基礎知識 ............................................................................................34

4.3.1.sampleAで使用するニーモニック(アセンブリ言語命令)....................................34 4.3.2.sampleAで使用する指示命令 ..................................................................................37 4.3.3.スタートアップファイル(start0.a30)の解説 ......................................................38 4.3.4.ベクタテーブルファイル(vector.a30)の解説.......................................................42

4.4.C言語プログラムの基礎知識.........................................................................................43

2/63

Page 3: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

4.4.1.sampleAで使用するC言語記述 ...............................................................................43 4.4.2.test.cの解説 .............................................................................................................46

4.5. メモリ配置の基礎知識..................................................................................................49 5.I/O制御の演習 ..............................................................................................................52

5.1.LED ...............................................................................................................................52 5.1.1.LEDの特性 ..............................................................................................................52 5.1.2.LEDの接続回路 .......................................................................................................52 5.1.3.電流制限抵抗の求め方.............................................................................................53 5.1.4.LEDの回路接続(演習 1)......................................................................................55 5.1.5.LED点灯プログラム(演習 2)...............................................................................55

5.2.スイッチ.........................................................................................................................58 5.2.1.スイッチの回路例 ....................................................................................................58 5.2.2.M16C/62Aのプルアップ抵抗 ..................................................................................59 5.2.3.スイッチの回路接続(演習 3) ...............................................................................60 5.2.4.スイッチとLEDの制御プログラム(演習 4) .........................................................60

3/63

Page 4: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

はじめに

このテキストは、OAKS16 を使って開発を行なう為の入門書です。 テキスト内では、演習を行ないますので、開発に必要な環境を揃えておく必要があります。

ソフトウエア(コンパイラ、デバッガ、フラッシュ ROM ライタ)のセットアップをなされて

いない方は、『OAKS16 をお使いになる方のために』を参考にしてソフトウエアのセットアッ

プを行なってください。そして、『OAKS16 で TM をお使いになる方のために』を参考にして、

TM にソフトウエアツール(エディタ、NC30、KD30、flashstart)を設定し、ツールバーか

ら起動できるようにしてください。 このテキストは、C 言語で開発をしていくことを前提としていますが、組み込み用のマイコ

ンでは初期設定はアセンブリ言語で記述しますので、その部分に関してはアセンブリ言語の説

明を入れてあります。C 言語もアセンブリ言語も、使用している命令、文法等は、テキスト内

で出来るだけ解説していますので、マイコンをはじめてお使いになる方でも、OAKS16 の開発

を簡単に行なっていただけると思います。

4/63

Page 5: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

1.マイコンとは

これから、OAKS16 を使って組み込みマイコンの開発について説明していきますが、その前

にマイコンの簡単な説明をしておきましょう。 『マイコン』とは、『マイクロコンピュータ』(『マイクロコントローラ』と呼ばれることも

あります)の略称です。この、『マイコン』を使う目的は、入出力の制御にあります。(そのた

めに『コントローラ』と呼ばれます)制御を行なう為には、ハードウエア(H/W)、ソフトウ

エア(S/W)の二つの要素が必要になります。(図 1-1)

ハードウエア:マイコンに入力回路と出力回路を接続すること、これが H/W の準備です。こ

れから説明していきますスイッチやLED(発光ダイオード)などの入・出力装置はその

ままマイコンに接続するだけではありません。抵抗など電子部品を接続したり、電源や

GND に接続したりといった配線が必要になります。これらのこと考慮した、マイコンシス

テムの作成が必要になります。 ソフトウエア:マイコンを動かす為のプログラムの準備です。マイコンはプログラムを読み込

み、その命令に従って動作を行ないますので、入出力制御のプログラムを作成してマイコ

ンシステムの中に入れておく必要があります。

マイコン入力装置 出力装置

入力

処理

出力

マイコンシステム(H/W)

プログラム(S/W)

図 1-1

5/63

Page 6: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

1.1.マイコンの基本構成

マイコンは普通、CPU(central processing unit:中央演算処理装置)、メモリ(記憶装置)、

周辺機器で構成されています。これらの構成要素は、バス(bus)と呼ばれる共通の信号線群

で結ばれています。(図 1-2)

CPU

メモリ 周辺機器

バス

<マイコンの構成>

図 1-2 周辺機器は周辺インタフェース(peripheral interface)と呼ばれる回路ユニットを通してバ

スに結合されます。周辺機器は、大きく分けて入力機器と出力機器に分かれますので、周辺イ

ンタフェースも、入力インタフェース、出力インタフェースと呼ばれたりします。また、入力

インタフェースと出力インタフェースをあわせた、入出力インタフェースを総称して I/O イン

タフェースと呼ぶこともあります。(図 1-3)

CPU

メモリ入力インタフェース

バス

出力インタフェース

マイコン

入力装置 出力装置

図 1-3

6/63

Page 7: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

この CPU、メモリ、I/O インタフェースがマイコン構成の三要素です。 CPU(中央演算処理装置):マイコンの頭脳部分です。メモリに書き込んであるプログラ

ムを順番に読み込み解読して、演算を行ったり、入出力の制御をしていきます。その実行過程

において必要となるレジスタ(一時的に記憶する回路)やカウンタなどの補助回路も内蔵して

います。 メモリ(記憶装置):プログラムやデータをデジタル信号の形で書き込み保存しておく場所で

す。メモリは大きく分けてROM(read only memory)とRAM(read write ramdom access memory)の 2 つの種類があります。 ROMは、CPUからの読み出し専用メモリで内容の変更が出来ません。ですが電源

を切ってもデータが保持されるので、プログラムを書き込んでおくために使います。

最初からプログラム等を工場で出荷時に書き込んでしまうマスク ROM、特別な書き込

み装置・消去装置を使って何度か書き換えが出来る EPROM(Erasable and Programable ROM)、電気的に書き換え可能な EEPROM(Electrically Erasable and Programable ROM)などがあります。EEPROM の仲間には、フラッシュメモリとい

う、ブロック単位でしか書き込みが出来ず、その単位ごとに一度消去しないと書き込

みが出来ないというタイプのメモリもあります。 RAMは CPU から読み書きができるメモリですが、電源を切ってしまうとデータは保

持されません。そのため、プログラムは書いておけませんが、プログラムの中で演算

結果などの一時的なデータ保持領域として使用します。RAM には電源が供給されてい

る間はデータを保持し続ける SRAM(static RAM)と、リフレッシュ回路というデー

タを保持する為の回路が必要な DRAM(dynamic RAM)があります。 最近は、FeRAM(Ferroelectric RAM)や MRAM(magnetic RAM:磁気によってデ

ータを記憶する)など Flash メモリのように不揮発性メモリ(電源を切ってもデータが

保持される)で SRAM のように書き換えが高速なメモリも登場し、ROM、RAM(プ

ログラム専用メモリ、データ専用メモリ)という表現も曖昧になりつつあります。 I/Oインタフェース:マイコンと接続する外部機器とのやり取りをおこないます。

7/63

Page 8: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

一つのチップ(IC:集積回路)に組み込まれているものをワンチップマイコンと呼びます。(図

1-4)

CPU(IC)

メモリ(IC)

入力インタフェース(IC)

バス

出力インタフェース(IC)

<ワンボードマイコン>

プリント配線基板

CPU

メモリ入力インタフェース

バス

出力インタフェース

<ワンチップマイコン>

集積回路チップ(IC)

図 1-4

これらの構成要素は、バス(bus)と呼ばれる信号線で結線され情報の伝達が行なわれます。

(バスは乗合バスを語源とし、同じ配線を色々な電気信号が時分割で共用することからその呼

び名がつきました。) バスは、その機能から、アドレスバス、データバス、コントロールバスの 3 つに分類されま

す。アドレスバス、データバスは複数まとめて 1 つの情報を表します。コントロールバスは、

1 本で情報を伝達し、メモリや周辺機器からのデータの読み取りの際に使用するリード(Read)信号、書き込みのために使用するライト(write)信号などがあります。(図 1-5)

図 1-4 CPU

メモリ入力インタフェース

出力インタフェース

コントロールバス

データバス

アドレスバス

(write信号)

(read信号)

図 1-5

8/63

Page 9: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

マイコンには、この基本構成要素のほかにどうしても必要な回路があります。(図 1-6) クロック発生回路:マイコンは、クロックという、一定周期で“H”と“L”を繰り返す信号

を基準として動作します。クロックは、ランニングをするときの笛の合図のよ

うなものです。笛を吹く間隔が短ければ、足を前に出すタイミングも速くなり、

スピードが上がります。マイコンもクロックの速度を上げればそれだけ処理速

度は上がります。ですがもちろん限界というものがあるわけで、それをデータ

シートでしっかり確認して設計しないと、マイコンを壊す原因になります。ク

ロック信号は、コンデンサと抵抗で発振させるCR回路や、セラミック発振

子・水晶発振子等を使った回路でマイコンのクロック入力端子から供給します。

精度はCR回路<セラミック発振子<クリスタル発振子の順でよくなります。

マイコンによっては、クロック発生回路を内部に持っているものもあります。 リセット回路:マイコンには、電源を投入したとき、プログラムが暴走してしまったときなど、

プログラムを一番最初から実行して欲しい時があります。そのための初期状態(リセ

ット状態と呼びます。)にする為の回路です。マイコンは通常、一定時間、決まった

レベルの電圧(信号)をリセット端子から入力すると、リセット状態になります。リ

セット時のマイコンの状態は CPU によって異なりますが、どのCPUでもプログラ

ムカウンタ(プログラムを順番に実行する為のカウンタ)を初期化し、プログラムを

先頭から実行できるようにします。マイコンによっては、内部にリセット回路を持っ

ているものもあります。

CPU

メモリ 入力インタフェース

出力インタフェース

コントロールバス

データバス

アドレスバス

(write信号)

(read信号)

クロック発生回路

リセット回路

図 1-6

9/63

Page 10: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

1.2.マイコンの基本動作

マイコンはメモリに書き込まれたプログラムを順次読み出して実行していきます。動作の内

容は、フェッチ、デコード、エグゼキュートの 3 つで、リセット解除後この動作を繰り返し続

けていきます。

リセット:リセット信号が一定時間入力された後、解除されると(リセット解除)マイコンが

動作を開始します。 命令の読み込み(フェッチ):CPUはプログラムカウンタの内容をアドレスバスから出力し、

リード信号を出力した後、データバスから命令を入力します。 命令の解析(デコード):CPU 内部で命令の解読をします。 命令の実行(エグゼキュート):解読した命令を実行します。

プログラムカウンタ

CPU メモリ

アドレスバス

データバス

アドレス

リセット端子

<マイコンの基本動作>

①リセット信号が入った後リセットが解除される。

②プログラムカウンタの値がアドレスバスに出力される。

RD信号③コントロールバスからリード信号が出される。

④プログラムに書き込まれた命令がデータバスからCPUに入力される。

⑤命令を解読する。

⑥命令を実行する。

図 1-7

10/63

Page 11: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

1.3.マイコンの扱うデータと言語

マイコンは全ての情報を“H”と“L”の二つの信号で伝達します。言い換えれば、マイコン

の理解できる情報は、2 種類だけということになります。マイコンはこの 2 種類の情報を複数

の信号線を使って、メモリや、I/O とやり取りするのです。この情報を“H”と“L”とで表現

していてはとても分かりにくいので、とりあえず数字の“1”(H)と“0”(L)とに置き換え

て考えるようになりました。“1”と“0”で表される 1 つの単位を“ビット(bit)”と呼び

ます。ビットとは指を意味します。このビットをいくつかまとめて、情報を表現するようにな

りました。2 ビットでは 22で 4 通り。4 ビットでは 24で 16 通り、8 ビットでは 28で 256 通り

のデータを表せます。 <マイコンの扱う数値>

0V5V

“H”

“L”

“1”と“0”に置き換える

1bit

01

この表現方法で、マイコンのプログラムやデータなど全ての情報を表現します。

2通りの表現

2bit0001 4通りの表現1011

2×2=4

4bit

00000001

16通りの表現

00100011

2×2×2×2=16

010001010110011110001001101010111100110111101111

図 1-8

11/63

Page 12: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

1.3.1.数値を表すデータ

私たちが日常使用している数値は、0 から 9までの数字を使って数を表します。この方法は、

10 になるごとに桁上がりをするので、10 進数

と呼びます。これに対して、マイコンの数値は、

1 と 0 だけなので、2 になったら桁上がりをし

ます。この方法を 2 進数と呼びます。2 進数の

表現は、数字の個数が多くなりすぎて解りにく

いので、これを解りやすくするために 16 進数

の表記方法が出来ました。これは、2 進数 4 ビ

ットをまとめたもので、数字の 0 から 9 の後

に、アルファベットのA,B,C,D,E,Fを追加

して、16 個の表記をするものです。(表 1-1)この 2 進数、16 進数、10 進数の区別をする為

に、記号を使います。2 進数を表す記号として

は“B”“%”、16 進数を表す記号としては“H”

“0x”等がありますが、プログラムの中では、

使える表現が決まっていますので、必要に応じ

て使い分けていきます。

表 1-1

0000000100100011010001010110011110001001101010111100110111101111

0123456789ABCDEF

91011121314

8 7 6 5 4 3 2 1 0

15

2進数 16進数 10進数

表記例) 01010101B %01010101

表 1-2(どちらも 2 進数を表します。)

0000000000000001000000100000001100000100000001010000011000000111000010000000100100010000

012345678910

910

8 7 6 5 4 3 2 1 0

2進数表現 16進数表現 10進数

<BCD表記>55H 0x55 (どちらも 16 進数を表します。)

マイコン側の、扱えるデータとしては、2 進数、

16 進数ということになりますが、やはり人間界の

10 進数に少しでも近づけたいということで、BCD(Binary Coded Decimal)という表現方法が考え

られました。これは、2 進数 4 ビット(16 進数 1桁)で 10 進数の 1 桁を表すというものです。この

表現を使うと、電卓など人間を相手にする用途で

は大変便利なので、BCD で計算を行なう命令語を

持つマイコンもあります。

12/63

Page 13: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

1.3.3.文字コード

コンピュータでは文字を取り扱う為にそれぞれの文字に 16 進コードを対応させています。そ

の一つである ASCII コードはコンピュータ用の英数字コード体系として最も普及しているも

のです。その他のコードとして、JIS や EUC(拡張 UNIX コード)で決められた文字コード

があります。漢字は 16 ビットで表現されます。JIS には約 6,300 文字の漢字コードが登録さ

れています。 <ASCII コード> ASCII コードは、7 ビットで文字を表現しています。上位3ビットが 000 と 001 のコードは制

御コードと呼ばれ、文字を表すのではなく改行やタブなどの文字表示の制御を行なう為のコー

ドです。この他に、上位ビットを3ビットから4ビットに拡張し、日本語の半角カタカナを表

現する拡張アスキーコードがあります。

表 1-3

上 位 3 ビ ッ ト 000(0) 001(1) 010(2) 011(3) 100(4) 101(5) 111(6) 111(7)

0000(0) NUL DEL SP 0 @ P ‘ p 0001(1) SOH DC1 ! 1 A Q a q 0010(2) ETX DC2 “ 2 B R b r 0011(3) EOT DC3 # 3 C S c s 0100(4) EOT DC4 $ 4 D T d t 下 0101(5) % E U e u ENQ NAK 5 位 0110(6) & F V f v ACK SYN 6 4 0111(7) ‘ G W g w BEL ETB 7 ビ 1000(8) BS CAN ( H X h x 8 ッ 1001(9) HT EM ) I Y i y 9 ト 1010(A) LF SUB * : J Z j z

1011(B) VT ESC + ; K [ k { 1100(C) , < L ¥ l | FF FS 1101(D) - = M ] m } CR GS 1110(E) . > N ^ n SO RS ~ 1111(F) SI US / ? O _ o

注)太字は制御コード

13/63

Page 14: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

1.3.3.プログラムに使われるデータ(言語)

プログラムにもやはり機械語が使われます。プログラムを書く場合には、2 進数を 16 進数に

置き換えてもやはり解りにくいことに変わりはありません。そこで、命令をニーモニック

(mnemonic:記憶を助けるというような意味です。)という記号に置き換える方法を考えまし

た。これがアセンブリ言語です。アセンブリとは組み立てるという意味ですが、ニーモニック

を使ってプログラムを記述する作業が組み立てを行なっているようなのでこう呼ばれるよう

です。 アセンブリ言語の問題は、CPU によってニーモニックが異なるということです。このために

プログラムの互換性(他のシステムでも使えるということ)がありません。そこで、どの CPUでも共通の記述で使えるプログラムのための言語が使われるようになりました。その 1 つがC

言語です。C言語は、比較的簡単な記述で、プログラムを記述できます。 以下に、各言語記述と特徴を示します。(図 1-9)

CPU

メモリ

マシン語(機械語)

アセンブリ言語

C言語

日本語 「Port0に、fehを出力する。」

言語 記述

Port0=0xfe

MOV.B #0feh,port0

11000111111111100000001111100000

←転送する(命令部分)←feh(転送する値)

←PORT0のアドレス

(この記号を“ニーモニック”と呼ぶ)

命令部分(転送する)

~を,~へ

Port0に16進数feを代入する

1111111011000111

0000001111100000

データバス

機械語のプログラムがメモリに書き込まれる。

“1”は電圧“H”“0”は電圧“L”としてメモリに記憶される。

記憶されたプログラムはデータバスからCPUに読み込まれ、解読、実行される。

特徴

難解で、開発言語としては無理。

機械語と1対1対応

CPUによって記述が異なる。

マイコンの詳しい知識が必要

CPUが変わっても共通の記述でOK

開発言語ではない

14/63 図 1-9

Page 15: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

このように、記述に便利な言語が出来ましたが、最終的にはやはり機械語に変換しないとマ

イコンでは動かすことが出来ません。このために、変換用のソフトウエアが存在します。 言い換えれば、変換用のソフトウエアがあれば、そのプログラム言語を使って開発が出来ると

いうことです。 C 言語からアセンブリ言語に変換する作業をコンパイルと呼び、その作業を行なうソフトウ

エアをコンパイラと呼びます。 アセンブリ言語から機械語に変換する作業をアセンブルと呼び、その作業を行なうソフトウエ

アをアセンブラと呼びます。 (ソフトウエアによっては、コンパイラが機械語まで変換してくれて、その一連の作業をコン

パイルと呼ぶ場合もあります。) このあと、OAKS16 を使ってこれらの作業を行なっていきます。

15/63

Page 16: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

2.M30620FCAFP概要

OAKS16 には三菱の 16 ビットワンチップマイコンM16C/62AグループのM30620FCAFPが使われています。OAKS16 を使っていく上で、このマイコンがどのような機能をもっているか

をある程度知っておかなければなりません。付属のCDROMには、このマイコンのデータシー

トとユーザーズマニュアルが入れてあります。これを全て読破して覚えればそれにこしたこと

はないのですが、それにはかなりの労力を伴います。ですから、ここでは最低限知って欲しい

ことだけを説明し、その他の部分については、必要になった段階で追加説明をしていきます。 M30620FCAFP は M16C/62A グループの 1 つで、内部 RAM(10KB)、フラッシュ ROM

(128KB)のものです。それ以外の点ではすべてグループ共通の機能を持ちますので、ここか

ら先は、M16C/62A として説明していきます。M16C/62A は、チップの内部にマイコンの基本

構成要素であるCPU、メモリ、I/O ポートとタイマ等周辺機器を内蔵しています。

16/63

Page 17: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

2.1.中央演算処理装置(CPU)

以下に CPU のレジスタ構成を示します。(図 2-1)

レジスタ構成 b15 b8 b7 b0

R0(注1)

b15 b8 b7 b0

b15 b8 b7 b0

b15 b8 b7 b0

b15 b8 b7 b0

b15 b8 b7 b0

b15 b8 b7 b0

データレジスタ

アドレスレジスタ

フレームベースレジスタ

b19 b0

b15 b0

USP

b19 b0

PC

INTB

b15 b0

ISP

b15 b0

SB

b15 b0

FLG

プログラムカウンタ

割り込みテーブルレジスタ

ユーザスタックポインタ

割り込みスタックポインタ

スタティックベースレジスタ

フラグレジスタ

CDZSBOIUIPL

H

H

L

L

H L

R1(注1)

R2(注1)

R3(注1)

A1(注1)

FB(注1)

A0(注1)

注1:これらのレジスタは、     2レジスタバンクあります。

図 2-1

データレジスタ(R0/R1/R2/R3):16 ビット構成ですが、命令語によっては、8 ビットまたは

32 ビットのレジスタとしても使用できます。 アドレスレジスタ(A0/A1):データレジスタと同等の機能を持つ 16 ビットのレジスタです。

アドレスレジスタ相対/間接アドレッシングで使用します。 フレームベースレジスタ(FB):16 ビットのレジスタで、FB相対アドレッシングに使用しま

す。 プログラムカウンタ(PC):20 ビット構成で次に実行する命令の番地を示します。 割り込みテーブルレジスタ(INTB):20 ビット構成で割り込みベクタテーブルの先頭番地を示

します。 スタックポインタ(USP/ISP):16 ビット構成でユーザスタックポインタ(USP)と割り込み

スタックポインタ(ISP)の 2 種類があります。どちらを使用するかはスタックポインタ

指定フラグ(フラグレジスタのビット7(U フラグ))で設定します。 スタティックベースレジスタ(SP):16 ビットのレジスタで、SP 相対アドレッシングに使用

します。

17/63

Page 18: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

フラグレジスタ(FLG):11ビットで構成されており、1ビット単位で使用します。アセ

ンブリ言語でプログラムを記述するときの分岐の判断条件に使われたり、CPU の動作を設定

する為に使われたりします。(図 2-2) このレジスタと、フラグについては、アセンブリ言語でプログラムを書く場合には絶対に

必要な知識となります。ですが、今回は C 言語でプログラム開発を行なっていきますので(一

部、どうしてもアセンブリ言語で書かなければならない部分はありますが)それほどレジスタ

やフラグを意識したプログラミングはありません。 フラグレジスタのそれぞれの役割と使い方については、プログラム説明の中で必要に応じ

て説明していきます。詳細をお知りになりたい方は、ユーザーズマニュアル P1-13 をご参照く

ださい。

フラグレジスタの構成

CDZSBOIUIPLb0b15

フラグレジスタ(FLG)

キャリーフラグ

デバッグフラグ

ゼロフラグ

サインフラグ

レジスタバンク指定フラグ

オーバーフローフラグ

割り込み許可フラグ

スタックポインタ指定フラグ

予約領域

プロセッサ割り込み優先レベル

予約領域

図 2-2

18/63

Page 19: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

2.2.周辺機能

M16C/62A の周辺機能を以下の図にまとめました。(図 2-3) このテキストでは、入出力ポートについてだけ説明しますが、その他にタイマなど多くの機能

を持っています。使用する場合は、ユーザーズマニュアルの各項目をお読みください。

M16C/62A ブロック図

タイマ

監視タイマ

DMCA

D-A変換器

A-D変換器

UART/クロック同期形SI/O

システムクロック発生

クロック同期SI/O

CPU

ROMRAM

CRC演算回路(CCITT方式)

内部周辺機能

入出力ポート

メモリ

P0 P1 P2 P3 P4 P5 P6 P7

P8

P85

P9

P10

8 8 8 8 8 8 8 8

7

8

8

図 2-3 2.3.メモリマップ

SFR領域

内部RAM領域

使用不可

内部ROM領域

00000h

003FFh00000h

02BFFh02C00h

DFFFFhE0000h

FFFFh

<シングルチップモード>

メモリ配置図を示します。(図 2-4)アドレス空間は 00000hから FFFFFh までの1Mバイトあります。 M30620FCAFP は、シングルチップモード、メモリ拡張モー

ド、マイクロプロセッサモードの 3 つのモードを持ち、メモ

リ拡張も可能です。 しかしOAKS16ではシングルチップモードのみサポートして

おりますので、ここではシングルチップモードのメモリマッ

プについてだけ説明します。 SFR(スペシャルファンクションレジスタ)領域:ここには、

CPU のモードや周辺機能の制御の為のレジスタが集めら

れています。この領域の使用方法は、プログラミングの中

で説明していきます。 内部 RAM:M30620FCAFP では 10K バイトの SRAM が使

われています。 図 2-4

19/63

Page 20: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

内部 ROM:M30620FCAFP では 125K バイトのフラッシュメモリが使われています。内部

ROM の一部(FFFDCh~FFFFFh)は、固定ベクタアドレスとなっており、割り込み発

生時に実行するプログラムの先頭アドレスを格納するようになっています。(図 2-5)

リセット

NMI

DBC

監視タイマ

シングルステップ

アドレス一致

BLK命令

オーバーフロー

未定義命令FFFDCh

FFFE0h

FFFE4h

FFFE8h

FFFECh

FFFF0h

FFFF4h

FFFF8h

FFFFCh

割り込みベクタテーブル

FFFDBhFFFDCh

FFFFFh

図 2-5 2.4.リセット

M16C/62A をリセット状態にする為には、ハード的にリセット信号を入力する方法と、ソフト

ウエアによりリセットする方法があります。通常のマイコンのシステムでは、『パワーONリ

セット』といい電源投入時にマイコンの動作が安定するまでリセット状態を保ち、その後リセ

ットを解除しマイコンの動作を開始するというような回路を組みます。OAKS16 では、電源投

入時と SW1 を押したときにリセットがかかるように設計されています。 M16C/62A のリセット解除後の状態 ① SFR の一部は、決まった値にセットされます。その設定を変更したい場合には、プログラ

ムの中で設定していかなければなりません。方法については『4.OAKS16 のプログラミン

グ』の中で説明していきます。 ② リセットが解除された後、リセットベクタテーブルに示されている番地からプログラムを

実行します。 リセット時の詳細は、ユーザーズマニュアルp1-15 リセットについての記述を参照して下さい。

20/63

Page 21: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

2.5.M16Cの基本動作

以下に M16C の簡単な動作を示します。

E0000

E0000h

FFFFCh

FFFFEh

FFFFDh

FFFFFh

PC

00

0E

00

00

7A

リセットベクタ

プログラムの初の命令

①リセット

②リセットベクタの内容がPCに入る

③PCの内容がアドレス情報として出力される

④指定されたアドレスの内容を命令語として取り込む

M16Cの動作

リセット解除後リセットベクタの内容をPCにセッ

トする

アドレスバスにPCの内容を出力する。

指定されたアドレスのデータを取り

込む

命令語が揃った?

PCの値を+1する

命令に従い処理を実行する

<CPU> <メモリ>

ハイ

イイエ・・・・・

PC:プログラムカウンタ

図 2-6

21/63

Page 22: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

3.OAKS16 で開発するということ

プログラム開発は、プログラムを書いて実行するだけではありません。プログラムが、一度

で仕様通りに動くことはまれで、ほとんどの場合、思うように動作してくれないものです。そ

こで、その原因を調べる作業を行なう必要が出てきます。この作業をデバッグといいます。(バ

グとは虫を意味し、プログラムの中のバグを探すことです。) デバッグは全てのマイコン開発に必要な作業ですが、この作業を行なう為のツールをデバッ

ガと呼びます。デバッガの代表は、ICE(インサーキットエミュレータ)ですが、メーカで出し

ているこのツールはとても高価なので、OAKS16 で使用しているような簡易デバッガ(モニタ

デバッガ)が多く使われるようになりました。このモニタデバッガは、パソコン側とターゲッ

ト側の両方にデバッグ用のプログラムが存在し、その間で通信を行ないながら、プログラムを

実行したり、メモリの内容を参照したりするものです。このデバッガは、開発者が作成するプ

ログラムと、デバッグ用のモニタプログラムが同じシステムのメモリに存在しますので、最初

は少し戸惑われるかと思いますが、慣れてしまえば結構役に立つツールです。 OAKS16 で使っているデバッガは、KD30 というデバッガです。これから、KD30 を使って

OAKS16 の開発をするために必要な内容を説明していきます。

22/63

Page 23: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

3.1.OAKS16 の開発手順

まず、OAKS16 を使ったプログラムの開発手順を示します。

この一連の作業は、TM で操作できます。TM を使用すると開発

に必要な各ツール(ソフトウエア)を共通のツールバーから起

動でき、開発作業がスムーズに行なえます。操作の詳細は

『OAKS16 で TM をお使いになる方のために』を参照して下さ

い。 ①コーディング:エディタ(テキストエディタ)を起動し、プ

ログラムを記述します。このテキストでは、基本的には C言語で記述します。しかし、後で詳しく説明しますが、

M16C の開発をする場合、全てのプログラムを C 言語で

記述することができません。M16C の初期設定の部分だけ、

アセンブリ言語で記述します。 ②コンパイル:詳しくは、コンパイル、アセンブル、リンクの

作業を含みます。C 言語で記述したプログラムは、コンパ

イラ(NC30)でアセンブリ言語のプログラムに変換(コ

ンパイル)します。その後、アセンブラ(AS30)でリロ

ケータブルオブジェクトファイル(再配置可能な機械語フ

ァイル)に変換(アセンブル)します。アセンブリ言語で

書いたプログラムは、アセンブラ(AS30)でリロケータブル

ファイルに変換します。そしてリンカ(LN30)を起動して、

すべてのリロケータブルオブジェクトファイルをまとめてアドレスを決定し、一つのア

ブソリュートオブジェクトファイル(実行ファイル)にします。(リンク)

開発手順

終了

コーディング

エディタを使って

プログラムを記述する

コンパイル

①NC30でコンパイルする

②AS30でアセンブルする

③ln30でリンクする

デバッグ

KD30でデバッグする

ROMに書き込に動作させる

①flashstartを起動し

フラッシュROMに

プログラムを書き込む

②プログラムを実行する

図 3-1

③デバッグ:デバッガ(KD30)を使ってプログラムの動作を確認します。仕様通りの動作

をしない場合、GO-BREAK、メモリ参照などの機能を使って原因を突き止めます。そし

て再びエディタを起動してプログラムを修正し、コンパイルし、デバッグの作業を行な

います。 ④ROM に書き込み:デバッガ上で仕様通りプログラムが動いたら、フラッシュ ROM ライタ

(flashstart)でフラッシュ ROM にプログラムを書き込み、動作させます。ここで、仕

様通りに動けば開発終了です。OAKS16 ではデバッガで動かすファイルと、フラッシ

ュ ROM ライタで書き込むためのファイルが異なるので、ここでファイルの変換作業

を行ないます。詳しい手順は、『OAKS16 でTMをお使いになる方のために』を参照

して下さい。

23/63

Page 24: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

3.2.メモリマップ

これは、OAKS16 のメモリマップです。前の章で説明した M3062FPAFP のメモリマップを思

い出してください。その中の、RAM 領域の一部と、ROM 領域の一部をモニタが使用します。 いままで、主流だったオンボード用のデバッガでは、ROMにモニタプログラムが入れてあり、

ユーザプログラムは、RAM上に展開されていました。OAKS16 では、フラッシュメモリを使

っている為、ROM 領域にプログラムを書き込んでデバッグができます。

ベクタテーブル

モニタROM

使用禁止領域

ユーザROM

SFR

ユーザRAM

モニタRAM

ベクタテーブル

ユーザROM

SFR

ユーザRAM

KD30使用中(デバッグ時) ROM化終了時(完成品)

00000h

00400h

024BFh024C0h

02BFFh

E0000h

FBDFFhFBE00h

FC000h

FFFDCh

図 3-2

24/63

Page 25: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

3.2.1 デバッグ時

まず、デバッグ時のメモリマップを見てください。モニタプログラムが、RAM、ROM の一

部を使用しています。そのため、ユーザ使用領域は、RAM の 0400H~024BH 番地まで、ROMの E0000H 番地から FBDFFH 番地までになります。

M16C/62A では、リセット解除後(マイコンの動作スタート時)リセットベクタ(FFFFCH~FFFFF)で示されるアドレスからプログラムを実行します。しかし、デバッグ中は、KD30を操作することによりプログラムを実行します。方法としては、まず、パソコンの KD30 画面

上でプログラムカウンタの値(実行スタートアドレス)を設定します。そして『GO』コマン

ドを実行することでプログラムを動かします。プログラムの書き込みは、KD30 のプログラム

ダウンロード機能により行ないます。

IBM 互換機

OAKS16

ベクタテーブル

モニタROM

使用禁止領域

ユーザROM

SFR

ユーザRAM

モニタRAM

KD30使用中(デバッグ時)

00000h

00400h

024BFh024C0h

02BFFh

E0000h

FBDFFhFBE00h

FC000h

FFFDCh

キーボード

①KD30を起動する

②実行プログラムをダウンロードする。

③PCにプログラムの先頭アドレスをセットする。

④GOボタンをクリックしてプログラムを実行させる。

(OAKS16上のM30620FCAFPのユーザ領域上にプログラムを書き込む。)

<KD30でのプログラムの実行>

・全てパソコンのマウスとキーボードで操作する。

図 3-3

25/63

Page 26: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

3.2.2.ROM書き込み時

デバッグが終了したら、今度は、フラッシュメモリにプログラムを直接書き込み、パソコン

とのケーブルをはずし、OAKS16 単体で動作させます。 この場合のプログラムの書き込みは、KD30 ではできません。フラッシュメモリ書き込み用

のソフト『flashstart』を起動します。『flashstart』は、M16C/62A のブート ROM に書かれ

ているプログラムを使用します。(ブート ROM に通信用のプログラムが入っています)ブー

ト ROM は、通常使用しているユーザ ROM の他にある、8K バイトのメモリで、出荷時に標

準入出力モードでの書き換えプログラムが格納されています。ブート ROM はある条件を満た

したときだけ使用できます。(条件:P55 端子“L”、CNVSS 端子“H”、P50 端子“H”として

リセットを解除) そのため、フラッシュメモリに書き込む前(『フラッシュスタート』を起動する前)には、

CPU ボードの J1 コネクタをショートします。これにより CNVSS端子が“H”になります。 P55 端子“L”、P50 端子“H”は OAKS16 のCPUボードですでに結線されています。(回路

図参照のこと)

ベクタテーブル

ユーザROM

SFR

ユーザRAM

00000h

00400h

02BFFh

E0000h

FFFDCh

IBM 互換機

OAKS16

キーボード

J1ショート(CNVSS=“H”)

標準入出力モードの制御プログラム

ブートROM領域ユーザROM領域

(OAKS16側の準備)①J1コネクタをショートする。

(CNVSS=“H”)

リセットスイッチを押す。

③ブートROMプログラムが実行される。

(パソコン側)①Flashstartを起動する。

②画面の指示に従い、プログラムを ②CPUボードの

電源

フラッシュメモリに書き込む。

注:まずOAKS16側の準備をしてから次にパソコン側で操作する。

ROM書き込み終了後

①J1コネクタをオープンにる。(CNVSS=“L”)

②CPUボードの

リセットスイッチを押す。

電源投入時、リセットボタンを押して離した後、OAKS16ボード単体でプログラムが動作します。

パソコンと接続しているRS232Cケーブルをはずしても問題はありません。

J1オープン(CNVSS=“L”)

電源

OAKS16

図 3-4

26/63

Page 27: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

Flashstart でプログラムを書き込んだ後は、再び、CPU ボードの J1 コネクタをオープンに

して、CPU ボードのリセットスイッチを押します。スイッチを離すと、作成したプログラム

が単独で動作して、OAKS16 を制御します。 ここで書き込まれるプログラムの先頭アドレスは、フラッシュ ROM のリセットベクタに書き

込まれていなければなりません。 この、プログラムの書き方、アドレスの決め方などを次の章で、例題の解説をしながら説明

していきます。

27/63

Page 28: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

4.OAKS16 のプログラミング(sampleA解説)

ここでは、OAKS16 のプログラミングについて、CDROM 内のサンプルプログラム sampleAを例にとって詳しく説明していきます。 OAKS16 でプログラムを開発する場合、いくつか注意することがあります。 ①マイコンの初期設定:KD30 で動作させているときはモニタのほうで既に初期設定されてい

る内容に関しては、ユーザプログラムで初期設定をしなくても正常に動作します。し

かし ROM に書き込んで動作させる場合には初期設定をしていないと誤動作の原因と

なります。(特にスタックポインタの設定は必ずしなければなりません。)そのため、

デバッグ用プログラムでも、初期設定は行なって下さい。特に、CPU の動作モードな

どをモニタの設定と異なる設定をする場合注意が必要です。(モニタの初期設定の内容

は、OAKS16Fullkit マニュアルまたは OAKS16Boardkit マニュアルを参照のこと) ②固定ベクタテーブル:モニタ(KD30)上でデバッグ中は、書き込みができませんが、ROM

に書き込んで実行する場合には必ず必要なので、デバッグ用プログラムでも、記述し

ておいてください。 結論としては、デバッグ用、ROM 焼き用というようにプログラムを分けないで、同じプロ

グラムを使った方が誤動作の原因が少なくてすみます。(デバッガで、フラッシュ ROM に書

き込めないところは無視してくれるので、誤動作の原因にはならない。) これらの点を考慮して sampleA のプログラムを考えてみましょう。 4.1.sampleAの仕様

では、sampleA のプログラムを考えます。制御する対象は、CPU ボード上の LED1 です。今

回は、この LED を点滅させることを考えます。点滅の方法としてはタイマ割り込みを使って

時間を制御する方法もありますが、ここでは、ソフトウエアウエイトを使うことにします。 詳しいプログラムの書き方はあとで説明します。

4.1.1.I/O回路図

制御の対象となる、LED1 の接続回路を確認します。(図 4-1)LED 接続の詳しい説明は(『5.I/O 制御の演習』)で行ない

ますので、ここでは、配線された回路図を確認し、どのよう

なデータをポートから出力すればいいのかを考えます。

LED1 接続回路

P00 LED1

M16C/62A

LED1 は P00 に接続されています。この回路図では P00 から

“H”を出力すれば LED1 が消灯し、P00 から“L”を出力

すれば LED1が点灯することがわかります。(詳細は、『5.

I/O 制御の演習』参照のこと)

図 4-1

28/63

Page 29: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

4.1.2.I/Oインターフェース仕様

今回制御する LED1 のインタフェース仕様は以下のようになります。(図 4-2) インタフェース仕様 点灯 消灯 LED1(P00)

4.1.3.フローチャート

以下に、このプログラムのフローチャートを示します。(図 4-3)

L H

図 4-2

sampleA

初期設定

LED1点滅

LED1点滅

LED1消灯

LED1点灯

時間待ち(ソフトウエイト)

LED1消灯

時間待ち(ソフトウエイト)

割り込みダミー処理

REIT

図 4-3

29/63

Page 30: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

4.1.4.ファイル分割

<start0.a30>:スタートアッププログラムです。アセンブリ言語で記述します。内容は、

M16C/62A の初期設定です。初期設定をしたあと、C言語で記述した main プログラムを

サブルーチンコールします。割り込み処理のダミープログラムもアセンブリ言語で記述し

ますので、このファイルの中に一緒に入れておきます。このダミープログラムの内容は、

何も処理を行なわずに、割り込みから復帰するというものです。 <test.c>:main プログラムを記述します。今回は、LED1 の点滅プログラムを記述します。 <vector.a30>:固定ベクタテーブルの設定をします。リセットベクタの領域に、satrt0.a30 に

記述した初期設定の先頭アドレスを記述します。その他のベクタには、割り込みダミープ

ログラムの先頭アドレスを記述します。 下記に、それぞれのファイルとプログラムの流れを示します。

<start0.a30> <test.c> <vector.a30>

start:

初期設定

dammy_int:

割り込みダミープログラム

main:

LED1点滅プログラム

startdummy_intdummy_intdummy_intdummy_intdummy_intdummy_intdummy_intdummy_intFFFDCh

FFFE0h

FFFE4h

FFFE8h

FFFECh

FFFF0h

FFFF4h

FFFF8h

FFFFCh

メインプログラムへ

②③

リセット

図 4-4

《プログラムの流れ》 ①リセットが解除されると、リセットベクタに入れてあるアドレス情報を読み出します。 ②リセットベクタに入れてあったアドレスからプログラムを実行します。 ③プログラム記述により、メインプログラムに処理が移ります。 (start0.a30 の初期設定内のサブルーチンコール命令で test.c のメインプログラムからプログ

ラムを実行します。)

30/63

Page 31: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

4.1.5.ファイル構成とオブジェクトファイルができるまで

sampleA のファイル分割ができたところで、これらの、ソースファイルから OAKS16 で実行

できるファイルができるまでの流れを説明します。OAKS16 では、KD30(デバッガ)が使用

するファイルと、flashstart(フラッシュメモリ書き込みソフト)が扱えるファイルが異なり

ます。これらのファイルを作成するために、NC30 を使ってコンパイルしていくわけですが、

実際にはコンパイル→アセンブル→リンク→ROM 化ファイル生成という手順を踏みます。

sampleA

C言語       ソースファイル

アセンブラ    ソースファイル

リロケータブルモジュール       ファイル

アブソリュート モジュール       ファイル

モトローラ   Sフォーマット     ファイル

vector.a30vector.a30test.a30test.a30start0.a30start0.a30

vector.r30test.r30start0.r30

test.c

sampleA.x30

sampleA.mot

コンパイル

アセンブル

リンク

ROM化ファイル生成

(実行コマンド)

nc30 –S –g test.c

as30 –L –S start0.a30as30 –L –S test.a30as30 –L –S vector.a30

ln30 –g –msl start0.r30…

lmc sampleA

② ③ ④

図 4-5

ソースファイルは test.c(C 言語ソースファイル)、start0.a30(アセンブリ言語ソースファイ

ル)、vector.a30(アセンブリ言語ソースファイル)の 3つです。

① test.c からはコンパイラ NC30 により、test.a30 というアセンブラソースファイ

ルが生成されます。

② start0.a30 からはアセンブラ AS30 により、start0.r30 が生成されます。

③ test.a30 からはアセンブラ AS30 により、test.r30 が生成されます。

④ vector.a30 からはアセンブラ AS30 により、vector.r30 が生成されます。

⑤ ②③④で作成されたリロケータブルモジュールファイルをリンクして、

sampleA.x30 というアブソリュートモジュールファイルを作成します。(デバッガ

KD30 用)

⑥ ⑤で作成されたsampleA.x30からsampleA.motというモトローラSフォーマット

のファイルを生成します。(FlashStart 用)

ここまでが、開発の流れです。

31/63

Page 32: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

4.2.サブルーチンの考え方

プログラムの記述方法として知っておかなければならないサブルーチンについて説明しま

す。 アセンブリ言語ではサブルーチンとして記述しますが、C 言語では関数として記述します。(C言語をコンパイラでアセンブリ言語の記述に書き換えるときには、サブルーチンの形になりま

す。) サブルーチンとは、『メイン』のルーチンに対して、『サブ』のルーチンということで、まと

まった処理を一つの独立したプログラムとして記述する方法です。

サブルーチン先頭アドレス

プログラムA

処理1

処理3

サブルーチン

処理2サブルーチン

<プログラムA>

<サブルーチン>

サブルーチン呼出し命令

サブルーチン復帰命令

・・・・

・・・・

(メモリ)

②→

プログラムは、①→ ③の順番で実行されます

戻り先番地(上位)

戻り先番地(中位)

戻り先番地(下位)

スタック

PC

設定され処理が移ります。

②に処理が移るときに、

まずスタックに③の先頭アドレスが退避されます。

次にプログラムカウンタにサブルーチンの先頭アドレスが

次のアドレス

(戻り先番地)

サブルーチン先頭アドレス

図 4-6

上に示すフローチャートのように、プログラムの途中でサブルーチンを呼び出すことによって、

動作させます。 この方法を取ると、まとまった処理を分けて記述することができ、プログラムが見やすくな

ります。

32/63

Page 33: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

また、NC30 では、異なったファイルに記述されているプログラムをリンクして最終プログ

ラムを作成できるので、サブルーチン(C では関数)の形をとり、他のファイルから呼び出し

て使用できることは、仕事の分担ができたり、他のシステムでそのサブルーチンや関数を流用

したりでき、開発効率を上げることもできます。 プログラムの書き方はこのあと説明していきますが、サブルーチンコール命令を使うことで、

指定したアドレスからプログラムを実行することができます。この動作は、条件無しの分岐命

令でもできますが、サブルーチンの形を取ると、サブルーチンの処理が終わるともとのプログ

ラムの続きから処理を行ないます。サブルーチンからの復帰は、サブルーチンの最後にサブル

ーチン復帰命令を記述しておき、この命令の実行によって、もとのプログラムの続きから命令

を実行していきます。 この、サブルーチンの動作のポイントとなるのが“スタックポインタ”です。サブルーチン

呼び出し命令が実行されると、スタックポインタが示すメモリ(“スタック”と呼びます)に

次の命令のアドレス(戻り先番地)を退避します。そして、プログラムカウンタにサブルーチ

ンの先頭アドレスを入れ、サブルーチンのプログラムが実行されます。サブルーチンの最後で

は、サブルーチンの復帰命令が実行され、スタックに退避してあったアドレスが、プログラム

カウンタに入り、サブルーチン呼び出し命令の次にあった命令を実行します。

33/63

Page 34: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

4.3.アセンブリ言語の基礎知識

前に説明しましたように、M16C/62A のプログラムをC言語で開発する場合、初期設定の部

分だけはアセンブリ言語で記述しなければなりません。このプログラムをスタートアッププロ

グラムと呼びます。アセンブリ言語で記述する理由は理由は、C 言語で記述できない部分(ス

タックポインタの設定)があるためです。それ以外にも、レジスタの初期設定等はここで行な

います。 この、スタートアッププログラムを作成するために使用するアセンブリ言語をこれから説明

していきます。 ファイルの記述の中には 2 種類の記述が混在します。一つは、M16C/62A のニーモニック(実

際に機械語に直されてプログラムとなるもの)。もう一つは、アセンブラ記述のファイルを機

械語の実行ファイルに変換する為のソフト AS30(アセンブラ)に対する指示命令です。 ここでは、ファイル内で使用されたものだけを説明していきます。さらに詳しい内容を知りた

い方は、ニーモニックについては『M16C/60 M16C/20 シリーズソフトウエアマニュアル』を、 指示命令については『AS30 ユーザーズマニュアル』をご覧下さい。

4.3.1.sampleAで使用するニーモニック(アセンブリ言語命令)

このファイル内で使用する命令語は、専用レジスタへの転送命令、転送命令、ビット操作命令、

サブルーチンコール命令、割り込みからの復帰命令の 5 種類です。このうち、割り込みからの

復帰命令は、割り込みの説明のときに行ないますのでここでは説明しません。

専用レジスタへの転送命令

LDC命令

ニーモニック 記述形式 オペレーション

LDC LDC src,dest dest ← src

・srcの内容をdestに転送します。

<記述例>

LDC RO,SB

1234h 0000hR0 SB

1234h 1234hR0 SB

<実行前>

<実行後>

0000hISP <実行前>

<実行後>

LDC #024Bh,ISP

024BhISP

図 4-7

34/63

Page 35: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

転送命令 MOV命令

ニーモニック 記述形式 オペレーション

MOV MOV.size  src,dest dest ← src

・srcの内容をdestに転送します。

<記述例>

MOV.B ROL,ROH

R0

R0

<実行前>

<実行後>

H L

H

12h 34h

34h 34h

MOV.W RO,R1

R0 <実行前>

<実行後>

1234h R1 5678h

R0 1234h R1 1234hL

MOV.B #00100000B,0007H

0000100 000000000

<実行前> <実行後>

0007h

メモリ メモリ

0007h

図 4-8 ビット処理命令

00000000 100000000

BSET・BCLR命令

ニーモニック 記述形式 オペレーション

BSET BSET dest dest ← 1 ・destに1を格納します。

<記述例>

BSET 0,000AH

BCLR BCLR dest dest ← 0 ・destに0を格納します。

BCLR 0,000AH

<実行前> <実行後>

000ah

メモリ メモリ

000ah

<実行前> <実行後>

000ah

メモリ メモリ

000ah11111111 1 1 1 1 1 1 1

35/63 図 4-9

Page 36: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

サブルーチン呼び出し命令

JSR命令

ニーモニック 記述形式 オペレーション

JSR JSR(.length)label SP ← SP-1

・labelへサブルーチン分岐します。

<記述例>

jsr.a label

M(SP) ← (PC+n)HSP ← SP-2

注:nは命令のバイト数

M(SP) ← (PC+n)MLPC ← label

・分岐範囲は分岐距離指定子により異なります。

注:(.length)は分岐距離指定子

.length

.W

.A

分岐範囲

命令の先頭番地を起点に-32767~+32768バイト(16ビットPC相対)

フルアドレス空間(20ビット絶対)

JSR命令

次の命令

サブルーチンプログラム

label

命令実行後のスタックの状態

PC(プログラムカウンタ)

メモリ

<アドレス>

上位 下位中位

CPU

次の命令番地上位

次の命令番地中位

次の命令番地下位 SP(スタックポインタ)

labelのアドレス(サブルーチンの先頭番地)

<アドレス>

戻り先番地(JSRの次の命令)下位の格納アドレス

図 4-10

36/63

Page 37: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

4.3.2.sampleAで使用する指示命令

AS30(アセンブラ)で使用できる指示命令について説明します。指示命令は、アセンブラ記

述ファイルを機械語のオブジェクトファイルに変換するソフト(AS30)に対する指示をする

ものです。ここでは sampleA のスタートアッププログラム start0.a30 で使われる指示命令に

ついて説明します。その他の指示命令については、AS30 のユーザーズマニュアルを参照して

下さい。 アセンブル制御指示命令 AS30 の実行について指示できます。 命令 機能 使い方・記述例

.EQU シンボルを定義します。 命令の右側に記述された内容が、左側の記述方法

で記述できるようになります。

.BTEQU ビットシンボルを定義します。 例 1) intstack .EQU 024BFH ・この定義の後からは、“024BFH”と書くところ

を“intstack”と書くことができます。 例 2) PRCR .EQU 000AH PRC0 .BTEQU 0,PRCR ・この定義の後からは、“1,000AH”と書くところ

を“PRC0”と書くことができます。 .END アセンブラソースの終了を

宣言します。 アセンブラのソースファイルの最後に記述しま

す。 リンク制御指示命令 アドレス再配置制御の為の情報を定義できます。 命令 機能 使い方・記述例

.SECTION セクション命を定義します。 例).section program リンクするときの情報になります。

.GLB グローバルラベルを 指定します。

例).glb main “main”というラベルが他のファイルから参照

されることを表します。

37/63

Page 38: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

アドレス制御命令 命令 機能 使い方・記述例

.ORG アドレスを宣言します。 セクション指示命令“.SECTION”の直後に記述

してください。 例).section fvector

.org 0fffdch .LWORD 4 バイト長データで ROM 領域

に格納します。 例).LWORD symbol(symbol は 4 バイトデー

タ:プログラムのアドレス等)

4.3.3.スタートアップファイル(start0.a30)の解説

sampleA の初期設定プログラムファイル(start0.a30)の説明をします。 フローチャート

start0.a30

スタックポインタ設定

プロセッサモードレジス

タ設定

システムクロック設定

mainプログラムへ

*LDC命令で割り込みスタックポインタに値を設定する。

*OAKS16はシングルチップモードで使用するので、

*サブルーチンコール命令でmainプログラムに移る。

モニタでは『分周無し』に設定されているので

ここではモニタにあわせ『分周無し』にする。

『シングルチップモード』に設定する。

スタックは、高位アドレスから下位アドレスへ

ユーザRAMの 終アドレス にする。

*メインクロック分周比を設定する。

使用していくので、設定する値は

<ユーザRAM>

024BFh

データ

SP

CPU

024BF

SP

終アドレス

図 4-11

38/63

Page 39: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

プロセッサモードレジスタ設定 OAKS16 のプロセッサモードを決めるレジスタで、プロセッサモード 0 とプロセ

ッサモード 1 があります。これらのレジスタは、SFR 領域の 0004h,0005h 番地に

なります。OAKS16 の設定を以下の表で確認してください。

プロセッサモードレジスタ0(0004h番地)

リセット後:00000000b

b7

PM07 PM06 PM05 PM04 PM03 PM02 PM01 PM00

b0

プロセッサモードビット

01:メモリ拡張モード

11:マイクロプロセッサモード10:使用禁止

R/Wモード選択ビット0:RD,BHE,WR1:RD,WRH,WRL

ソフトウエアリセットビット

“1”をセットするとマイクロコンピュータはリセットされる。

マルチプレクスバス空間選択ビット00:マルチプレクスバスを使用しない。01:CS2の空間に割り当てる10:CS1の空間に割り当てる11:全空間に割り当てる

P40~P43機能選択ビット0:アドレス出力1:ポート機能

BKLK出力禁止ビット

0:BCLK出力あり1:BCLK出力なし(端子はフローティング)

0 0 0 0 0 0 0 0

00:シングルチップモード

例)OAKS16での設定

図 4-12

プロセッサモードレジスタ1(0005h番地)

リセット後:00000xx0b

b7

PM17 PM16 PM15 PM14 PM13 PM12 PM1 PM10

b0

予約ビット

何も配置されていない設定する場合は“0”

読み出し時の値は不定

内部予約領域拡張ビット0:内部RAM領域15Kバイト以下

内部ROM領域192Kバイト以下

ウエイトビット

0:ウエイトなし1:ウエイトあり

0 0 0 0 0 0 0 0

必ず“0”を設定

例)OAKS16での設定

内部ROM領域192Kバイト越えに拡張1:内部RAM領域15Kバイト越え、

予約ビット必ず“0”を設定

39/63 図 4-13

Page 40: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

システムクロック制御レジスタ設定

このレジスタで、CPU の動作クロック源を設定します。CPU リセット時には、メインクロ

ックの 8 分周が BCLK になります。OAKS16 ではモニタで、“分周なし”に設定していますの

で、ユーザプログラムの初期設定でも分周の設定をして下さい。このレジスタの値を設定しな

いと、モニタ起動時には、“分周なし”(モニタ設定により)、ROM 化時には、8分周(リセッ

ト時の値)ということが起こってしまいます。

システムクロック制御レジスタ0

(0006h番地)

リセット後:01001000b

b7

クロック出力機能選択ビット

01:fcを出力

11:f32を出力10:f8を出力

WAIT時周辺クロック停止ビット

0:ウエイトモード時f1,f8,f32停止しない

メインクロック(XIN-XOUT)停止ビット

0:発振1:停止

メインクロック分周比選択ビット0:CM16,CM17有効1:8分周モード

0 0 0 0 1 0 0 0

00:入出力ポートP57

例)OAKS16での設定

1:ウエイトモード時f1,f8,f32停止する

XCIN-XCOUT駆動能力選択ビット

0:LOW

1:HIGH

ポートXC切り替えビット

0:入出力ポート機能1:XCIN-XOUT発振機能

システムクロック選択ビット0:XIN,XOUT選択1:XCIN,XCOUT選択

b6 b5 b4 b3 b2 b1 b0

図 4-14

システムクロック制御レジスタ1

(0007h番地)

リセット後:00100000b

b7

全クロック停止制御ビット

1:全クロック停止(ストップモード)

0 0 1 0 0 0 0 0

0:クロック発振

例)OAKS16での設定

XCIN-XCOUT駆動能力選択ビット0:LOW1:HIGH

メインクロック分周比選択ビット

01:2分周モード

11:16分周モード10:4分周モード

00:分周なしモード

予約ビット必ず“0”を設定

b6 b5 b4 b3 b2 b1 b0

40/63 図 4-15

Page 41: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

プログラム記述例

;/*---------------------------------------------*/

;/* ファイル名: start0.a30 */

;/* 内容: スタートアッププログラム */

;/* 日付: 2001.9.19 */

;/* 作成者: OAKS16KIT support */

;/*---------------------------------------------*/

intstack.EQU 024BFH ; スタックポインタ初期値(ユーザRAM最終番地)

PRCR .EQU 000AH ; プロテクトレジスタ

PRC0 .BTEQU 0,PRCR ; システムクロックレジスタビット

PRC1 .BTEQU 1,PRCR ; プロセッサモードレジスタビット

SFRのアドレス

やビットを定義し

ます。

ヘッダ:ファイル名や作成記録

を記述します。 コメントは“;”の後に記述し

ます。

;

PM0 .EQU 0004H ; プロセッサモードレジスタ0

PM1 .EQU 0005H ; プロセッサモードレジスタ1

;

CM0 .EQU 0006H ; クロックモードレジスタ0

CM1 .EQU 0007H ; クロックモードレジスタ1

C_CM0 .EQU 00001000B ; CM0(Xcin-HIGH)

C_CM1 .EQU 00100000B ; CM1(Xin-HIGH)

;

.section program

.glb start

;

;************************************************

;* 初期化ルーチン *

;************************************************

;

start:

; ----- set interruptstack -----

LDC #intstack,ISP ; 割り込みスタックポインタセット

; ----- set Processor mode -----

BSET PRC1 ; プロセッサモードレジスタ書き込みイネーブル

MOV.B #00000000b,PM0 ; シングルチップモード

MOV.B #00000000b,PM1 ; 非拡張、ノーウェイト

BCLR PRC1 ; プロセッサモードレジスタ書き込みディゼーブル

; ----- set System clock -----

BSET PRC0 ; クロックコントロールレジスタ書き込みイネーブル

MOV.B #C_CM0,CM0 ; 発信

MOV.B #C_CM1,CM1 ; 分周なし

BCLR PRC0 ; レジスタ書き込みディゼーブル

;

.glb _main

;

; ***** メインルーチンへ *****

;

jsr.a _main ; --> main()

;

;************************************************

;* ダミープログラム *

;************************************************

.glb dummy_int

ここからのセクションを“program”

という名前にします。

“start”というラベルを他のフ

ァイルから参照できるように

します。

M16C の初期設定です。 (ここからが実際に M16Cで動かすプログラムです。)

“main”というラベルを他のフ

ァイルから参照できるようにし

ます。

使用していない割り込みのダミープログラムです。何もし

ないで割り込みから復帰します。

プログラム記述の終了を示します。

サブルーチンコールで main プログラ

ムを呼び出します。

dummy_int:

reit

;

.end

41/63

Page 42: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

4.3.4.ベクタテーブルファイル(vector.a30)の解説

このファイルは、ベクターテーブルの定義をする為のファイルです。M16C/62A はリセット

がかかると、リセットベクタと呼ばれるメモリのアドレスを読み込み、その内容をプログラム

カウンタにセットしてプログラムを実行していきます。そのため、プログラムの先頭アドレス

を、リセットベクタに設定しなければなりません。ベクタテーブルは、それぞれ 4 バイトずつ

データ領域を持っているので、設定には指示命令“.lword”を使用します。

;/*---------------------------------------------------------------------------*/

;/* ファイル名: vector.a30 */

;/* 内容: ベクタテーブル定義 */

;/* 日付: 2001.9.19 */

;/* 作成者: OAKS16KIT support */

;/* コメント:使用しないベクタは dummy_int を設定 */

;/*----------------------------------------------------------------------------*/

;

.glb start

.glb dummy_int

.section fvector

.org 0fffdch

;

.LWORD dummy_int ; FFFDC~F Undefined instruction

.LWORD dummy_int ; FFFE0~3 Overflow

.LWORD dummy_int ; FFFE4~7 BRK instruction

.LWORD dummy_int ; FFFE8~B Address match

.LWORD dummy_int ; FFFEC~F Single step

.LWORD dummy_int ; FFFF0~3 Watchdog timer

.LWORD dummy_int ; FFFF4~7 DBC

.LWORD dummy_int ; FFFF8~B NMI

.LWORD start ; FFFFC~F RESET

;

.end

ヘッダ:ファイル名や 作成記録を記述します。

“start”と“dummy_int”は他のファイ

ルを参照することを宣言します。

以下の記述内容を“fvector”というセクション

で fffdch から配置する宣言です。

fffdch

fffe0h

fffffh

ffffch

dummy_int上位

dummy_int中位

dummy_int下位

dummy_int下位

start下位start中位

start上位

00

・・・

00

下位、中位、上位の順で配置さ

れる。余った上位ビットには全

て“0”が入る。

42/63

Page 43: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

4.4.C言語プログラムの基礎知識

4.4.1.sampleAで使用するC言語記述

ここで使われる C言語記述について説明します。C言語のプログラムはフリーフォーマット形

式なので、ある一定の規則を守れば、後は自由にプログラムを記述できます。

C 言語の規則 (1) プログラムは原則的に英小文字で記述する。 (2) プログラムの実行文は「;」で区切る。 (3) 関数や制御文の実行単位は{ }で囲む。 (4) 関数や変数は型宣言が必要である。 (5) 予約語は識別し(関数名、変数名など)に使用できない。 (6) コメントは「/* コメント */」で記述する。 関数 C 言語では「関数」がプログラムの基本単位となります。関数を使用するためには「関数の型

宣言(プロトタイプ宣言)」、「関数の定義」、「関数の呼び出し」の 3 つの手続きが必要です。 関数の型宣言(プロトタイプ宣言) ・・・ 関数を使用する前に行なう。

<書式> 戻り値のデータ型 関数名(引数のデータ型のならび); *戻り値や引数がないときは、空(から)を意味する“void”という型を記述する。

関数の定義(関数本体) <書式>

戻り値のデータ型 関数名(仮引数 1 のデータ型 仮引数,・・・) { ・ ・ ・

return 戻り値; }

関数の呼び出し <書式> 関数名(引数 1…,); または 変数=関数名(引数 1…,);

43/63

Page 44: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

test.c で使用する C 言語記述 ① main(){

} これは C 言語プログラムの中心になる main 関数です。この関数がプログラム全体の中心とな

り、ここからさらに、ほかの関数を呼び出したりします。 main の後の()は引数が空であることを示します。引数がなくても()が必要です。 { }で囲まれた部分は関数の本体と呼び、処理手順等

を記述します。 for文

式1

式2

処理

式3

{}

(for文の次の命令)

偽(=0)

(≠0)

② for(式 1;式 2;式 3){・・・} 繰り返しを行なう命令です。式 1 は for 文に入って最初

に実行される為、初期値の設定に使われます。式 2 は for文の繰り返しを終了する条件式です。式 3 は{・・・}が

実行された後で実行される為、カウンタのインクリメン

トなどに使われます。式 2 の繰り返しの先頭で行なわれ

ています。for 文の式 1、式 2、式 3 はどれも書かない

で済ますこともできます。書かない場合には、その式が

ないものとみなされます。その結果 for(;;){・・・}

は無限ループと判断されます。

図 4-16 ③ if(式) 文; 制御の流れを 2 方向に変える命令です。条件式が真のと

き文を実行します。偽のとき、文を実行せずに次の命令に進み

ます。 if文

真 (≠0)

偽(=0)

If 文は文が一つの場合はセミコロン(;)で終わります。文が

複数の場合は、それぞれの文をセミコロンで終わり、まとまり

をカッコ{}でくくります。 ④ break; 繰り返しを中断してループから抜け出します。 ⑤ #pragma ADDRESS 変数名 絶対アドレス 変数名を絶対アドレスに配置します。

図 4-17

44/63

Page 45: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

⑥ #define マクロ定義を行ないます。 ⑦ 演算子

表 4-1

演算子 記述形式 内容

--

==

式1=式2

--変数

変数--

式1==式2

式2の値を式1へ代入する

変数の値をディクリメント(-1)する

式1の値が式2の値と等しければ真、それ以外は偽

⑧ NC30 の予約語 (NC30 で使用しているため変数や関数名に使用できない記述です)

表 4-2

_asm const far regisuter switch _far continue float return typedef _near default for short union asm do goto signed unsigned auto double if sizeof void break else int static volatile case enum long struct while char extem near

45/63

Page 46: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

4.4.2.test.cの解説

sampleA の main プログラムファイル(test.c)の説明をします。 フローチャート

test.c

port0初期設定

LED点灯

カウンタ初期値設定

方向レジスタを出力にする。

*ポート0にLED1点灯データをセットする。

*ポート0の初期データをセットし、

カウンタ-1

カウンタ=0?

LED消灯

カウンタ初期値設定

カウンタ-1

カウンタ=0?

*カウンタに初期値4ffffHをセットする。

*カウンタの値が0になるまで

*カウンタが0のなったら

ディクリメントを繰り返す。

*カウンタに初期値4ffffHをセットする。

*ポート0にLED1消灯データをセットする。

ディクリメントを繰り返す。*カウンタの値が0になるまで

ループを抜け次の処理に進む。

*カウンタが0のなったらループを抜け次の処理に進む。

図 4-18

46/63

Page 47: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

ポートの使い方(データ出力)

LED1が接続されているポートP0は、入出力兼用レジスタです。ポートP0方向レジスタで、

入力ポートとして使用するか、出力ポートとして使用するかを設定します。出力ポートとして

設定した場合には、データレジスタに値を設定すれば、その値がポートの端子から出力されま

す。

ポート0方向レジスタ0

(03e2h番地)

リセット後:00000000b

b7PD0_7

b0PD0_6 PD0_4PD0_5 PD0_3 PD0_2 PD0_1 PD0_0

*方向はビットごとに設定でき、“1”で出力、“0”で入力になります。

ポート0レジスタ0

(03e0h番地)

b7P0_7

b0P0_6 P0_4P0_5 P0_3 P0_2 P0_1 P0_0

*“1”で“H”を出力、“0”で“L”を出力します。

図 4-19 今回の回路は、ポート P00 に LED1 が接続されているだけで、P01 から P07 までの 7 ビッ

トは何も接続されていません。ですから、P01 から P07 までは、入出力どちらに設定しても、

どんなデータを設定しても、何も問題はありません。ここで、ポートへのデータの出し方です

が、NC30 というコンパイラはビット演算もサポートしているので、1 ビットだけ処理するこ

とも可能です。ですが、今回のプログラムでは、8 ビットまとめて、代入演算子で処理する方

法をとります。 方向レジスタは全て出力(11111111b)にします。LED 出力データは、LED1 以外は全て“H”

データを出力することにし、点灯データ(11111110b)、消灯データ(11111111b)とします。

47/63

Page 48: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

プログラム記述例

/*---------------------------------------------*/

/* ファイル名: test.c */

/* 内容: LED 点灯(ソフトウエイト) */ /* 日付: 2001.9.19 */

/* 作成者: OAKS16KIT support */

/*---------------------------------------------*/

/* SFR 定義 */

#pragma ADDRESS p0 3e0H /* Port P0 register */

#pragma ADDRESS pd0 3e2H /* Port P0 direction register */

/* プロトタイプ宣言 */

void _main(void);

/* 変数の宣言 */

unsigned char p0, pd0;

/* マクロ定義 */

#define LED_on 0xfe /* LED 点灯 */

#define LED_off 0xff /* LED 消灯 */

main(){

unsigned long i; カウンタとして使用する変数を宣言します。

LED 点灯データ・消灯データ

をマクロ定義します。

ポート 0 の方向レジスタとデータレジスタに値を

入れるために変数として宣言します。

このファイルで使用される関数の宣言です。

ポート 0 の方向レジスタとデー

タレジスタのアドレス設定

ヘッダ:ファイル名や作成記

録を記述する。

p0 = LED_off; /* ポート 0 出力 H(LED 消灯)*/

pd0 = 0xff; /* ポート 0 方向出力 */ ポート0初期設定

LED 点灯

for(;;)

{

p0 = LED_on; /* LED 点灯 */

for(i=0x4ffff;;){ /* 時間待ち(ソフトウエイト) */

i--;

if(i==0) break;

}

p0 = LED_off; /* LED 消灯 */ for(i=0x4ffff;;){ /* 時間待ち(ソフトウエイト) */

ウエイト:ダウンカウント

LED 消灯

ウエイト:ダウンカウント

i--;

if(i==0) break;

}

}

}

48/63

Page 49: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

4.5. メモリ配置の基礎知識

SFR

データ領域

プログラム領域

固定ベクタ

固定データ領域

00000h

e0000h

fffffh

RAM

ROM

OAKS16で開発するプログラムは、最終的にROM化して動作させます。そのため、プログラムやデー

タをどこに配置するかが重要になります。基本的に

は、右の図が示す用に、ワーク用のデータ領域(カ

ウンタなど)プログラム実行中のみ使用するものは

は RAM に配置します。プログラムや固定データの

ように、プログラム実行途中で変更されないもの、

電源を切ってもデータを保持したいものは ROM に

配置します。 これらの配置は、最終的にリンカで決定されます。

そのリンカに渡す情報として、“セクション”があり

ます。このセクションの決め方は、アセンブラ記述

と、C 言語記述では異なります。 図 4-20

①アセンブラのセクションの決め方 “.SECTION”命令をソースプログラム内に記述することで決定します。 ②C 言語でのセクションの決め方 コンパイラが自動的に設定します。

data section

bss section

stack section

programsection

rom section

data_lsection

ROM

RAM

main(){

unsigned long i;

p0=LED_off;

}

プログラム

自動変数

初期値を持つ静的変数

初期値を持たない静的変数

文字列・定数

初期値

<test.c>

<NC30が管理するセクションとtest.cで使用するセクション>

・・・

図 4-21

49/63

Page 50: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

ファイル内のセクション記述と、メモリ配置

<start0.a30> <test.c> <vector.a30>

.section programmain(){

}

処理A 処理Bベクタアドレス

.section program

処理B

コンパイラによって、一度アセンブラのファイルに変換される。そのときにセクション情報

が自動的に記述される。

<start0.r30> <test.r30> <vector.r30>

<sampleA.x30>

<sampleA.mot>

e0000h

fffdch

fffffh

リンカの起動時に、セクションアドレスを指定する。

ln30 start0.r30 test.r30 vector.r30 -O sampleA -ORDER program=0e0000

処理B

ベクタアドレス

処理A

.org 0fffdch

.section fvector

フラッシュROMに書き込み

図 4-22

50/63

Page 51: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

複数のファイルをコンパイル、アセンブル、リンクという一連の処理を行なうことによって

一つのオブジェクトファイルを作成します。そこで、プログラムやデータをメモリのどこに配

置されるかを決める方法として、アセンブラリストの中に指示命令“.org”で記述する方法と、

リンカのオプション“-order”でアドレスを設定する方法があります。 固定ベクタなど、変更の必要のないものは、“.org”で設定しておきます。 プログラムやデータのアドレスなどは、変更がしやすいように、リストの中ではセクション

だけを決めておき、リンク時にアドレスを指定するか、スタートアッププログラムに“.org”で配置する部分をまとめておき、そこだけを変更すればよいようにしましょう。 ここで説明している test.c はスタックを使用する自動変数しか使用していませんので、デー

タ領域のセクションの配置は必要ありません。ですが、C 言語のプログラムの中で、静的変数、

定数、初期値を持つ静的変数などを使用する場合には、アセンブリ言語のスタートアッププロ

グラムで、セクションの配置と初期化を行なう必要があります。今回の説明に使用した

start0.a30 にはデータ領域の初期化は含まれていません。静的変数、定数、初期値を持つ静的

変数などを使用する場合には、NC30 に標準で添付されている“ncr0.a30”というスタートア

ッププログラムを使用することをお勧めします。使用方法は、TM でプロジェクトを作成する

ときに、“標準のスタートアッププログラムを使用する”を選択すれば、自動的にプロジェク

トのフォルダにコピーされます。そこで、『M16C/60 M16C/20 シリーズ<C 言語編>プログラ

ミングマニュアル 第2章 ROM 化技術』を参考にスタートアッププログラムの変更を行なっ

てください。

51/63

Page 52: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

5.I/O制御の演習

ここで、fullkit の EXBOARD の準備をします。EXBOARD についている部品を接続し、制御

する為の回路を作成します。 5.1.LED

ここでは代表的な出力装置として LED をとりあげ、マイコンとの接続の方法、プログラムで

の制御の考え方を説明していきます。 5.1.1.LEDの特性

LED は Light Emitting diod(発光ダイオード)の略では一定の電流を流すと発光する部品で

す。LED はダイオードの一種ですので極性があります。足の長い方が『アノード』といい電

源につなぎます。足の短い方が『カソード』といい、GND につなぐ方です。電流は、アノー

ドからカソードに向かってしか流れません。

5.1.2.LEDの接続回路

次に、LED の一般的な接続回路を示します。LED は、M16CA/62(マイコン)のポートに接

続します。ここで LED とマイコンの間に抵抗が入れてあります。この抵抗がないと、LED と

マイコンに多量の電流が流れ、壊れることがあります。そのために、電流を制限する為の抵抗

を入れます。(『電流制限抵抗』と呼びます。)

LED出力

ポート

マイコン

電流制限抵抗

5V

5V

電流は流れない電位差がないので

0V 電位差があるので

電流が流れる この回路では、マイコンの出力ポートから

“H”を出力すれば、LEDは点灯せず(消灯)“L”を出力すれば、LEDは点灯する。

図 5-1

52/63

Page 53: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

5.1.3.電流制限抵抗の求め方

LED の制限抵抗を求めるには、まず、LED のデータシートで特性を調べます。 表 5-1

LED(SEL111R)の光特性(データシートより) 順電圧

ここから、10mA の電流を流したとき、約 2.0(V)の電圧降下がおこる事がわかります。 次に、ポートの推奨動作条件を調べます。 M16C/62A でポートから出力する電流の推奨値は5mA ですので、ここでは、5mAで計算し

てみます。 R(抵抗値)=V(電源電圧)-VLED(LEDの電圧降下)/I(電流) R=(5-2)/0.005=600(Ω) ということで 600Ω位の抵抗をつければよいことになります。 OAKS16 の EXBOARD についている抵抗は、1kΩですので逆に計算してみると、1000=(5

-2)/Iで I=約 3.3mA 位の電流が流れることになります。電流は、流しすぎるとマイコンやL

ED をこわす原因になりますが、少なくても、輝度が問題なければOKです。実際につけてい

ただければ、それほど問題のない輝度を得られることがわかっていただけると思います。 というわけで、LED の制御回路では計算した制限抵抗値より大きい値もので、近い値の抵抗

をつけていただければよいということになります。

条件 Typ Max

2.0(V) 2.5(V) 10(mA)

表 5-2

M16C/62A 推奨動作条件(データシートより) 記号 項目 規格値(最大) IOH(peak) “H”尖頭出力電流 -10.0(mA) IOH(avg) “H”平均出力電流 -5.0(mA) IOL(peak) “L”尖頭出力電流 10.0(mA)

“L”平均出力電流 5.0(mA) IOL(avg)

53/63

Page 54: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

<参考> 代表的な電子部品である抵抗は、その用途に応じて多くの種類が存在します。ここで使用して

いるのは、制度はあまりよくありませんが安価でよく使われる『炭素皮膜抵抗器』を使用して

います。抵抗には一目で抵抗値がわかるようにカラーコードが表示されています。 抵抗カラーコード表 表 5-3 色 第 1 数字 第 2 数字 第 3 数字

黒 0 0 100 (1) 茶 1 1 101 (10) 赤 2 2 102 (100) 橙 3 3 103 (1000) 黄 4 4 104 (10000) 緑 5 5 105 (100000) 青 6 6 106 (1000000) 紫 7 7 107 (10000000) 灰 8 8 108 (100000000) 白 9 9 109 (1000000000)

茶 黒 橙

1(茶)0(黒)×1000(橙)=10000(Ω)=10k(Ω)

第1数字第2数字

第3数字許容差

図 5-2

54/63

Page 55: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

5.1.4.LEDの回路接続(演習 1)

下の回路図の通りに、LED2、LED3 を EXBOARD に接続して下さい。M30620FPAFP の端

子はコネクタで EXBOARD に接続していますので、LED と接続した抵抗のもう一方の端子を

回路図に示すポートが接続されるコネクタに接続してください。P70 は CN1の 26 番ピン、

P71 は CN1 の 25 番ピンに接続されています。(OAKS16EXBOARD マニュアル参照)

LED 回路図

LED2LED3

R3

R2P70

P71

M30620FCAFP

これで、LED の制御回路ができました。 この LED は、ポートから“H”が出力され

ると消灯し、“L”が出力されると点灯しま

す。 これは、プログラムを作成するときに、非常

に重要な情報です。この後説明するスイッチ

の回路の情報と一緒に『インターフェース仕

様書』としてまとめておくと便利です。) 表 5-4 インタフェース仕様

点灯 消灯

LED2(P70) L H LED3(P71) L H

図 5-3

5.1.5.LED点灯プログラム(演習 2)

LED2 と LED3 を交互に点灯させるプログラムを作成して下さい。点灯の交代時間は、変化が

分かる速さであれば OK です。 ① ソースファイルの準備 ソースファイルは、sampleA を参考にしましょう。スタートアッププログラムと、ベクタファ

イルは同じものをそのまま使い、I/O を制御するメインプログラムだけを変更します。 (ア) ハードディスクに新フォルダを作成する。フォルダ名は TM のプロジェクト名になる

のでここでは“ensyuA”とする。¥ensyuA に OAKS16CDROM 内¥sampleA から 3つのソースファイル(test.c、start0.a30、vector.a30)をコピーする。

(イ) test.c の内容を変更するので、ファイル名を ensyuA.c に変更する。(内容の異なるプ

ログラムを同じファイル名で持つことは、間違いの原因になりやすい。) (ウ) ensyuA.c をエディタで、仕様に合わせた内容に書き換える。

55/63

Page 56: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

② コンパイル TM でプロジェクトを作成し、コンパイルする。これにより、デバッガ(KD30)上で動作さ

せるファイル(ensyuA.x30)とフラッシュ ROM ライタ(flashstart)で書き込むためのファ

イル(ensyuA.mot)が作成される。 ③ デバッグ デバッガで動作を確認する。 ④ ROM 焼 フラッシュ ROM にプログラムを書き込み単体で動作させる。 以上が演習手順です。 演習 2 のサンプルプログラムはこのテキストに添付してあります。(ensyuA)ハードディスク

のルートディレクトリにフォルダごとコピーして、TM で動作を確認してください。 <参考> 制御部分のフローチャート

ensyuA.c

port7初期設定

LED2点灯

カウンタ初期値設定

方向レジスタを出力にする。

*ポート7にLED2点灯データをセットする。

*ポート7の初期データをセットし、

カウンタ-1

カウンタ=0?

LED3点灯

カウンタ初期値設定

カウンタ-1

カウンタ=0?

*カウンタに初期値4ffffHをセットする。

*カウンタの値が0になるまで

*カウンタが0のなったら

ディクリメントを繰り返す。

*カウンタに初期値4ffffHをセットする。

*ポート7にLED3点灯データをセットする。

ディクリメントを繰り返す。*カウンタの値が0になるまで

ループを抜け次の処理に進む。

*カウンタが0のなったらループを抜け次の処理に進む。

56/63 図 5-4

Page 57: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

制御プログラム(ensyuA.c)リスト

/*---------------------------------------------------------------------*/ /* ファイル名: ensyuA.c */ /* 内容: LED2.3 点灯(ソフトウエイト) */ /* 日付: 2001.12.4 */ /* 作成者: OAKS16KIT support */ /*---------------------------------------------------------------------*/ /* SFR 定義 */ #pragma ADDRESS p7 3edH /* Port P7 register */ #pragma ADDRESS pd7 3efH /* Port P7 direction register */ /* プロトタイプ宣言 */ void _main(void); /* 変数の宣言 */ unsigned char p7, pd7; /* マクロ定義 */ #define LED_off 0xff /* LED2.3 消灯 */ #define LED2_on 0xfe /* LED2 点灯、LED3 消灯 */ #define LED3_on 0xfd /* LED2 消灯、LED3 点灯 */ main(){ unsigned long i; p7 = LED_off; /* ポート 7 出力 H(LED 消灯) */ pd7 = 0xff; /* ポート 7 方向出力 */ for(;;) { p7 = LED2_on; /* LED2 点灯 */ for(i=0x4ffff;;){ /* 時間待ち(ソフトウエイト) */ i--; if(i==0) break; } p7 = LED3_on; /* LED3 点灯 */ for(i=0x4ffff;;){ /* 時間待ち(ソフトウエイト) */ i--; if(i==0) break; } } }

LED3 点灯

LED2 点灯

P7 初期設定

LED に出力するデータを定義します。

ポート 7 の方向レジスタとデータレジスタに値を

入れるために変数として宣言します。

P7 のアドレスを定義します。

57/63

Page 58: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

5.2.スイッチ

OAKS16 EXBOARD には三種類のスイッチが用意されています。 ① トグルスイッチ:ON、OFF の状態が固定できます。 ② 8 素子ディップスイッチ:ON、OFFの状態が固定できます。トグルスイッチが 8 個一緒にな

って小さな部品になったようなものです。 ③ プッシュスイッチ:一番よく使われるスイッチです。押している間だけONになります。 これらを M16C に接続する方法を考えましょう。 スイッチも LED と同様にポートに接続します。ですが、スイッチはこれを使ってマイコンに

情報を与える部品です。スイッチが ON のとき、OFF のときの変化がマイコンに伝わるよう

な回路を作成する必要があります。 5.2.1.スイッチの回路例

一般的なスイッチの接続回路例を示します。

スイッチ回路例 1 回路例 1 では、ON のときの電圧は“L”になりますが、

OFF の時の電圧が決まりません。そこで、回路例 2 の

様に抵抗を入れて電源に接続し、OFF の時“H”に決

まるように配線します。 port

ここで、抵抗が入っていないと、スイッチを ON にした

時、ショートしてしまいます。この抵抗をプルアップ抵

抗といい、スイッチ回路では必要な回路です。プルアッ

プ抵抗には、数kΩから数十kΩの抵抗を使います。

図 5-5 この後、詳しく説明しますが、OAKS16 に使われてい

るマイコンでは、ポートにプルアップ抵抗が内蔵されて

おり、これを使うこともできます。 スイッチ回路例 2

port

図 5-6

58/63

Page 59: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

5.2.2.M16C/62Aのプルアップ抵抗

M16C/62A のポートは内部にプルアップ抵抗を内蔵しており、プルアップ制御レジスタを設定

することで、4 ビットごとにプルアップ抵抗の有無を設定できます。プルアップ制御レジスタ

は、プルアップ制御レジスタ 0(03FCh 番地)、プルアップ制御レジスタ 1(03FDh 番地)、

プルアップ制御レジスタ 2(03FEh 番地)の 3 つで、それぞれ指定されたビットを“1”にす

ることでプルアップ抵抗を使うことができます。 下記に、P30、P31にスイッチをつけた場合のプルアップ抵抗の設定を示します。ポート P3 の

プルアップ制御レジスタはプルアップ制御レジスタ 0 です。P30と P31はビット 6 に割り当て

られていますので、ビット 6 を“1”にします。P32、P33は何も接続されていなくても 4 ビッ

トごとの設定しかできませんので、強制的にプルアップされることになります。

プルアップ制御レジスタ0

(03fch番地)

リセット後:00000000b

b7PU07

b0PU06 PU04PU05 PU03 PU02 PU01 PU00

P00~P03のプルアップ

P04~P07のプルアップ

P10~P13のプルアップ

P14~P17のプルアップ

P20~P23のプルアップ

P30~P33のプルアップ

P24~P27のプルアップ

P34~P37のプルアップ

*“0”でプルアップなし、“1”でプルアップあり。

0 1 0 0 0 0 0 0 ← 例)OAKS16での設定

図 5-7 プルアップ抵抗値は、データシート P175『電気的特性』より、標準で 50.0kΩです。

59/63

Page 60: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

5.2.3.スイッチの回路接続(演習 3)

下の回路図の通りに、OAKS16EXBOARD の SW2、SW3 を接続して下さい。M30620FPAFPの端子はコネクタで EXBOARD に接続していますので、スイッチの一方を GND に、もう一

方を回路図に示すポートが接続されるコネクタに接続してください。P30はCN3の 24番ピン、

P31 は CN3 の 23 番ピンに接続されています。(OAKS16EXBOARD マニュアル参照) これらのスイッチは、OFF の時に“H”、ON の時に“L”になります。 プルアップ抵抗は、M16C/62A の内部プルアップ抵抗を使用します。 表 5-5 SW 接続 スイッチ 2 の状態とポート P30 の入力データ

P30 SW2 が off H SW2 が on L

スイッチ 3 の状態とポート P31 の入力データ

P31 SW3 が off H SW3 が on L

P30

P31

M30620FCAFP

SW2

SW3

図 5-8

5.2.4.スイッチとLEDの制御プログラム(演習 4)

SW2 と LED2、SW3 と LED3 を対応させ、それぞれがONのときに対応する LEDが点灯す

るプログラムを作成してください。(OFF の時は、対応する LED は消灯です。) 演習手順は、4.1.5.LED 点灯プログラムと同じです。(プロジェクト名を ensyuB とします。) データの考え方

P7レジスタ

P3レジスタ

SW3 SW2

LED3 LED2

“ON”で“0”

“0”で“点灯”

未接続

未接続

P7レジスタの内容をP3レジスタに設定すればOK

60/63 図 5-9

Page 61: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

制御プログラムのフローチャートとリスト

図 5-10

ensyuB.c

port3・port7初期設定

スイッチの状態をLEDに表示する。

方向レジスタを出力にする。

ポート3をプルアップ有りに設定する。

*ポート7の初期データをセットし、

*ポート3の方向レジスタを入力に設定する。

*プルアップ制御レジスタ0で

*port3レジスタの内容をport7レジスタに入れる。

/*--------------------------------------------------------------------*/ /* ファイル名: ensyuB.c */ /* 内容: LED と SW の制御 */ /* 日付: 2001.12.4 */ /* 作成者: OAKS16KIT support */ /*---------------------------------------------------------------------*/ /* SFR 定義 */ #pragma ADDRESS p3 3e5H /* Port P3 register */ #pragma ADDRESS pd3 3e7H /* Port P3 direction register */ #pragma ADDRESS p7 3edH /* Port P7 register */ #pragma ADDRESS pd7 3efH /* Port P7 direction register */ #pragma ADDRESS pur0 3fcH /* Port P0-3 pullup register */ /* プロトタイプ宣言 */ void _main(void); /* 変数の宣言 */ unsigned char p3,pd3,p7, pd7,pur0; /* マクロ定義 */ #define LED_off 0xff /* LED2.3 消灯 */ #define p3pullup 0x40 /* p3b0-b3 pullup data */ #define p3in 0x00 /* pd3 input */ #define p7out 0xff /* pd7 output */ main(){ pur0 = p3pullup; /* ポート 3 をプルアップ抵抗ありに設定 */ pd3 = p3in; /* ポート 3 方向入力 */ p7 = LED_off; /* LED 消灯 */ pd7 = p7out; /* ポート 7 方向出力 */ for(;;) { p7 = p3; /* スイッチの状態を LED に出力 */ } }

ポート 3 データレジスタの内容をその

ままポート7データレジスタに入れる。

ポートの初期設定

レジスタに設定する値をマクロ

定義しておく。

ポートのデータレジスタ、方向レジスタ、プルアップ

レジスタに値を設定する為に変数宣言をする。

プルアップ制御レ

ジスタのアドレス

を定義します。

スイッチが接続されているポー

ト3のアドレスの定義を追加し

ます。

61/63

Page 62: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

ファイルの変更が終了したら、TM を起動してプロジェクトを作成し、コンパイル、デバッグ

を行い、仕様通りの動作をするかどうか確認してください。動作が確認できたら flashstart でフラッシュ ROM に書き込み最終確認をして下さい。 演習 4 のサンプルプログラムはテキストに添付してあります。(ensyuB)ハードディスクのル

ートディレクトリにフォルダごとコピーして、TM で動作を確認してください。 以上で、OAKS16 基礎コースの説明と演習の解説は終了です。 さらに、M16C/62A の周辺機能、C 言語のプログラミングについてお知りになりたい方は

OAKS16 応用テキストにお進み下さい。

62/63

Page 63: OAKS16基礎テキスト - マイコンボードと ...oaks-ele.com › oaks_board › oaks16 › data › text › text_pdf › ... · このマイコンの構成要素が一つのボード上に組み込まれているものをワンボードマイコン、

OAKS16 基礎テキスト

OAKS16 キット

OAKS16 基礎テキスト(Ver.1.01) 資料番号:OAKS16 基礎テキスト(Ver.1.01) 発 行 所:オークス電子株式会社

〒101-0025 東京都千代田区佐久間町 3丁目21番地(第一千代田ビル3F) TEL:03-3863-1121 FAX:03-3863-1130 ホームページ http://www.oaks-ele.com

禁無断転載 本書の一部または全部を、当社に断りなく、いかなる形でも転載または複製すること

を堅くお断りします。

63/63