打印

请教一个延时的问题。。。。多谢!!!

[复制链接]
1895|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ky_21ic|  楼主 | 2008-11-10 16:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用单片机内部的定时器做中断延时(间隔是35.555ms,在用个计数),比如说延时隔一定的时间做开关,测试的时候用小时间延时,比如说延时3分钟都好用。实际上我得延时几个小时(计数很大,最大约100多万计数才能到时间),但在实际测试的时候,就不对了,又的时候延时20分钟就动作,,,怎么回事啊????
大侠指教一下!!!!!!!!!!多谢了。。。。

相关帖子

沙发
computer00| | 2008-11-10 16:40 | 只看该作者

计数器溢出了吧……

使用特权

评论回复
板凳
zhouss| | 2008-11-10 20:37 | 只看该作者

软件仿真走一下就知道,提高OSC的频率,

以前我做一个24小时的就这样做,好象可以把OSC提很高,我24小时延时好象只跑了几十秒....

使用特权

评论回复
地板
ayb_ice| | 2008-11-10 20:41 | 只看该作者

可以做到理论上没有误差

实际上一天误差可以控制在2秒内

使用特权

评论回复
5
耕在此行| | 2008-11-10 21:13 | 只看该作者

35.555ms中断一次

你的计数器是多少位的,是8位吗, 35.555ms * 255   = 9.066S
                  如果是16位, 35.555ms * 65535 = 2330S = 39MIN
你的程序是不是有问题?


                         

使用特权

评论回复
6
ky_21ic|  楼主 | 2008-11-11 14:08 | 只看该作者

问题

我用的是16位的定时器,另外定义一个long型的变量,35ms定时一到该变量就加1,大概加到100多万的时候就到了,,你楼上所说的计数器16位最大只能计数65535是什么意思啊???
我是另外定义的一个long型变量啊,,,和你说的计数器有什么关系啊???
忘多指教。。。

使用特权

评论回复
7
chen3bing| | 2008-11-11 16:50 | 只看该作者

re

16位数据最大可表示到65535.
用long型数据当然就可以超过这个范围了。

使用特权

评论回复
8
ky_21ic|  楼主 | 2008-11-12 08:36 | 只看该作者

问题

实际上我用long型变量做计数的时候就不对了啊,,,,,怎么解释呢?????具体意思就是6楼我说的那样的问题。。。
望多指教。。。。

使用特权

评论回复
9
原野之狼| | 2008-11-12 08:58 | 只看该作者

如果有实时时钟

那么可以用它作参考。

使用特权

评论回复
10
chen3bing| | 2008-11-12 10:29 | 只看该作者

用long应该没问题

会不会是你程序的问题?

使用特权

评论回复
11
耕在此行| | 2008-11-12 16:14 | 只看该作者

把你的程序发上来吧

把你的程序发上来吧,思路是没问题的,我原来用汇编也做过长时间计时,方法不会有问题.

使用特权

评论回复
12
icmap| | 2008-11-12 19:33 | 只看该作者

可能是访问多字节变量的问题

中断内和中断外如果都要对同一个多字节变量进行访问,要考虑当中断外访问该变量时被中断的问题。

使用特权

评论回复
13
ky_21ic|  楼主 | 2008-11-13 09:31 | 只看该作者

问题

回楼上,这种情况我已经考虑了,,不存在这样的问题,,,
现在的问题是:定时中断的计数器与我定义的long型变量有什么冲突吗???

使用特权

评论回复
14
李冬发| | 2008-11-13 09:36 | 只看该作者

先得问一下你的35.555ms是怎么来的?有必要取个这么怪的时间

使用特权

评论回复
15
hotyong| | 2008-11-13 09:51 | 只看该作者

11楼不是叫楼主贴个程序出来呀

楼主还怕泄密??一个破得不行的程序还怕泄密不成!!!

使用特权

评论回复
16
耕在此行| | 2008-11-13 17:30 | 只看该作者

就是啊

这么个简单的东东,也不用藏着嘛.

使用特权

评论回复
17
ky_21ic|  楼主 | 2008-11-14 12:26 | 只看该作者

这就是程序

void Timer0_ISR() interrupt 1  //16的定时器,初始值为00,所以延时为  35ms
{  
         EA=0;              //关中断
    TF0=0;             //清标志位
    TH0=0x00;
         TL0=0x00; 
    
 if(bitwait==0)            

   {  times++;

   if(times==(6-m1)*16875)     //35.5555ms*16875=10分钟。101250=60分                 钟.33750--20分钟
                               
  
        { sendbit=1;      //动作标志位 
          sendcoubit=0;   
          times=0;
          cou++;
         }          
                  
    }


  if(bitwait==1)             
  {
       hours++;      
             
       if(hours==1417500)         
         { 
                       
             bitwait=0;
              hours=0;   
             coubit=1;//另一个动作标志位       
         
              }
    }

     EA=1; 
}

使用特权

评论回复
18
耕在此行| | 2008-11-14 13:11 | 只看该作者

楼主

还是你自己看吧,这么个问题怎么会搞不定呢?
建议你定时不要定35mS,定个好整点数,如25mS.这样自己也好算点.
你如果想别人帮你看程序,那你得首先能让别人看明白.

使用特权

评论回复
19
5880527| | 2008-11-14 14:38 | 只看该作者

你在定时中断里放一标志位

在外面大循环里去判断此标志位,为1则进行加1及其他处理,标志位清零,否则跳过。中断占用的时间极其少,一般的主循环不会超过几十ms的,所以每一次标志位都能扫描到,哪怕丢个几次也没什么的,不用担心什么半个字的问题。还有,你定时器一直开着好了

使用特权

评论回复
20
李冬发| | 2008-11-17 12:56 | 只看该作者

35.5555ms是因为定时器是16位来的啊,倒塌!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

65

主题

211

帖子

1

粉丝