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.
main.cpp
- Committer:
- abem
- Date:
- 2014-10-29
- Revision:
- 0:03dfcdd06518
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; } }