大家帮忙看看 ,超级郁闷 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的中断标志
}
} 看看是不是外部中断影响的,
外部中断1要比C/T2的中断优先级高,
如果外部中断1不撤除,C/T2不会产生中断。 mark
页:
[1]