为什么第一个程序灯会闪,第二个就不行

2019-07-15 12:16发布

编译器是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;
        }
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
14条回答
srgtgretgr
1楼-- · 2019-07-15 22:18
zwx_zhang 发表于 2016-12-23 23:29
不同函数间调用同一变量,建议使用全局变量,IAR是专业软件厂家,编译器更完善些,个人建议,不要过于频繁进中断,根据需要设置长点的中断间隔

第二个程序里 Timer0Flag 是全局变量。 试过几种编译器都比atmel studio 差很多。atmel studio是用的vs的壳,自动补完,进入函数之类的功能很全。
猎国倾城
2楼-- · 2019-07-16 04:01
 精彩回答 2  元偷偷看……
macro_chan
3楼-- · 2019-07-16 04:45
没清中断标志吧
陈明辉
4楼-- · 2019-07-16 09:48
当然错了
这就是中断时间的问题
一生漂泊v
5楼-- · 2019-07-16 13:07
一生漂泊v
6楼-- · 2019-07-16 16:33
.

一周热门 更多>