目次
18K07は、4点のビーム位置モニター信号を508MHz帯域濾波器及びログアンプ
を通過した後、14ビットAD変換しメモリーにセーブ出来るVME 1幅のモジュールです。ここで紹介するデバイスサポートはEPICS R314で動作するMV5500用です。
- 入力チャンネル:4チャンネル -70dBmから0dBm
- サンプリング:4チャンネル同時、外部サンプル:最大2.4MHz
- メモリー容量(各チャンネル):256k/128k/64k/32kワード
- 外観
VME 1幅 ダブルハイト
- VMEランプ
VMEアクセスがあったとき緑色に点灯(0.5s)
- A/Dランプ
緑:スタートトリガー許可状態
赤:メモリー書き込み中(メモリーへのアクセス及びトリガー不可)
橙:A/D終了(メモリーの最後まで書き込んだ状態、トリガー不可)
- TRIG IN(QLAコネクタ)
NIMレベル。インピーダンス50Ω。立ち下がりでADスタート。100ns程度の幅があることが望ましい。
- TRIG OUT(QLAコネクタ)
NIMレベルトリガー出力。
- CLK(QLAコネクタ)
サンプルクロック入力。NIMレベル。インピーダンス50Ω。立ち下がりエッジで動作。安定動作のため、DutyはLow(-1V):High(0V)が8:2程度とすること。
- CH1〜CH4 入力(SMA)
インピーダンス50Ω。最大0dBmまでの信号。
18K07ボードのI/Oマップは以下の通りです。
アドレス | Write/Read | データ
|
---|
31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
|
---|
0x**(**00)00000 | (R/W) | **** | CH3:ADデータ | **** | CH1:ADデータ
|
| | **** | Ch3 | **** | CH1
|
0x**(**00)0FFFC | | **** | CH3:ここまで(32kワード時) | **** | CH1:32k
|
| | **** | Ch3 | **** | CH1
|
0x**(**00)FFFFC | | **** | CH3:ここまで(256kワード時) | **** | CH1:256k
|
0x**(**01)00000 | (R/W) | **** | CH4:ADデータ | **** | CH2:ADデータ
|
| | **** | CH4 | **** | CH2
|
0x**(**01)0FFFC | | **** | CH4:ここまで(32kワード時) | **** | CH2:32k
|
| | **** | CH4 | **** | CH2
|
0x**(**01)FFFFC | | **** | CH4:ここまで(256kワード時) | **** | CH2:256k
|
0x**(**10)00000 | R/W | * | AD_START
|
0x**(**10)00004 | R/W | * | AD_MEMORY
|
0x**(**10)00008 | R/W | * | TRG_POS
|
0x**(**10)0000C | R/W | * | IRQ_ENB
|
0x**(**10)00010 | R/W | * | Reserved
|
0x**(**10)00014 | R | * | AD_STATUS
|
0x**(**10)00018 | R | * | IRQ_NO
|
0x**(**10)0001C | R | * | IRQ_ID
|
0x**(**11)***** | R | * | トリガポインタレジスタ(R)
|
0x**(**11)FFFFF | N/A | *(NOT USED)
|
ADCのデータフォーマットは、
入力電圧 | ディジタル出力
|
---|
| (MSB) | | (LSB)
|
---|
2V | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1
|
1V | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
|
0V | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
|
です。
- AD_START: A/Dスタートコマンド。1でA/Dスタート、測定終了後自動で0クリアする。0を書くとADが強制終了する。
- AD_MEMORY: A/Dデータメモリー範囲。
- 0:32768ワード/channel
- 1:65536ワード/channel
- 2:131072ワード/channel
- 3:262144ワード/channel
- TRG_POS: A/Dデータのトリガー位置
- 0: -100% (トリガーでデータ取得終了)
- 1: -50% (トリガー前75%、入力後25%)
- 2: 0% (トリガー入力前50%、入力後50%)
- 3: 50% (トリガー入力前25%、入力後75%)
- 4: 100% (トリガーからメモリーサイズまでデータ取得)
- IRQ_ENB: AD終了時の割り込みの有効・無効
1 | 0
|
---|
5秒タイムアウト(有効=1) | IRQ有効(有効=1)
|
- AD_STATUS:AD処理ステータス。割り込み有効時は、割り込み時にこのレジスターにアクセスする必要あり。
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
|
---|
CH4オーバーフロー | CH3オーバーフロー | CH2オーバーフロー | CH1オーバーフロー | AD CLOCK OK | AD BUSY | AD ERROR | AD正常終了
|
- IRQ_NO: IRQの番号。0は禁止。ボード上の設定の読み出し
- IRQ_ID: IRQベクター設定。ボード上の設定の読み出し。
- read(トリガポインタレジスタ)下位18ビット有効
本デバイスサポートは、EPICS R314のVxWORKS(MV5500)用に開発したものです。EPICSそのものに対する説明、入門出家入道遁世については専門家に帰依するなり、コントロールグループのページをご参照なさるなりの自活努力が必要です。現時点で、MV5500用のデバイスサポートはabco3(呪われたSun OS)でしか開発出来ません。abco3とLinuxマシンとの相性は極めて麗しくないので、開発には相当の覚悟が必要です。
コードを以下に示します。
- include文
新たに以下の2つのincludeが必要です
#include <epicsMutex.h>
#include <epicsExport.h>
- データ構造体定義
今までの定義の後、export宣言が必要です。例えば、devBo18k07構造体を定義した
あと、
epicsExportAddress(dset,devBo18k07);
の様にします。
- lockの定義変更
カード構造体の中で宣言するセマフォの型は
struct ioCard {
volatile struct D18k07 *card; /* address of this card */
epicsMutexId lock; /* semaphore */
IOSCANPVT ioscanpvt;
};
のように、epicsMutexIdとなります。
- logMsgの変更
これは前からかもしれませんが、logMsgの引数の数は7つです。余ったところは
0を入れておきます。昔のままでもコンパイラさまにはお叱りを頂戴しないようですけど。
logMsg("Found 18k07 with cardNum= %d\n address= %x\n",cardNum,p,0,0,0,0);
- セマフォの初期化
以下の様に、epicsMutexMustCreateを使い生成し、epicsMutexUnlockで解除します。
cards[cardNum].lock = epicsMutexMustCreate();
epicsMutexUnlock((cards[cardNum].lock)); /* Init the board lock */
- write operation時のセマフォのロック
以下の例のようにepicsMutexMustLockでロックし、epicsMutexUnlockで解除します。
epicsMutexMustLock((cards[cardN].lock));
/* ADC start */
cards[cardN].card->ad_start = 0x1;
epicsMutexUnlock((cards[cardN].lock));
- returnコード
昔return(CONVERT)などと書いていた物は、return(OK)にします。ま、単に定義すればいいんだと思うけど。
- dbdファイルの設定
devVme18k07.dbdというファイルを作り、中で次のように定義します。
device(bo,VME_IO,devBo18k07,"V18K07")
device(mbbiDirect,VME_IO,devMbbi18k07,"V18K07")
device(waveform,VME_IO,devWf18k07,"V18K07")
device(longout,VME_IO,devLo18k07,"V18K07")
device(longin,VME_IO,devLi18k07,"V18K07")
- Makefile
以下の様に、devVme18k07.dbdとdevVme18k07.cを追加します。
fbppc_DBD += devVme18k07.dbd
fbppc_SRCS += devVme18k07.c
makeは以下の様にsrcディレクトリで
gmake vxWorks-ppc604_long
とします。なお、何かの呪いでdbdの方は変更しようが追加しようがmakeだけでは何もしてくれないようなので、先にgmake cleanとかした方が良いと思います。いっぱいwarningが出て鬱陶しいですけど。
初期化ファイルはdev18k07Configで、ベースアドレスが0x20000000で、IRQ=4、IRQ Vectorが0xF0で9枚使うとすると、
dev18k07Config(9,0x20000000,0x4,0xf0)
の様に指定します。なお、このボードは1枚で2Mバイトもの領域を占有しますので、
他のボードと干渉しないよう特段の注意が必要です。特にTD-4Vのdefaultアドレスは近いし、同じVMEバス上で使う可能性が高いので注意が必要です。
2枚目のボードはVMEアドレスを0x20400000(A22を1にする)、IRQ Vectorを0xF1にと
順次incrementしていきます。IRQは4のまま変更する必要はありません。
サンプルファイルは以下を参照してください。
mbbiDirectのsignal=1をI/O Intrに設定し、これのFLINKに
waveformレコードを指定、そのFLINKにFanoutを指定して、
EVENT確認用のレコード及び各subArrayをプロセスします。なお、現在の所この環境ではcompactSubarrayはまだサポートされていませんので、残念ながらsubarrayで受けるしかありません。こちらも、Makefileにちゃんと登録して
gmakeをしておく必要があります。なお、subarrayのNELMが32kワードになって
いますので、R313環境ではcagetできません。R314でもEPICS_CA_MAX_ARRAY_BYTESの設定が必要です。
/cont/bootp/iocの所には
# Example vxWorks startup file
#Following must be added for many board support packages
</cont/bootp/ioc/kekb_mv5500.cmd
putenv "EPICS_CA_MAX_ARRAY_BYTES=1048576"
# put your startup script below
</users/tobiyama/epics_M5/iocBoot/iocfbppc/st.test2.cmd
kekBootLog
printTime(60)
のように、自分の所のブートファイルを読みに行くように設定します。
なお、EPICS_CA_MAX_ARRAY_BYTESはクライアント側も設定しておかないと
長いwaveformを読む事が出来ません。
9枚の18K07ボードを使用する時のスタートアップファイル(の関係部分)は次のようになります。
dbLoadRecords("db/FB_DRMON.db","USER=FB41, CHAN=C0")
dbLoadRecords("db/FB_DRMON.db","USER=FB42, CHAN=C1")
dbLoadRecords("db/FB_DRMON.db","USER=FB43, CHAN=C2")
dbLoadRecords("db/FB_DRMON.db","USER=FB44, CHAN=C3")
dbLoadRecords("db/FB_DRMON.db","USER=FB45, CHAN=C4")
dbLoadRecords("db/FB_DRMON.db","USER=FB46, CHAN=C5")
dbLoadRecords("db/FB_DRMON.db","USER=FB47, CHAN=C6")
dbLoadRecords("db/FB_DRMON.db","USER=FB48, CHAN=C7")
dbLoadRecords("db/FB_DRMON.db","USER=FB49, CHAN=C8")
dev18k07Config(9,0x24000000,0x4,0xf0)
dbpf "FB41:ADC4:MEMSIZE","0"
dbpf "FB41:ADC4:TRGPOS","4"
dbpf "FB41:ADC4:IRQENB","3"
dbpf "FB41:ADC4:START","1"
dbpf "FB42:ADC4:MEMSIZE","0"
dbpf "FB42:ADC4:TRGPOS","4"
dbpf "FB42:ADC4:IRQENB","3"
dbpf "FB42:ADC4:START","1"
dbpf "FB43:ADC4:MEMSIZE","0"
dbpf "FB43:ADC4:TRGPOS","4"
dbpf "FB43:ADC4:IRQENB","3"
dbpf "FB43:ADC4:START","1"
dbpf "FB44:ADC4:MEMSIZE","0"
dbpf "FB44:ADC4:TRGPOS","4"
dbpf "FB44:ADC4:IRQENB","3"
dbpf "FB44:ADC4:START","1"
dbpf "FB45:ADC4:MEMSIZE","0"
dbpf "FB45:ADC4:TRGPOS","4"
dbpf "FB45:ADC4:IRQENB","3"
dbpf "FB45:ADC4:START","1"
dbpf "FB46:ADC4:MEMSIZE","0"
dbpf "FB46:ADC4:TRGPOS","4"
dbpf "FB46:ADC4:IRQENB","3"
dbpf "FB46:ADC4:START","1"
dbpf "FB47:ADC4:MEMSIZE","0"
dbpf "FB47:ADC4:TRGPOS","4"
dbpf "FB47:ADC4:IRQENB","3"
dbpf "FB47:ADC4:START","1"
dbpf "FB48:ADC4:MEMSIZE","0"
dbpf "FB48:ADC4:TRGPOS","4"
dbpf "FB48:ADC4:IRQENB","3"
dbpf "FB48:ADC4:START","1"
dbpf "FB49:ADC4:MEMSIZE","0"
dbpf "FB49:ADC4:TRGPOS","4"
dbpf "FB49:ADC4:IRQENB","3"
dbpf "FB49:ADC4:START","1"
4チャンネル同時サンプルの
14ビットログレシオADCモジュール、18K07ボードのMV5500用
EPICSデバイスサポートおよびデータベースについて紹介しました。
Makoto Tobiyama
13/Jun/2011
Return to FB Home Page...