2024/01/20(SAT) | なんとなくタコメータを作る流れC |
---|---|
前回の処理だと
割込みが入りまくって CPUの負荷が常に高そうなので 処理を見直して 最初、入力割込みが入ったら 入力割込みを禁止して タイマーを貼って タイムアウト後に入力割込みを有効にする これによってチャダリング対策とする CPUの負荷も減るはず プログラム抜粋 ■変数、定数宣言 変数と定数を宣言します。 今回はチャダリング対策は500μsecとしました ---8<------8<------8<------8<------8<------8<--- ・・・ #define IGN_DELAY_TIME 500 // 500μsec ・・・ // ■定義 // ピンアサイン #define PIN_TACO 16 // タコメーターのピンアサイン // ■変数 // 共通 uint32_t u32TacoCount = 0 ; hw_timer_t *pTimer = NULL; ・・・ ---8<------8<------8<------8<------8<------8<--- ■初期化処理 タイマーと入力割込みの設定をする ---8<------8<------8<------8<------8<------8<--- // // 初期化 // void setup() { ・・・ // タイマー設定 pTimer = timerBegin(0, 80, true) ; timerAttachInterrupt(pTimer, fnTimerISR, true) ; timerAlarmWrite(pTimer, IGN_DELAY_TIME, false) ; // PIN の入力設定 pinMode( PIN_TACO, INPUT ) ; // 割り込み設定 attachInterrupt(PIN_TACO, fnTacoISR, FALLING) ; ・・・ } ---8<------8<------8<------8<------8<------8<--- ■入力割込み処理 入力割込みを停止して、 チャダリング対策のタイマーを貼ります ---8<------8<------8<------8<------8<------8<--- // タコメータの割り込み void fnTacoISR() { // 入力割込みをオフにする detachInterrupt(PIN_TACO) ; // カウントアップ u32TacoCount++; // タイマー割込みをオンにする timerWrite(pTimer,0); timerAlarmEnable(pTimer) ; } ---8<------8<------8<------8<------8<------8<--- ■タイマー割込み処理 タイムアウト後、入力割込みを再び有効にします。 ---8<------8<------8<------8<------8<------8<--- // タイマー割込み void fnTimerISR() { // 入力割込みをオンにする attachInterrupt(PIN_TACO, fnTacoISR, FALLING) ; } ---8<------8<------8<------8<------8<------8<--- 実車にて動作確認してみると ちゃんと動いているようです。 ![]() |