打印

请教AVR定时1中断

[复制链接]
2969|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhlok520|  楼主 | 2010-10-12 14:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zhlok520 于 2010-10-13 17:49 编辑

抄了一个定时器1的中断程序,但是进不去中断,请教大家,程序如下,谢谢。
#include <iom32v.h>
#include <AVRdef.h>
void init_devices(void)   
{
CLI();
TCCR1B= 0x00;  
TCNT1H= 0x00;
TCNT1L= 0x00;

TCCR1A= 0x00;
TCCR1B=0x04;  
MCUCR = 0x00;  
GICR  = 0x00;   
TIMSK = 0x04;
SEI();  //enable all interrupts
}

#pragma interrupt_handler timer1_ovf_isr:10
void timer1_ovf_isr(void)
{
TCNT1H=0x00;
TCNT1L=0x00;
PORTA=0x00;
delay(100);//100ms
  }
void main (void)
{
  while(1)
{
   port_init();
   init_devices();
delay(2000);//大于中断等待时间

PORTA=0x01;
  }
}

相关帖子

沙发
chenczy| | 2010-10-12 16:17 | 只看该作者
TCCR1A=0x00;
      TCCR1B=0x03;
      TCNT1H=0xcf;
      TCNT1L=0x2c;
TIMSK=0x04;

interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
  TCNT1H=0xcf; //100ms
  TCNT1L=0x2c;
}

这是我做的定时器1中断,参考一下

使用特权

评论回复
板凳
zhlok520|  楼主 | 2010-10-12 17:17 | 只看该作者
谢谢啊 但是还是不行啊,大家帮个忙啊!

使用特权

评论回复
地板
airwill| | 2010-10-12 19:45 | 只看该作者
TIMSK = 0x04; ?
楼主不认真看看这个寄存器的说明呀?

设置 TIMSK = 0x01;  看看呢
timer1_ovf_isr 中断可是在 BIT0 控制的呢

使用特权

评论回复
5
zhlok520|  楼主 | 2010-10-13 08:52 | 只看该作者
谢谢LS,不过我用的是16位定时计数器1,不是8位定时计数器0。不过发现TIMER1溢出中断向量号是15,不是9。但是改成15还是不行。改成这样interrupt [15] void timer1_ovf_isr(void),说我语法错误,应该是我没有interrupt.h头文件。不知道怎么改了!!!

使用特权

评论回复
6
chenczy| | 2010-10-13 09:24 | 只看该作者
不用interrupt.h头文件的,我把我的再上一下,我做的是成功的,我用了二个定时器的

TCCR1A=0x00;
      TCCR1B=0x03;
      TCNT1H=0xcf;
      TCNT1L=0x2c;  
      
      TCCR2=0x05;
      TCNT2=0x16;
      OCR2=0xea;
      TIMSK=0x44;
这是我用的二个定时器的设置,

interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
  TCNT1H=0xcf; //100ms
  TCNT1L=0x2c;
}
这是定时器1,里面的内容比较长,我就不发了

interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
  TCNT2=0x16;  //10ms
  ++godled1;
}

这是定时器2。
#include <mega32.h>
#include <stdio.h>
这是我用32的二个头文件

使用特权

评论回复
7
chenczy| | 2010-10-13 09:25 | 只看该作者
再说明一下,我用的是CVAVR写的程序

使用特权

评论回复
8
zhaoyu2005| | 2010-10-13 09:59 | 只看该作者
LZ,你看下datasheet里,定时器1的中断号是不是15?应该是9吧
另外不知道你用的是不是ICCAVR,看着像,如果是的话,你看下iom32v.h的最后部分,有中断号

使用特权

评论回复
9
zhlok520|  楼主 | 2010-10-13 12:34 | 只看该作者
iom32v.h里面是#define iv_TIMER1_OVF   10 和datasheet里面一样,刚开始我是看的书,书上写的是128的芯片!但是不管是9,10还是15,好像都不管用,唉。
我用的是ICCAVR,interrupt [TIMER1 OVF] void timer1_ovf_isr(void) 我改成这句编译的时候会出错。我就是想用T1搞个方波出来,搞到现在也没出得来。
不过谢谢LS几位的帮忙啊,我再继续研究研究了。

使用特权

评论回复
10
SLEET1986| | 2010-10-13 16:57 | 只看该作者
#pragma interrupt_handler timer1_ovf_isr:iv_TIM1_OVF
void timer1_ovf_isr(void)
{

}
中断函数写法
iv_TIM1_OVF是15

使用特权

评论回复
11
zhaoyu2005| | 2010-10-13 17:25 | 只看该作者
中断号是10,那LZ位的中断子函数是定义是对的,你的程序不能进中断是程序的问题:
主函数的中init_devices()函数的位置不对,应该放在while(1)的前面,不能放在里面

放在里面的话,会不停的执行init_devices();寄存器的值不停被初始化话,当然也就进不了中断了

使用特权

评论回复
12
zhlok520|  楼主 | 2010-10-13 17:26 | 只看该作者
#define iv_TIMER1_OVF   10
#define iv_TIM1_OVF     10
LS这是我头文件中的向量号,应该是10不是15。
哎 把程序改了还是没搞出来,什么方法都试了!!!出不来方波啊。

使用特权

评论回复
13
zhlok520|  楼主 | 2010-10-13 17:29 | 只看该作者
哪位大哥救救我啊!!!感激不尽啊!!!

使用特权

评论回复
14
zhlok520|  楼主 | 2010-10-13 17:46 | 只看该作者
谢谢楼上各位啊,是小弟我太没时间观念了啊,主函数里面没有给等待中断的时间,所以PORTA一直置位了,所以看不到中断程序想要得到的低电平了,现在好了啊,谢谢各位啊^^:lol

使用特权

评论回复
15
zhaoyu2005| | 2010-10-14 16:58 | 只看该作者
刚开始你也没说要输出方波,只说进不了中断,按我说的改了一定能进中断
另外,想输出方波,直接在中断中对改位取反,就不用等了

使用特权

评论回复
16
顶风作案| | 2010-10-15 07:55 | 只看该作者
同学习,呵呵

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

123

帖子

1

粉丝