打印
[C语言]

说说单片机定时器用法

[复制链接]
3266|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
南宫云明|  楼主 | 2014-8-3 08:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 南宫云明 于 2014-8-3 08:51 编辑

我不知道大家的程序框架是怎么样,定时器是拿来干什么用的。我一毕业就进入了一家小公司,没师傅带,只有自己摸索,摸索了两年了,现在程序普通定时器框架基本上都是这样子:
定时器中断函数()
{
   变量定义;
   n多的函数调用;
   清除中断标志;
}
我现在基本上所有的程序代码都放在定时器中断中处理,不知道这样的程序框架稳定不,然后在主函数main()中只有简单的如下代码:
void main()
{
  单片机初始化;
  while(1)
  {
    喂看门狗函数();
    附带一些操作flash的函数(因为一般的操作flash时间都比较长,如果放在中断中处理可能会引起一些不可预知的错误)
  }
}
我的就是这样,不知道各位前辈们的框架是怎样的,或者有什么更好的框架或者建议,谢谢!。。。没人带,没人说,久了以后难免会对自己的代码产生一些疑问。

@NE5532 ,@江枫渔火 @程序匠人 @ayb_ice   

相关帖子

沙发
ayb_ice| | 2014-8-3 09:26 | 只看该作者
别放在中断中处理
因为很多MCU其实不支持中断嵌套,这样会导致其它中断严重延迟响应

稍加处理,放在主循环中,效果一样,但其它中断可以快速响应

使用特权

评论回复
板凳
南宫云明|  楼主 | 2014-8-3 09:38 | 只看该作者
ayb_ice 发表于 2014-8-3 09:26
别放在中断中处理
因为很多MCU其实不支持中断嵌套,这样会导致其它中断严重延迟响应

比如这样:

定时器中断函数()
{
    变量(静态变量)定义;
    定时计数;
    if(定时时间到)
    {
       定时标志位置1;
    }
    清除中断标志;
}


然后main()函数:
void main()
{
   。。。略;
   while(1)
   {
      if(标志位为1)
       {
          清除标志位;
           处理定时任务;
       }
   }
}



可否?

使用特权

评论回复
地板
排山倒海| | 2014-8-3 09:38 | 只看该作者
本帖最后由 排山倒海 于 2014-8-3 09:47 编辑

我很多项目需要驱动“无源”蜂鸣器、检测过零信号、驱动可控硅等需要用定时中断100-200uS甚至需要50-80uS定时中断,所以尽可能在中断里处理紧急的事情,在主函数中处理按键扫描之类事情。

使用特权

评论回复
5
南宫云明|  楼主 | 2014-8-3 09:45 | 只看该作者
排山倒海 发表于 2014-8-3 09:38
我很多项目需要驱动蜂鸣器、检测过零信号、驱动可控硅等需要用定时中断100-200uS甚至需要50-80uS定时中断, ...

我以前做过红外编码的学习一个项目,它是需要用到定时器捕获功能的,捕获上升沿下降沿,捕获之后肯定要计算两个捕获之间的时间差,算出时间差后还要做一些其他处理比如编码的有效性判断,编码是否是正确编码等,这些难道也要放到主函数里去吗?

还是说根据时间情况判断,如果可以的话也可以放在中断中进行?

使用特权

评论回复
6
排山倒海| | 2014-8-3 09:46 | 只看该作者
我的一个程序是有红外遥控接收解码、动态数码管驱动、串口发送和接收在中断里处理,主函数如下:
void    main(void)
{
    initial();
    power_on_delay_100mS();
   
    //============================================
/*       
void        LB_main_loop()        {}                    //label        作为标签/书签
*/
    while (  )
    {
        if (bit_5mS)
        {
            bit_5mS = 0;
            
            remote_control();
            uart_receipt();
            scan_key();
            key_function();
            beep();
            time();
            display();
        }
        
        
        if (bit_100mS)
        {
            bit_100mS = 0;
            
            set_delay();
            if (!bit_set_time)
            {
                DS1302_get_time();
            }
            
            LED_display();
        }
    }
}

使用特权

评论回复
7
排山倒海| | 2014-8-3 09:52 | 只看该作者
南宫云明 发表于 2014-8-3 09:45
我以前做过红外编码的学习一个项目,它是需要用到定时器捕获功能的,捕获上升沿下降沿,捕获之后肯定要计 ...

解码部分在中断中处理,至于遥控按键功能在主函数中处理。
类似真正的数码管底层动态扫描在中断里处理,而功能应用方面要显示什么内容的在主循环中处理。

使用特权

