Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Продукция MICROCHIP

Продукция MICROCHIP Технические вопросы по всей продукции Microchip

Ответ
 
Опции темы Опции просмотра
Старый 05.02.2009, 08:47   #1
РоманБ
Junior Member
 
Регистрация: 05.02.2009
Сообщений: 12
Вес репутации: 100/34
РоманБ will become famous soon enoughРоманБ will become famous soon enough
По умолчанию Как правильно использовать WDT

Я начинающий программист. Как использовать ст таймер в простом случае я понимаю…
А какой алгоритм настройки и работы таймера в следующем случае.
Допустим, цикл программы составляет месяц. ПИК после сброса отрабатывает часть кода (настройка, опрос и выдача требуемых сигналов) и засыпает на несколько дней. Потом просыпается, отрабатывает очередную порцию или цикл и снова засыпает.
В простом случае срабатывания сторожевого таймера программа начнёт исполняться заново, что не подходит. Требуется продолжение исполнения кода с того участка где произошел сбой.
У меня мысль такая: при входе в определённый участок кода устанавливать флаги признаки (в оперативной памяти) этого участка и в случае вылета, в обработчике ст таймера анализировать их, что бы иметь возможность вернуться обратно.
Прав ли я? Как в таком случае поступают профи?
И ещё вопрос на эту тему.
Я организую задержку допустим на 2 сек. (вхожу в цикл и жду когда таймер отсчитает эти 2 сек). WDT сбрасывает систему через 1 сек. Тоесть я его должен постоянно сбрасывать в цикле ожидания... А если вдруг у меня остановится таймер, то я останусь в цикле ожидания. Как быть в этом случае?
РоманБ вне форума   Ответить с цитированием
Старый 05.02.2009, 08:54   #2
const
Senior Member
 
Регистрация: 25.02.2007
Адрес: Новосибирск
Возраст: 48
Сообщений: 423
Вес репутации: 156/45
const has a spectacular aura aboutconst has a spectacular aura about
Отправить сообщение для const с помощью ICQ
По умолчанию Ответ: Как правильно использовать WDT

Период WDT ограничен.
Требуется хранить состояние, по пробуждению контролировать соответствующие биты регистра STATUS для контроля нормальности пробуждения.
По пробуждению отсчитывать время (оно будет нестабильным) и ветвиться по состоянию.
Делать это надо в привязке к конкретному камню, предварительно ознакомившись с даташитом и апликэйшин нотысами по этой теме.
const вне форума   Ответить с цитированием
Старый 05.02.2009, 09:58   #3
РоманБ
Junior Member
 
Регистрация: 05.02.2009
Сообщений: 12
Вес репутации: 100/34
РоманБ will become famous soon enoughРоманБ will become famous soon enough
По умолчанию Ответ: Как правильно использовать WDT

Контроллер PIC12F629. Согласно документации максимальное время ст таймера 2.3 секунды. Они то мне и нужны...
РоманБ вне форума   Ответить с цитированием
Старый 05.02.2009, 10:01   #4
РоманБ
Junior Member
 
Регистрация: 05.02.2009
Сообщений: 12
Вес репутации: 100/34
РоманБ will become famous soon enoughРоманБ will become famous soon enough
По умолчанию Ответ: Как правильно использовать WDT

Маленькое уточнение на эту фразу "Я организую задержку допустим на 2 сек. (вхожу в цикл и жду когда таймер отсчитает эти 2 сек)..... "
Задержка организуется интервальным таймером, например TMR1
РоманБ вне форума   Ответить с цитированием
Старый 05.02.2009, 10:12   #5
Bill
Senior Member
 
Аватар для Bill
 
Регистрация: 26.02.2007
Адрес: Челябинск
Возраст: 67
Сообщений: 2,215
Вес репутации: 1898/80
Bill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant future
По умолчанию Вообще-то WDT предназначен для

