ECT学习总结

ECT的核心是一个16位自由运行计数器(TCNT),所有输入捕捉和输出比较功能的计时信息都来源于TCNT,当定时器系统启用时,通过设置TSCR1的TEN位,计数器从$0000开始,每经过一个模块时钟加1,直到加到$FFFF,然后自动溢出为$0000并继续计数.16位自由记数器的当前值保存在两个8位寄存器中,高的存在TCNTH,低的存在TCNTL中.综合这两个寄存器就形成TCNT.定义TCNT的 话 ,要定义为word型。分频系数在TSCR2的低三位。TCNT是一个递增的计数器.

TCn寄存器是一个数据寄存器,用来存放数据的。如果工作在IC模式下,那么TCn寄存器用于锁存出现捕捉事件时的TCNT的值,读取后以判断出有效事件是在什么时候发生的;如果工作在OC模式下,当TCNT的值和写入TCn寄存器的值相等时,就触发一次中断

【总结】总之,TCn寄存器在IC模式下是用来READ的,在OC模式下是用来WRITE的。

输入捕捉步骤
初始化函数
TIOS---选择工作方式为IC
TCTLx---设置对应位输入捕捉的方式(x=3、4,高位是3,低位是4)
TSCRx---控制寄存器设置,包括工作使能、确定工作方式(x=1)、中断允许、预分频
TIE---中断使能
中断函数
清除标志位---TFLG1
处理函数
【功能】电机模块中用作测速,摄像头模块中判断行场信号
4、输出比较步骤
初始化函数
TIOS---选择工作方式为OC
TCx---通道x的OC寄存器赋初值,经过N秒后进入第一次中断
TCTLx---设置对应位输入捕捉的方式(x=1、2,高四位是1,低四位是2)
TSCRx---控制寄存器设置,包括工作使能、确定工作方式(x=1)、中断允许、预分频
TIE---中断使能
中断函数
清除标志位---TFLG1
重新赋初值TCx
【总结】这里说明几点个人调试经验总结:
在初始化函数中,给TCn赋的初值是来确定单片机经过多长时间进入第一次中断,进入中断以后,这段话就失去了它的作用。
经过PLL倍频到总线时钟后,再分频到ECT模块时钟,比如总线频率为24M,分频系数为64,那么ECT模块的时钟周期为2.67us,如果要计时1000us的话,那么TCNT要计数375个数,所以TCn的值要始终比TCNT大375,这个可以在中断里面处理。同理,要计时10ms,那么TCNT要计数3750次,要计时100ms,那么TCNT要计数37500次。如果user需要其他的定时,可以自己根据时钟来计算。

附:
/---------------------------------------------------------------------------//
//功能说明:利用PT0的输出比较功能,定时进入中断
// 利用PORTB显示定时的时间
//---------------------------------------------------------------------------//
#include<hidef.h> /*commondefinesandmacros*/
#include<mc9s12dg128.h> /*derivativeinformation */
#pragmaLINK_INFODERIVATIVE"mc9s12dg128b"
//利用定时器输出比较功能产生定时中断
//----------------------变量定义----------------------//
staticunsignedint waittime=0;
//---------------------时钟初始化-------------------//
voidPLL_Init(void) //PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)
{ //锁相环时钟=2*16*(2+1)/(1+1)=48MHz
REFDV=1; //总线时钟=48/2=24MHz
SYNR=2;
while(!(CRGFLG&0x08));
CLKSEL=0x80;
}
//--------------------定时器初始化------------------//
voidECT0_Init(void)
{
TIOS=0x01; //定时器通道0设置为输出比较
TC0=0x00ee; //赋初值,当TCNT从0计数到此值时第一次进入中断
TCTL2=0x02; //其他七路与定时器断开 执行的动作时:0通道输出清零
TSCR2=0x86 //溢出中断禁止 24M/64=2.67微秒,计一个数用2.67微秒
TSCR1=0x80; //使能定时器
TIE=0x01; //通道0输出比较中断允许
}
//-----------------------主函数------------------------//
voidmain(void)
{
PLL_Init();
ECT0_Init();

DisableInterrupts;
DDRB=0xff;
PORTB=0x00;
for(;;)
{
EnableInterrupts;
}
}
//-----------------------中断函数处理-------------------//
#pragmaCODE_SEGNON_BANKED
voidinterrupt 8Timer0_ISR(void)//8 为定时器通道0的中断标号
{
unsignedint m;
TFLG1_C0F=1;//清中断标志位
DisableInterrupts;
m=TCNT;
TC0=m+37500;//37500*2.67us=10ms定时时间
waittime++;
if(waittime>=255)
{
waittime=0;
}
PORTB=waittime;
}

posted @ 2012-11-03 23:09  丁洋  阅读(618)  评论(0编辑  收藏  举报