评论回复
8
南宫云明|  楼主 | 2014-8-3 09:54 | 只看该作者
排山倒海 发表于 2014-8-3 09:52
解码部分在中断中处理,至于遥控按键功能在主函数中处理。
类似真正的数码管底层动态扫描在中断里处理, ...

受教了!!!

使用特权

评论回复
9
排山倒海| | 2014-8-3 10:00 | 只看该作者
《匠人手记》的“手记3 编程思路漫谈”的“六、 中断与前/后台的程序结构”中有一些介绍。

使用特权

评论回复
10
南宫云明|  楼主 | 2014-8-3 10:23 | 只看该作者
排山倒海 发表于 2014-8-3 10:00
《匠人手记》的“手记3 编程思路漫谈”的“六、 中断与前/后台的程序结构”中有一些介绍。 ...

还有一点,比如有许多任务需要处理时,会不会用模拟堆栈的方法来处理?

使用特权

评论回复
11
ayb_ice| | 2014-8-3 10:32 | 只看该作者
要合理的分配哪些在中断中处理,哪些在主循环完成
比如数码管显示,显示扫描应该在定时中断中处理,但显示的内容处理应该在主循环

使用特权

评论回复
12
排山倒海| | 2014-8-3 13:18 | 只看该作者
南宫云明 发表于 2014-8-3 10:23
还有一点,比如有许多任务需要处理时,会不会用模拟堆栈的方法来处理? ...

我没有用什么模拟堆栈之类技术也不什么了解。
我的很多项目程序主函数都是在5mS内处理完的。有同事项目使用合泰单片机没有乘法和除法指令,有较多乘法和除法运算时5mS主函数确实有处理不过来的情况,对于这样的项目建议参考《匠人手记》“七、 时间片与分时调度机制”和“八、 多进程并行运行机制”设计程序。

使用特权

评论回复
13
NE5532| | 2014-8-3 14:45 | 只看该作者
原则上说,中断处理程序里的东西尽量少,尽量只处理“紧急”的事情,但是最高手的答案就是——没有禁止你在中断里处理长任务,没有空对空的“合理”和“不合理”,只有具体到你自己实际情况下的合适好不合适。

使用特权

评论回复
14
南宫云明|  楼主 | 2014-8-3 19:42 | 只看该作者
NE5532 发表于 2014-8-3 14:45
原则上说,中断处理程序里的东西尽量少,尽量只处理“紧急”的事情,但是最高手的答案就是——没有禁止你在 ...

恩,我觉得也是,没有死的规定,灵活运用就好

使用特权

评论回复
15
ayb_ice| | 2014-8-4 07:54 | 只看该作者
南宫云明 发表于 2014-8-3 09:38
比如这样:

完全可以

使用特权

评论回复
16
wstcllx| | 2014-8-4 08:56 | 只看该作者
南宫云明 发表于 2014-8-3 09:45
我以前做过红外编码的学习一个项目,它是需要用到定时器捕获功能的,捕获上升沿下降沿,捕获之后肯定要计 ...

呵呵呵。。。你也搞这个?你用什么mcu?

使用特权

评论回复
17
南宫云明|  楼主 | 2014-8-4 09:14 | 只看该作者
wstcllx 发表于 2014-8-4 08:56
呵呵呵。。。你也搞这个?你用什么mcu?

这是我最开始写的一个程序,用的LPC2214,现在想想当时写那个程序太白痴了,框架乱的一塌糊涂。。。

使用特权

评论回复
18
wstcllx| | 2014-8-4 09:51 | 只看该作者
南宫云明 发表于 2014-8-4 09:14
这是我最开始写的一个程序,用的LPC2214,现在想想当时写那个程序太白痴了,框架乱的一塌糊涂。。。 ...

你用ARM应该好点的。我用51去搞的。用了两个输入实现上升和下降沿中断。不过我没有过零什么的东西。收完信号再处理就行了。

使用特权

评论回复
19
南宫云明|  楼主 | 2014-8-4 10:20 | 只看该作者
wstcllx 发表于 2014-8-4 09:51
你用ARM应该好点的。我用51去搞的。用了两个输入实现上升和下降沿中断。不过我没有过零什么的东西。收完 ...

现在增强型51也有很多带定时器捕获功能的,最好用定时器去做,如果实在没有只能用外部中断和普通定时器去做了,是会麻烦一点。。。。。。

使用特权

评论回复
20
wstcllx| | 2014-8-4 14:56 | 只看该作者
南宫云明 发表于 2014-8-4 10:20
现在增强型51也有很多带定时器捕获功能的,最好用定时器去做,如果实在没有只能用外部中断和普通定时器去 ...

呵呵。为了搞这个我开了两个外部。一个定时器。一个PCA,一个串口。

使用特权

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

本版积分规则

22

主题

272

帖子

0

粉丝