周波数の測定
#include <16f648a.h> #fuses INTRC_IO,NOWDT,NOLVP,NOMCLR//内部クロック、WDT,LVPなし #use delay(CLOCK=4000000) //クロック4MHz #byte port_a=5 //Aポート番地 #byte port_b=6 //Bポート番地 //b6 計測信号 //b0-b5,b7:7素子接続 //A2,A1,A0:3,2,1桁点灯 //タイマー0割り込み:0.256mS //nm:測定回数 //ns:休止回数 int mode; //タイマー0をプリスケーラ、1/64で利用 long nm=61;//1秒 ,1000/(256*64) long ns=76;//適当な表示間隔 long ins,inm; int v3,v2,v1; int digit; long lcount; long valt; //int segment_data[]={0x7E,0x0C,0xB6,0x9E,0xCC,0xDA,0xFA,0xE,0xFE,0xCE}; //intsegment_data[]={0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x67}; //b5-b0 f:a,b7:g を利用 int segment_data[]={0x3f,0x06,0x9B,0x8F,0xA6,0xAAD,0xBD,0x07,0xBF,0xA7}; #int_rtcc void rtcc_isr(){//タイマー0割り込み処理 if(mode == 0){//display ins--; if(ins == 0){ inm = nm; mode = 1; set_timer1(0); output_bit(PIN_A3,0); } } else {//count inm--; if(inm == 0){ //getcount lcount=get_timer1(); v3 = lcount/100;//3桁目 valt = lcount % 100; v2 = valt / 10;//2桁目 v1 = valt % 10;//1桁目 mode=0; output_bit(PIN_A3,1); ins=ns; } } } void main(){ set_tris_a(0xf0);//Aポート4bit出力(桁指定) set_tris_b(0x40);//Bポート下位7bit出力(7素子) mode = 1; inm = nm; setup_counters(RTCC_INTERNAL , RTCC_DIV_64);//タイマー0設定 setup_timer_1(T1_EXTERNAL_SYNC | T1_DIV_BY_1);//タイマー1設定 enable_interrupts(INT_TIMER0);//タイマー0割り込み許可 enable_interrupts(GLOBAL);//割り込み機能許可 lcount = 0;//表示する値 v3=v2=v1=0; digit = 1;//桁数 while(1){ if(digit== 3){//第3桁の表示 port_b = segment_data[v3]; output_bit(PIN_A2,1);//3桁表示開始 delay_ms (5); //表示期間(ミリ秒) output_bit(PIN_A2,0);//表示を消す delay_us(5); } if(digit== 2){ port_b = segment_data[v2]; output_bit(PIN_A1,1); delay_ms (5); output_bit(PIN_A1,0); delay_us(5); } if(digit == 1){ port_b = segment_data[v1]; output_bit(PIN_A0,1); delay_ms (5); output_bit(PIN_A0,0); delay_us(5); } digit ++;//表示桁を変更 if(digit ==4 ) digit=1; } }