智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 4415|回复: 8
打印 上一主题 下一主题

[编程类] 128精确定时1s

[复制链接]

0

主题

16

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
386
威望
266
贡献
72
兑换币
50
注册时间
2009-2-16
在线时间
24 小时
跳转到指定楼层
1#
发表于 2009-2-17 13:40:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我想用128的ECT模块做过1s计时,但不知该如何办。看了些帖子,也是没头绪。望指教!不胜感激

0

主题

47

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
293
威望
221
贡献
22
兑换币
0
注册时间
2008-12-6
在线时间
25 小时
2#
发表于 2009-2-17 15:10:38 | 只看该作者
WJ_whut发过“定时和计数的几套方案”,很好,去看一下吧,用MDC和输出比较都可以
回复 支持 反对

使用道具 举报

0

主题

47

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
293
威望
221
贡献
22
兑换币
0
注册时间
2008-12-6
在线时间
25 小时
3#
发表于 2009-2-17 15:10:51 | 只看该作者
WJ_whut发过“定时和计数的几套方案”,很好,去看一下吧,用MDC和输出比较都可以
回复 支持 反对

使用道具 举报

0

主题

16

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
386
威望
266
贡献
72
兑换币
50
注册时间
2009-2-16
在线时间
24 小时
4#
 楼主| 发表于 2009-2-18 12:24:57 | 只看该作者
3# 法布里加斯[/
好的  谢谢
回复 支持 反对

使用道具 举报

0

主题

165

帖子

0

精华

高级会员

Rank: 4

积分
597
QQ
威望
438
贡献
23
兑换币
0
注册时间
2008-5-11
在线时间
68 小时
5#
发表于 2009-3-19 18:48:59 | 只看该作者
延时模块:其中问号代表要填的数,要延时多少,到表格中去找数据,然后填上就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的博客的,可以参考一下
回复 支持 反对

使用道具 举报

0

主题

16

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
386
威望
266
贡献
72
兑换币
50
注册时间
2009-2-16
在线时间
24 小时
6#
 楼主| 发表于 2009-3-20 20:14:16 | 只看该作者
呵呵  非常感谢!!
回复 支持 反对

使用道具 举报

7

主题

72

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
403
QQ
威望
304
贡献
37
兑换币
0
注册时间
2011-3-5
在线时间
31 小时
7#
发表于 2011-3-8 14:39:49 | 只看该作者
有没有 用ECT精确定时1ms的程序范例呀?新手求救!!!!!
回复 支持 反对

使用道具 举报

0

主题

111

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
439
威望
281
贡献
112
兑换币
0
注册时间
2010-10-23
在线时间
23 小时
8#
发表于 2011-3-8 20:24:04 | 只看该作者
下面是我个人写的一个用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;
    }
  
}
回复 支持 反对

使用道具 举报

0

主题

111

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
439
威望
281
贡献
112
兑换币
0
注册时间
2010-10-23
在线时间
23 小时
9#
发表于 2011-3-8 20:25:00 | 只看该作者
ECT最重要的还是个寄存器的控制吧  看看资料就行了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-9-21 15:49 , Processed in 0.048809 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表