0 / 0 / 0
Регистрация: 07.04.2014
Сообщений: 137
|
|
1 | |
Пробуждение по watchdog15.04.2017, 21:43. Показов 6163. Ответов 9
Метки нет (Все метки)
Доброго времени суток.
На старом АТ90S нужно уйти в сон, проснуться по watchdog, убедиться что событие не произошло, и опять уйти в сон. Делаю так: Код
.def flags =r17 #define yes_pack flags,1 .cseg ; много всякой инициализации outp MCUCR,(1<<SE)|(0<<SM) ; Change Idle Mode (макрос) outp WDTCR, (0<<WDTOE)|(1<<WDE)|(1<<WDP2)|(1<<WDP1)|(1<<WDP0) ; (макрос) Woyt: WDR sleep sbrs yes_pack ; проснулись смотрим событие rjmp Woyt cbr yes_pack sbi Status_Led ; программа пошла дальше Читал http://we.iosyitistromyss.ru/AVR/avr-po ... -spat.html , но все вроде как надо.
0
|
15.04.2017, 21:43 | |
Ответы с готовыми решениями:
9
Пробуждение приложения Самопроизвольное пробуждение MPU6050 пробуждение и сон Пробуждение ПК из режима сна |
0 / 0 / 0
Регистрация: 28.01.2012
Сообщений: 499
|
|
16.04.2017, 01:05 | 2 |
Неправильно куришь ДШ.
Сторожевой таймер (СТ) старых AVR перезапускает ядро МК с адреса 0. Даже не всякие "новые" могут что-то другое. Например, СТ Мега8 делает тоже самое, что и AT90S. А Tiny2313 можно настроить еще и на обработку прерывания. Т.е. изменить событию СТ вектор прерывания. В статье по ссылке явно же указано "ISR (WDT_vect)". Я хоть и не чирикаю, но приведенная запись явно указывает, что СТ (WDT) в данном примере вызовет процедуру обработки прерывания, а не сбросит программный счетчик в ноль.
0
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 155
|
|
16.04.2017, 01:07 | 3 |
еще tiny13A умеет так
0
|
0 / 0 / 0
Регистрация: 28.01.2012
Сообщений: 499
|
|
16.04.2017, 01:12 | 4 |
Сообщение от myshomy984
0
|
0 / 0 / 0
Регистрация: 31.01.2013
Сообщений: 1,625
|
|
16.04.2017, 01:51 | 5 |
В меге8 единственный вариант - это после сброса анализировать причину сброса в регистре MCUCSR, но я где-то вычитал, что способ не гарантирует надежности, поэтому я от него отказался. Кроме того, оказалось геморно объяснить компилятору, что мне надо использовать переменные без инициализации, в которых бы хранилось состояние программы до сброса. Когда мне понадобилось минимизировать ток потребления в спящем режиме, но чтобы МК бы делал что-то полезное, я соорудил внешний генератор, который подавал прерывание 10 раз в секунду. Общее потребление составило около 15 мкА. Но лучше взять МК, который умеет прерываться по WDT - без лишних деталей и хлопот.
0
|
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
|
|
16.04.2017, 07:39 | 6 |
"геморно объяснить"
Сделал бы asm-ую вставку да и всё
0
|
0 / 0 / 0
Регистрация: 07.04.2014
Сообщений: 137
|
|
16.04.2017, 08:59 | 7 |
Сообщение от Fohyvis
0
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,864
|
|
16.04.2017, 10:03 | 8 |
Дык собака - она и есть собака, она для конкретных задач сделана (ребутнуться, если мк завис).
Навороты (типа возможности повесить на прерывание) - это именно навороты для нецелевого использования. А просто выход из sleep по watchdog выглядит вообще беспределом. Впрочем, на асме вообще не вижу проблемы. Можете даже реализовать именно так, как у вас сейчас код устроен: 1. Пишете процедуру, сохраняющую SP в память по заданному адресу и пишущую рядом "нигическое число" (а потом таки уходящую в сон) 2. Вместо sleep делаете call в эту процедуру 3. На risit проверяете нигическое число, если совпало - восстанавливаете SP и ret, иначе продолжаете инициализацию.
0
|
0 / 0 / 0
Регистрация: 31.01.2013
Сообщений: 1,625
|
|
16.04.2017, 10:28 | 9 |
Сообщение от oomomstir
0
|
0 / 0 / 0
Регистрация: 28.01.2012
Сообщений: 499
|
|
16.04.2017, 18:14 | 10 |
Сообщение от Kmusmos
0
|
16.04.2017, 18:14 | |
16.04.2017, 18:14 | |
Помогаю со студенческими работами здесь
10
Планировщик заданий (Пробуждение ПК из сна) Планировщик заданий - пробуждение компьютера Пробуждение микроконтроллера по прерыванию с АЦП Atmega 324PA UART и пробуждение. Не работает пробуждение по расписанию в Windows 7 с grub2 Как отключить пробуждение компьютера по таймерам? Пробуждение STM32F401 по временному интервалу (РЕШЕНО) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |