AVR定时器问题
2014-06-25
展开全部
对于单片机来说,一般进入中断时要关闭所有中断(但如果采取特别的方法,也可以不这么做)。
你的情况,如果这么做的话,定时1ms就没有意义了,相当于6ms一次中断了。
最好是根据所有情况,综合考虑定时中断。
你这个是在使用时间片?
你的情况,如果这么做的话,定时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){} 里也要判断不同的任务以处理。。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询