PIC24FJ64GB002に以下のようなプログラムを書き込んで6ピンにつないだLEDの点滅する間隔を考える。
Configuration Bitsは長くなるので関係あると思われる1行だけを書いた。
回路図は前回の「PIC24FJ64GB002 簡単なコードを」にあるのと同じだ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#pragma config FNOSC = FRCDIV//Initial Oscillator Select (Fast RC Oscillator with Postscaler (FRCDIV)) volatile int flag = 0; void __attribute__((__interrupt__,__no_auto_psv__)) _T1Interrupt(void){ if ( flag == 0 ){ LATBbits.LATB2 = 1; } else { LATBbits.LATB2 = 0; } flag = flag ^ 1; IFS0bits.T1IF = 0; } int main(){ TMR1 = 0; PR1 = 0x7fff; TRISBbits.TRISB2 = 0; PORTBbits.RB2 =0; T1CONbits.TCS = 0;//Timer1 Clock Source is Internal clock T1CONbits.TCKPS = 0b11;//Timer1 Input Clock Prescale is 1:256 T1CONbits.TON = 1;//Starts 16-bit Timer1 IFS0bits.T1IF = 0; IEC0bits.T1IE = 1; while(1){ } } |
まず前提だが、データシートには以下のようにある。
8ビットのPICでのおなじみは FOSC/4 だが、ここでは FOSC/2 だ。
実は、このせいで計算結果と測定結果が合わなくて、だいぶ長いこと悩んだ。
初期設定では RCDIV = 0b001 のようなので、明示的に設定していなければクロックは 4MHz のはずだ。
PR1 = 0x7FFF としているので、32768カウントすると割り込みが発生する。
プリスケーラは 1:256 と設定してある。
以上から、4000000 / 2 / 32768 / 256 = 0.238 となって、この逆数である、4.194秒毎に割り込みルーチンが呼ばれることになる。
したがって、LEDが点灯して消えて次に点灯するまでの時間は約8.39秒となる。
実測すると、8.37秒だったので、以上の理解でよろしいんではないかと…。