我试图将我的ATTiny置于睡眠模式而不是将其唤醒。我使用这段代码让它入睡:
void go_to_sleep(){
is_sleeping = true;
RED_HIGH;
YELLOW_HIGH;
GREEN_HIGH;
sleep_enable();
sei();
sleep_cpu();
sleep_disable();
}
比我使用外部中断但没有任何反应。
ISR(INT0_vect)
{
if(is_sleeping){
awake();
}
if(BUTTON_LOW){ // przycisk wciśnięty?
_delay_ms(80);
if(BUTTON_LOW){ // nadal wciśnięty?
do_thing();
}
}
}
void awake(){
is_sleeping = false;
RED_LOW;
YELLOW_HIGH;
GREEN_HIGH;
}
欢迎任何想法。
我添加main以表明中断工作正常,我已经在没有睡眠模式的情况下对其进行了测试:
int main(void)
{
MCUCR |= 1<<SE; // zezwolenie na sleep mode
GIMSK |= 1<<INT0; // int0 enable
MCUCR |= 0<<ISC00 | 1<<ISC01; //przerwanie zboczem opadającym
sei(); // zezwolenie na przerwania
//OUTPUTS
DDRB |= RED | YELLOW | GREEN;
//INPUTS
DDRB &= ~BUTTON;
// Podciągnięcie przycisku do VCC
PORTB |= BUTTON;
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // ustaw tryb sleep modu, ta linijka nie uruchamia go
//Stan początkowy
RED_LOW;
YELLOW_HIGH;
GREEN_HIGH;
timer0(TIMER_PRESCALER_1024,255);
while(1);
}
答案 0 :(得分:0)
You must enable the INT0 interrupt in the General Interrupt Mask Register....
添加行...
GIMSK |= _BV( PCIE );
...在您进入休眠状态并激活INT0引脚(默认情况下具有低电平)之前,应将MCU从休眠状态唤醒。
请注意,使用您显示的代码,我不确定您是否能够告诉CPU已经唤醒了。在睡觉之前尝试在引脚上输出高电平,然后在唤醒时让它变低,这样你就会知道它发生了。