歩き遍路 平成19年春(J1) 記録の準備
SPIでUSB( 9) パソコンのパラレルポートから  PIC18F4520のパラレルスレーブポート経由でMAX3421を制御する

 FT245やPIC18FやH8/3067でUSBペリフェラル/ホストコントローラ MAX3421を制御するのが大義なのでパソコン直接制御出来ないかと考えました。
 FT245を使ってパソコンから制御した場合、途中に制御用マイコンが必要になり、パソコンのソフトとFT245制御用マイコンのソフトが要ることと、USBの転送が1ms単位なので間延びした制御になってしまう。又、PIC18FやH8/3067で制御する場合、メモリが少ない事やCコンパイラの能力やディスレイ等の周辺装置の能力が低いのでプログラム作りが大義になって来た。
 それならば、パソコンをマイコン代りにしてはと発想して、パソコンからSPI信号が出ないのでSPIに変更するマイコンだけを付ける方法で実験しました。 パソコンの入出力はパラレルポートを、途中のパラレルとSPIの変換はPIC18F4520のパラレルスレーブポートとMSSPのSPIモードを使いました。
 これで、マイコンはパラレル〜SPI変換プルグラムを一度実装すれば、Visual C#のプログラム作りに専念できることを期待します。


●パソコン側は、XP,Visual C#とパラレルポート

 PCIのディジタルI/Oボードも検討したのですが高価なので将来の検討事項にして、パソコン標準装備のパラレルポートを使うことにします。 パラレルポートのドライバは、横山直隆著 「Visual Studio.NETによる計測・制御実験 工作からプログラムまで C#.NET編」に付属のものを使わせてもらいました。このドライバを、WindowsVistにインストールしても認識できなかったので、WindowsXPにインストールすると認識出来たのでWindowsXPで進めます。

 本付属のサンプルプログラム P1 を実行したパネルと波形を下記します。
 最小でも、パルス幅は12uS、周期は18uSです。
 パラレルポートは、ISAバスに実装されているのでISAバスのタイミングで動いています。今のパソコンのCPUはGHz速度で動いているが、ISAバスは時間調節しています。レガシポートなので仕方がないですね。



・上のボタンを押下した波形                      ・下のボタンを押下した波形
           ・上の波形は、/Strobe 信号    ・下の波形は、/Int信号


●パラレル・SPI変換マイコンは、PIC18F4520で
      パラレル・スレーブ・ポートとMSSPのSPIモードを使う

 パソコン側がパラレルポートなら、マイコン側はPIC18F4520のパラレル・スレーブ・ポートで受けてMSSPのSPIモードを使ってUSBペリフェラル/ホストコントローラ MAX3421を制御します。

・左側がパラレルとSPIの変換用ボードです。SPIでUSB( 1)で作ったPIC18F4520ボードを改造して追加のパソコンからのパラレルポートを受ける回路と接続しています。
・右側はUSBペリフェラル/ホストコントローラ MAX342xボードです。




 SPIでUSB( 1)で作ったPIC18F4520ボードを改造した、パラレルとSPIの変換用ボードです。
 手を抜いて、変更箇所だけ追記しています。




 パソコンからのパラレルポートを受ける回路です。上のパラレルとSPIの変換用ボードのLCDコネクタに接続します。
 回路は、パラレルケーブルが長いのでヒステリスの8ビットの双方向バッファとデコーダで 横山直隆著 「Visual Studio.NETによる計測・制御実験 工作からプログラムまで C#.NET編」に記載のものと同じです。




 USBペリフェラル/ホストコントローラ MAX342xボードの回路図です。SPIでUSB( 7)で使ったものです。




●パソコンからUSBペリフェラル/ホストコントローラ MAX342xボードを制御する

 パソコンのパラレルからSPIの変換用PIC18F4520ボード経由でUSBペリフェラル/ホストコントローラ MAX342xボードを制御しました。
 




 パソコンから 9 を出力するとLEDに 9 が表示されます。
 上部のボタンとテキストボックスは今回追加しました。




 パソコンのVisual C#のプログラムです。横山直隆著 「Visual Studio.NETによる計測・制御実験 工作からプログラムまで C#.NET編」に記載のプログラム P_1 に追加したボタンの処理を追加しています。




 PIC18F4520のプログラムコードを示します。
 SPIを制御する SPI送受信関数 を SPIでUSBホストのレジスタに書込む関数 と 読出す関数 で呼び出します。
 メインでは、PsP書込みを待ち 書き込みが有れば パソコンからのデータを7SEGの表示パターンに変換してSPIでUSBペリフェラル/ホストコントローラ MAX342xボードに送ります。


