/***********************************************************************/ /* */ /* train_cont.c         */ /* Ver. 1.00           */ /* shigeki shimono         */ /* */ /***********************************************************************/ // #include // R8C/15 SFR定義ファイル unsigned char int_count; //インタラプト回数 unsigned int speed; //スピードパルス幅 unsigned int set_speed; //スピード設定 unsigned int max_speed; //最高スピード unsigned int speed_data[8]; //スピードデータ unsigned int kasoku; //加速 unsigned char gensoku; //減速 int mascon[16]; //マスコン int b_con[16]; //ブレーキ void set_MainCLK(void); //メインクロック切替 void set_port(void); //ポート設定 void set_timerX(void); //タイマX タイマモード初期設定 void set_ADC(void); //ADコンバータ初期設定 void set_mascon(int,int*); //マスコン・ブレーキのAD値をセット void seg_disp(unsigned char); //7セグメント表示 void set_speed_data(void); //スピードセット void main(void) { unsigned int i; int ad_data[2]; int ad_b[2]; unsigned char n[2]; unsigned char ch; set_MainCLK(); //メインクロックの切替 set_port(); //ポート設定 set_timerX(); //タイマX タイマモード初期設定 set_ADC(); //A-Dコンバータ(8bit)の初期設定 set_speed_data(); //スピードセット asm("FSET I"); //割り込み許可 txs = 1; //タイマXカウント開始 while(1){ //繰り返し //A-D変換 adst = 1; while(adst == 1); ad_data[ch] = ad & 0x03ff; //マスコン・ブレーキの位置読み込み if((ad_data[ch]==ad_b[ch]) || (ad_data[ch]+1==ad_b[ch]) || (ad_data[ch]-1==ad_b[ch])){ if(n[ch]++>9){ if(n[ch]<20){ if(ch==0) set_mascon(ad_data[0],mascon); if(ch==1) set_mascon(ad_data[1],b_con); } n[ch]=20; } } else{ n[ch]=0; } ad_b[ch]=ad_data[ch]; //ADのチャンネルを周期ごとに切替 if(ch==0){ ch0 = 1; // アナログ入力端子AN9選択(ブレーキ) ch=1; } else{ ch0 = 0; // アナログ入力端子AN8選択(マスコン) ch=0; } //速度切替 for(i=0;i<7;i++){ if(ad_data[0] < (mascon[i]+0x10)){ if(i>0){ max_speed=speed_data[i-1]; seg_disp(i-1); } break; } } //ブレーキ切替 gensoku=10; //ブレーキかけてない時の減速値 for(i=0;i0){ if(i<=b_con[15]-1){ gensoku=0x8 * (b_con[15]-i-1); //seg_disp(b_con[15]-i-1); } } break; } } for(i=0;i<0x100;i++){} //dummy } } //マスコンの位置に応じたスピード値をセット void set_speed_data(void) { speed_data[0]=0; speed_data[1]=0x2000; speed_data[2]=0x4000; speed_data[3]=0x8000; speed_data[4]=0xc000; speed_data[5]=0xff00; } //マスコン・ブレーキのAD値をセット void set_mascon(int i,int *con){ int c; int d; int n; if(con[15]==0){ //con[15]はmax //1つ目 con[0]=i; con[15]=1; } else{ for(c=0;c < con[15];c++){ d = i-con[c]; //差を調べる if(d<0) d = -d; if(d<4){ //同じあり終了 break; } } if(c==con[15]){ //同じなし登録 //ソート for(c=0;c < con[15];c++){ if(in;c--){ con[c]=con[c-1]; } con[n]=i; } if(con[15]++>13) con[15]=13; //最大 } } } //7セグメント表示 void seg_disp(unsigned char i){ p1_4=i & 1; p1_5=(i & 2)>>1; p1_6=(i & 4)>>2; p1_7=(i & 8)>>3; } // メインクロック切替 void set_MainCLK(void) { prc0 = 1; // 書き換え許可 cm13 = 1; // Xin-Xout端子切り替え cm05 = 0; // Xin-Xoutメインクロック発振 cm06 = 0; // 8分周以外(分周なし) asm("nop"); // 安定待ち asm("nop"); // asm("nop"); // asm("nop"); // ocd2 = 0; // メインクロック選択 prc0 = 0; // 書き換え禁止 } // Port 初期設定 void set_port(void) { drr2 = 1; // ポートP1_2 駆動能力High設定 pd1_2 = 1; // ポートP1_2 出力(スピードパルス出力ポート) pd1_4 = 1; // ポートP1_4 出力(7セグメントLED用ポート) pd1_5 = 1; // ポートP1_5 出力(7セグメントLED用ポート) pd1_6 = 1; // ポートP1_6 出力(7セグメントLED用ポート) pd1_7 = 1; // ポートP1_7 出力(7セグメントLED用ポート) p1_2 = 0; // ポートP1_2 Lレベル設定 pu06 = 1; // ポートP3_3 pullUP pd3_3 = 0; // ポートP3_3 入力モード設定 } // タイマX初期設定 void set_timerX(void) { txck0 = 1; // カウントソースf8=20MHz/8 (400nsec) prex = 9; // カウンタの設定 tx = 9; // 400nsec×(9+1)×(9+1)=40μs ilvl0_txic = 1; // 優先レベル1 ir_txic = 0; // 要求フラグクリア } // タイマX インタラプト #pragma interrupt timerX_int (vect=22) void timerX_int(void) { if (int_count++ ==0){ set_speed += kasoku; if(set_speed>0xff00) set_speed=0xff00; if(set_speed>max_speed) kasoku=0; else kasoku=(max_speed - set_speed) >> 9; set_speed -= gensoku; if(set_speed>0xff00) //マイナス set_speed=0; speed=set_speed; speed >>= 8; } else{ if(speed==0){ p1_2 = 0; //出力レベル0 } else{ p1_2 = 1; speed--; } } } // ADC初期設定 void set_ADC(void) { ch0 = 0; // アナログ入力端子AN8選択 ch1 = 0; // ch2 = 1; // adgsel0 = 1; // ポートP1グループ選択 cks0 = 1; // 周波数 f2選択 bits = 1; // 10ビットモード選択 vcut = 1; // Vref接続 smp = 1; // サンプル&ホールド有り }