中级会员
- 积分
- 229
- 威望
- 157
- 贡献
- 50
- 兑换币
- 18
- 注册时间
- 2012-4-24
- 在线时间
- 11 小时
- 毕业学校
- 杭州电子科技大学
|
4#
楼主 |
发表于 2012-12-11 15:10:03
|
只看该作者
happyzn75 发表于 2012-12-10 12:40
我觉得可以,而且16位计数器通过分频计数时间可以加长,即使不在一个周期也没问题,但是一定要分清楚什么时 ...
非常感谢,你说的很对.
我的问题目前已经解决,现在计时依靠PIT0计时器产生0.01ms的定时间隔,每一个周期,变量A++,A到最大值65535,变量B++,这样就能满足长时间的计时了.程序如下.
#include <string.h>
#include <stdio.h>
#include <hidef.h> /* common defines and macros */
#include <MC9S12XS128.h> /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12xs128"
//==================================================
//定时中断,实现计时
//==================================================
//#define PITTIME 60//设定为 50MS定时
unsigned int vTmpPIT=0,vTmpPIT2=0;
unsigned int flag0=0,flag1=0;
double timer1=0.0,timer2=0,timer3=0,speed1=0,distance1=0.05;
void pllclk(void)//24MHz,外部时钟为 16MHz
{
CLKSEL=0X00;
PLLCTL=0xe1;
SYNR=2;//PLLCLK=2*OSCCLK*(SYNR +1)/(REFDV +1)
REFDV=1;
PLLCTL=0X60;
asm NOP;
asm NOP;
asm NOP;
while((CRGFLG&0X08)==0);//时钟校正同步
CLKSEL=0X80;
}
//****T0,T4输入捕捉通道初始化****//
void ECT0_INIT()
{
TSCR1=0X80; //开启总定时器中断 基本不变
TSCR2=0X00; //关闭溢出中断,0分频
TIOS_IOS0=0; //定通道0为输入捕捉,1为输出比较IOC0
TIOS_IOS5=0; //定通道4为输入捕捉,1为输出比较IOC0
//TCTL4=0X01; //上升沿捕捉 0x02为下降沿捕捉
TCTL3=0X02; //0101上升沿捕捉 0x02为下降沿捕捉
TCTL4=0X01; //上升沿捕捉 0x02为下降沿捕捉
TIE_C0I=1; //通道0中断使能
TIE_C4I=1; //通道4中断使能
TFLG1_C0F=1; //标志位清零
TFLG1_C4F=1; //标志位清零
}
//****T0中断服务程序****//
#pragma CODE_SEG __NEAR_SEG NON_BANKED //分配内存空间
void interrupt 8 timer_onput0() //输入捕捉通道0的中断向量为8
{
flag0=flag0+1; //中断次数标志位
if(flag0 == 1)
{
TFLG1_C0F=1; //标志位清零
//TIE_C0I=0; // 禁止通道0中断使能,使中断只响应一次
asm sei; //关总中断
PTM_PTM0=~PTM_PTM0;
PITCFLMT_PITE=1; //开启PIT模块
PITINTE_PINTE0=1;
asm cli; //开总中断
}else if(flag0 == 2)
{
PTM_PTM0=~PTM_PTM0;
}
}
//****T4中断服务程序****//
#pragma CODE_SEG __NEAR_SEG NON_BANKED //分配内存空间
void interrupt 12 timer_onput4() //输入捕捉通道0的中断向量为8
{
flag1++; //中断次数标志位
if(flag1 == 1 && flag0 == 1)
{
timer1=(double) vTmpPIT;
timer2=(double) vTmpPIT2;
timer3=timer2*0.65535+timer1*0.00001;//时间计算单位秒s
speed1=timer3/distance1;
TFLG1_C4F=1; //标志位清零
//TIE_C4I=0; // 禁止通道0中断使能,使中断只响应一次
asm sei; //关总中断
PTM_PTM0=~PTM_PTM0;
//PITCFLMT_PITE=0; //关闭PIT模块
//PITINTE_PINTE0=1;
asm cli; //开总中断
}
/*else
{
timer1=(double) vTmpPIT;
timer2=(double) vTmpPIT2;
timer3=timer2*0.65535+timer1*0.00001;//时间计算单位秒s
TFLG1_C0F=1; //标志位清零
//TIE_C0I=0; // 禁止通道0中断使能,使中断只响应一次
asm sei; //关总中断
PTM_PTM0=~PTM_PTM0;
PITCFLMT_PITE=0; //关闭PIT模块
PITINTE_PINTE0=1;
asm cli; //开总中断
}
*/
}
//****定时中断初始化函数 0.01MS定时中断设置****//
void initPIT(void)
{
PITCFLMT_PITE=0;//定时中断通道0关
PITCE_PCE0=1;//定时器通道 0使能
//PITMTLD0=40-1;//8位定时器初值设定。40*60=2400分频,在 24MHzBusClock下,为 0.01MHz。定时长度即 100us=0.1ms
PITMTLD0=4-1;//8位定时器初值设定。4*60=240分频,在 24MHzBusClock下,为 0.1MHz。定时长度即 10us=0.01ms
PITLD0=60-1;//16位定时器初值设定。PITTIME*0.01MS
PITINTE_PINTE0=1;//定时器中断通道 0中断使能
//PITCFLMT_PITE=1;//定时器通道0使能
}
//****PIT0 中断服务程序****//
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 66 PIT0(void)
{
vTmpPIT++;
if(vTmpPIT==65535)
{
vTmpPIT2++;
PTM_PTM0=~PTM_PTM0;
}
PITTF_PTF0=1;//清中断标志位
}
//****IO口初始化,M口为输出 ****//
void initIOBoutput(void)
{
DDRM=0XFF;
PTM=0XFF;
}
//****主函数 ****//
void main(void)
{
ECT0_INIT();
pllclk();
initIOBoutput();
initPIT();
PTM=0B11111110;
EnableInterrupts;
for(;;){}
}
|
|