/**************************************************************
*
* PCのパラレルポートとPIC18FのPSPを接続してコマンドとデータを授受
* そして、PIC18FのMSSPを使ってMAX33421とSPI接続
*
**
***************************************************************

/** I N C L U D E S *******************************************/
#include <p18cxxx.h>
#include <spi.h>
#include "delays.h"
#include "MAX3421E.h"

/*** コンフィギュレーションの設定 *******/
#pragma config OSC=HS, /*FSCM=OFF, */ IESO=OFF, PWRT=ON
#pragma config BOREN=ON, /*BORV=45,*/ WDT=ON, WDTPS=1024
#pragma config MCLRE=ON, PBADEN=OFF //, CCP2MX=RC1
#pragma config STVREN=ON, LVP=ON, DEBUG=ON
#pragma config CP0=OFF, CP1=OFF, CP2=OFF, CP3=OFF, CPB=OFF
#pragma config CPD=OFF, WRT0=OFF, WRT1=OFF, WRT2=OFF, WRT3=OFF
#pragma config WRTB=OFF, WRTC=OFF, WRTD=OFF, EBTR0=OFF
#pragma config EBTR1=OFF, EBTR2=OFF, EBTR3=OFF, EBTRB=OFF

// ***** マクロ定義
#define HSSEL_LO LATA &= ~0x04; // HSSEL=RA2 MAX3421選択
#define HSSEL_HI LATA |= 0x04; // HSSEL=RA2 MAX3421選択解除
#define HRES_LO LATA &= ~0x02 // PSSEL=RA1 MAX3421リセット
#define HRES_HI LATA |= 0x02; // PSSEL=RA1 MAX3421リセット解除

typedef unsigned char BYTE; // these save typing

// ***************************************************************************
// ***** SPI送受信関数 SSピン制御無し
BYTE SpiTxRx(BYTE data){
BYTE Temp;
//??? LATAbits.LATA5 = 0; //SSピンLow
SSPBUF = data; //送信開始

while(!SSPSTATbits.BF); //送信完了待ち

data = SSPBUF; //受信データ読み出し
//??? LATAbits.LATA5 = 1; //SSピンHigh
return(data); //受信データ戻り
}

// ***** SPIでUSBホストのレジスタに書込む関数
void Hwreg(BYTE reg, BYTE val) // write a host register
{
HSSEL_LO
SpiTxRx(reg+2); // MAX3421のレジスタ番号と書込み指定をSPIで送信
SpiTxRx(val); // 書込みデータをSPIで送信
HSSEL_HI
}

// ***** SPIでUSBホストのレジスタを読出す関数
BYTE Hrreg(BYTE reg) // read a host register
{
BYTE dum;
HSSEL_LO
SpiTxRx(reg); // MAX3421のレジスタ番号と読出し指定をSPIで送信
dum = SpiTxRx(0x00); // ダミー書込みデータをSPIで送信と同時に読出しデータを入力
HSSEL_HI
return(dum);
}

