My-CDC-Basic.Xプログラムコードのポイント
*MPLAB_X_IDE_v2.25とPIC18F4553マイコンの復習、16章:高温用温度レコーダの製作をベースに修正しました。
*コパルステッピングモーター SPG27−1702の制御に関しては19章:ステッピングモーターの制御を参照しました。
(1)EPROM書込み方法の変更
*測定データのEPROMへの書込みはタイマー0割込みから呼び出されるvoid Int_Low()関数内で行っています。
*void Int_Low()関数内で1バイト書込み関数void Write_EPROM(unsigned short addr,unsigned char send_data)を多数回実行するとタイミング的な不具合が発生しました。
そこでvoid Int_Low()関数内での書き込みを
gEPdata[0]=(unsigned char)(X1/256);
gEPdata[1]=(unsigned char)(X1);
gEPdata[2]=(unsigned char)(X2/256);
gEPdata[3]=(unsigned char)(X2);
Write_EPROM_N(4*gSNo+8,4);//EPROM書込み
と1回に変更しました。
unsigned char gEPdata[10];//Write_EPROM_N用グローバル配列変数
//N個のgEPdata[i]を同時にEPROMに書込み
void Write_EPROM_N(unsigned short addr,unsigned char N)
{
int i;
TRISB = 0b00000011; //B1=SCL(INPUT),BO=SDA(OUTPUT)I2C通信
SSPCON1 = 0x28; // SSP enable & I2C Master mode, clock = FOSC / (4 * (SSPADD+1))
SSPADD = 0x0F; // 0x00だと動作しないクロック設定
unsigned char addr1, addr2;
addr2=addr;
addr1=addr >> 8;
//1バイト書込み
PIR1bits.SSPIF = 0;//I2C_通信割込みフラグクリア
SSPCON2bits.SEN = 1;//I2C_startビット
while (SSPCON2bits.SEN) {}//終了待ち
PIR1bits.SSPIF = 0;//I2C_通信割込みフラグクリア
while(SSPSTATbits.BF){};
SSPBUF =0xA0;//0xA0 //書込み制御コード
if (SSPCON2bits.ACKSTAT) {PORTD=0b11111110;}//ACKチェック
while (!PIR1bits.SSPIF) {}//終了待ち
PIR1bits.SSPIF = 0;//I2C_通信割込みフラグクリア
while(SSPSTATbits.BF){};//SSPBUFの干渉確認
SSPBUF = addr1; // 書き込みアドレス1
if (SSPCON2bits.ACKSTAT) {PORTD=0b11111101;}//ACKチェック
while (!PIR1bits.SSPIF) {}//終了待ち
PIR1bits.SSPIF = 0;//I2C_通信割込みフラグクリア
while(SSPSTATbits.BF){};//SSPBUFの干渉確認
SSPBUF = addr2;// 書き込みアドレス2
if (SSPCON2bits.ACKSTAT) {PORTD=0b11111100;}//ACKチェック
while (!PIR1bits.SSPIF) {}//終了待ち
for(i=0;i < N;i++)
{
PIR1bits.SSPIF = 0;//I2C_通信割込みフラグクリア
while(SSPSTATbits.BF){};//SSPBUFの干渉確認
SSPBUF =gEPdata[i];// send_data書き込み
if (SSPCON2bits.ACKSTAT) {PORTD=0b11111011;}//ACKチェック
while (!PIR1bits.SSPIF) {}//終了待ち
}
PIR1bits.SSPIF = 0;//I2C_通信割込みフラグクリア
SSPCON2bits.PEN = 1;//I2C_通信終了
while (SSPCON2bits.PEN) {}//終了待ち
}