avr-arm 发表于 2009-5-7 19:34:08

大家帮忙看看 ,超级郁闷 mega8 其他模式都可以,就省电模式不行 tc2 唤不醒!!!

#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <avr/delay.h>
#include <avr/wdt.h>
#include <avr/sleep.h>



#define LED0 0 //PB0      //PB0 驱动LED0,高电平点亮


//宏定义
#define LED0_ON() PORTB|= (1<<LED0)         //输出高电平,灯亮
#define LED0_OFF() PORTB&=~(1<<LED0)         //输出低电平,灯灭

void delay_10ms(unsigned int t)
{
      while(t--)
                _delay_ms(10);
}

//全局变量
// volatile 表示在中断中此参数会改变
volatile unsigned char T2_AS2TOP;                //设置T2的时间值

void timer2_init(void) //T2初始化(设定分频数和定时初值)
{
TIMSK &= 0x3F;                //清零OCIE2和TOIE2,关闭T/C2中断
ASSR = (1<<AS2);      //选择外部32768Hz晶振   
T2_AS2TOP= 192;                //设定TOP值,定时 秒
TCNT2 = T2_AS2TOP;                  
TCCR2 = (0<<WGM21)|(0<<WGM20)|(1<<CS22)|(0<<CS21)|(1<<CS20);      //普通模式,1024分频
while (!(ASSR & 0x07))//等待TCN2UB,OCR2UB,TCR2UB为零
TIFR &= 0x3F;      //清零T/C2的中断标志
TIMSK = (1<<TOIE2); //开启T2定时器的中断
}

SIGNAL(SIG_OVERFLOW2)      //T2中断服务子程序
{
      TCNT2 = T2_AS2TOP;
      PORTB^= (1<<LED0);               //熄灭LED
}

SIGNAL(SIG_INTERRUPT1)//外部中断1服务程序 唤醒源
{
            
}

int main(void)
{
      unsigned char i;
    //上电默认DDRx=0x00,PORTx=0x00 输入,无上拉电阻
    //不用的管脚使能内部上拉电阻。
      PORTB=0x00;
      PORTC=0xFF;
    PORTD=0xFF;
      DDRB =0XFF;
   
      MCUCR=(0<<ISC11)|(0<<ISC10);         //设置中断方式,低电平触发(注意该寄存器有多个功能)
      GIFR=(1<<INTF1);                            //写1清除标志位,在使能中断前最好先把对应的标志位清除,以免误触发
    GICR=(1<<INT1);                                 //使能外部中断
         
      timer2_init();                        //T0初始化,设置为异步模式,定时 秒
         
                                                //使能全局中断
         
      while(1)
      {
               
      
                _delay_us(10);
                TIFR &= 0x3F;                //清零T/C2的中断标志
                TIMSK = (1<<TOIE2);//开启T2定时器的中断
                   sei();
                //设定为省电模式,可用外部中断和异步定时器唤醒
                set_sleep_mode(SLEEP_MODE_PWR_SAVE);
                sleep_mode();      //进入睡眠状态

                TIMSK &= 0x3F;      //清零OCIE2和TOIE2,关闭T/C2中断
                TIFR &= 0x3F;      //清零T/C2的中断标志
               
               
      }
}

xhdzwzj 发表于 2009-5-15 00:48:21

看看是不是外部中断影响的,
外部中断1要比C/T2的中断优先级高,
如果外部中断1不撤除,C/T2不会产生中断。

zl_123 发表于 2014-7-15 10:50:56

mark                              
页: [1]
查看完整版本: 大家帮忙看看 ,超级郁闷 mega8 其他模式都可以,就省电模式不行 tc2 唤不醒!!!