--- ver012/main.c 2013-01-08 09:39:48.000000000 +0900 +++ ver012kai_tacho/main.c 2013-02-10 16:47:16.000000000 +0900 @@ -1,3 +1,39 @@ +// 自動車用スピードメータキット(タコメータ化版) +//2013/02/10 Ver012改(タコメータ化版) by disklessfun +//2011/11/21 Ver011改(タコメータ化版) by disklessfun +// ライセンスはADL(詳細はhttp://a-desk.jp/modules/forum_youbou/index.php?cat_id=4)です。 +// +// スピードメータとしてではなく、タコメータとして機能します。 +// 最小表示単位は10rpmです。最大9990rpmまで表示できます。 +// 内部的には15000rpmまで対応しています。 +// 10000rpm以上では千の桁以下のみを表示します(つまり全桁表示できないものの15000rpmまで使用できます)。 +// クランクシャフト1回転あたりのパルス数はJP1とJP2で設定します。 +// +// 1回転あたり1パルス(JP1 2-3,JP2 NC) +// 1回転あたり2パルス(JP1 1-2,JP2 NC) +// 1回転あたり3パルス(JP1 NC, JP2 2-3) +// 1回転あたり4パルス(JP1 2-3,JP2 2-3) +// 1回転あたり5パルス(JP1 1-2,JP2 2-3) +// 1回転あたり6パルス(JP1 NC, JP2 1-2) +// +// タコメータではあるものの、10rpmから表示できます(低回転の入力を無視するような、タコメータ専用設計ではありません)。 +// +// 1回転あたり6パルスの設定時、タコメータとしてではなく、周波数計としても使用できます。この場合は表示値がそのまま +// 周波数(Hz)値となります。 +// +// 今リリースからは、初期状態で、タコメータとしての用途に合わせる為に(アイドリング時の表示が安定するように)、 +// INT0計測とCCP計測との切替回転数がアイドリング回転数帯と重ならないように調整しています。 +// +// car_type_set構造体のパラメータを変更することによって、メータの特性を好みに合わせて調整することができます。 +// 付属の表計算シートを活用して下さい。白抜きの部分が(一般的に)変更可能な部分です。 +// +// +// 改造元のスピードメータにおける最高速度表示機能は最高回転数表示機能に置き換わっています。 +// +// あと、是非、コンパイル前に各自SHTUP_PNTの値を好みの値に変更して下さい。エンジン回転数が指定値以上に達すると +// LEDが点滅します。シフトアップ回転数表示機能としての用途を想定しています。 +// +////////ここまではdisklessfunが追加したヘッダ//////////////////////////////////// // 自動車用スピードメータキット // 2013/01/08 Ver012 brightness_disp変更時のチラツキをなくす為、バッファ化 // 2011/02/04 Ver011 num_disp_filtをlongに変更(オーバーフローを防ぐ為) @@ -37,14 +73,22 @@ #define CULC_ZERO 2 #define MODE_OPENING 0 #define MODE_SPEED 1 -#define MAX_ACC 1280 //最高加速度、これを超えて加速した場合はノイズとして無視する(車速×FILT_FACTORの値にする) +//#define MAX_ACC 1280 //最高加速度、これを超えて加速した場合はノイズとして無視する(車速×FILT_FACTORの値にする) #define FILT_FACTOR 64L //フィルタの定数 -#define MIN_LED_BLINK 60 //LED点滅の最低速度(km/h) +//#define MIN_LED_BLINK 60 //LED点滅の最低速度(km/h) #define PULSE_DEVIDE 1 ///1/2の分周の場合は1、1/4の分周の場合は2 +#define SHTUP_PNT 1500 //シフトアップ回転数(各自好みの値を設定する。実際の回転数の1/10の値を設定する。つまり表示値と + // 同じ値を設定する。例えば6000rpm以上で点滅させたい場合は600と記述する。 + // LEDは明るく点滅するので、常時点滅させると明る過ぎて特に夜間走行時に障害となる。 + // 従って、常時点滅してしまうような小さい値を設定してはいけない。 + // 1000(=1万rpm)超の値も設定可能) #define PORT_DISP_HUD PORTAbits.RA6 //HUD表示の設定ピン #define PORT_DISP_REVERSE PORTAbits.RA7 //180度反転表示の設定ピン +#define T2_POST_DSM T2_POST_1_8 //8MHz時 +//#define T2_POST_DSM T2_POST_1_16 //16MHz時 + //コンフィグレーション設定 #pragma config OSC = INTIO67 #pragma config FCMEN = OFF @@ -79,7 +123,7 @@ void disp_led_op(unsigned char); void (*fun_disp_led)(unsigned char); -//車両のパルスタイプの違いのデータ +//車両のパルスタイプ毎のデータ(全て付属の表計算シートを用いて算出して下さい) const struct car_type_set { long num_CCP; //CCP計測時の変換係数 @@ -87,9 +131,18 @@ unsigned int num_INT0; //INT0計測時の変換係数 int speed_INT0_to_CCP; //INT0計測からCCP計測へ移る速度 int count_INT0_to_ZERO; //INT0計測から車速0モードへ移るカウント数 + int timer1_ps; //(CCP1用)TIMER1のプリスケーラ値 + int timer0_ps; //(INT0モード計測用)TIMER0のプリスケーラ値 } car_type_set[] = { - {500000 ,1000 ,977,1440 ,1000}, //通常の周波数への変換(JP1 NC, JP2 NC) + {1000000,992 ,1953,1323,1953,2,4}, //通常の周波数への変換(JP1 NC, JP2 NC) + {3000000,2976,5859,3264,5859,4,8}, //1回転あたり1パルス(JP1 2-3,JP2 NC) + {3000000,2976,5859,3264,5859,2,4}, //1回転あたり2パルス(JP1 1-2,JP2 NC) + {2000000,1984,3906,2645,3906,2,4}, //1回転あたり3パルス(JP1 NC, JP2 2-3) + {1500000,1504,2930,2005,2930,2,4}, //1回転あたり4パルス(JP1 2-3,JP2 2-3) + {1200000,1216,2344,1621,2344,2,4}, //1回転あたり5パルス(JP1 1-2,JP2 2-3) + {1000000,992 ,1953,1323,1953,2,4}, //1回転あたり6パルス(JP1 NC, JP2 1-2) +/* {500000 ,1000 ,977,1440 ,1000}, //通常の周波数への変換(JP1 NC, JP2 NC) {2825746,3840,5519,5120,5519}, //車速センサ1倍 (JP1 2-3,JP2 NC) {1412873,1920 ,2760,2560,2760}, //車速センサ2倍 (JP1 1-2,JP2 NC) {706436 ,1280 ,1380,1920 ,1380}, //車速センサ4倍 (JP1 NC, JP2 2-3) @@ -97,7 +150,7 @@ {176609 ,384 ,345 ,640 ,345 }, //車速センサ16倍(JP1 1-2,JP2 2-3) {141287 ,320 ,276 ,480 ,276 }, //車速センサ20倍(JP1 NC, JP2 1-2) {113030 ,256 ,221 ,384 ,221 }, //車速センサ25倍(JP1 2-3,JP2 1-2) - {423862 ,960 ,828 ,1440 ,828 }, //VW(JP1 1-2,JP2 1-2) + {423862 ,960 ,828 ,1440 ,828 }, //VW(JP1 1-2,JP2 1-2)*/ }; char car_type = 0; //車のパルスタイプ @@ -134,7 +187,8 @@ unsigned char culc_mode = CULC_ZERO; //車速計算のモード char main_mode = MODE_OPENING; //最初はオープニングモード int devide_counter = PULSE_DEVIDE; //パルス分周処理用のカウンター -int flg_initial = 1; // 起動時にだけ使用する +//int flg_initial = 1; // 起動時にだけ使用する +int flg_justmodezeroin = 1; //車速0モード時に入った直後であることを表す //オープニングデモ用 unsigned int timer_opening = 0; @@ -170,9 +224,24 @@ ConvertADC(); while(BusyADC()); car_type += ((int)(ReadADC()/342)) * 3; - +car_type = 2; //タイマ1の設定(キャプチャ用) - OpenTimer1(TIMER_INT_OFF & T1_16BIT_RW & T1_SOURCE_INT & T1_PS_1_4 & T1_OSC1EN_OFF); +// OpenTimer1(TIMER_INT_OFF & T1_16BIT_RW & T1_SOURCE_INT & T1_PS_1_4 & T1_OSC1EN_OFF); + switch (car_type_set[car_type].timer1_ps) { + case 1: + OpenTimer1(TIMER_INT_OFF & T1_16BIT_RW & T1_SOURCE_INT & T1_PS_1_1 & T1_OSC1EN_OFF); + break; + case 2: + OpenTimer1(TIMER_INT_OFF & T1_16BIT_RW & T1_SOURCE_INT & T1_PS_1_2 & T1_OSC1EN_OFF); + break; + case 4: + OpenTimer1(TIMER_INT_OFF & T1_16BIT_RW & T1_SOURCE_INT & T1_PS_1_4 & T1_OSC1EN_OFF); + break; + case 8: + OpenTimer1(TIMER_INT_OFF & T1_16BIT_RW & T1_SOURCE_INT & T1_PS_1_8 & T1_OSC1EN_OFF); + break; + default:break; + } WriteTimer1(0); //キャプチャソースの設定(タイマ1を使用) T3CONbits.T3CCP1 = 0; @@ -180,9 +249,25 @@ OpenCapture1(CAPTURE_INT_ON & C1_EVERY_RISE_EDGE); //タイマ2の設定 (LED点灯用 1.024ms毎に割り込み) - OpenTimer2(TIMER_INT_ON & T2_PS_1_1 & T2_POST_1_8); +// OpenTimer2(TIMER_INT_ON & T2_PS_1_1 & T2_POST_1_8); + OpenTimer2(TIMER_INT_ON & T2_PS_1_1 & T2_POST_DSM); WriteTimer2(0); +//タイマ0の設定 (低速時用のパルス計測とモード判定用 8MHz時にはPS値x128μs毎に割り込み) + switch (car_type_set[car_type].timer0_ps) { + case 4: + OpenTimer0(TIMER_INT_ON & T0_8BIT & T0_SOURCE_INT & T0_PS_1_4); + break; + case 8: + OpenTimer0(TIMER_INT_ON & T0_8BIT & T0_SOURCE_INT & T0_PS_1_8); + break; + case 16: + OpenTimer0(TIMER_INT_ON & T0_8BIT & T0_SOURCE_INT & T0_PS_1_16); + break; + default:break; + } + WriteTimer0(0); + //INT0割り込み(低速時のパルス計測) INTCONbits.INT0IE = 1; INTCON2bits.INTEDG0 = 1; @@ -222,7 +307,7 @@ { //スピードメータ //INT0モード用車速計算 temp_hold_timer2 = hold_timer2; - if(temp_hold_timer2 != 0) //hold_timer2 == 0であった場合は極端に短いパルスであるので処理しない + if(temp_hold_timer2 != 0) //hold_timer2 == 0であった場合は極端に短いパルスもしくは車速0モードであるので処理しない culced_speed_INT0 = (car_type_set[car_type].num_INT0 * FILT_FACTOR) / temp_hold_timer2; //CCPモード用車速計算 // diff_hold_timer1は0とはならない。また、ここではオーバーフローも起こらないので除算のチェックを割愛 @@ -238,35 +323,42 @@ //車速計算モードにより、フィルタの計算を振り分け if(culc_mode == CULC_INT0) { - if (flg_initial){ +/* if (flg_initial){ num_disp_filt = culced_speed_INT0; flg_initial = 0; } if((culced_speed_INT0 - num_disp_filt) < MAX_ACC) - num_disp_filt = num_disp_filt + (culced_speed_INT0 - num_disp_filt)/FILT_FACTOR; + num_disp_filt = num_disp_filt + (culced_speed_INT0 - num_disp_filt)/FILT_FACTOR;*/ + num_disp_filt = num_disp_filt + (culced_speed_INT0 - num_disp_filt)/FILT_FACTOR; } else if(culc_mode == CULC_CCP) { - if (flg_initial){ +/* if (flg_initial){ num_disp_filt = culced_speed_CCP; flg_initial = 0; } if((culced_speed_CCP - num_disp_filt) < MAX_ACC) - num_disp_filt = num_disp_filt + (culced_speed_CCP - num_disp_filt)/FILT_FACTOR; + num_disp_filt = num_disp_filt + (culced_speed_CCP - num_disp_filt)/FILT_FACTOR;*/ + num_disp_filt = num_disp_filt + (culced_speed_CCP - num_disp_filt)/FILT_FACTOR; } else num_disp_filt = 0; num_disp = (int)(num_disp_filt / FILT_FACTOR); + num_disp = (culc_mode != CULC_ZERO) ? num_disp + 1 : 0; //最高速の更新 if(num_disp > max_speed) { max_speed = num_disp; - if (max_speed >= MIN_LED_BLINK) - count_led_light = 2; +// if (max_speed >= MIN_LED_BLINK) +// count_led_light = 2; } +//シフトアップ回転数判定 + if(num_disp > SHTUP_PNT) + count_led_light = 2; + //最高速表示 if(!PORTCbits.RC7) num_disp = max_speed; @@ -315,17 +407,18 @@ if(culc_mode == CULC_ZERO) { + if (flg_justmodezeroin) + flg_justmodezeroin = 0; + else { hold_timer2 = car_type_set[car_type].count_INT0_to_ZERO; //車速を1km/hにする為 culc_mode = CULC_INT0; } + } } - if(PIR1bits.TMR1IF == 1) - PIR1bits.TMR1IF = 0; - - if(PIR1bits.TMR2IF) - { //タイマ2割り込み LEDのダイナミック点灯 - PIR1bits.TMR2IF = 0; + if(INTCONbits.TMR0IF) + { //タイマ0割り込み + INTCONbits.TMR0IF = 0; //INT0モード用のタイマ timer2_count++; @@ -334,7 +427,25 @@ timer2_count = 0; culced_speed_INT0 = 0; culc_mode = CULC_ZERO; + flg_justmodezeroin = 1; } + } + + if(PIR1bits.TMR1IF == 1) + PIR1bits.TMR1IF = 0; + + if(PIR1bits.TMR2IF) + { //タイマ2割り込み LEDのダイナミック点灯 + PIR1bits.TMR2IF = 0; + +////INT0モード用のタイマ +// timer2_count++; +// if(timer2_count >= car_type_set[car_type].count_INT0_to_ZERO) +// { //車速0モードへ +// timer2_count = 0; +// culced_speed_INT0 = 0; +// culc_mode = CULC_ZERO; +// } //オープニングモード timer_opening++;