Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of TCD_BD_JIG by
main.cpp
- Committer:
- abem
- Date:
- 2014-10-29
- Revision:
- 0:03dfcdd06518
- Child:
- 1:40527b0f0dfa
File content as of revision 0:03dfcdd06518:
#include "mbed.h" /* DA設定 */ AnalogOut da1(p18); /* LED設定 */ DigitalOut myled1(LED1); DigitalOut myled2(LED2); DigitalOut myled3(LED3); DigitalOut myled4(LED4); /* DIO設定 */ DigitalIn inDrvAlm(p21); // DRV-ALM DigitalIn inReady(p22); // READY DigitalOut outRSTDRV(p23); // RST-DRV DigitalOut outPWMON(p24); // PWM-ON /* SIO設定 */ Serial pc(USBTX, USBRX); // USB-SIO Serial sio1(p9, p10); // SIO1 Serial sio2(p13, p14); // SIO2 /* タイマー設定 */ Timeout flipper; Ticker led4flic; /* 関数宣言 */ void initSIO(void); // シリアルイニシャライズ void cmdSIOpc(void); // コマンド処理 pc-SIO void cmdSIOsio2(void); // コマンド処理 SIO1 void cmdSIOsio1(void); // コマンド処理 SIO2 int trgADcmp(short ADdata, unsigned short ch); // ターゲット取得AD値比較処理 /* 定数宣言 */ // DA固定出力(0-2.5-5V) unsigned short outDA0v0 =0; unsigned short outDA2v5 =19200; //unsigned short outDA2v5 =10000; unsigned short outDA5v0 =62000; // ターゲットAD判定閾値(0-2.5-5V) // 出力範囲:0-5V(ターゲット:-2047~2048) short AD0v0l =-2048; short AD0v0h =-1800; short AD2v5l =-100; short AD2v5h =100; short AD5v0l =1800; short AD5v0h =2047; // SIOコマンド // 個別 char cmdCHK[] = "CHK"; // シリアルチェック char cmdIO1[] = "IO1"; // RST_DRV-DRV_ALMチェック char cmdIO2[] = "IO2"; // PWM_ON-READYチェック char cmdIOC[] = "IOC"; // DI/Oシーケンシャルチェック char cmdDAC[] = "DAC"; // 指令電圧チェック char cmdDAM[] = "DAM"; // 指令電圧マニュアル出力 /* 変数宣言 */ // DA用 unsigned short u16OutDA; short TrgAD; unsigned short cmpADch; // pc-SIO char rx_buf_PC[50]; char rx_ch_PC; short rx_cnt_PC; short rx_endflg_PC; // SIO1 char rx_buf_SIO1[50]; char rx_ch_SIO1; short rx_cnt_SIO1; short rx_endflg_SIO1; // SIO2 char rx_buf_SIO2[50]; char rx_ch_SIO2; short rx_cnt_SIO2; short rx_endflg_SIO2; // 汎用 short i; int len; int intdaout; int intbuf; char cbufstr[50]; // Flag unsigned short flgCHKrun; unsigned short flgRxAD; /* 割込ハンドラ */ /* pc-SIO_受信 */ void isr_Rx_PC() { rx_ch_PC = pc.getc(); rx_buf_PC[rx_cnt_PC] = rx_ch_PC; if( rx_ch_PC == '\r'){ rx_endflg_PC = 1; myled3 = 1; }else{ rx_cnt_PC++; myled2 = 1; } } /* SIO1_受信 */ void isr_Rx_SIO1() { rx_ch_SIO1 = sio1.getc(); rx_buf_SIO1[rx_cnt_SIO1] = rx_ch_SIO1; if( rx_ch_SIO1 == '\r'){ rx_endflg_SIO1 = 1; }else{ rx_cnt_SIO1++; myled2 = 1; } } /* SIO2_受信 */ void isr_Rx_SIO2() { rx_ch_SIO2 = sio2.getc(); rx_buf_SIO2[rx_cnt_SIO2] = rx_ch_SIO2; if( rx_ch_SIO2 == '\r'){ rx_endflg_SIO2 = 1; myled3 = 1; }else{ rx_cnt_SIO2++; myled2 = 1; } } /* flip_設定時間後ワンショット動作 */ void flip() { led4flic.detach(); // タイムアウトにてLED点灯 myled4 = 1; flgCHKrun = 0; pc.puts("TimeOut CHK\r"); sio1.puts("NG\r"); } /* flic_設定時間繰り返し動作 */ void flic() { myled4 = !myled4; } /* main */ int main() { /* シリアル初期化 */ initSIO(); /* mbed上LED初期化 */ myled2 = 0; myled3 = 0; /* 出力ポート初期化 */ outRSTDRV = 1; // '1'=Hi(mbed),出力=Open outPWMON = 1; // '1'=Hi(mbed),出力=Open /* DA出力初期化 */ da1.write_u16(0); flgRxAD = 0; // ターゲットAD受信フラグ /* 起動出力 */ pc.printf("SIOpc test start \r"); sio1.printf("PW ON\r"); myled1 = 1; while(1){ /* SIO処理 */ if( rx_endflg_PC == 1 ){ cmdSIOpc(); // コマンド処理 pc-SIO }else if( rx_endflg_SIO1 == 1 ){ cmdSIOsio1(); // コマンド処理 SIO1 }else if( rx_endflg_SIO2 == 1 ){ cmdSIOsio2(); // コマンド処理 SIO2 } /* AD値判定処理 */ if( flgRxAD == 1){ trgADcmp(TrgAD, cmpADch); } } } /* 関数 */ /* シリアルイニシャライズ */ void initSIO(void) { /* シリアル-割込ハンドラ登録 */ /* pc-SIO */ pc.attach(isr_Rx_PC,Serial::RxIrq); // 受信割込ハンドラ /* SIO1 */ sio1.attach(isr_Rx_SIO1,Serial::RxIrq); // 受信割込ハンドラ /* SIO2 */ sio2.attach(isr_Rx_SIO2,Serial::RxIrq); // 受信割込ハンドラ /* シリアル初期化 */ /* pc-SIO */ pc.baud(38400); pc.format(8, SerialBase::None ,1); /* pc-SIO */ sio1.baud(38400); sio1.format(8, SerialBase::None ,1); /* pc-SIO */ sio2.baud(38400); sio2.format(8, SerialBase::None ,1); /* pc-SIO チェック用初期化 */ rx_cnt_PC = 0; rx_endflg_PC = 0; /* SIO1 チェック用初期化 */ rx_cnt_SIO1 = 0; rx_endflg_SIO1 = 0; /* SIO2 チェック用初期化 */ rx_cnt_SIO2 = 0; rx_endflg_SIO2 = 0; /* 受信領域初期化 */ memset(cbufstr,'\0',sizeof(cbufstr)); memset(rx_buf_PC,'\0',sizeof(rx_buf_PC)); memset(rx_buf_SIO1,'\0',sizeof(rx_buf_SIO1)); memset(rx_buf_SIO2,'\0',sizeof(rx_buf_SIO2)); } /* コマンド処理 */ /* 20141008 現状ではターミネート受信後返信処理 */ /* SIO-pc */ void cmdSIOpc(void) { memset(cbufstr,'\0',sizeof(cbufstr)); /* 文字長チェック */ len = strlen(rx_buf_PC); strncpy(cbufstr,rx_buf_PC,3); /* コマンド判定 */ if( strlen(rx_buf_PC) <= 4){ if(strcmp(cbufstr,cmdCHK) == 0){ // コマンド可 pc.puts("Res CHK\r"); flipper.detach(); led4flic.detach(); if( flgCHKrun == 1){ flgCHKrun = 0; myled4 = 0; sio1.puts("OK\r"); } }else{ // コマンド不可 pc.puts("No CHK\r"); } }else if( strlen(rx_buf_PC) <= 10){ if(strcmp(cbufstr,cmdDAC) == 0){ // コマンド可 DAC strncpy(cbufstr,&rx_buf_PC[4],5); intbuf = atoi( cbufstr ); TrgAD = (short)intbuf; flgRxAD = 1; }else{ // コマンド不可 pc.puts("No DAC\r"); } }else{ pc.puts("Lengs error\r"); pc.puts(cbufstr); } memset(rx_buf_PC,'\0',sizeof(rx_buf_PC)); rx_cnt_PC = 0; myled2 = 0; myled3 = 0; rx_endflg_PC = 0; } /* SIO1 */ void cmdSIOsio1(void) { memset(cbufstr,'\0',sizeof(cbufstr)); /* 文字長チェック */ len = strlen(rx_buf_SIO1); /* コマンド判定 */ strncpy(cbufstr,rx_buf_SIO1,3); if( len == 4){ if(strcmp(cbufstr,cmdCHK) == 0){ // コマンド可:CHK if( flgCHKrun == 1){ flipper.detach(); led4flic.detach(); } flipper.attach(&flip,5.0); led4flic.attach(&flic,0.3); flgCHKrun = 1; sio2.puts("CHK\r"); }else{ // コマンド不可 sio1.puts("CMD Error 3\r"); } }else if( len == 6){ if(strcmp(cbufstr,cmdIO1) == 0){ // コマンド可:IO1 sio1.puts("res IO1\r"); if( rx_buf_SIO1[4] == '0' ){ outRSTDRV = 1; wait(0.5); if( inDrvAlm == 1 ){ sio1.puts("OK\r"); }else{ sio1.puts("NG\r"); } }else if(rx_buf_SIO1[4] == '1'){ outRSTDRV = 0; wait(0.5); if( inDrvAlm == 0 ){ sio1.puts("OK\r"); }else{ sio1.puts("NG\r"); } }else{ sio1.puts("Data Error cmdIO1\r"); } }else if(strcmp(cbufstr,cmdIO2) == 0){ // コマンド可:IO2 sio1.puts("res IO2\r"); if( rx_buf_SIO1[4] == '0' ){ outPWMON = 1; wait(0.5); if( inReady == 1 ){ sio1.puts("OK\r"); }else{ sio1.puts("NG\r"); } }else if(rx_buf_SIO1[4] == '1'){ outPWMON = 0; wait(0.5); if( inReady == 0 ){ sio1.puts("OK\r"); }else{ sio1.puts("NG\r"); } }else{ sio1.puts("Data Error cmdIO2\r"); } }else if(strcmp(cbufstr,cmdDAC) == 0){ // コマンド可:DAC sio1.puts("res DAC\r"); if(rx_buf_SIO1[4] == '1'){ sprintf(cbufstr,"DAC,%05d\r",outDA0v0); sio1.puts(cbufstr); da1.write_u16(outDA0v0); wait(0.2); sio2.puts("DAC\r"); // pc.puts("DAC\r"); cmpADch = 1; // 比較用chセット }else if(rx_buf_SIO1[4] == '2'){ sprintf(cbufstr,"DAC,%05d\r",outDA2v5); sio1.puts(cbufstr); da1.write_u16(outDA2v5); wait(0.2); sio2.puts("DAC\r"); // pc.puts("DAC\r"); cmpADch = 2; // 比較用chセット }else if(rx_buf_SIO1[4] == '3'){ sprintf(cbufstr,"DAC,%05d\r",outDA5v0); sio1.puts(cbufstr); da1.write_u16(outDA5v0); wait(0.2); sio2.puts("DAC\r"); // pc.puts("DAC\r"); cmpADch = 3; // 比較用chセット }else{ sio1.puts("Data Error cmdDAC\r"); } }else{ // コマンド不可 sio1.puts("CMD Error 5\r"); sio1.printf("SIO1Rx= %s ",rx_buf_SIO1); } }else if( len == 10){ if(strcmp(cbufstr,cmdDAM) == 0){ // コマンド可:DAM sio1.puts("res DAM\r"); strncpy(cbufstr,&rx_buf_SIO1[4],5); intdaout = atoi( cbufstr ); // DA出力設定 da1.write_u16((unsigned short)intdaout); }else{ // コマンド不可 sio1.puts("CMD Error 9\r"); } }else{ sio1.puts("CMD Lengs Error\r"); } memset(rx_buf_SIO1,'\0',sizeof(rx_buf_SIO1)); rx_cnt_SIO1 = 0; myled2 = 0; myled3 = 0; rx_endflg_SIO1 = 0; } /* SIO2 */ void cmdSIOsio2(void) { memset(cbufstr,'\0',sizeof(cbufstr)); /* 文字長チェック */ len = strlen(rx_buf_SIO2); strncpy(cbufstr,rx_buf_SIO2,3); /* コマンド判定 */ if( strlen(rx_buf_SIO2) <= 4){ if(strcmp(cbufstr,cmdCHK) == 0){ // コマンド可 pc.puts("Res CHK\r"); flipper.detach(); led4flic.detach(); if( flgCHKrun == 1){ flgCHKrun = 0; myled4 = 0; sio1.puts("OK\r"); } }else{ // コマンド不可 pc.puts("No CHK\r"); } }else if( strlen(rx_buf_SIO2) <= 10){ if(strcmp(cbufstr,cmdDAC) == 0){ // コマンド可 DAC strncpy(cbufstr,&rx_buf_SIO2[4],5); intbuf = atoi( cbufstr ); TrgAD = (short)intbuf; flgRxAD = 1; }else{ // コマンド不可 pc.puts("No DAC\r"); } }else{ pc.puts("Lengs error\r"); pc.puts(cbufstr); } memset(rx_buf_SIO2,'\0',sizeof(rx_buf_SIO2)); rx_cnt_SIO2 = 0; myled2 = 0; myled3 = 0; rx_endflg_SIO2 = 0; } /* ターゲットAD値判定処理 */ /* 引数: */ /* unsigned short ADdata :判定値(受信ADデータ) */ /* unsigned short ch :判定レンジ指定[1:0V0,2:2v5,3,5v0] */ /* 戻値:int 1:OK, 0:NG */ /* */ int trgADcmp(short ADdata, unsigned short ch) { // フラグリセット flgRxAD = 0; memset(cbufstr,'\0',sizeof(cbufstr)); // 比較範囲チェック if( ch == 1 ){ // 0V比較 if( ADdata >= AD0v0l && ADdata <= AD0v0h){ // OK sprintf(cbufstr,"OK,%05d\r",(int)ADdata); sio1.puts(cbufstr); return 1; }else{ // NG sprintf(cbufstr,"NG,%05d\r",(int)ADdata); sio1.puts(cbufstr); return 0; } }else if( ch == 2 ){ // 2V5比較 if( ADdata >= AD2v5l && ADdata <= AD2v5h){ // OK sprintf(cbufstr,"OK,%05d\r",(int)ADdata); sio1.puts(cbufstr); return 1; }else{ // NG sprintf(cbufstr,"NG,%05d\r",(int)ADdata); sio1.puts(cbufstr); return 0; } }else if( ch == 3 ){ // 5V0比較 if( ADdata >= AD5v0l && ADdata <= AD5v0h){ // OK sprintf(cbufstr,"OK,%05d\r",(int)ADdata); sio1.puts(cbufstr); return 1; }else{ // NG sprintf(cbufstr,"NG,%05d\r",(int)ADdata); sio1.puts(cbufstr); return 0; } }else{ // ch error sio1.puts("error ADch\r"); return 0; } }