OSDN Git Service

ADCボリューム制御を追加
authortakemasa <suikan@users.sourceforge.jp>
Wed, 19 Dec 2012 14:29:25 +0000 (23:29 +0900)
committertakemasa <suikan@users.sourceforge.jp>
Wed, 19 Dec 2012 14:29:25 +0000 (23:29 +0900)
uzume_prototype/ad7999.c [new file with mode: 0644]
uzume_prototype/ad7999.cfg [new file with mode: 0644]
uzume_prototype/ad7999.h [new file with mode: 0644]

diff --git a/uzume_prototype/ad7999.c b/uzume_prototype/ad7999.c
new file mode 100644 (file)
index 0000000..8bedfe5
--- /dev/null
@@ -0,0 +1,65 @@
+/**
+ * \file ad7999.c
+ * \Author: suikan
+ * \brief AD799x I2C ADCからデータを読み込み、API経由でアプリケーションへ渡す
+ */
+
+
+#include <t_services.h>
+#include <i2c_subsystem.h>
+#include "kernel_id.h"
+#include "uzume.h"
+#include "ad7999.h"
+
+/**
+ * @brief ADC変換値保存用配列
+ * @details
+ * 変換値を保存する。アクセスは排他的でなければならない。値は符号付き左詰めである。
+ * 整数部はないので、1ビットの符号の右に小数部が連なる。
+ */
+static int values[4];
+
+
+/**
+ * \brief ADU999 制御タスク
+ * \param extinf タスク引数。ADC799xが持つ7bitのI2Cアドレスを指定する。
+ */
+void ad7999_task(VP_INT exinf)
+{
+    unsigned int adcaddress, ch;
+    unsigned char adcbuf[2];
+
+        /* タスク引数として渡される数字を、7bitのI2Cデバイスアドレスとみなす */
+    adcaddress = (unsigned int) exinf;
+
+    while(1)
+    {
+        i2c_master_read(0, adcaddress, adcbuf, 2);
+        syslog( LOG_NOTICE, "ADC is : %02x%02x ", adcbuf[0], adcbuf[1]);
+
+            /* 上位バイトのbit 5:4 をチャンネル番号として受け取る */
+        ch = ( adcbuf[0] & 0x30 ) >> 4;
+            /*上位バイトのbit 3;0と買いバイトから12bitのADCデータを作る。そのデータを32bitに左詰めする */
+
+        /* 排他区間開始 */
+        wai_sem(AD7999_SEM);
+        values[ch] = ( (( adcbuf[0] & 0x0F )<<8 ) | adcbuf[1] ) << 19;
+        sig_sem(AD7999_SEM);
+        /* 排他区間終了 */
+
+        tslp_tsk(1);
+    }
+}
+
+FX32 get_volume(unsigned int ch)
+{
+    FX32 retval;
+
+    /* 排他区間開始 */
+    wai_sem(AD7999_SEM);
+    retval = values[ch];
+    sig_sem(AD7999_SEM);
+    /* 排他区間終了 */
+
+    return retval;
+}
diff --git a/uzume_prototype/ad7999.cfg b/uzume_prototype/ad7999.cfg
new file mode 100644 (file)
index 0000000..ef4d214
--- /dev/null
@@ -0,0 +1,38 @@
+
+/*
+* I2C ADCである、AD7999をボリューム・入力として使うUZUMEのサブシステム(オプション)
+* このコンフィギュレーション・ファイルはBSPのコンフィギュレーション・ファイルから
+* インクルードして使う。インクルードするときは、i2c0_m.cfgより後にインクルードする。
+*
+* 関連するソースは次の2つ
+* ad7999.h
+* ad7999.c
+*/
+
+#define _MACRO_ONLY
+
+INCLUDE("\"ad7999.h\"");
+
+/*
+* プライベートな資源
+*/
+
+    /* AD7999サブシステムの排他利用のためのセマフォ */
+CRE_SEM (AD7999_SEM, 
+            { 
+                TA_TPRI,    /* タスク優先順位に基づいてセマフォを奪い合う。 */
+                1,          /* 初期状態で資源数は1。すなわち、最初に排他領域を獲得しようとしたタスクは、待ちなしに獲得できる。 */
+                1           /* 最大返却資源数は1。これは PV セマフォによる排他処理を行う場合の普通の値。 */ 
+            }
+        );
+
+CRE_TSK( AD7999_TASK, 
+            { 
+                TA_HLNG|TA_ACT, /* 初期状態からアクティブ */
+                0x28,           /* タスク引数(AD7999のI2C デバイスアドレス) */
+                ad7999_task,    /* タスク本体 */
+                AD7999_PRIORITY, /* タスク優先順位 */
+                1024,           /* タスク・スタックサイズ */
+                NULL            /* タスク・スタック。NULLならシステムが準備 */
+             });
+
diff --git a/uzume_prototype/ad7999.h b/uzume_prototype/ad7999.h
new file mode 100644 (file)
index 0000000..d619e85
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * \file ad7999.h
+ * \Author takemasa
+ * \brief AD7999制御プログラム
+ * \details
+ * AD7999制御タスク及びAPI。cfgファイルから読み込んで使う
+ */
+
+
+#ifndef AD7999_H_
+#define AD7999_H_
+
+
+#define AD7999_PRIORITY 7
+
+#ifndef _MACRO_ONLY
+
+extern FX32 get_volume(unsigned int ch);
+extern void ad7999_task(VP_INT exinf);
+
+#endif
+#endif /* AD7999_H_ */