MCR - Micom Car Rally
大会情報 マイコンカーラリーとは? 今から始めるマイコンカーラリー 技術情報 大会記録 MCRファン倶楽部 お問い合せ
マイコンカーラリートップへ マイコンカーラリートップへ
技術情報 >> R8C/M12A 技術情報
技術情報
各種資料
YouTube情報
R8C/M12A 技術情報
上位入賞マイコンカー
よくある質問(FAQ)
ダウンロード
R8C/M12A 技術情報
ボリュームの電圧(0〜5V)を
A/D変換する

内容
ボリュームから出力された0〜5Vの電圧を、マイコンでA/D変換してデジタル値に変換します。その値を、LEDへ出力します。

ワークスペース
開発環境を整える」ページからダウンロードしてください。

回路
回路を下図に示します。

回路図

ブレッドボード実装図
ブレッドボードの実装を下図に示します。
ブレッドボード実装図

実習中のブレッドボード
実習中のブレッドボード

プログラムを開く
ワークスペース「r8cm12a_breadboard」のプロジェクト「03volume」をアクティブ(有効)にします。「03volume」が太字になっていない場合は、右画面のように、「アクティブプロジェクトに設定」してください。

「ビルド→ビルド」して、MOTファイルを作成、「ツール→R8C Writer」でプログラムを書き込んで、実行してください。
  プロジェクトを切り替える
プロジェクト「03volume」を有効にする

実行中の動画


プログラムの説明
A/Dコンバータの設定

A/Dコンバータの概要を、下図に示します。

A/Dコンバータ 概要

A/Dコンバータに接続されている端子は、P1_7、P1_4、P1_3、P1_2、P1_1、P1_0の6端子です。アナログ電圧を入力するときは、それぞれの端子をAN7、AN4、AN3、AN2、AN1、AN0とも呼びますが、同じ端子です。
結果は、A/Dレジスタ0かA/Dレジスタ1に格納されます。どちらのレジスタに格納されるかは、A/D変換する端子で決まっています。
これからA/Dコンバータのレジスタについて、説明します。

■A/Dモードレジスタ(ADMOD)の設定
bit 7 6 5 4 3 2 1 0
設定
内容
0 0 0 A/D動作モード
選択ビット
00:単発モード
01:繰り返しモード
10:単掃引モード
11:繰り返し掃引モード
A/D変換クロック
選択ビット
000:f8(2.5MHz)
001:f4(5MHz)
010:f2(10MHz)
011:f1(20MHz)
100:fAD(20MHz)
設定値 0 0 0 0 0 0 1 1

A/D動作モード選択ビットは、単発モードを選びます。単発モードは、1回ずつA/D変換するモードです。
A/D変換クロック選択ビットは、A/D変換をどのクロックで行うかを選びます。今回はf1を選択します。

■A/D入力選択レジスタ(ADINSEL)の設定
bit 7 6 5 4 3 2 1 0
設定
内容
10000001:AN7  10000000:AN4
01000001:AN3  01000000:AN2
00000001:AN1  00000000:AN0
設定値 1 0 0 0 0 0 0 1

どの端子からアナログ電圧を入力するかを選択するレジスタです。今回は、AN7端子を選択します。

■A/D制御レジスタ0(ADCON0)の設定
bit 7 6 5 4 3 2 1 0
設定
内容
0 0 0 0 0 0 0 A/D変換開始ビット
0:A/D変換停止
1:A/D 変換開始
設定値 0 0 0 0 0 0 0 1

A/D変換開始ビットを"1"にすると、A/D変換を開始します。A/D変換が終了すると、自動でこのbitが"0"になるので、このbitが"0"かどうかチェックすることによりA/D変換が終了したかを知ることができます。

■A/Dレジスタ0(AD0)
bit 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
変換
結果
0 0 0 0 0 0 A/D変換結果
00 0000 0000〜11 1111 1111

AN4、AN2、AN0のどれかの端子でA/D変換したときは、このレジスタに結果が格納されます。このレジスタの値を読み出してください。

■A/Dレジスタ1(AD1)
bit 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
変換
結果
0 0 0 0 0 0 A/D変換結果
00 0000 0000〜11 1111 1111

AN7、AN3、AN1のどれかの端子でA/D変換したときは、このレジスタに結果が格納されます。このレジスタの値を読み出してください。

■A/Dコンバータの設定プログラム
今回のサンプルプログラムでは、AN7端子に入力されている電圧をA/D変換します。このプログラムを、get_ad7という名前で関数化しています。プログラムを下記に示します。
  74 :  int get_ad7( void )
  75 :  {
  76 :      int i;
  77 :
  78 :      /* A/Dコンバータの設定 */
  79 :      mstad   = 0;           /* A/Dコンバータを有効にする*/
  80 :      admod   = 0x03;        /* 単発モードに設定         */
  81 :      adinsel = 0x81;        /* 入力端子AN7(P1_7)を選択  */
  82 :      adcon0  = 0x01;        /* A/D変換スタート          */
  83 :
  84 :      while( adcon0 & 0x01 );/* A/D変換終了待ち          */
  85 :      i = ad1;               /* A/D値取得(0〜1023)       */
  86 :
  87 :      return i;
  88 :  }

「mstad」は、A/Dコンバータスタンバイビットで、A/Dコンバータを有効にするか、無効にするかを選択するビットです。0で有効です。初期はA/Dコンバータが無効になっているので、A/Dコンバータを使う前にこのビットを0にしてください。
AN7端子をA/D変換するので、結果を読み出すレジスタは「AD1」になります。このレジスタの値を変数iに代入して、戻り値としています。変数iに代入せず、AD1の値をreturnしても構いません。

メインプログラム

volume.cのmain関数のプログラムを、下記に示します。
  32 :  void main( void )
  33 :  {
  34 :      int ad;
  35 :
  36 :      init();               /* 初期化             */
  37 :
  38 :      while( 1 ) {
  39 :          ad = get_ad7();   /* ad = 0〜1023       */
  40 :          ad = ad >> 3;     /* ad = 0〜127にする  */
  41 :          p1 = ad;
  42 :      }
  43 :  }

39行で、変数adにAN7端子のA/D変換結果を代入します。
40行で、右に3bitシフトして、0〜127の値にします。
41行で、0〜127の値を、P1に接続されている7個のLEDへ出力します。

課題
1.P4_7端子に8個目のLEDを追加して、A/D変換値を2ビット右シフトさせ0〜255に変換したときに、0〜255の値を、P4_7、P1_6〜P1_0端子に接続している8個のLEDに出力するプログラムを作りなさい(下図のようなイメージです)。

課題のヒント

2.A/D変換値の値を7ビット右シフトさせて0〜7に変換したとき、下表のように8個のLEDが点灯するようプログラムを作りなさい。LEDは課題1で接続した、8個の状態とする。
※LEDの点灯方法は、今回はビットシフト命令は使わないこと。

A/D変換値 LEDの付き方
0 0000 0001
1 0000 0011
2 0000 0111
3 0000 1111
4 0001 1111
5 0011 1111
6 0111 1111
7 1111 1111

3.課題2の問題で、LEDの点灯方法をビットシフト命令(>>、または<<)を使って、プログラムしなさい。

課題の回答例
1.の回答例
volume_answer_1.c

2.の回答例
volume_answer_2.c

3.の回答例
volume_answer_3.c

BACK