大家好.我这里想用s12dp256测发动机的转速,使用外部16MHz的晶振..用的是输入捕捉功能.想测量一下两个下降沿的时间间隔.我这里把A口与通道0相接,用A口发送高低电平的脉冲,当通道0捕捉到电平变化后进入中断,这个时候中断里的dic就是2次下降沿的时间间隔吧...关键点是::我想问一下.这个时间间隔长度具体到咱们的分秒上怎么算出来呢?..比如我测到dic=42那我怎么能知道A口脉冲下降沿的频率呢? 具体dic记一个数是多长时间呢? 问题比较多哈.谢谢大家了.希望版主能帮我说一下. /*ECT应用举例2-使用输入捕捉功能对脉冲进行计数 2009年2月 */ /*本例利用输入捕捉0通道(PT0在管脚9)对外来方波信号进行捕捉,采用中断方式. 中断发生后,读取捕捉后的计数值,并用LED灯指示中断成功. 通道0设置为输入捕捉,采用双沿触发,IC0开中断,可以进入终端服务程序.通道0接受外来方波信号 */ #include <hidef.h> /* common defines and macros */ #include <mc9s12dp256.h> /* derivative information */ #pragma LINK_INFO DERIVATIVE "mc9s12dp256b"
unsigned char ic4,dic4,ic40;
void ic_init (void) //输入捕捉初始化函数 { TSCR1=0x90; //主定时器使能 TSCR2=0x07; //分频因子为128 ICSYS=0x02; //IC缓冲使能 TIOS=0x00; //通道设置为输入捕捉 TCTL4=0x02; //采用下降沿触发 TIE=0x01; //通道0开中断 } void delayms(int ms) { int ii,jj; if (ms<1) ms=1; for(ii=0;ii<ms;ii++) for(jj=0;jj<1335;jj++); } void main(void) { EnableInterrupts; ic_init(); DDRA=0xff; //设置PORTA的方向寄存器,为输出 PORTA=0x00; //PORTA的输出初始化为低电平 DDRB=0xff; //PORTB设置为LED灯的控制信号 PORTB=0xff; delayms(2000); //LED灯全亮 for(;;) {
PORTA=0x00; //循环中设置为高电平 delayms(100);
PORTA=0xff; //循环中设置为低电平,产生一个方波 delayms(100);
}
}
#pragma CODE_SEG NON_BANKED void interrupt 8 ic0_int(void) //中断服务程序 { TFLG1_C0F=1; //中断标志清除 ic4=TC0; //通过读TC0寄存器来相应中断, dic4=ic4-ic40; ic40=ic4; //得到脉冲宽度不需要考虑溢出 PORTB=0x55; //用LED灯来指示已经进入了中断 }
|