//****************************************************************************** // オ−トステップ切り替え改造方法 // CYTEC 2019-03-03    製作:JE1AHW/内田恵介 // 開発ソフト: mikroC PRO Ver7.1 // PIC: PIC12F1840 // // エンコ−ダ−の回転の変化に合わせてステップ数を、自動的に変えたい // --------------------------------------------------------------------------- // 2019-03-03 ソフト開発始める //   2019-03-08 CYTEC式オ-トステップ切り替え完成 // //****************************************************************************** //注意:インタ−バルでの割り込み処理を使っている場合のみ使用できます。 //   使用するエンコ-ダ-により、フィ-リングが変わります。 // //■■■グロ−バル変数設定 ■■■■■■■■■■■■■■■■■■■ ■■■■■■ static unsigned long old_tmp; //メインカウンタ−退避 static unsigned long ud_count; //時間単位での変化量用レジスタ static unsigned int en_con; //割り込み回数カウンタ− static unsigned long step; //エンコ−ダ ステップ周波数Hz //■■■ 割り込み処理 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■ void interrupt() { INTCON.T0IF = 0; //割り込みフラグ・クリア TMR0 = 0x80; //割り込み周期調整定数 //エンコ−ダ−回転方向取得 RE <<= 2 ; //エンコ−ダ−の状態を保存する RE &= 0b00001100; RE_TMP = PORTA; //現在のエンコ−ダ−の状態を読み込む RE_TMP >>=4; RE_TMP &= 0b00000011; //マスク処理 RE = RE | RE_TMP; //旧デ−タと新デ−タを足す ######################################### //ステップ数自動切換え en_con = en_con+1; //割り込み回数カウント if(en_con == 4000){ //4000回割り込み ud_count = abs(count - old_tmp); //時間単位でどれだけメインが動いたか ud_count &= 0xFFFF; //マスク処理 if(ud_count <= 25) step=10; else step=100; //ステップ選択 if(ud_count > 980) step=500; //Step Max=500 en_con = 0; //カウンタ−類クリア ud_count = 0; old_tmp = count; //選択した時点のメインカウンタ−退避 } ########################################## //1倍カウント if(enc_speed == 0) { if(RE == 1) { count = count + step; //カウントUP if(limit_flag == 1) //周波数設定時パスする 0設定 { if(count >= vfo_freq_hi) //周波数上限リミット { count = vfo_freq_hi; } } } if(RE == 4) { count = count - step; //カウントDown if(limit_flag == 1) //周波数設定時パスする { if( count <= vfo_freq_low ) //周波数下限リミット { count = vfo_freq_low; } } } } } //■■■ メイン関数 ■■■■■■■■■■■■■■■■■■■■■■■■■■■ void main() { //---------- 初期設定 ----------------------------------------------- ud_count = 0; //時間単位での変化数用レジスタ en_con =0; //割り込み数カウント用レジスタ //***** コンパイル時 設定項目 ************************************************ step = 10; //スタ−トは、10HzStep //*************************************************************************** while(1) { LCD_hyouji(); // LCD表示ル−チン } } //****** END **************************************************************** 消去する関数   1)ステップ切り替えスイッチ関数   2)ステップ数設定関数