智能车制作

标题: 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