第二章 タイマーとA/Dコンバーター

第一章のワークスペースの中にあるライブラリlib.libは、cpuクラスとPortクラス、printf周りだけをサポートしています。自前でその他のクラスを作るときに用いてください。
水野が作ったクラス群を用いるときには、このZIPファイルを解凍して利用してください。これから後のプログラムは全てこの中にあるライブラリを用います。

タイマーを用いてLEDを点滅させるプログラム

タイマークラスにはwaitメソッドがあり、引数にはミリ秒単位の整数を入れると、時間待ちしてくれます。

LEDを点滅させるプログラム
#include "common.h"
#include "primary.h"

void main()
{
  Timer tm;
  while(true)
  {
    LED(1);
    tm.wait(500);
    LED(2);
    tm.wait(500);
  }
}
 1 iodefine.hを読み込んだり、新しい型の設定をしている。
 2 基本的なクラスのヘッダファイルを読み込む。(ほとんどは、コメントになっている)
 3
 4 
 5
 6 tmという名前のTimerオブジェクトを作る
 7 永久ループ
 8
 9 緑のLEDを点灯
10 tmオブジェクトの中のwaitメソッドに500を送る。500ms待ちになる。
11 オレンジのLEDを点灯
12 
13 
14 



上級
waitUS()メソッドを使えばマイクロ秒単位で使うことができます。
void waitUS(unsigned short US);
引数は16bitです。

タイマーを2つ使ってみる

Timerのオブジェクトを複数作ると、それぞれ独立して使うことができます。
ここでは、緑のLEDを500ms毎、オレンジのLEDを300ms毎に点滅させます。

タイマー2つでLEDを2つ独立に点滅させるプログラム
void main()
{
  startInit("**** タイマーのテスト****\n");
  Timer tm;
  Timer tm2;
  Port Green = Port(CPU.port6, 4);
  Port Orange = Port(CPU.port6, 5);
  Green.setOutput();
  Orange.setOutput();
  tm.mark();
  tm2.mark();
  while(true)
  {
    if(tm.timeout(500)) {
      tm.mark();
      Green.writePin(!Green.readPin());
    }
    if(tm2.timeout(300)) {
      tm2.mark();
      Orange.writePin(!Orange.readPin());
    }
  }
}
 1 
 2
 3
 4 緑のLED用のtmという名前のオブジェクトを作る。
 5 オレンジのLED用のtmという名前のオブジェクトを作る。
 6 緑のLEDオブジェクトで、名前をGreenにする。
 7 オレンジのLEDオブジェクトで、名前をOrangeにする。
 8 Greenを出力設定にする。
 9 Orangeを出力設定にする。
10 緑のLED用タイマーをセットする。タイマースタート
11 オレンジのLED用タイマーをセットする。タイマースタート
12
13
14 緑用のタイマーが500ms経っていたら、
15  タイマーを再スタートさせる。
16 緑のLEDを反転させる。
17
18 オレンジ用のタイマーが300ms経っていたら、
19  タイマーを再スタートさせる。
20 オレンジのLEDを反転させる。
21
22
23



上級
timeoutUSメソッドを使えばマイクロ秒単位で使うことができます。
bool timeoutUS(unsigned short timeUS);
引数は16bitです。



重要なcpuクラスのメンバー
フィールド
    static const unsigned int port1 = 0xFFD4;
    static const unsigned int port2 = 0xFFD5;
    static const unsigned int port3 = 0xFFD6;
    static const unsigned int port5 = 0xFFD8;
    static const unsigned int port6 = 0xFFD9;
    static const unsigned int port7 = 0xFFDA;
    static const unsigned int port8 = 0xFFDB;
    static const unsigned int portB = 0xFFDD;
コンストラクタ
    cpu();
メソッド
    static void delay(unsigned wait);       単位は約5μsのつもり 
    static unsigned char readPin(unsigned int port, int bit);
    static unsigned char readPin(Port& P);
    static void setInput(unsigned int port);
    static void setInput(unsigned int port, int bit);
    static void setInput(Port& P);    ポートとビットの情報はPortクラスを用いる
    static void setIOPort(unsigned int port, int value);
    static void writePin(unsigned int port, int bit, bool value);
    static void writePin(Port& P, bool value);
    static void writePort(unsigned int port, unsigned char value);
    static void writePort(Port& value);
    static void setOutput(unsigned int port, unsigned char bit);
    static void setOutput(unsigned int port);
    static void setOutput(Port& P);   ポートとビットの情報はPortクラスを用いる
    static void setOutputPort(unsigned int port, int value);
    static int readPort(unsigned int port);
    static void BuzzerSet(unsigned char pitch , unsigned char vol); ブザーの設定
    static void BuzzerStart();     ブザーを鳴らす
    static void BuzzerStop();      ブザーを止める


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


0番と1番のA/Dコンバーターの値を500ミリ秒毎に読み、表示する。

A/Dコンバーターの値を表示させる
void main()
{
  startInit("**** ADコンバーターのテスト****\n");
  Timer tm;
  ADCon ad;
  while(true)
  {
    printf("left: %4d leftC: %4d\n", ad.value(0), ad.value(1));
    tm.wait(500);
  }
}
 1 
 2
 3
 4 タイマーオブジェクトを作る。
 5 A/Dコンバーターのオブジェクトを作る。
 6 永久ループ。
 7 
 8  それぞれ測定し、値を表示する
 9  500ms待つ
10
11



上級
ADCScanメソッドを用いると、4チャンネルを高速に測定できます
ADCScan(BYTE channel);
測定された値は、
int* value();       // 4つの大きさの配列のアドレスが戻ります
void value(int* val);   // 自前の配列に入れてもらいたい場合
上記のメソッドは、1回のスキャンですが、次のメソッドで、autoScanをtrueにすると、連続的に測定します。
ADCScan(BYTE channel, bool autoScan);


赤外線距離センサーを用いるときの注意

注意

第三章に行く    ホームに戻る