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

A/D

データレジスタは

A/D

変換結果を格納するための

16

ビットのリード専用レジスタです。

ADDRA

〜ADDRDの

4

本あります。各アナログ入力チャネルの変換結果が格納される

A/D

データレジスタは表

12.3

のとおりです。

12.3

アナログ入力チャネルと

A/D

データレジスタの対応 アナログ入力チャンネル 変換結果が格納される

グループ

0

グループ

1 A/D

データレジスタ

AN0 AN4 ADDRA

AN1 AN5 ADDRB

AN2 AN6 ADDRC

AN3 AN7 ADDRD

10

ビットの変換データは

A/D

データレジスタのビット

15

からビット

6

に格納されます

(図 12.1)。下

6

ビットの読み出し値は常に

0

です。

ビット 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

ADDR AD9 AD8 AD7 AD6 AD5 AD4 AD3 AD2 AD1 AD0 - - -

-初期値 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

R/W R R R R R R R R R R R R R R R R

12.1 A/D

データレジスタ

A〜D(ADDRA〜D)

A/D

コントロール/ステータスレジスタ(ADCSR)

ADCSR

A/D

変換器の終了フラグ、割込み許可、スキャンモード、チャンネルセレクトビットなど

で構成されています。

12.4 A/D

コントロール/ステータスレジスタ(ADCSR)

ビット ビット名 初期値

R/W

説 明

7 ADF 0 R/W A/D

エンドフラグ

[

セット条件

]

・単一モードで

A/D

変換が終了したとき

・スキャンモードで選択されたすべてのチャネルの変換が

1

回終了したとき

[

クリア条件

]

1

の状態をリードした後、

0

をライトしたとき

6 ADIE 0 R/W A/D

インタラプトイネーブル

このビットを1にセットすると

ADF

による

A/D

変換終了割り込み要求(

ADI

)が イネーブル

(

有効

)

になります。

5 ADST 0 R/W A/D

スタート

このビットを

1

にセットすると

A/D

変換を開始します。

単一モードでは

A/D

変換を終了すると自動的にクリアされます。

スキャンモードではソフトウェア、リセット、

またはスタンバイモードによってクリアされるまで 選択されたチャネルを順次連続変換します。

4 SCAN 0 R/W

スキャンモード

(P.316

12.1.4

参照

) A/D

変換のモードを選択します。

0

:単一モード

1

:スキャンモード

3 CKS 0 R/W

クロックセレクト

A/D

変換時間の設定を行います。

0

:変換時間=

134