// ********************
// ***** メイン
void main(void)
{
char tempData;
char tempData2;
char tempData3;
unsigned char segval,dum;
// 0 1 2 3 4 5 6 7 8 9 A b C d E F 10 11
BYTE sevseg[18]={0x77,0x30,0x6e,0x7a,0x39,0x5b,0x5f,0x70,0x7f,0x79,0x7d,0x1f,0x47,0x3e,0x4F,0x4d,0x08,0x00};

//ポートデータ設定
LATA = 0xFF; // データ
LATB = 0xFF; // データ
LATC = 0xFF; // データ
LATD = 0xFF; // データ
LATE = 0xFF; // データ

//ポート方向設定 TRISx 1 = IN,0 = OUT
TRISA = 0xD9; //
TRISB = 0xFF; // SW入力
TRISC = 0xFC; // SPI信号とbit1,0はLED
//??? TRISD = 0xFF; // PsPのデータ入出力
TRISD = 0x00; // PsPのデータ入出力
TRISE = 0x17; // PsPのnCS,nWR,nRD信号

ADCON1 = 0x0F; // PsPのための設定

TRISE = 0x17; // PsPのnCS,nWR,nRD信号


//*** MSSP初期設定 Spiマスター、モード00 クロック:1.25Mbps データサンプル:中央
OpenSPI(SPI_FOSC_16, MODE_00, SMPMID);

//*** MAX3421の7SegLEDに 0 を表示
Hwreg(rIOPINS1, 0x07); //R20:IOPINS1に下位のLEDデータを出力
Hwreg(rIOPINS2, 0x07); //R20:IOPINS2に上位のLEDデータを出力
TRISE = TRISE & ~0x80;
tempData = PORTD;

Delay10TCYx(10);

/// メインループ
while(1)
{
if (TRISEbits.IBF) { //PsP書込み有りか?
TRISE = TRISE & ~0x80;

tempData = (PORTD - 0x30) & 0x0F;
segval = sevseg[tempData];
Hwreg(rIOPINS1,segval); // GPO[3:0] are all for 7-seg readout
dum = Hrreg(rIOPINS2) & 0x08; // GPO[6:4] are for 7-seg, preserve bit 7 (Vbus control)
segval >>= 4;
Hwreg(rIOPINS2,(dum | segval)); // OR the 3 bits for 7-seg


}//END of if (PORTEbits.RE1)

Delay10TCYx(10); //時間待ち
}//END of while(1)
}//END of main

// a
// -----
// f| |b
// | g |
// -----
// e| |c
// | d |
// -----
//


●困った事

 PIC18F4520のパラレル・スレーブ・ポートの扱いで手間が掛かりました PIC18F4520のパラレル・スレーブ・ポートは余り使われて無いようでデータシートやアプリケーションノートやWEBを探しても使い方の説明が無く手探りでした。

 ●パラレル・スレーブ・ポートモードの設定
 パラレル・スレーブ・ポートモードの設定の要点は
 ・TRISE レジスタを 17hと設定する。
  PSPMODE ビットを 1 = Parallel Slave Port modeに設定。
  制御信号 CS,WR,RD 用のポート RE2,RE1,RE0 を入力に設定。
 ・ADCON1 レジスタのビット3〜0の PFCG3:PFCG0 の設定を‘1010’〜‘1111’にする。

 ●パラレル・スレーブ・ポートのフラグビットの制御
 パラレル・スレーブ・ポートのフラグビットには、IBFとOBFが有る。IBFのセットとOBFリセットはタイムチャートに有るが、IBFのリセットとOBFセットの説明が見当たらない。
 IBFのリセットとOBFセットは、対応のレジスタをアクセスすることにより行われる。又、初期化時IBFはリセットされずセットされていたのでプログラム開始時にリセットの必要があった。


 ●ドライバのインストール
 このドライバを、WindowsVistにインストールしても認識できなかったので、WindowsXPにインストールすると認識出来たのでWindowsXPで進めます。


 ●ついでに、パソコンの事
 マイコン様にハードウエアを直接制御するパソコンをどうしょうか悩んだ末小型のを購入することにした。
 中古かATOMかいろいろ迷ったがコンパクトなデスクトップにしました。OSは、MSDNが有るのでWindowsXPを、ディスプレイは液晶17型が余っているので使うとして、セレロン、2GB,250GBのパソコンが送料別で3万円でできました。
 さあ、マイコンと接続しようとパソコンの裏を見るとパラレルポートが有りません。困りました。せっかく買ったのに。
 諦めきれず、パソコンの中を覗くと2列に並んだ26ピンのコネクタがマザーボードに有ります、取扱説明書にはマザーボードの説明はありません。又、WEB探しです、それらしい説明書を入手して読むとやはりパラレルポートです。今度はケーブル作りです。手元に26ピンの圧接型コネクタが無いので手持ちの30ピンのコネクタを使います。バイスを使って圧接して作りました。やれやれできました。









ホームへ戻る