- メインページ
- ネームスペース
- クラス
- ファイル

- ファイル一覧
- ファイルメンバ

# ad7998.cpp

説明を見る。

    00001 /** \file ad7998.cpp
    00002  *  \brief AD7998, AD7997制御プログラム
    00003  *
    00004  * ad7998::initAndStartで変換を開始し、以後変換を続ける。
    00005  * 変換した値は ad7998::getValueで取得できる。
    00006  */
    00007
    00008 #include "ad7998.h"
    00009 #include "twi.h"
    00010 #include <ccblkfn.h>
    00011
    00012 namespace ad7998{
    00013
    00014     const unsigned int CRR = 0;     ///<    Conversion Result Register (Read)
    00015     const unsigned int ASR = 1;     ///<    Alert Status Register (Read/Write)
    00016     const unsigned int CR = 2;      ///<    Configuration Register (Read/Write)
    00017     const unsigned int CTR = 3;     ///<    Cycle Timer Register (Read/Write)
    00018     const unsigned int DLR1 =4;     ///<    DATALOW Reg CH1 (Read/Write)
    00019     const unsigned int DHR1 =5;     ///<    DATAHIGH Reg CH1 (Read/Write)
    00020     const unsigned int HR1 = 6;     ///<    Hysteresis Reg CH1 (Read/Write)
    00021     const unsigned int DLR2 =7;     ///<    DATALOW Reg CH2 (Read/Write)
    00022     const unsigned int DHR2 =8;     ///<    DATAHIGH Reg CH2 (Read/Write)
    00023     const unsigned int HR2 = 9;     ///<    Hysteresis Reg CH2 (Read/Write)
    00024     const unsigned int DLR3 =10;    ///<    DATALOW Reg CH3 (Read/Write)
    00025     const unsigned int DHR3 =11;    ///<    DATAHIGH Reg CH3 (Read/Write)
    00026     const unsigned int HR3 = 12;    ///<    Hysteresis Reg CH3 (Read/Write)
    00027     const unsigned int DLR4 =13;    ///<    DATALOW Reg CH4 (Read/Write)
    00028     const unsigned int DHR4 =14;    ///<    DATAHIGH Reg CH4 (Read/Write)
    00029     const unsigned int HR4 = 15;    ///<    Hysteresis Reg CH4 (Read/Write)
    00030
    00031     const unsigned int ch1 = 0x0010;    ///< ad7998::CRのチャンネル指定用。Vin1
    00032     const unsigned int ch2 = 0x0020;    ///< ad7998::CRのチャンネル指定用。Vin2
    00033     const unsigned int ch3 = 0x0040;    ///< ad7998::CRのチャンネル指定用。Vin3
    00034     const unsigned int ch4 = 0x0080;    ///< ad7998::CRのチャンネル指定用。Vin4
    00035     const unsigned int ch5 = 0x0100;    ///< ad7998::CRのチャンネル指定用。Vin5
    00036     const unsigned int ch6 = 0x0200;    ///< ad7998::CRのチャンネル指定用。Vin6
    00037     const unsigned int ch7 = 0x0400;    ///< ad7998::CRのチャンネル指定用。Vin7
    00038     const unsigned int ch8 = 0x0800;    ///< ad7998::CRのチャンネル指定用。Vin8
    00039     const unsigned int fltr= 0x0008;    ///< ad7998::CRの設定用。フィルタを使う
    00040
    00041     const unsigned int VinSeq = 0x70;   ///< Mode2コマンド。 ad7998::CRで指定した入力からデータを連続取得
    00042
    00043 /** AD7997デバイスアドレス
    00044  *
    00045  * AD7998のI2Cアドレス。
    00046  */
    00047 const int AD7998 = 0x20;
    00048
    00049 /** 初期化文字列の長さ
    00050  *
    00051  * AD7998に送る初期化文字列の長さ。
    00052  */
    00053 const int initLen = 3;
    00054
    00055 /** コマンド文字列の長さ
    00056  *
    00057  * AD7998に送るコマンド文字列の長さ。
    00058  */
    00059 const int cmdLen = 1;
    00060
    00061 /** AD7998初期化文字列
    00062  *
    00063  * コントロール・レジスタのアドレス1バイトと、その内容2バイトからなる。
    00064  */
    00065 const unsigned char initAD7998Str[initLen] = { ad7998::CR , 0x0F, 0xF0 | ad7998::fltr };
    00066 /** AD7998コマンド文字列
    00067  *
    00068  * AD7998のモード2転送で用いるコマンド文字列。
    00069  */
    00070 const unsigned char cmdAD7998Read[cmdLen] = { ad7998::VinSeq };
    00071
    00072 /** ADCチャンネル数
    00073  *
    00074  * AD7998のチャンネル数。
    00075  */
    00076 const int chNum = 8;
    00077
    00078 /** データ受信バッファ
    00079  *
    00080  * TWI用の受信バッファ。AD7998の変換結果を受け取る。
    00081  */
    00082
    00083     unsigned char rxBuffer[chNum*2] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    00084
    00085 /** データ受信バッファ
    00086  *
    00087  * ad7998::rxBufferの値を移しておく。
    00088  */
    00089
    00090     unsigned char rxValue[chNum*2];
    00091
    00092
    00093     void callBack( bool rcv );
    00094
    00095     void init(void)
    00096     {
    00097     }
    00098
    00099     void start(void)
    00100     {
    00101         twi::writeAsync(    // コントロールレジスタの設定
    00102                     AD7998,             // デバイスアドレス
    00103                     initAD7998Str,      // AD7998初期化ストリング
    00104                     initLen,            // 初期化ストリング長
    00105                     ad7998::callBack    // 終わったらcallBack関数を呼ぶ
    00106                   );
    00107     }
    00108
    00109     shortfract getValue( adcChannel vin )
    00110     {
    00111         unsigned int imask;
    00112         shortfract val;
    00113         short temp;
    00114         int index;
    00115
    00116         imask = cli();                              // 割込み禁止
    00117
    00118         index = (int)vin*2;                         // チャンネル番号をバイト・インデックスに変換
    00119         temp = ( rxValue[index]<<8 ) + rxValue[index+1];     // ビッグ・エンディアンの値を取り出す
    00120         temp &= 0x0FFF;                             // チャンネル番号をマクス・オフ
    00121         val.v = temp << 3;                          // 12bit値を15bit値(符号付16bitの正の部分)に変換
    00122
    00123         sti(imask);                                 // 割込み禁止解除
    00124
    00125         return val;
    00126     }
    00127
    00128     /** コールバック関数
    00129      * \param rcv 受信コールバックなら1
    00130      *
    00131      * twi::writeReadAsync() 関数に渡すコールバック。AD7998の変換データ読み込み完了を
    00132      * をトリガにして、受信データの取得を行う。
    00133     */
    00134     void callBack( bool rcv )
    00135     {
    00136         unsigned int imask;
    00137
    00138         imask = cli();  // 割込み禁止
    00139
    00140         for ( int i= 0; i<chNum*2; i++ )
    00141             rxValue[i] = rxBuffer[i];          // 受信データをコピーしてくる。
    00142
    00143         sti(imask);     // 割込み禁止解除
    00144
    00145         twi::writeReadAsync(
    00146                 AD7998,             // I2Cデバイス・アドレス（送信）
    00147                 cmdAD7998Read,      // Mode2転送を指定するコマンド
    00148                 cmdLen,             // コマンド長
    00149                 AD7998,             // I2Cデバイス・アドレス（受信）
    00150                 rxBuffer,           // データ受信バッファ
    00151                 chNum*2,            // データ受信バイト数
    00152                 ad7998::callBack    // コールバック関数
    00153             );     // Mode2読み出し設定
    00154
    00155     }
    00156
    00157 };
    00158
    00159
    00160