Цитата:
Сообщение от РоманБ Посмотреть сообщение
Я начинающий программист. Как использовать ст таймер в простом случае я понимаю…
А какой алгоритм настройки и работы таймера в следующем случае.
Допустим, цикл программы составляет месяц. ПИК после сброса отрабатывает часть кода (настройка, опрос и выдача требуемых сигналов) и засыпает на несколько дней. Потом просыпается, отрабатывает очередную порцию или цикл и снова засыпает.
В простом случае срабатывания сторожевого таймера программа начнёт исполняться заново, что не подходит. Требуется продолжение исполнения кода с того участка где произошел сбой.
У меня мысль такая: при входе в определённый участок кода устанавливать флаги признаки (в оперативной памяти) этого участка и в случае вылета, в обработчике ст таймера анализировать их, что бы иметь возможность вернуться обратно.
Прав ли я? Как в таком случае поступают профи?
И ещё вопрос на эту тему.
Я организую задержку допустим на 2 сек. (вхожу в цикл и жду когда таймер отсчитает эти 2 сек). WDT сбрасывает систему через 1 сек. Тоесть я его должен постоянно сбрасывать в цикле ожидания... А если вдруг у меня остановится таймер, то я останусь в цикле ожидания. Как быть в этом случае?
принудительного сброса программы в случае ее зависания, когда система не способна реагировать на какие-либо иные сигналы. Естественно, если WDT включен его нужно в программе периодически сбрасывать. С другой стороны, контроллеру всегда известно от чего произошел сброс программы: при включении питания или от WDT. А поскольку при сбросе от WDT состояния регистров не изменяются и известны, то можно исключить их инициализацию.
Другой вопрос - каким образом Вы хотите перезапустить программу через неделю, месяц... Может быть лучше для этих целей использовать инструкцию sleep? Или нет?
Bill вне форума   Ответить с цитированием
Старый 05.02.2009, 11:05   #6
z0rgvi
Senior Member
 
Регистрация: 03.12.2008
Адрес: РФ, Санкт-Петербург
Возраст: 32
Сообщений: 518
Вес репутации: 242/40
z0rgvi has a spectacular aura aboutz0rgvi has a spectacular aura aboutz0rgvi has a spectacular aura about
По умолчанию Ответ: Как правильно использовать WDT

Цитата:
Сообщение от РоманБ Посмотреть сообщение
Контроллер PIC12F629. Согласно документации максимальное время ст таймера 2.3 секунды. Они то мне и нужны...
а какая точность необходима?
насколько я знаю, у PIC12F629 боооольшой разброс (больше 10%) частоты генератора вотчдога
z0rgvi вне форума   Ответить с цитированием
Старый 05.02.2009, 12:28   #7
РоманБ
Junior Member
 
Регистрация: 05.02.2009
Сообщений: 12
Вес репутации: 100/34
РоманБ will become famous soon enoughРоманБ will become famous soon enough
По умолчанию Ответ: Как правильно использовать WDT

Для перезапуска через несколько дней и используется инструкция СЛИП. МК засыпает, просыпается от ст таймера, вычитает счётчик, снова засыпает и так до обнуления счетчика (программного). Счетчик обнулился, исполняется очередная порция кода, затем снова засыпает. Точности ст таймера вполне достаточно...
РоманБ вне форума   Ответить с цитированием
Старый 05.02.2009, 12:37   #8
tester
Super Moderator
 
Аватар для tester
 
Регистрация: 28.02.2007
Возраст: 40
Сообщений: 3,577
Вес репутации: 4386/118
tester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond repute
По умолчанию Ответ: Как правильно использовать WDT

Цитата:
Требуется продолжение исполнения кода с того участка где произошел сбой.
У меня мысль такая: при входе в определённый участок кода устанавливать флаги признаки (в оперативной памяти) этого участка и в случае вылета, в обработчике ст таймера анализировать их, что бы иметь возможность вернуться обратно.
Тут нужно определиться, что Вы называете сбоем. Если произошел сбой (т.е. программа перестала работать по заданному алгоритму), то возвращние на тот же участок как-то непонятно...
Но в целом - другого пути нет, т.е. нужно сохранять, как Вы пишете, флаги и по ним после ресета определять из какого места вылетели.



