5131|12

71

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

AVR 定时器中断问题 [复制链接]

我用的是TINNY 2313,它的定时器0溢出中断向量是7,我用轮循环的方式是正常的,用中断方式不行.下面是代码,帮忙看下,解决了分全给.

#include
#include



//volatile
unsigned int cnt=0;
//int ss _at_ 0x00;

int main()
{
        DDRB=0xFF;
        TCNT0=55;
        TIMSK =0x02;

        TCCR0A = 0x00;
        TCCR0B = 0x01;
        PORTB=0xFF;
//        sei();
        while(1)
        {
        while(cnt<10000)
                {
                        while(!(TIFR&(1<<1)));//轮循环方式
                        TCNT0=155;
                        TIFR&=0xFF;//清除溢出标志,置1相当于清0
                        cnt++;
                }
                cnt=0;
        PORTB=~PORTB;       
        }
}

        /*
#pragma interrupt_handler timer0_ovf_isr:7
void timer0_ovf_isr()//中断方式
{
   TCNT0=55;
   cnt++;
   if(cnt>=1250)
    {
      cnt=0;
          PORTB=~PORTB;
    }
}
*/

最新回复

#pragma interrupt_handler              time2_isr:iv_TIMER2_OVF 我用这个编译完全通过,你那个警告已经告诉你忽略了那个中断ISR,根本就不执行,去看看例子程序中如何定义中断,去掉那个警告应该就可以了.  详情 回复 发表于 2010-3-14 16:25
点赞 关注

回复
举报

65

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
另外:编译时有这样一个警告
../Alarm.c:36: warning: ignoring #pragma interrupt_handler timer0_ovf_isr
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
先帮顶下。

一会有空再帮你,好好看看。
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

4
 
用中断不行的原因可能有两种:
1、中断函数没有执行,这个可以在中断函数中加打印信息或者点灯来测试。
2、很重要的一点,如果在某个循环中查询某一变量,而这个变量会被某个中断函数修改,那么定义的时候一定要用volatile关键字修饰,这样才会保证循环查询语句中每次使用这个变量的时候都重新从内存中取数据,而不是函数刚开始执行前就读取的数值,切记。当然,这一条有时候不一定是绝对,因为编译器优化等级很低的时候是没关系的,但是如果优化等级开得比较高就一定要用它修饰。
volatile unsigned int cnt =0;
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

5
 

  1. CLI();
  2. TCCR0B = 0x00; //stop timer
  3. TCNT0 = 0xFD; //set count
  4. OCR0A = 0x03; //set count
  5. OCR0B = 0x03; //set count
  6. TCCR0A = 0x00; //start timer
  7. TCCR0B = 0x05; //start timer
  8. TIMSK =0x02;
  9. SEI();
复制代码

初始化一定要关中断!
 
 
 

回复

92

帖子

0

TA的资源

一粒金砂(初级)

6
 
神啊,救救我吧,不行啊
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

7
 
那个警告,说明 可能是中断函数有问题,那函数应该没进去,另外 小弟不才,问一下 那个main函数返回值为什么是int而不是void 没发现主函数里有返回值啊
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

8
 
总中断开了吗?
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

9
 
把“#pragma interrupt_handler timer0_ovf_isr:7 ”放到文件顶部试试
 
 
 

回复

89

帖子

0

TA的资源

一粒金砂(初级)

10
 
应该把“#pragma interrupt_handler timer0_ovf_isr:7 ”放到main()前,放到main()后相当于没有参加编译,当然不执行.
因为中断和函数不同,函数放在main()后可以.
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

11
 
引用 9 楼 wwdragonfly88 的回复:
应该把“#pragma interrupt_handler timer0_ovf_isr:7 ”放到main()前,放到main()后相当于没有参加编译,当然不执行.
因为中断和函数不同,函数放在main()后可以.

这句话放在MAIN前mian后都无所谓的 照样被编译 可以写个小程序调下试试
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

12
 
还是不行
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

13
 
#pragma interrupt_handler              time2_isr:iv_TIMER2_OVF
我用这个编译完全通过,你那个警告已经告诉你忽略了那个中断ISR,根本就不执行,去看看例子程序中如何定义中断,去掉那个警告应该就可以了.
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表