为什么第一个程序灯会闪,第二个就不行
时间:10-02
整理:3721RD
点击:
编译器是atmel studio 7
#include <avr/io.h>
#include <avr/interrupt.h>
unsigned int i=0;
int main(void)
{
DDRG|=_BV(PG0);
TCCR0|=_BV(CS02)|_BV(CS00); //1024分频
TCNT0=256-F_CPU/1024*0.001; //定时1ms
TIMSK|=0x01; //开定时器中断
sei();
while (1)
{
}
}
ISR(TIMER0_OVF_vect){
TCNT0=256-F_CPU/1024*0.001; //重装定时1ms
i++;
if(i>300){
PORTG^=_BV(PE0);
i=0;
}
}
#include <avr/io.h>
#include <avr/interrupt.h>
unsigned int i=0;
unsigned char Timer0Flag=0;
int main(void)
{
DDRG|=_BV(PG0);
TCCR0|=_BV(CS02)|_BV(CS00); //1024分频
TCNT0=256-F_CPU/1024*0.001; //定时1ms
TIMSK|=0x01; //开定时器中断
sei();
while (1)
{
if(Timer0Flag){
PORTG^=_BV(PE0);
Timer0Flag=0;
}
}
}
ISR(TIMER0_OVF_vect){
TCNT0=256-F_CPU/1024*0.001; //重装定时1ms
i++;
if(i>300){
//PORTG^=_BV(PE0);
Timer0Flag=1;
i=0;
}
}
#include <avr/io.h>
#include <avr/interrupt.h>
unsigned int i=0;
int main(void)
{
DDRG|=_BV(PG0);
TCCR0|=_BV(CS02)|_BV(CS00); //1024分频
TCNT0=256-F_CPU/1024*0.001; //定时1ms
TIMSK|=0x01; //开定时器中断
sei();
while (1)
{
}
}
ISR(TIMER0_OVF_vect){
TCNT0=256-F_CPU/1024*0.001; //重装定时1ms
i++;
if(i>300){
PORTG^=_BV(PE0);
i=0;
}
}
#include <avr/io.h>
#include <avr/interrupt.h>
unsigned int i=0;
unsigned char Timer0Flag=0;
int main(void)
{
DDRG|=_BV(PG0);
TCCR0|=_BV(CS02)|_BV(CS00); //1024分频
TCNT0=256-F_CPU/1024*0.001; //定时1ms
TIMSK|=0x01; //开定时器中断
sei();
while (1)
{
if(Timer0Flag){
PORTG^=_BV(PE0);
Timer0Flag=0;
}
}
}
ISR(TIMER0_OVF_vect){
TCNT0=256-F_CPU/1024*0.001; //重装定时1ms
i++;
if(i>300){
//PORTG^=_BV(PE0);
Timer0Flag=1;
i=0;
}
}
中断里的使用全局变量要加 volatile
第二个也能点灯,将Timer0Flag定义成全局变量,建议用第一个吧,毕竟中断处理的事情不多,效率还是比while要高。
问题就出在这儿,第二个看起来没问题,但就是不行。
我怀疑跟编译器有关系。我换ICCAVR就可以。
atmel studio 6和7都不行。
这就奇怪了,亲娘不认自己的儿子啊!你用的IDE是正式版吗,如果是BETA版的,出现这样的问题很正常。
不同函数间调用同一变量,建议使用全局变量,IAR是专业软件厂家,编译器更完善些,个人建议,不要过于频繁进中断,根据需要设置长点的中断间隔
不是beta版,官网直接下的。试了下atmel studio 6.2 也是这样
第二个程序里 Timer0Flag 是全局变量。 试过几种编译器都比atmel studio 差很多。atmel studio是用的vs的壳,自动补完,进入函数之类的功能很全。
我之前用了一个7的测试版,各种毛病
没清中断标志吧
当然错了
这就是中断时间的问题
中断时间的问题
.
手术
为啥这两个程序看不懂,都到WHILE就就结束了,不出循环了,为啥要设定重置ISR()函数?第二个程序就出不了循环,如果按照编译器的微弱区别,很有可能第一个程序根据编译器的原因,可能不执行while就到程序尾端了,但是按照一般单片机习惯,很可能就从main()头开始执行了。
