My-CDC-Basic.Xプログラムコードのポイント
*MPLAB_X_IDE_v2.25とPIC18F4553マイコンの復習、3章:サンプルプログラムのファイル
構造の変更とカスタマイズをベースに修正しました。
(1)グローバル変数
system.hに定義しました。
void InitInterTimer0 (void);
#define _XTAL_FREQ 48000000 //__delay_ms
unsigned char gCT=0;//Timer0割込みカウンタ
unsigned char fDC=0;//DCモータON-OFFフラグ
short gX0=0,gY0=0,gZ0=0;//現在座標
short gX1=0,gY1=0,gZ1=0;//目標座標
unsigned char CHxy[4] = { 0x08,0x04,0x02,0x01};//XY1相励磁パターン
unsigned char CHz[4] = { 0x01,0x02,0x04,0x08};//Z1相励磁パターン
unsigned char MCx=0,MCy=0,MCz=0;//XVZ移動中フラグ
unsigned char fOutM=0;//XVZ移動完了報告フラグ
(2)タイマ0割込み設定関数と割込み処理関数
*当初、DCモータのPWM制御のため、使用しました。
*3.3V電圧レギュレータに変更したため、あまり意味がありません。
(3)AD変換処理関数
*app_device_cdc_basic.cとapp_device_cdc_basic.hに定義しました。
*AD変換を行います。
unsigned short ADC0()
{
unsigned short result;
long X;
ADCON0bits.GO = 0; // Stop AD conversion
__delay_us( 100 );
ADCON0bits.CHS = 0b0000; //Analog Channel Select bits=Channel 0 (AN0)
__delay_us( 100 );
ADCON0bits.GO = 1; // Start AD conversion
while(ADCON0bits.NOT_DONE); // Wait for conversion
result=ADRESH*256+ADRESL;
return result;
}
(4)USB受信処理関数
*app_device_cdc_basic.cとapp_device_cdc_basic.hに定義しました。
*USB受信処理を行います。
void MyCDCBasicTasks()
{
if( USBUSARTIsTxTrfReady() == true)
{
uint8_t i,j,k;
uint8_t numBytesRead;
unsigned char FIN[5][20];
double X1,X2,X3;
uint8_t I1,I2,I3;
numBytesRead = getsUSBUSART(readBuffer, sizeof(readBuffer));
if(numBytesRead > 0)
{
j=0;k=0;
for(i=0;i5){j=4;}
k=0;
}
else
{
FIN[j][k]=readBuffer[i];
k++;if(k>20){k=19;}
}
}
int TEST=1;
if(FIN[0][0]=='A' && FIN[0][1]=='A' && FIN[0][2]==0)
{
X1=atof((const char *)FIN[1]);
X2=atof((const char *)FIN[2]);
X3=X1+X2;
sprintf(writeBuffer,"%.2f + %.2f = %.2f\r\n",X1,X2,X3);
numBytesRead = strlen(writeBuffer);
putUSBUSART(writeBuffer,numBytesRead);
TEST=2;
}
if(FIN[0][0]=='D' && FIN[0][1]=='C' && FIN[0][2]==0)
{
I1=atoi((const char *)FIN[1]);
if(I1==1)
{
fDC=1;
}
else
{
fDC=0;
}
}
if(FIN[0][0]=='A' && FIN[0][1]=='D' && FIN[0][2]==0)
{
sprintf(writeBuffer,"AD\t%d\r\n",ADC0());
numBytesRead = strlen(writeBuffer);
putUSBUSART(writeBuffer,numBytesRead);
}
if(FIN[0][0]=='M' && FIN[0][1]=='R' && FIN[0][2]==0)
{
gX1=gX0+atoi((const char *)FIN[1]);
//gX1=100;
gY1=gY0+atoi((const char *)FIN[2]);
gZ1=gZ0+atoi((const char *)FIN[3]);
}
if(FIN[0][0]=='M' && FIN[0][1]=='A' && FIN[0][2]==0)
{
gX1=atoi((const char *)FIN[1]);
gY1=atoi((const char *)FIN[2]);
gZ1=atoi((const char *)FIN[3]);
if(gX1==gX0 && gY1==gY0 && gZ1==gZ0){fOutM=2;}
}
}
else
{
if(fOutM==2)
{
sprintf(writeBuffer,"MC\t%d\t%d\t%d\r\n",gX0,gY0,gZ0);
numBytesRead = strlen(writeBuffer);
putUSBUSART(writeBuffer,numBytesRead);
fOutM=0;
}
}
}
CDCTxService();
}