[AVR单片机] AVR中断定时方法 请教

[复制链接]
1117|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 | 显示全部楼层
其它的操作建议放在主程序里

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

如:

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

评论

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

评分

参与人数 1威望 +1 收起 理由
SD10A + 1 赞一个!

查看全部评分

caijie001 发表于 2017-10-31 13:11 | 显示全部楼层
ningling_21 发表于 2017-10-31 09:00
其它的操作建议放在主程序里

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

以前会这样子写程序,
ningling_21 发表于 2017-10-31 13:40 | 显示全部楼层
caijie001 发表于 2017-10-31 13:11
以前会这样子写程序,

现在呢
caijie001 发表于 2017-10-31 14:52 | 显示全部楼层

小程序我一般while循环做完,现在在学freertos
您需要登录后才可以回帖 登录 | 注册

本版积分规则

29

主题

169

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部