Цитата:
Я организую задержку допустим на 2 сек. (вхожу в цикл и жду когда таймер отсчитает эти 2 сек). WDT сбрасывает систему через 1 сек. Тоесть я его должен постоянно сбрасывать в цикле ожидания... А если вдруг у меня остановится таймер, то я останусь в цикле ожидания. Как быть в этом случае?
Вообще-то, безусловно сбрасывать WDT не рекомендется, тем более в задержках. Программа при "хорошем" сбое может попасть в этот участок кода с неинициализированным таймером и зависнет там навсегда.

Кстати, саму задержку можно формировать с помощью WDT, если точность не критична. Понижать период WDT и уходить в слип. Например, для задержки в 2 сек:
Код:
    char n;
    char option_temp;
 
    option_temp = OPTION;
    OPTION &= 0xF8;
    OPTION |= 0x04;  // prs = 16, period = 288 ms
    n = 7;
    do {
        SLEEP();
        CLRWDT();
    } while (--n);
    OPTION = option_temp;
tester вне форума   Ответить с цитированием
Старый 05.02.2009, 12:41   #9
tester
Super Moderator
 
Аватар для tester
 
Регистрация: 28.02.2007
Возраст: 40
Сообщений: 3,577
Вес репутации: 4386/118
tester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond repute
По умолчанию Ответ: Как правильно использовать WDT

Цитата:
Сообщение от РоманБ Посмотреть сообщение
Для перезапуска через несколько дней и используется инструкция СЛИП. МК засыпает, просыпается от ст таймера, вычитает счётчик, снова засыпает и так до обнуления счетчика (программного). Счетчик обнулился, исполняется очередная порция кода, затем снова засыпает. Точности ст таймера вполне достаточно...
Кстати, даже при дежурных просыпаниях рекомендуется проверять состояние ПИКа: правильную настройку периферии, правильное содержание каких-то критических переменных и т.д. Если что-то не так, то делаем принудительный сброс ("goto $", пока WDT не сделает ресет). В идеале еще сигнализируем об ошибке.
tester вне форума   Ответить с цитированием
Старый 05.02.2009, 12:44   #10
AleksBak
Senior Member
 
Аватар для AleksBak
 
Регистрация: 27.02.2007
Адрес: г. Баку
Сообщений: 3,125
Вес репутации: 2885/99
AleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond repute
По умолчанию Ответ: Как правильно использовать WDT

Цитата:
Сообщение от РоманБ Посмотреть сообщение
Я начинающий программист. Как использовать ст таймер в простом случае я понимаю…
А какой алгоритм настройки и работы таймера в следующем случае.
Допустим, цикл программы составляет месяц. ПИК после сброса отрабатывает часть кода (настройка, опрос и выдача требуемых сигналов) и засыпает на несколько дней. Потом просыпается, отрабатывает очередную порцию или цикл и снова засыпает.
В простом случае срабатывания сторожевого таймера программа начнёт исполняться заново, что не подходит. Требуется продолжение исполнения кода с того участка где произошел сбой.
У меня мысль такая: при входе в определённый участок кода устанавливать флаги признаки (в оперативной памяти) этого участка и в случае вылета, в обработчике ст таймера анализировать их, что бы иметь возможность вернуться обратно.
Прав ли я? Как в таком случае поступают профи?...
Есть ПИКи с такими флагами - указателями по какой причине произошел сброс. В 629-м по-моему нет таких флагов(надо уточнить по описанию) - тогда придется что-то похожее на Ваши мысли(см. цитату) реализовывать.
Цитата:
И ещё вопрос на эту тему.
Я организую задержку допустим на 2 сек. (вхожу в цикл и жду когда таймер отсчитает эти 2 сек). WDT сбрасывает систему через 1 сек. Тоесть я его должен постоянно сбрасывать в цикле ожидания... А если вдруг у меня остановится таймер, то я останусь в цикле ожидания. Как быть в этом случае?

