搜索
bottom↓
回复: 17

求教:多延时的单片机系统大家都是如何实现的?

[复制链接]

出0入0汤圆

发表于 2014-6-12 08:26:03 | 显示全部楼层 |阅读模式
经常遇到一些小的单片机系统,比如家电,特点就是资源不够移植操作系统(大都是8位16位),操作上有很多的程序步骤,基本上每个步骤都需要延时(比如500ms,10s,5min),不知道这样的系统大家都是如何实现的?
我自己觉得状态机必须是要用的,可是就不知道延时这个怎么处理了,希望能向大家学习一下。

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出20入186汤圆

发表于 2014-6-12 08:38:38 | 显示全部楼层
定时器中断啊,

出0入0汤圆

发表于 2014-6-12 08:44:44 | 显示全部楼层
本帖最后由 yjbin 于 2014-6-12 10:05 编辑

做个时间基准,然后各需所取。
我一般用选择语句。

如:
    switch(KeyTask1)
         {
          case 0:   
               FAN1=ON;
           FAN2=OFF;
               KeyTime1=speed1;
               KeyTask1=1;
             break;   
          case 1:   
          KeyTime1--;   
                 if(KeyTime1==0) KeyTask1=2;
        break;         
                case 2:   
                  FAN1=OFF;
                  FAN2=OFF;
                  KeyTime1=speed2;
               KeyTask1=3;
                  break;
          case 3:   
                KeyTime1--;   
                           if(KeyTime1==0) KeyTask1=4;
                       break;                 
          case 4:   
                  FAN1=OFF;
                  FAN2=ON;
                  KeyTime1=speed3;
                        KeyTask1=5;
                  break;
          case 5:   
                KeyTime1--;   
                        if(KeyTime1==0) KeyTask1=0;
                           break;  
                  default:
                       break;
    }
speed1、2、3、4是不同的延时时间。

出0入0汤圆

发表于 2014-6-12 08:45:20 | 显示全部楼层
资源够的话可用一个定时器做10ms 或者20ms之类的时期基,然后在上面做你要的时间

出0入0汤圆

 楼主| 发表于 2014-6-12 09:02:34 | 显示全部楼层
yjbin 发表于 2014-6-12 08:44
做个时间基准,然后各需所取。
我一般用选择语句。

我也写过这样的程序,但是总感觉这样不是很完美。这样做就是把每个步骤点和延时过程都当做是一个小的状态,如果步骤比较多,每个步骤都有延时,是不是很繁琐?

出0入0汤圆

发表于 2014-6-12 09:18:19 | 显示全部楼层
你有什么好办法了吗?我觉得还是不错的。也属于状态机吧。

出0入0汤圆

发表于 2014-6-12 09:23:06 | 显示全部楼层
资源够的话,还是占用一个定时器吧,有时基会比较方便的

出0入0汤圆

发表于 2014-6-12 09:31:39 | 显示全部楼层
我一般用CPU分时处理。

出0入0汤圆

发表于 2014-6-12 09:34:03 | 显示全部楼层
runningwater 发表于 2014-6-12 09:02
我也写过这样的程序,但是总感觉这样不是很完美。这样做就是把每个步骤点和延时过程都当做是一个小的状态 ...

不死機、良率高、易維護纔是完美。
如果你千辛萬苦移植了一箇系統,最後快量產時,纔發現一樣有你說的延遲,還不如你自己做的呢,那你怎麼辦?

出0入0汤圆

发表于 2014-6-12 09:34:23 | 显示全部楼层
这么多定时,实际上只需要一个基本定时器,每个任务的定时就是安排一个定时变量,每个基本定时到来,定时变量--,定时变量值减为0,表示该任务时间到。

出0入0汤圆

 楼主| 发表于 2014-6-12 09:34:36 | 显示全部楼层
leon...... 发表于 2014-6-12 09:31
我一般用CPU分时处理。

能说一下具体是如何实现的吗?

出0入0汤圆

发表于 2014-6-12 09:37:03 | 显示全部楼层
runningwater 发表于 2014-6-12 09:34
能说一下具体是如何实现的吗?

我以前发过一个贴子,我找一找

出0入264汤圆

发表于 2014-6-12 09:47:06 | 显示全部楼层
只需要用软定时器

if(XXXX)
{
     SetTimer(TIMER_ID_1,  TIME_10MS);
}

if(CheckTimer(TIMER_ID_1) == TIMEOUT)
{
    //do something here
}

出0入0汤圆

发表于 2014-6-12 09:51:30 来自手机 | 显示全部楼层
时间触发的调度器,只需一个硬件定时器即可。

出0入0汤圆

发表于 2014-6-12 09:52:00 | 显示全部楼层
runningwater 发表于 2014-6-12 09:34
能说一下具体是如何实现的吗?

你可以看一下我以前发的这个贴子
http://www.amobbs.com/thread-4429159-1-1.html

出0入0汤圆

发表于 2014-6-12 10:14:46 | 显示全部楼层
//Timer4中断,1MS
void __T4_ISR _T4Interrupt(void)
{
    timer4.tick_1MS++;                                       
    timer4.flagINT = 1;                        
    IFS1bits.T4IF = 0;                         
}

//任务运行的时钟节拍
void TaskClock(void)
{
        timer4.flag1MS = 0;
        timer4.flag5MS = 0;
        timer4.flag10MS = 0;
        timer4.flag20MS = 0;
        timer4.flag50MS = 0;
        timer4.flag100MS = 0;
        timer4.flag125MS = 0;
        timer4.flag500MS = 0;
       
        if(timer4.flagINT == 1)                        //1MS时间到
        {
                timer4.flagINT = 0;
               
                timer4.flag1MS = 1;
               
                timer4.count5MS++;
                timer4.count10MS++;
                timer4.count20MS++;
                timer4.count50MS++;
                timer4.count100MS++;
                timer4.count125MS++;
                timer4.count500MS++;
               
                if(timer4.count5MS == 5)        //5MS时间到
                {
                        timer4.count5MS = 0;
                        timer4.flag5MS = 1;
                }
               
                if(timer4.count10MS == 10)        //10MS时间到
                {
                        timer4.count10MS = 0;
                        timer4.flag10MS = 1;
                }
               
                if(timer4.count20MS == 20)        //20MS时间到
                {
                        timer4.count20MS = 0;
                        timer4.flag20MS = 1;
                }
               
                if(timer4.count50MS == 50)        //50MS时间到
                {
                        timer4.count50MS = 0;
                        timer4.flag50MS = 1;
                }
               
                if(timer4.count100MS == 100)//100MS时间到
                {
                        timer4.count100MS = 0;
                        timer4.flag100MS = 1;
                }

                if(timer4.count125MS == 125)//125MS时间到
                {
                        timer4.count125MS = 0;
                        timer4.flag125MS = 1;
                }
               
                if(timer4.count500MS == 500)//100MS时间到
                {
                        timer4.count500MS = 0;
                        timer4.flag500MS = 1;
                }
        }       
}

出0入0汤圆

 楼主| 发表于 2014-6-12 10:45:51 | 显示全部楼层
cheungman 发表于 2014-6-12 10:14
//Timer4中断,1MS
void __T4_ISR _T4Interrupt(void)
{

这个只是一些时标,具体的时标的在程序中的延时是如何使用的?

出0入0汤圆

发表于 2014-6-12 10:49:07 | 显示全部楼层
建议看看《时间触发嵌入式系统》这本书,本坛貌似就有,你找找,里面使用的一个合作式调度器,所有任务仅使用一个定时器完成。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 03:28

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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