/******************************************** * C言語プログラム例 * File Name : USCounter.c * 周波数カウンタ * CCP1とTimer1で10Hzの定周期生成 * Timer0で測定パルスカウント ********************************************/ // ヘッダファイルインクルード #include <12f683.h> // コンフィギュレーション設定 #fuses EC_IO, NOWDT, PUT, NOPROTECT, NOMCLR // 外部クロック12.8MHz #use delay(CLOCK = 12800000) #use RS232(BAUD=9600, XMIT=PIN_A4, RCV=PIN_A3) // Define Address #bit T1Start = 0x10.0 #bit T0IF = 0x0b.2 int EndFlag; int Sec, i; long CounterHigh; int32 Freq; // CCP1割り込み処理 100msec周期 #INT_CCP1 void isr(void){ Sec--; // Wait 1sec if(Sec == 0){ // Just 1sec? output_low(PIN_A2); // Stop Timer0 T1Start = 0; // Stop Timer1 EndFlag = 1; } } // メインプログラム void main(){ output_high(PIN_A0); // LED Off output_high(PIN_A1); // タイマ0初期設定 外部クロック 1/1 setup_timer_0(RTCC_EXT_L_TO_H | RTCC_DIV_8); set_timer0(0); // タイマ1初期設定 内部クロック、プリスケーラ1/8 setup_timer_1(T1_INTERNAL | T1_DIV_BY_8); T1Start = 0; set_timer1(0); /// CCP1初期設定 100msec setup_ccp1(CCP_COMPARE_RESET_TIMER); CCP_1 = 40000; enable_interrupts(INT_CCP1); enable_interrupts(GLOBAL); // メインループ while(1) { output_toggle(PIN_A1); // Red LED toggle // High Freq or Low? if(input(PIN_A0)) setup_timer_0(RTCC_EXT_L_TO_H | RTCC_DIV_1); else setup_timer_0(RTCC_EXT_L_TO_H | RTCC_DIV_8); EndFlag = 0; // Reset all data CounterHigh = 0; set_timer0(0); T0IF = 0; Sec = 10; // set 1sec set_timer1(0); T1Start = 1; // Start Timer1 delay_cycles(66); // Delay count start input(PIN_A2); // Start Timer0 /// 計測完了待ち while(!EndFlag ){ if(T0IF) { // Check Timer0 Overflow CounterHigh++; // Count up High Digit T0IF = 0; // Reset overflow flag } } // Output Frequency putc(0x1C); // LCD claer delay_ms(5); if(input(PIN_A0)) Freq =(int32)CounterHigh * 256 + (int32)get_timer0(); else Freq =(int32)CounterHigh * 2048 + (int32)get_timer0()*8; printf("Freq= %8.0wHz\r\n", Freq); putc(0x1E); // LCD 2line if(input(PIN_A0)) printf("Max Freq 2.5MHz\r\n"); else printf("Max Freq 20MHz\r\n"); } }