这个单片机的中断标志位困扰了我很久,一直存在的疑问就是我在不打开中断使能的情况下面这个中断标志位会因为中断源的触发而置位吗?下面我将我个人的测试过程发表,希望对大家有所帮助!大家知道要触发中断并且执行相应的中断服务程序需要这么几个条件: 1、要有相应的中断源; 2、要打开相应中断的终端使能位; 3、要打开全局中断;有了上面的3个条件,MCU此时已经响应了中断,如果有相应的中断服务程序,MCU 将自动跳转到其执行。为了解决上面的疑问,我做了一个小测试,就是将所有的中断都关闭CLI(); (ICCAVR),让AVR128定时器T1进行计数,我让其工作模式为模式4---CTC--更新时间OCR1A;那么在比较匹配发生的时候这个中断标志位会发生置位吗?让我们来试试。。。编译测试环境:ICCAVR
内部晶振:8M
源代码如下:
#include<iom128v.h>
#include<macros.h>
#define uint unsigned int
#define uchar unsigned char
volatile uchar num=0,cont=0;
void timer1_init(void) //定时器T1初始化函数
{ TCCR1B = 0X00;//关闭定时器T1
TCNT1H = 0X00;
TCNT1L = 0X00;
OCR1AH = 0XF0;
OCR1AL = 0XFF;
TCCR1A = 0X00;//T1计数,OCR1A与TCNT1比较匹配
TCCR1B = 0X0A;//启动定时器,4--CTC模式,8分频
}
void port_init(void) //端口初始化函数
{ PORTE |= BIT(PE2); //打开LED灯的锁存器使能
DDRE |= BIT(PE2);
DDRA = 0XFF; //A口全部输出
}
void main(void)
{ timer1_init();
port_init();
while(1) //等待比较匹配中断
{ if(TIFR&0X10)//检测比较匹配中断标志位是否置位, //这个地方请查阅相关的寄存器TIFR
{ if(cont++ == 254)
{ cont=0;
PORTA = num++;
TIFR |= BIT(OCF1A);//软件清零比 //较匹配中断标志位,注意是写的1
}
}
}
}
实践证明:A端口的灯在有规律的闪烁流动,这就是说明中断标志位在比较匹配发生的时候置位了,并且由软件写一清零了。上面的问题也就是解决了。附注:最开始我用的是AVRSTUDIO的测试环境,由于AVRSTUDIO支持代码仿真,所以最先验证上面的设想的是我在仿真的时候关注的num这个数值以及TIFR这个寄存器,在 AVRSTUDIO环境下面的代码如下,大家可以仿真看一下相关的寄存器以及参数num 。别忘了自己写好makefile添加在工程里面!
#include<avr/io.h>
#define uint unsigned int
#define uchar unsigned char
volatile uchar num=0,cont=0;
void timer1_init(void)
{ TCCR1B = 0X00;//关闭定时器T1
TCNT1H = 0X00;
TCNT1L = 0X00;
OCR1AH = 0XF0;
OCR1AL = 0XFF;
TCCR1A = 0X00;//T1计数,OCR1A与TCNT1比较匹配
TCCR1B = 0X0A;//启动定时器,4--CTC模式,8分频
}
void port_init(void)
{ PORTE |= _BV(PE2); //打开LED灯的锁存器使能
DDRE |= _BV(PE2); DDRA = 0XFF; //A口全部输出
}
void main(void)
{ timer1_init();
port_init();
while(1) //等待比较匹配中断
{ if(TIFR&0X10)//检测比较匹配中断标志位是否置位
{ if(cont++ == 254)
{ cont=0;
PORTA = num++;
TIFR |= _BV(OCF1A);//软件清零比较匹配中断标志位
}
}
}
}
文章评论(0条评论)
登录后参与讨论