// CYTEC版 ステップ周波数自動切換えソフト  2019/04−08 // ■■■ グロ−バル変数定義 ■■■■■■■■■■■■■■■■■■■■■■■■■ static unsigned long dds_count = 0; //DDS出力周波数カウンタ static unsigned long step = 0; //エンコ−ダ ステップ周波数 static unsigned long RE_count = 0; //エンコ−ダ−のスピ−ドカウンタ static unsigned char RE = 0; //エンコ−ダ用変数その1 static unsigned char RE_TMP = 0; //エンコ−ダ用変数その2 //■■■ PIC12F1840 初期化 ■■■■■■■■■■■■■■■■■■■■ void PIC12F1840_set() { OSCSTAT = 0b01011000 ; //PLLを使う場合 Clock=32MHz OSCCON = 0b11110000 ; // 内部クロックは8MHzとする 4xPLL OPTION_REG = 0b00001000 ; //内部プルアップ抵抗を使用する Bit7=0 WPUA = 0b00111111 ; // プルアップ抵抗設定 使用=1 未使用=0 ANSELA = 0b00000000 ; // A/D入力ピン設定 入力=1 TRISA = 0b00111001; // 入出力設定 0=OUTPUT 1=INPUT PORTA = 0b00000000 ; // 出力ピンの初期化(全てLOWにする) //---- Timer0の設定 --------------------------------------------------- OPTION_REG.PSA = 1; //プリスケ−ラを使わない OPTION_REG.TMR0CS = 0; //内臓クロック使用 INTCON.T0IF = 0; //オバ−フロ−フラグ・クリア− TMR0 = 0x80; //TIMER0インタ−バル周期設定 INTCON.T0IE = 1; //Timer0オバ−フロ−割り込み設定。 } // ■■■ 割り込み処理 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■ void interrupt() { unsigned int en_con = 0; // INTCON.TMR0IF = 0; //割り込みフラグ・クリア TMR0 = 0x80; //割り込み周期調整定数 //エンコ−ダ−回転方向取得 RE <<= 2 ; //エンコ−ダ−の状態を保存する RE &= 0b00001100; RE_TMP = PORTA; //現在のエンコ−ダ−の状態を読み込む RE_TMP &= 0b00000011; //マスク処理 RE = RE | RE_TMP; //旧デ−タと現デ−タを足す //ステップ数自動切換え//****************************************************** en_con = en_con+1; //割り込み回数カウント if(en_con == 4000){ //def=4000 if(RE_count <= 90) step=25; if((RE_count >= 91)&(RE_count <= 150)) step = 50; if((RE_count >= 151)&(RE_count <= 200)) step = 75; else step = 100; if(RE_count >= 290) step = 1000; en_con = 0; //カウンタ−類クリア RE_count = 0; } //***************************************************************************** // UP処理 if(RE == 1) { dds_count = dds_count + step; RE_count = RE_count + 10; // カウンタ− if(dds_count >= dds_frq_hi){ dds_count = dds_frq_hi; } } //Down処理 if(RE == 4) { dds_count = dds_count - step; RE_count = RE_count + 10; // カウンタ− if( dds_count <= dds_frq_lo ){ dds_count = dds_frq_lo; } } }