реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Atmega128 спит (должна спать)
elusive
сообщение Feb 19 2013, 06:08
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 26-05-10
Пользователь №: 57 544



Нужно усыплять 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 она благополучно продолжает пахать! почему??

Сообщение отредактировал elusive - Feb 19 2013, 06:08
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 19 2013, 06:22
Сообщение #2


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата из 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 (без шуток).


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
zombi
сообщение Feb 19 2013, 07:55
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Цитата(elusive @ Feb 19 2013, 09:08) *
и во второй раз процессор проснуться не может.

Может в обработчике напутали чего?
Go to the top of the page
 
+Quote Post
elusive
сообщение Feb 19 2013, 09:15
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 26-05-10
Пользователь №: 57 544



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


А, я понял... Надо было перед самым Set_SE ставить, да еще с переменной таймера напутал. В общем, все нормально работает, как и должно. Спасибо!
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th June 2025 - 03:01
Рейтинг@Mail.ru


Страница сгенерированна за 0.04068 секунд с 7
ELECTRONIX ©2004-2016