ステート(

max

1

:変換時間=

70

ステート(

max

変換時間の切換えは、

ADST

0

の状態で行ってください。

2 CH2 0 R/W

チャネルセレクト

2

0

1 CH1 0 R/W

アナログ入力チャネルを選択します。

0 CH0 0 R/W SCAN

0

のとき

000

AN0 001

AN1 010

AN2 011

AN3 100

AN4 101

AN5 110

AN6 111

AN7 SCAN

1

のとき

000

AN0 001

AN0

AN1 010

AN0

AN2 011

AN0

AN3 100

AN4 101

AN4

AN5 110

AN4

AN6 111

AN4

AN7

12.1.4 単一モードとスキャンモード 

A/D

変換器の動作モードには単一モードとスキャンモードがあります。

動作モードやアナログ入力チャネルの切換えは、ADCSRの

ADST

ビットが

0

の状態で行ってくださ い。動作モードモードやアナログ入力チャネルの変更と

ADST

ビットのセットは同時に行うことができ

単一モードは指定された

1

チャネルのアナログ入力を

1

A/D

変換します

(P.316

12.4

参照)。

スキャンモードは指定された最大

4

チャネルのアナログ入力を順次連続して

A/D

変換します

(P.316

12.4

参照)。

SCI3

のレジスタ定義

(iodefine.h

の一部を抜粋)

HEW

のレジスタ定義ファイルのうち、関連する部分を載せておきます。

AD

変換のレジスタ定義

(iodefine.h

の一部を抜粋)

struct st_ad { /* struct A/D */

unsigned int ADDRA; /* ADDRA */

unsigned int ADDRB; /* ADDRB */

unsigned int ADDRC; /* ADDRC */

unsigned int ADDRD; /* ADDRD */

union { /* ADCSR */

unsigned char BYTE; /* Byte Access */

struct { /* Bit Access */

unsigned char ADF :1; /* ADF */

unsigned char ADIE:1; /* ADIE */

unsigned char ADST:1; /* ADST */

unsigned char SCAN:1; /* SCAN */

unsigned char CKS :1; /* CKS */

unsigned char CH :3; /* CH */

} BIT; /* */

} ADCSR; /* */

union { /* ADCR */

unsigned char BYTE; /* Byte Access */

struct { /* Bit Access */

unsigned char TRGE:1; /* TRGE */

} BIT; /* */

} ADCR; /* */

}; /* */

……

#define AD (*(volatile struct st_ad *)0xFFB0) /* A/D Address*/

今回の関数の仕様は以下の通りです。

■ファイル(ad.c)、ヘッダファイル(ad.h)

---void AdIinit(---void)

形式:

#include "ad.h"

void AdIinit(void);

機能:A/D変換の端子の初期化を行う関数。

シングルモード、AN0に限定

A/D変換を用いる場合には、必ず実行すること。

デフォルトではA/D変換は停止状態。

引数: 無し 返却値:無し

---void AdStart(---void)

形式:

#include "ad.h"

void AdStart(void);

機能:A/D変換を開始する関数。

引数:無し 返却値:無し

---void AdStop(---void)

形式:

#include "ad.h"

void AdStop(void);

機能:A/D変換を停止する関数。

引数:無し 返却値:無し

---unsigned short AdRead(void)

形式:

#include "ad.h"

unsigned short AdRead(void);

機能:A/D変換の結果を取得する関数。

AN0の値のみ。

引数:無し

返却値:unsigned short(A/D変換の結果10ビット)

12.1.5 A/D 変換の結果をシリアルで表示 

まずは可変抵抗を

AN0

に接続して、単一モードで値を

A/D

変換し、その結果をシリアル通信を用い てターミナルソフトに表示してみましょう。

今プログラムは、AN0につなぐものが可変抵抗でなくてもそのまま使えることに注意してください。

5V

以下の出力でしたら、どのようなセンサをつないでもかまいません。

可変抵抗

半固定抵抗は、3本の足があり、両端の足をプラス側と

GND

に繋ぎます。上部の可変部分をドライバ で回すことによって、真中の足の抵抗が変えられます。

回路図

今回は

AN0

に可変抵抗の出力をつなぎます。

12.2 A/D

変換の回路図

今回は

A/D

変換以外に、シリアル通信と数値を

10

進数に変換する関数を使いますので、sci.h、sci.c、

str.h、str.c

などが必要になります。

これらのファイルを利用する方法は、第

6

(P.151)

を参考にしてください。

以下に手順をまとめておきます。

新しいプロジェクトを作る。

プロジェクトの中の

iodefine.h

は削る。

フォルダ

lib

の下の

sci.c、str.c、ad.c

をプロジェクトに追加。

インクルードファイルディレクトリを設定する。

なお、受信割込みを使うために、intprg.cの

INT SCI3

をコメントアウトしておいてください。ここで 宣言されている関数は、sci.cに記述しました。

intprg.c

INT SCI3

をコメントアウト

// vector 23 SCI3

//__interrupt(vect=23) void INT_SCI3(void) {/* sleep(); */}

// vector 24 IIC2

__interrupt(vect=24) void INT_IIC2(void) {/* sleep(); */}

今回のプログラムでは、A/D変換の結果は、4回測定して平均をとるようにしました。このようにする と、値のばらつきが少なくなります。

では、以下にサンプルプログラムを示します。