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 

AudioFrameWorkに対してMon Apr 9 16:33:23 2007に生成されました。  doxygen 1.5.1-p1