目次
RPV-130は8ビットのインプットレジスター及びアウトプットレジスターです。また、2チャンネル割り込みのインタラプトレジスター機能も持っています。VME1幅のモジュールです。
林栄精器殿の製品情報
- VMEファンクション
- アドレスはA16のみをサポートします。
- AMコードは0x2D(ショート特権)と0x29(ショート非特権)をサポートしますが、本デバイスサポートは0x2D用です。
- 本ボードで連続8ワードを占有します。
RPV-130ボードのI/Oマップは以下の通りです。
Address | R/W | 0x0F | 0x0E | 0x0D | 0x0C | 0x0B | 0x0A | 0x09 | 0x08 | 0x07 | 0x06 | 0x05 | 0x04 | 0x03 | 0x02 | 0x01 | 0x00
|
---|
0x***0 | R | N/A | LATCH1 データ
|
0x***2 | R | N/A | LATCH2 データ
|
0x***4 | R | N/A | R/S FF データ
|
0x***6 | R | N/A | THROUGH データ
|
0x***8 | W | N/A | Pulse出力データ
|
0x***A | W | N/A | Level出力データ
|
0x***C | R/W | N/A | CSR1レジスタ
|
0x***E | R/W | N/A | CSR2レジスタ
|
- Latch 1レジスタ
Fin 1入力をラッチトリガとしてデータを取り込んだもの。割り込みモードで使用。
- Latch 2レジスタ
Fin 2入力をラッチトリガとしてデータを取り込んだもの。割り込みモードで使用。
- R/S FFレジスタ
データを内部回路のタイミングでラッチしたもの。どれくらいでラッチしてくれるか、いまいち不明だが、30ns幅単発パルスでテストしたところ、取り込めなかった例は無かった。
- Throughレジスタ
VMEにアクセスした時点での入力ステータスを取り込む。
- Pulseレジスタ
このレジスタに1を書くと該当チャンネルにパルス幅200nsの単発パルスを出力する。D0がOUT1に、D1がOUT2に・・・と対応する。
- Levelレジスタ
このレジスタに1を書くと該当チャンネルをNIM Low level(-1V)にする。レジスタを0にするまでLowのまま。Levelレジスタが1になっているとPulseレジスタを1にしてもなにも起きない(lowのまま)。
- CSR1(コントロール・ステータス・レジスタ1)
ビット | Write mode | Read mode
|
---|
D7 | N/A | Busy 3
|
D6 | Enable 3 | Enable 3
|
D5 | N/A | Busy 1
|
D4 | Enable 1 | Enable 1
|
D3 | Mask 1 | Mask 1
|
D2 | N/A | N/A
|
D1 | CLR1 | N/A
|
D0 | CLR3 | N/A
|
意味
以下の記述で赤色文字で書いてある部分は当方テスト結果に基づくもので、製造会社殿の見解と矛盾します。この部分は特に信用しないでください
- ENABLE 3(W)
R/S FFのORでVMEバスに対して割り込みをかける凶悪なビット。絶対1にしてはならない。
- ENABLE 1(W)
Fin 1を有効にするとき1にする。
- MASK 1(W)
Fin 1割り込みを有効にするマスク。
- CLR 1(W)
Latch 1レジスタをクリアするフラグ。
- CLR 3(W)
R/S FFをクリアするフラグ(1でクリア)
- BUSY 3(R)
R/S FFのどこかのビットが立つと1になる。
- ENABLE 3(R)
Enable 3が1になっていると立つビット。
- BUSY 1(R)
Fin 1に入力があったとき立つビット。
- ENABLE 1(R)
Enable 1が1になっていると立つビット。
- MASK1 (R)
MASK 1が1になっていると立つビット
- CSR2(コントロール・ステータス・レジスタ2)
ビット | Write mode | Read mode
|
---|
D7 | N/A | Busy 3
|
D6 | Enable 3 | Enable 3
|
D5 | N/A | Busy 2
|
D4 | Enable 2 | Enable 2
|
D3 | Mask 2 | Mask 2
|
D2 | N/A | N/A
|
D1 | CLR2 | N/A
|
D0 | CLR3 | N/A
|
意味
- ENABLE 3(W)
R/S FFのORでVMEバスに対して割り込みをかける凶悪なビット。絶対1にしてはならない。
- ENABLE 2(W)
Fin 2を有効にするとき1にする。本デバイスサポートではdefaultでONになっている。
- MASK 2(W)
Fin 2割り込みを有効にするマスク。本デバイスサポートではdefaultでON(1)になっている。
- CLR 2(W)
Latch 2レジスタをクリアするフラグ。
- CLR 3(W)
R/S FFをクリアするフラグ(1でクリア)
- BUSY 3(R)
R/S FFのどこかのビットが立つと1になる。
- ENABLE 3(R)
Enable 3が1になっていると立つビット。
- BUSY 2(R)
Fin 2に入力があったとき立つビット。
- ENABLE 2(R)
Enable 2が1になっていると立つビット。
- MASK2 (R)
MASK 2が1になっていると立つビット
なお、R/S FF、Through、Latch1、Latch2各レジスタは完全に独立ですので、同じ入力に対してもタイミングによって一般に別々の結果が入ります。
本デバイスサポートは、EPICS R313改訂版で開発したものです。EPICSそのものに対する説明、入門出家入道遁世については専門家に帰依するなり、コントロールグループのページをご参照なさるなり勝手になさってください。動作はPPC750で確認しています。
コードを以下に示します。
初期化ルーチン
このデバイスサポートはショート特権用なのでバスrequestは
if (sysBusToLocalAdrs(VME_AM_SUP_SHORT_IO,(char *)Base_IO,(char **)&p) == ERROR)
{
logMsg("VME RPV130: cannot find A16 address space\n");
return(ERROR);
}
とします。立ち上がったときには割り込みを不許可にしたいのでinit_allでは
p->csr1 = 0x01; /* clear all and dissable interrupt */
int_level = INT_LEVEL;
cards[cardNum].card = p; /* Remember address of the board */
scanIoInit(&cards[cardNum].ioscanpvt);
logMsg("rpv130 ioInit. 0x%X\n",cards[cardNum].ioscanpvt);
FASTLOCKINIT(&(cards[cardNum].lock));
FASTUNLOCK(&(cards[cardNum].lock)); /* Init the board lock */
としておきます。
割り込みサービスルーチン
割り込みがかかったとき読みに行くのはmbbiDirectなので、mbbiDirect用に割り込みサービスルーチンを用意します。
static void rpv130_isr(pmbbi)
struct mbbiDirectRecord *pmbbi;
{
unsigned char mode;
short cardN;
cardN = pmbbi->inp.value.vmeio.card;
scanIoRequest(cards[cardN].ioscanpvt);
return;
}
mbbiDirectの初期化function
static long init_mi_record(pmbbi)
struct mbbiDirectRecord *pmbbi;
{
short cardNum;
cardNum = pmbbi->inp.value.vmeio.card;
if (intConnect(INUM_TO_IVEC(INT_VEC_BASE + cardNum),
(VOIDFUNCPTR)rpv130_isr,
(int)pmbbi) != OK)
logMsg("devRPV130: Interrupt connect failed for card %d\n",pmbbi->inp.value.vmeio.card);
logMsg("intConnect 0x%X\n",pmbbi);
sysIntEnable(int_level);
logMsg("rpv130 int set for int 0x%x\n",int_level);
return(0);
}
mbbiDirect読み込みfunction
R/S FFのときは、読んだ後レジスタをクリアし、次の入力に備えます。また、割り込みに悪影響を与えないため、Latch1割り込みは許可しておきます(当然クリアはしない)。
switch(pmbbi->inp.value.vmeio.signal){
case 0: /* set_reset_ff */
pmbbi->rval = (cards[cardN].card->ff) & 0xff;
cards[cardN].card->csr1 = 0x01; /* clr 3 */
cards[cardN].card->csr1 = 0x18; /* enable 1 mask 1 */
break;
割り込みの時は、csr1、2を見て自分のレジスタかを判断し、動作を行います。
reg1 = (cards[cardN].card-> csr1);
reg2 = (cards[cardN].card-> csr2);
case 2: /* latch1 */
if ((reg1 & 0x20) == 0x20){
pmbbi->rval = (cards[cardN].card->latch1) & 0xff;
cards[cardN].card->csr1 = 0x02; /* clr 1 */
}
cards[cardN].card->csr1 = 0x18; /* enable 1 mask 1 */
break;
デバイスタイプ定義
dbdファイルの中で次のように定義します。
device(bo,VME_IO,devBoRPV130,"RPV130")
device(mbbiDirect,VME_IO,devMbbiRPV130,"RPV130")
device(mbboDirect,VME_IO,devMbboRPV130,"RPV130")
初期化ファイルはdevRPV130nfigで、ベースアドレスが0x8FF0、割り込みレベル0x07、ベクター0xf3で1枚使うとすると、
devRPV130Config(1,0x8FF0,0x07,0xf3)
の様に指定します。
このデバイスサポートで直接使うデータベースをまとめると、以下の様になります。
DTYP | Record | Signal | Name | Function | Remarks
|
---|
RPV130 | bo | 0 | RPV:RESET_FF | R/S FFをリセットする | 使わない
|
RPV130 | bo | 1 | RPV:RESET_L1 | Latch1をリセットする | 使わない
|
RPV130 | bo | 2 | RPV:RESET_L2 | Latch2をリセットする | 使わない
|
RPV130 | bo | 3 | RPV:RESET_LA | R/S FF、L1、L2をリセットする | 使わない
|
RPV130 | bo | 4 | RPV:DISABLE_L2 | Latch2をdisableする | 使わない
|
RPV130 | mbboDirect | 0 | RPV:PULSE | パルス出力 |
|
RPV130 | mbboDirect | 1 | RPV:LEVEL | レベル出力 |
|
RPV130 | mbboDirect | 2 | RPV:CSR1 | CSR1出力 | 通常使わない
|
RPV130 | mbboDirect | 3 | RPV:CSR2 | CSR2出力 | 通常使わない
|
RPV130 | mbbiDirect | 0 | RPV:FF | R/S FF入力 | 使うときは例えば1秒でスキャンする
|
RPV130 | mbbiDirect | 1 | RPV:THROUGH | スルー入力 |
|
RPV130 | mbbiDirect | 2 | RPV:LATCH1 | LATCH1入力 | スキャンはI/O Intr
|
RPV130 | mbbiDirect | 3 | RPV:LATCH2 | LATCH2入力 |
スキャンはI/O Intr
|
RPV130 | mbbiDirect | 4 | RPV:CSR1_R | CSR1入力 |
|
RPV130 | mbbiDirect | 5 | RPV:LATCH2 | CSR2入力 |
|
1枚のRPV-130ボードを使用する時のスタートアップファイル(の関係部分)は次のようになります。
dbLoadRecords("fbppcApp/Db/FB_RPV.db","USER=FBH:TMP , CHAN=C0")
devRPV130Config(1,0x8ff0,0x07,0xf3)
iocInit
VME Interrupt & I/O REGISTER RPV-130のEPICSデバイスサポートおよびデータベースについて紹介しました。
Makoto Tobiyama
13/Mar/2001
Return to FB Home Page...