打印
[AVR单片机]

AVR中断定时方法 请教

[复制链接]
942|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
SD10A|  楼主 | 2017-10-30 21:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 SD10A 于 2017-10-30 21:14 编辑

传统的软件延时具有阻断性,不能在延时时候做其他工作,同时不能使用中断,否则要影响延时。
对于AVR  这几天我想了个办法用中断延时,有几个疑问程序的红字部分 其他的操作是在中断好呢?还是在延时的时候好呢?
另外这其他的操作都应该在1MS完成,如何写在延时的时候(不是中断程序),怎么保证写的过程中不会有定时器中断响应呢?
各位专家对于AVR还有什么更好的方法写延时程序,请都告诉我下

#include "iom16v.h"
#include "macros.h"
#define uchar unsigned char
#define uint unsigned int
uint F_ms=0;//定义毫秒中断标志

//TIMER2 initialize - prescale:32
// WGM: Normal
// desired value: 1mSec
// actual value:  1.000mSec (0.0%)
void timer2_init(void)
{
TCCR2 = 0x00; //stop
ASSR  = 0x00; //set async mode
TCNT2 = 0x06; //setup
OCR2  = 0xFA;
TCCR2 = 0x03; //start
}
// 中断程序
#pragma interrupt_handler timer2_ovf_isr:5
void timer2_ovf_isr(void)
{
TCNT2 = 0x06; //reload counter value
F_ms++;//标志加1
//其他的操作
}
//硬件初始化
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts

timer2_init();

MCUCR = 0x00;
GICR  = 0x00;
TIMSK = 0x40; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
//

//主函数 测试流水灯
void main(void)
{
  init_devices();
  DDRB=0XFF;//
  while(1)
    {
          TCCR2 = 0x00; //stop定时器停止
          PORTB=0;
          F_ms=0;//时间标记先清零
          TCCR2 = 0x03; //start定时器打开
         while(F_ms<5)
          {//其他的操作
          NOP();//空指令
          }
          TCCR2 = 0x00; //stop
        PORTB=0XFF;
          F_ms=0;//时间标记先清零
          TCCR2 = 0x03; //start
          while(F_ms<5)
          {//其他的操作
          NOP();//空指令
          }
        }


}

相关帖子

沙发
ningling_21| | 2017-10-31 09:00 | 只看该作者
其它的操作建议放在主程序里

主程序只判断定时是否到,其余时间可以执行其它操作

如:

while(1) //主程序循环
{
    if(定时时间到?)
    {
        清除定时标志,执行定时操作
    }
    其它操作....
}

使用特权

评论回复
评论
SD10A 2017-10-31 19:07 回复TA
这个if怕是不行啊,时间没到的话就执行后面的程序? 实际要求是程序停在这里等顺便执行其他操作,但不能往后面走 
板凳
qin552011373| | 2017-10-31 09:55 | 只看该作者
对响应时间要求苛刻的直接在中断处理,当然前提是不能是个需要很长时间执行的代码。
对时间要求不苛刻在主循环处理,允许的误差可以大一点。
在主循环处理有弊端,不会像是在中断里面处理那么及时,具体情况要取决于中断的时间点。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
SD10A + 1 赞一个!
地板
caijie001| | 2017-10-31 13:11 | 只看该作者
ningling_21 发表于 2017-10-31 09:00
其它的操作建议放在主程序里

主程序只判断定时是否到,其余时间可以执行其它操作

以前会这样子写程序,

使用特权

评论回复
5
ningling_21| | 2017-10-31 13:40 | 只看该作者
caijie001 发表于 2017-10-31 13:11
以前会这样子写程序,

现在呢

使用特权

评论回复
6
caijie001| | 2017-10-31 14:52 | 只看该作者

小程序我一般while循环做完,现在在学freertos

使用特权

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

本版积分规则

29

主题

169

帖子

4

粉丝