Отправить AVR в сон на определенное время

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

Re: Отправить AVR в сон на определенное время

Сообщение BCluster »

Почему после вызова sleep программа сразу же переходит в обработчик прерывания по WDT хто знает?
Реклама
Аватара пользователя
md5sum
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

Re: Отправить AVR в сон на определенное время

Сообщение md5sum »

BCluster писал(а):Почему после вызова sleep программа сразу же переходит в обработчик прерывания по WDT хто знает?
Может программист так захотел :))
Код где? :kill:
— Не говорите мне что делать и я не скажу куда Вам идти...
Реклама
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Re: Отправить AVR в сон на определенное время

Сообщение GP1 »

BCluster писал(а):Почему после вызова sleep программа сразу же переходит в обработчик прерывания по WDT хто знает?
может перед сном его надо обнулить?
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

Re: Отправить AVR в сон на определенное время

Сообщение BCluster »

Камень ATMega48
Вот так я вызывайу слип

Код: Выделить всё

...
void delay()
{
    #asm("wdr");
    #asm("sleep")
}
...
Вот так инициализирую собаку и все остальное

Код: Выделить всё

SMCR=0x05;
PRR=0xEE;
WDTCSR=0x39;
WDTCSR=0x61;
Прерывание:

Код: Выделить всё

interrupt [WDT] void wdt_timeout_isr(void)
{
#asm("wdr") 
WDTCSR|=(1<<6);
 
 }
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

Re: Отправить AVR в сон на определенное время

Сообщение BCluster »

если настроить на сброс собаку она сбрасывает контроллер по вызову sleep шо за блин)
Реклама
Аватара пользователя
md5sum
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

Re: Отправить AVR в сон на определенное время

Сообщение md5sum »

BCluster писал(а):Вот так инициализирую собаку и все остальное

Код: Выделить всё

SMCR=0x05;
PRR=0xEE;
WDTCSR=0x39;
WDTCSR=0x61;
А надо:

Код: Выделить всё

WDTCSR=(1<<WDCE)|(1<<WDE);
WDTCSR=(1<<WDIF)|(1<<WDIE)|(1<<WDP3)|(0<<WDCE)|(1<<WDE)|(1<<WDP0);
(1<<WDE) второй раз обязательно (мы ведь разрешаем собаку).
(1<<WDIF) - сброс флага прерывания.
Сброс флага желательно делать всегда при инициализации любого прерывания - будь то собака, таймер или что-то еще...
— Не говорите мне что делать и я не скажу куда Вам идти...
Реклама
Аватара пользователя
md5sum
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

Re: Отправить AVR в сон на определенное время

Сообщение md5sum »

Еще замечание: SMCR=0x05 нужно делать непосредственно перед командой sleep и сразу после пробуждения очищать бит SE
To avoid the MCU entering the sleep mode unless it is the programmer’s
purpose, it is recommended to write the Sleep Enable (SE) bit to one just before the execution of
the SLEEP instruction and to clear it immediately after waking up.

Код: Выделить всё

void delay()
{
    #asm("wdr");
    SMCR=0x05;
    #asm("sleep");
    SMCR=0;
}
— Не говорите мне что делать и я не скажу куда Вам идти...
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

Re: Отправить AVR в сон на определенное время

Сообщение BCluster »

Сделал, теперь на первом слип также вызывает прерывание, а второй усыпляет навсегда))
Аватара пользователя
md5sum
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

Re: Отправить AVR в сон на определенное время

Сообщение md5sum »

BCluster писал(а):Сделал, теперь на первом слип также вызывает прерывание, а второй усыпляет навсегда))
откуда первый и второй слипы :shock:
Код можно полностью? (токо архивом)
— Не говорите мне что делать и я не скажу куда Вам идти...
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

Re: Отправить AVR в сон на определенное время

Сообщение BCluster »

Первый слип выполняем, после него программа идет по новой - следовательно слип еще раз вызывается :)
Аватара пользователя
md5sum
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

Re: Отправить AVR в сон на определенное время

Сообщение md5sum »

BCluster писал(а):Первый слип выполняем, после него программа идет по новой - следовательно слип еще раз вызывается :)
Ну положим программа не идет по новой, а продолжает выполнение со следующего шага после слипа (точнее вернется туда после прерывания). Значит перед вторым слипом не полностью выполнены рекомендации по подготовке ко сну (зубы не почистили, не умылись и т.д.) :))

Зы: надеюсь слип не в прерывании выполняется....
— Не говорите мне что делать и я не скажу куда Вам идти...
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

Re: Отправить AVR в сон на определенное время

Сообщение BCluster »

Ну да, просто программа циклическая, на следующей итерации опять вызывается слип )
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»