実現したいこと
1000msec毎、LEDを点灯/消灯したい。
(タイマー割込みを使用して)
発生している問題・分からないこと
発生している事象
・1000msec毎のトグルが、ときどき800msecくらいになってしまう。
該当のソースコード
uint16_t gMSecTime; // タイマー割込み関数 void Timer0IntFunc(void) { gMSecTime++; } /* Main application */ void main(void) { uint16_t t_led_tgl = 0; // time scale for LED uint16_t diff; // Initialize the device SYSTEM_Initialize(); TMR0_SetInterruptHandler(Timer0IntFunc); // タイマー0割込み関数の登録 // Enable the Global Interrupts INTERRUPT_GlobalInterruptEnable(); // Enable the Peripheral Interrupts INTERRUPT_PeripheralInterruptEnable(); t_led_tgl = gMSecTime; while (1) { diff = gMSecTime - t_led_tgl; // 経過時間計算 if( diff >= 1000 ){ // 1000msec経過? // ログ出力 sprintf(line_buf, "%u,%u,%u\r\n", gMSecTime, t_led_tgl, diff ); TxString(line_buf,strlen(line_buf)); IO_RA2_Toggle(); // LEDトグル t_led_tgl = gMSecTime; // 時間再計測 } } }
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
---以下、ログ出力-----------------------------
11195,10195,1000
12216,11216,1000
13056,12237,1074 ★この時、時間が短くなる。
14077,13077,1000
15098,14098,1000
16119,15119,1000
★の箇所で
gMSecTime:13056
t_led_tgl:12237
なので、
diff:819
となり、ifの条件に引っかからないはずなのですが
diff:1074
となっておりifの条件に引っかかってトグル処理を実行しています。
引き算の結果が時々おかしくなる!?
気になっているのは、
PIC18Fは8bitマイコンですがgMSecTimeが16bitなので
何か弊害があるのでは・・・
と思っています。
補足
今回初めてのPICマイコンでLチカを試しているのですが、どうもうまく動きません。
行き詰ってしまったため、お助けいただけると幸いです。
使用しているマイコンは「PIC18F14K22」で
MPLAB X IDEのMCCで初期化コードを生成しています。
アルゴリズムは下記のようにしています。
・タイマ0を使って1msecの周期割込みを発生
・割込み処理内で1msecカウンタgMSecTimeをインクリメント
・mainループで1msecカウンタgMSecTimeを監視
・1000msec経過したら、LED(IOポートRA2)をトグル
回答1件
あなたの回答
tips
プレビュー