Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Atmega128 спит (должна спать)
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
elusive
Нужно усыплять Atmega128 и пробуждать по таймеру timer0 25 раз. Делаю так:


Код
sleepmode:

//start timer0
  TCNT0 = 0;
  TCCR0 |= 0x07; //Set 1024 prescaler for timer0 and normal mode
  TIMSK |= 0x01; //Enable interrupt from timer0 overflow

//set Sleep Enable bit
  MCUCR |= 0x20;
  
  asm("sleep");
  
//clear Sleep Enable bit
  MCUCR &=~ 0x20;

//stop timer0
  TCCR0 &=~ 0x07; //Switch off timer0
  TIMSK &=~ 0x01; //Disable interrupt from timer0 overflow

  timer_++;
  if (timer_ < 25)
       goto sleepmode;


Проблема: один раз мега нормально засыпает, просыпается по прерыванию, в обработчике бит Global_Interrupts сбрасывается и во второй раз процессор проснуться не может.

Вопрос: где поставить сакраментальное SEI (разрешить глобальные прерывания)? где бы я ни ставил (в пределах этого кода) это всегда приводит к тому что мега не спит! то есть после команды sleep она благополучно продолжает пахать! почему??
demiurg_spb
Цитата из sleep.h avr-gcc (winavr)
Код
    #define SLEEP_MODE_IDLE         (0)
    #define SLEEP_MODE_ADC          _BV(SM0)
    #define SLEEP_MODE_PWR_DOWN     _BV(SM1)
    #define SLEEP_MODE_PWR_SAVE     (_BV(SM0) | _BV(SM1))
    #define SLEEP_MODE_STANDBY      (_BV(SM1) | _BV(SM2))
    #define SLEEP_MODE_EXT_STANDBY  (_BV(SM0) | _BV(SM1) | _BV(SM2))

    #define set_sleep_mode(mode) \
    do { \
        _SLEEP_CONTROL_REG = ((_SLEEP_CONTROL_REG & ~(_BV(SM0) | _BV(SM1) | _BV(SM2))) | (mode)); \
    } while(0)

      set_sleep_mode(<mode>);
      cli();
      if (some_condition)
      {
        sleep_enable();
        sei();
        sleep_cpu();
        sleep_disable();
      }
      sei();
Работает как надо...
Рекомендую ознакомиться.

Вы codevision используете? Если да, то поскорее бросайте это занятие и переходите на avr-gcc (без шуток).
zombi
Цитата(elusive @ Feb 19 2013, 09:08) *
и во второй раз процессор проснуться не может.

Может в обработчике напутали чего?
elusive
Цитата(zombi @ Feb 19 2013, 13:55) *
Может в обработчике напутали чего?


А, я понял... Надо было перед самым Set_SE ставить, да еще с переменной таймера напутал. В общем, все нормально работает, как и должно. Спасибо!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.