6222|10

9

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

新手——关于中断服务的问题 [复制链接]

在学AVR,写定时器中断的程序时遇到问题,程序在计数溢出后没有跳进中断服务程序中。
我用的是AVR STUDIO6 编程,选的是ATMEGA88PA芯片,用STUDIO6自带的软件仿真。单步运行时,发现计数溢出后程序没有进入中断。
求大神解惑,附上程序。
#include < avr/io.h >
#include < avr/interrupt.h >

unsigned int CNT = 0;
void timer0_init()
{
TCCR0A = 0x00;    //普通模式
TCCR0B = 0x00;    //停止计数
TCNT0 = 0xFA;      //计数初值,为了单步时能快点计数溢出,就用0xFA作初值了
TIMSK0 = 0x01;    //计数溢出使能
}

int main(void)
{
timer0_init();
TCCR0B = 0x01;          //计数频率=系统时钟频率
sei();     //开启全局中断
    while(1)
    {
        ;//TODO:: Please write your application code
    }
}

ISR(TIMER0_OVF_vect)   //中断服务程序
{
cli();
TCNT0 = 0xFA;
if(++CNT == 10) CNT = 0;
sei();
}

最新回复

还真是被我猜中了,是仿真调试时操作不对,不是代码、编译器、调试器的问题。  详情 回复 发表于 2013-3-12 15:37

点评

有没有使能全局中断?  详情 回复 发表于 2013-3-12 08:52
点赞 关注
 

回复
举报

9

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
是不是单步调试的时候,是把中断屏蔽掉了的呀?
 
 
 

回复

1万

帖子

139

TA的资源

版主

板凳
 
检查是否正确设置了中断使能。

点评

TIMSK0 = 0x01; //计数溢出使能 在void timer0_init()函数里的这句应该就可以把TOV0置1了呀,TOV0置1了不就是开启定时器0溢出使能吗。 在单步运行程序时,计数到0xFF之后,也确实能看到溢出进位标志被置1了。全  详情 回复 发表于 2013-3-12 10:04
 
 
 

回复

436

帖子

5

TA的资源

五彩晶圆(初级)

4
 
原帖由 俺是做电源的 于 2013-3-11 10:07 发表
在学AVR,写定时器中断的程序时遇到问题,程序在计数溢出后没有跳进中断服务程序中。
我用的是AVR STUDIO6 编程,选的是ATMEGA88PA芯片,用STUDIO6自带的软件仿真。单步运行时,发现计数溢出后程序没有进入中断。
...

有没有使能全局中断?

点评

sei(); 这句就是开启全局中断了呀,单步运行到这句时,也可看到SREG寄存器的 I 位置1了。计数到0xFF之后,TOV0位也置1了。但是不会进入中断,一直停在whlie(1)那。  详情 回复 发表于 2013-3-12 10:08
 
 
 

回复

9

帖子

0

TA的资源

一粒金砂(中级)

5
 

回复 板凳 chunyang 的帖子

TIMSK0 = 0x01;    //计数溢出使能
在void timer0_init()函数里的这句应该就可以把TOV0置1了呀,TOV0置1了不就是开启定时器0溢出使能吗。
在单步运行程序时,计数到0xFF之后,也确实能看到溢出进位标志被置1了。全局中断也开了,但是程序就卡在whlie(1)那,不进入中断服务。
是不是AVR STUDIO单步调试的时候,是不会进入中断服务的呀?
 
 
 

回复

9

帖子

0

TA的资源

一粒金砂(中级)

6
 

回复 4楼 lr2131 的帖子

sei();
这句就是开启全局中断了呀,单步运行到这句时,也可看到SREG寄存器的 I 位置1了。计数到0xFF之后,TOV0位也置1了。但是不会进入中断,一直停在whlie(1)那。
 
 
 

回复

436

帖子

5

TA的资源

五彩晶圆(初级)

7
 
要不是全局中断的问题,那查一下是不是:
1.定时器的相关设置对吗?
2.定时器的时钟源选择有问题吗?
3.定的时间是不是太长了,所以等了很长时间都没来中断
4.ISR(TIMER0_OVF_vect)   //中断服务程序 这种方式写中断服务子程序可以吗?
我没用过AVR STUDIO6 ,写法不知道。
5.在单步调试时,注意断点应该设置到中断ISR中,不要设置在while(1);这里
6.其他相关的中断开关设置了没

点评

中断服务用ISR没问题,我打开STUDIO6自带的一些例子里,都是这么写的。应该是断点的问题了,我没设断点,在中断服务中设置了断点后再运行,就可以跳进去了。  详情 回复 发表于 2013-3-12 15:33
 
 
 

回复

6366

帖子

4912

TA的资源

版主

8
 
TCCR0B = 0x00;    //停止计数
让他开始计数啊

点评

TCCR0B = 0x01; //计数频率=系统时钟频率 主程序里这句就是让它开始计数了呀。  详情 回复 发表于 2013-3-12 14:24
 
 
 

回复

9

帖子

0

TA的资源

一粒金砂(中级)

9
 

回复 8楼 tiankai001 的帖子

TCCR0B = 0x01;          //计数频率=系统时钟频率

主程序里这句就是让它开始计数了呀。
 
 
 

回复

9

帖子

0

TA的资源

一粒金砂(中级)

10
 

回复 7楼 lr2131 的帖子

中断服务用ISR没问题,我打开STUDIO6自带的一些例子里,都是这么写的。应该是断点的问题了,我没设断点,在中断服务中设置了断点后再运行,就可以跳进去了。

点评

还真是被我猜中了,是仿真调试时操作不对,不是代码、编译器、调试器的问题。:faint::faint::faint:  详情 回复 发表于 2013-3-12 15:37
 
 
 

回复

436

帖子

5

TA的资源

五彩晶圆(初级)

11
 
原帖由 俺是做电源的 于 2013-3-12 15:33 发表
中断服务用ISR没问题,我打开STUDIO6自带的一些例子里,都是这么写的。应该是断点的问题了,我没设断点,在中断服务中设置了断点后再运行,就可以跳进去了。

还真是被我猜中了,是仿真调试时操作不对,不是代码、编译器、调试器的问题。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表