AVR定时器问题

在AVR编程中,定时器定时1ms,但是在对应的中断函数中代码有5ms,会有什么影响?... 在AVR编程中,定时器定时1ms,但是在对应的中断函数中代码有5ms,会有什么影响? 展开
 我来答
匿名用户
2014-06-25
展开全部
对于单片机来说,一般进入中断时要关闭所有中断(但如果采取特别的方法,也可以不这么做)。
你的情况,如果这么做的话,定时1ms就没有意义了,相当于6ms一次中断了。
最好是根据所有情况,综合考虑定时中断。

你这个是在使用时间片?
追问
中断里是显示数码管的,4个数码管。所以在出中断后1ms进入中断,不知道这样是否可以。
追答

哦,你是打算在中断函数里使用软件延迟啊?

不要这么做,虽然对于你这个程序来说这么做没什么问题,但如果程序复杂,就没法实现了。


给你举个用时间片的例子吧:

数码管动态扫描,利用的是视觉暂留,显示设备需要每秒刷新50次或更多,相对于不同的人、不同的环境,这个值会有所不同。以50次/秒为例,4位的数码管,完整扫描一次需要20mS,每个位要5mS,嘎~~这个你都计算好了~~就不删掉了。。继续~~

如果只有这么一个任务,那么就可以开启一个定时器产生系统时钟,每5毫秒产生一次中断,每次中断显示一个位,显示时间5mS。定时中断子程序里,只管产生系统滴答,就是时间片。不过这个简单的程序就不用定义时间片变量了。

给你写点像是代码的东西好了:


uint8_t dig=0; //定义数码管的位变量。
//定时器中断
{
    //关全局中断 cli();
    if ( ++dig==4) dig=0; //判断是否4位数码管都扫描完毕
    //开全局中断 sei();
}
int main(void)
{
   while(1){
       Disp_7Seg(dat, dig); //显示,段码、位号。
   }
}
//显示函数,入口变量 段码、位号
void Disp_7Seg(uint8_t dat, uint8_t dig){
   //端口操作了。。
}

大致就是这么个意思,实际的程序和你的电路有关。


如果程序稍微复杂一些,比如还有其它任务,时间片的尺度(就是那个定时中断的间隔)要综合考虑。while(1){} 里也要判断不同的任务以处理。。

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式