最初は、実行モード中に Timer0 が正常に動作していました。唯一の問題は、デバイスがスリープ モードになると、タイマー 0 が起動するまでカウントアップを停止することです。データシートでは、Timer1 を使用してスリープ モード中に時間を監視できるようになっています。timer0 の既存のコードを timer1 の新しい構成に変更しました。他のコードはほとんど同じです。ただし、timer1 はまったくカウントアップしないため、timer1 と timer0 の違いを見逃している可能性があります。私が使用している PIC は、MPLAB C18 を搭載したPIC18F87J11です。
関連すると思われるコードを共有し、要求に応じて必要に応じてさらに追加します。
Timer0スニペット コード (ヘッダー ファイルから)
#define TMR_IF INTCONbits.TMR0IF
#define TMR_IE INTCONbits.TMR0IE
#define TMR_IP INTCON2bits.TMR0IP
#define TMR_ON T0CONbits.TMR0ON
#define TMR_CON T0CON
#define TMR_L TMR0L
#define TMR_H TMR0H
Timer0 (C ファイルから)
TMR_CON = 0b00000000 | CLOCK_DIVIDER_SETTING;
TMR_IP = 1;
TMR_IF = 0;
TMR_IE = 1;
TMR_ON = 1;
Timer0 (時間をインクリメントする場所)
if(TMR_IF)
{
printf("\r\n Passed here");
timer_counter_high++;
}
出力:ここに渡されます
Timer1スニペット コード (ヘッダー ファイルから)
#define TMR_IF PIR1bits.TMR1IF
#define TMR_IE PIE1bits.TMR1IE
#define TMR_IP IPR1bits.TMR1IP
#define TMR_ON T1CONbits.TMR1ON
#define TMR_CON T1CON
#define TMR_L TMR1L
#define TMR_H TMR1H
Timer1 (C ファイルから)
TMR_CON = 0b11101101 | CLOCK_DIVIDER_SETTING;
TMR_IP = 1;
TMR_IF = 0;
TMR_IE = 1;
TMR_ON = 1;
Timer1 (時間をインクリメントする場所)
if(TMR_IF)
{
printf("\r\n Passed here");
timer_counter_high++;
}
else
{
printf("\r\n Did not come through");
}
出力:通らなかった
編集: 要求に応じて CLOCK_DIVIDER_SETTING コードを追加しました。これは timer0 と timer1 に使用されています。
#elif(CLOCK_FREQ <= 8000000)
#define CLOCK_DIVIDER 32
#define CLOCK_DIVIDER_SETTING 0x04
#define SYMBOL_TO_TICK_RATE 8000000
デバイスをスリープ モードにして、その状態で timer1 をテストしていません。まず、run モードで timer1 がカウントアップしない理由を突き止めなければなりません。私の問題に関連するヘルプやアイデアをいただければ幸いです。ありがとうございます。
編集 2:回答してもらいたい質問
Q1 : Timer1 は、timer0 と同じように内部オシレータで引き続き使用できますか?
Q2 : T1CON の正しい CLOCK_DIVIDER_SETTING をどのように計算しますか? (T1SYNC とプリスケーラが設定されている場合、必要ですか?)