Если таймер у ПИКа останавливается внепланово, то это уже воздействие какое-то внешнее тут. Хотя может бть и помеха. Но тогда ПИК по идее зависнет и WDT сработает. Может ввести ограничение на кол-во сбросов WDT и если оно превышено, то соотв. переход?
AleksBak вне форума   Ответить с цитированием
Старый 05.02.2009, 13:36   #11
РоманБ
Junior Member
 
Регистрация: 05.02.2009
Сообщений: 12
Вес репутации: 100/34
РоманБ will become famous soon enoughРоманБ will become famous soon enough
По умолчанию Ответ: Как правильно использовать WDT

Тестер, спасибо за ответы.
Немного комментариев.
Значит с флагами моя мысль правильная... Возвратиться на тот же участок не проблема, эти участки не такие критичные на сбой...

"Кстати, саму задержку можно формировать с помощью WDT..."
Я так и делаю когда нужно на несколько дней или больше одной минуты... (только я пишу на ассемблере). Но бывает нужна точная задержка, например на 10 сек. И приходится входить в цикл ожидания... где и сбрасывается постоянно ст таймер.
Вот поэтому и поднял вопрос, как в таких случаях поступают те кто "на этом съел собаку (сторожевую)"

П.С. Создается впечатление что я задал не удачный вопрос, так как ощущается нехватка чего-то в ответах...
РоманБ вне форума   Ответить с цитированием
Старый 05.02.2009, 13:53   #12
picavr
Senior Member
 
Регистрация: 13.02.2008
Сообщений: 168
Вес репутации: 117/38
picavr will become famous soon enoughpicavr will become famous soon enough
По умолчанию Ответ: Как правильно использовать WDT

Цитата:
Сообщение от РоманБ Посмотреть сообщение
Допустим, цикл программы составляет месяц. ПИК после сброса отрабатывает часть кода (настройка, опрос и выдача требуемых сигналов) и засыпает на несколько дней. Потом просыпается, отрабатывает очередную порцию или цикл и снова засыпает.
Если не нужна большая точность или число устройств невелико (можно константами подобрать требуемый период срабатывания) то можно извратиться вот так. Я запустил WDT с максимальным периодом и использовал WDT вместо обычного таймера. Как период прерывания.

То есть, спит скажем 2,5 сек и несколько микросек анализ состояния флагов где находится алгоритм и отсчёт счётчика периода обработки , затем спать. Если счётчик достиг требуемого времени - выполняем код и снова спать. Большую часть времени спим.
Получилось незавешиваемое устройство ))))

Цитата:
Сообщение от РоманБ Посмотреть сообщение
В простом случае срабатывания сторожевого таймера программа начнёт исполняться заново, что не подходит. Требуется продолжение исполнения кода с того участка где произошел сбой. У меня мысль такая: при входе в определённый участок кода устанавливать флаги признаки (в оперативной памяти) этого участка и в случае вылета, в обработчике ст таймера анализировать их, что бы иметь возможность вернуться обратно.
Абсолютно в дырочку!
picavr вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как правильно паять СМД чипы ? Balanser Печатный монтаж 43 08.02.2011 11:17
Как правильно в MCC18 v3.13 ? Sancho Продукция MICROCHIP 9 18.12.2007 22:37
Господа, научите как правильно реализовывать синхронизацию dynaco Общетехнические вопросы 18 21.07.2007 10:31
Как правильно оформить массив. Andrey Продукция MICROCHIP 11 23.05.2007 09:37


Часовой пояс GMT +3, время: 21:38.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd. Перевод: zCarot