【问题标题】:ATTiny 13 wake up from sleep modeATtiny 13 从睡眠模式唤醒
【发布时间】:2017-11-13 10:56:04
【问题描述】:

我正在尝试将我的 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);
}

【问题讨论】:

  • sei() 这不是一些禁用中断的代码吗?在什么情况下会屏蔽外部中断?
  • @Jean-FrançoisFabre 否,在 AVR 上,当中断标志设置为 设置 时会启用中断(与例如具有与中断标志相反的逻辑的 6502 相对) .参见例如my working code...
  • 一般来说,您的 ISR 可能做得太多。无论如何,ISR 中的延迟都是自找麻烦。 ISR 应该尽可能短且快速,尝试仅设置(易失性)标志并在您的主代码中完成工作。
  • @FelixPalmen 是 6502 SEI 指令给了我这个想法:)
  • @Jean-FrançoisFabre 这是 Atmel 内核中的一个已知缺陷。他们抄袭了摩托罗拉的大部分汇编程序,但颠倒了seicli 指令的含义。所以在 Atmel 上,sei 表示允许中断,而在 Motorola-ish 内核上则表示阻止所有中断。他们颠倒了 CCR 中 I 位的含义。

标签: c avr attiny


【解决方案1】:

您必须在通用中断屏蔽寄存器中启用 INT0 中断....

添加行...

GIMSK |= _BV( PCIE );

...在您进入睡眠状态并激活 INT0 引脚(默认为低电平)之前,应将 MCU 从睡眠状态唤醒。

请注意,您的代码如图所示,我不确定您是否能够判断 CPU 已唤醒。尝试在你睡觉前将一个引脚输出为高电平,然后在你醒来时让它变为低电平,这样你就会知道它发生了。

【讨论】:

  • 我在主函数中使用 sei()。这还不够吗?
  • sei() 确实可以发生中断,但您还必须单独启用每个中断源。在您的情况下,外部中断源由GIMSK 寄存器中的INT0 位启用。其他中断在其他地方启用。
【解决方案2】:

我相信你 cross-posted your issue 从掉电模式中醒来。验证我对其他问题的回答是否适合您,即您无法使用 INT0 上的下降沿检测从掉电中唤醒,因为掉电时没有 I/O 时钟。

【讨论】:

    猜你喜欢
    • 2016-12-27
    • 2022-11-13
    • 2017-06-25
    • 2019-10-12
    • 1970-01-01
    • 1970-01-01
    • 2012-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多