智能车制作
标题:
128精确定时1s
[打印本页]
作者:
mushangege
时间:
2009-2-17 13:40
标题:
128精确定时1s
我想用128的ECT模块做过1s计时,但不知该如何办。看了些帖子,也是没头绪。望指教!不胜感激
作者:
法布里加斯
时间:
2009-2-17 15:10
WJ_whut发过“定时和计数的几套方案”,很好,去看一下吧,用MDC和输出比较都可以
作者:
法布里加斯
时间:
2009-2-17 15:10
WJ_whut发过“定时和计数的几套方案”,很好,去看一下吧,用MDC和输出比较都可以
作者:
mushangege
时间:
2009-2-18 12:24
3#
法布里加斯[/
好的 谢谢
作者:
Michael_Fei
时间:
2009-3-19 18:48
延时模块:其中问号代表要填的数,要延时多少,到表格中去找数据,然后填上就OK!
切忌3条FOR语句不能颠倒顺序
void Delay()
{
unsigned char a,b,c;
for(a=0;a<?;a++)
for(b=0;b<?;b++)
for(c=0;c<?;c++);
}
数据表如下
/*****************************************************************/
延时时间 a的值 b的值 c的值 延时误差(us)
10us 1 1 1 -0.5
20us 1 1 8 0
30us 1 1 15 +0.5
40us 2 1 9 0
50us 1 1 28 0
60us 1 1 35 +0.5
70us 1 1 42 +1
80us 1 1 48 0
90us 1 1 55 +0.5
100us 1 1 61 -0.5
200us 1 1 128 0
300us 3 1 63 +1.5
400us 2 1 129 0
500us 5 1 63 +0.5
600us 6 1 63 0
700us 7 1 63 -0.5
800us 1 3 175 +0.5
900us 9 1 63 -1.5
1ms 1 3 219 -1.5
2ms 2 3 220 +3
3ms 3 3 220 +3
Xms X 3 220 +3
(X的范围为2到255)
基本上我们平时用到的延时都在这里了,每种延时的误差都很小,最大也不过3us,
有的甚至没有误差,已经很精确了,
如果想延时1秒钟,你可以连续调用延时250ms的程序4次,总共延时误差12us,
这样的误差已经不算误差了,用汇编语言编写还达不到这个程度。
转自wj的博客的,可以参考一下
作者:
mushangege
时间:
2009-3-20 20:14
呵呵 非常感谢!!
作者:
xiao19890501
时间:
2011-3-8 14:39
有没有 用ECT精确定时1ms的程序范例呀?新手求救!!!!!
作者:
范莹
时间:
2011-3-8 20:24
下面是我个人写的一个用ECT的输出比较实现一秒流水灯的简单程序
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
#include <mc9s12dg128.h> /* derivative information */
//#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"
char i=0xfe;
void PLLinit()
{
CLKSEL=0X00; //disengage PLL to system
PLLCTL_PLLON=1; //turn on PLL
SYNR=3;
REFDV=1; //pllclock=2*osc*(1+SYNR)/(1+REFDV)=64MHz;
_asm(nop); //BUS CLOCK=32M
_asm(nop);
while(!(CRGFLG_LOCK==1)); //when pll is steady ,then use it;
CLKSEL_PLLSEL =1; //engage PLL to system;
}
void ECT0init()
{
TIOS=0x01; //设定通道0为输出比较
TC0=0x00ee;//当TCNT 从0 计数到此值时第一次进入中断,间隔238*2微秒=476微秒
TCTL2=0x02;//使通道0输出低电平
TSCR2=0x06;//溢出中断禁止,实现64分频,加一次或者说计1个数是2微秒
TSCR1=0x80; //使能定时器
}
void main(void)
{
/* put your own code here */
PLLinit();
ECT0init();
DisableInterruts;
DDRB=0xff;
PORTB=0xff;//灯全灭
for(;;)
{
EnableInterrupts;
_FEED_COP(); /* feeds the dog */
} /* loop forever */
/* please make sure that you never leave main */
}
#pragma CODE_SEG NON_BANKED
void interrupt 8 Timer0_ISR(void) //8 为定时器通道0 的中断标号
{
unsigned int m,a;
a++;
m=TCNT;
TFLG1_C0F=1;//中断标志位清零
TC0=m+5000;//实现一秒定时
if(a==100)
{
a=0;
PORTB=i;
i<<=1;
i|=1;
}
}
作者:
范莹
时间:
2011-3-8 20:25
ECT最重要的还是个寄存器的控制吧 看看资料就行了
欢迎光临 智能车制作 (http://111.231.132.190/)
Powered by Discuz! X3.2