マイコン・メモ
I2Cバスインタフェース,A/Dコンバータの使い方
ホームページに戻るトップページに戻る前ページに戻る
タイニーマイコンH8/3694FのI2CインタフェースとA/Dコンバータの基本的な使い方を、これまで製作で使用したものを基に紹介します。
6.I2Cバスインタフェースを使う

6-1.接続方法

I2Cバスインタフェースの詳しい仕様は省きますが、簡単に言うと、I2Cはクロック同期シリアル通信の一種で、下図のように2本の信号線(SCL, SDA)を使い、マスタデバイスと複数のスレーブデバイスを接続して通信できることが特徴です。
SCLはマスタデバイスが出力するクロックで、SDAはマスタデバイスとスレーブデバイスが出力するデータです。つまり、SDAは信号が双方向に流れます。

備考:ここでは、IICバス(Inter IC Bus)をI2Cバスと表記します。
I2Cの接続回路例

6-2.通信フォーマット

簡単にI2Cの通信フォーマットを説明します。ここでは、マスタとしてマイコンH8/3694Fを、スレーブとしてRTC-8564NBやEEPROMなどの周辺デバイスを接続することを想定し、かつACK(アクノリッジ)を含めて9ビット単位の通信を想定して説明します。
下記に示すのは、基本的な通信フォーマットです。このように、通信は「スタートコンディション」(開始条件)で始まり、「ストップコンディション」(停止条件)で終わります。
「スレーブアドレス」とは、通信相手となるスレーブデバイスを特定するアドレスで、あらかじめデバイスごとに付けられているものです。次の「アドレス」は、スレーブデバイス内のデータを特定するためのアドレスで、RTCなどでは内部レジスタの番号が、EEPROMなどではメモリアドレスがそれに相当します。
RTCなどでは内部レジスタも少ないため、アドレスは8ビットで十分な場合が多いですが、EEPROMなどでは容量によって8ビットのアドレスでは不足するものもあります。下記の通信フォーマットは、8ビットアドレスの場合と16ビットアドレスの場合を表しています。
デバイスによっては、スレーブアドレスの下位数ビットがハード的に設定できたり、アドレスの上位ビットが含まれていたりするものがあります。アドレスは必ずしも切りの良い8ビットあるいは16ビットとは限らないので、使用するスレーブデバイスの仕様を確認する必要があります。
I2C通信の基本フォーマット
次の図は、通信フォーマットを詳細に表したものです。
スタートコンデションは、SCLが“H”の状態でSDAが立ち下がった(↓)とき、ストップコンディションは、SCLが“H”の状態でSDAが立ち上がった(↑)ときで表されます。従って、アドレスやデータのビットそしてACK(アクノリッジ)は、SCLが“L”の状態で“H/L”を切り換えます。
アクノリッジとは、アドレスやデータを受信したデバイスが、正常に受信したことを送信側デバイスに返す信号です。9ビット単位の通信の場合、アクノリッジは図のように9クロック目に送信します(“L”でACK)。
I2Cバスインタフェースでは、これらの信号作成や送信が全て自動とはいかず、設定や指示がその都度に必要です。

I2C通信フォーマット詳細

6-3.制御プログラム例

H8/3694FのI2Cバスインタフェースは、マイコンH8/3664などにあるI2Cバスインタフェースの改良版で、ハードウェアマニュアルには「I2Cバスインタフェース2」と書かれています。
下記に、H8/3694Fをマスタとした、I2Cバスインタフェースの制御フローとプログラム例を示します。8ビットまたは16ビットアドレスでスレーブデバイスにアクセスする関数もそれぞれ用意してあります。

I2Cインタフェースの制御フロー図

I2Cインタフェースの制御プログラム例

この例は割り込みを使用しない、いわゆるポーリング方式で通信しています。ポーリング方式は、割り込みを使用する場合に比べプログラムが簡単になりますが、CPUの使用効率が落ちます。割り込みは使用していませんが、250Kbpsで通信できることは確認しています。
ソースプログラムにある「#define RATE_USE」の宣言を変更してコンパイルすると、通信速度を変えることができます。だたし、250Kbpsを超える速度に関しては確認してありません。
このプログラム例では、スレーブデバイスと通信する前に関数SetSlaveAddr_IIC2を呼ぶ必要があります。それによりスレーブアドレスが設定され、以降の通信はそのデバイスと行われます。複数のスレーブデバイスがある場合は、通信相手が変わる都度に関数SetSlaveAddr_IIC2でスレーブアドレスを切り換えます。


7. A/Dコンバータを使う

7-1.A/Dコンバータの特徴

H8/3894Fには10ビットの逐次比較型A/Dコンバータが内蔵されています。そのアナログ入力端子はポートBで、AN0~AN7の8本(0~7チャンネル)が使用できます。といっても内蔵されているA/Dコンバータは1つで、チャンネルを順次切り替えて目的のアナログ入力をA/D変換することになります。

A/Dコンバータにはスキャンモード、つまり複数のチャンネルを自動的に切り替えて順番にA/D変換する機能が備わっています。ただし、一度のスキャンで変換できるのはチャンネル0または4を開始とする4チャンネルまでです。
H8シリーズマイコンに共通することですが、A/D変換されたデータはA/Dデータレジスタ(ADDRA~D)の上位10ビット(b15~b6)に格納されます。8ビットデータとして使用する場合は上位バイトをそのまま読み込めばよいですが、10ビットすべてを使用する場合はb15~b0を読み込んで6ビット右にシフトする必要があります。

7-2.A/Dコンバータの使い方

下記にA/Dコンバータの制御フロー図とプログラム例を示します。

 ・A/Dコンバータの制御フロー図

 ・A/Dコンバータの制御プログラム例

このプログラム例は、0~7チャンネルを100mSごとに順に測定し、16回の平均を配列wADdata[0~7]に格納するものです。だたし、100mSの周期を作成する部分は含まれていませんので、インターバルタイマなどで別途作成して100mSごとに関数Start_ADを呼ぶ必要があります。測定データの平均を取るのは、ノイズの影響を低減させるためによく行われる方法です。
この例では100mS周期の16回平均なので、データが更新されるまで100mS×8ch×16回=12.8秒かかります。当然ですが、10mSごとに関数Start_ADを呼べば1/10の時間になります。
またこの例では、1チャンネルずつ順に測定するため、各チャンネルのアナログ入力を同時に測定する用途には使えません。そのような場合はスキャンモードを使います。ただし、A/Dコンバータは1つなので本当の意味での同時測定はできませんが、時間差の少ない測定ができます。また、スキャンモードはAN0またはAN4からの4チャンネルまでしかスキャンできないので、全チャンネル測定するには、2回に分ける必要があります。

ホームページに戻るトップページに戻る前ページに戻る
■■■ 注 意 ■■■
1.ここに掲載された内容(写真,図,表などを含む)の、全てまたは一部を無断で使用しないでください。
2.ここで紹介した手法(構造や仕組み,回路,プログラムなどを含む)を使用したことにより、問題や不利益が発生したとしても一切関知しません。
3.ここで紹介したプログラム例は、正常なコンパイルおよび正常な動作を保証するものではありません。