Ioann_II 0 12 марта, 2017 Опубликовано 12 марта, 2017 (изменено) · Жалоба Здравствуйте, Уважаемые коллеги. Столкнулся с такой вот проблемой - не получается запустить сторожевой таймер в режиме Сброс. Делаю так: WDR (); // сброс счетчика сторожевого таймера WDTCSR = WDTCSR | (1<<WDCE) | (1<<WDE); // запуск сторожевого таймера с предделителем на 512К (0,55с) WDTCSR = (1<<WDE) | (1<<WDIE) | (1<<WDP2) | (1<<WDP1) | (1<<WDP0); SEI(); // разрешить прерывания Работает в режиме прерываний. Действительно, срабатывает прерывание. Если настраиваю так: WDR (); // сброс счетчика сторожевого таймера WDTCSR = WDTCSR | (1<<WDCE) | (1<<WDE); // запуск сторожевого таймера с предделителем на 512К (0,55с) WDTCSR = (1<<WDE) | (1<<WDP2) | (1<<WDP1) | (1<<WDP0); SEI(); // разрешить прерывания То, не работает. Точнее, срабатывает, но вместо перезапуска, останавливает работу МК. Далее помогает только если снять питание и подать заново. Стакливался кто? или может, что-то не так делаю??? Спасибо. Изменено 12 марта, 2017 пользователем IgorKossak [codebox] для длинного кода, [code] - для короткого! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
controller_m30 1 15 марта, 2017 Опубликовано 15 марта, 2017 (изменено) · Жалоба ATMega328P установлена на Arduino? Если да, то в интернете пишут что есть проблема с встроенным загрузчиком (geektimes), который и не даёт правильно работать WatchDog-у. В отличие от обычного контроллера, который мы покупаем "чистым", в изделиях Arduino вшит загрузчик. Плюс его в том, что для программирования достаточно любого USB-UART переходника, с сигналами RX, TX. А минус - что ещё перед запуском основной программы которую мы пишем, этот загрузчик успевает настроить процессор удобным для себя образом, что в некоторых случаях может мешать работе загруженной программы. Изменено 15 марта, 2017 пользователем controller_m30 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ioann_II 0 15 марта, 2017 Опубликовано 15 марта, 2017 · Жалоба ATMega328P установлена на Arduino? Если да, то в интернете пишут что есть проблема с встроенным загрузчиком (geektimes), который и не даёт правильно работать WatchDog-у. В отличие от обычного контроллера, который мы покупаем "чистым", в изделиях Arduino вшит загрузчик. Плюс его в том, что для программирования достаточно любого USB-UART переходника, с сигналами RX, TX. А минус - что ещё перед запуском основной программы которую мы пишем, этот загрузчик успевает настроить процессор удобным для себя образом, что в некоторых случаях может мешать работе загруженной программы. Не установлена, загрузчика нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aiwa 0 16 марта, 2017 Опубликовано 16 марта, 2017 · Жалоба То, не работает. Точнее, срабатывает, но вместо перезапуска, останавливает работу МК. Далее помогает только если снять питание и подать заново. Как Вы узнаете, что не срабатывает, а останавливает работу МК? Может он, например, срабатывает циклически. Сначала проверьте снимаете ли Вы собачий флаг - в доке рекомендация его очищать даже если WatchDog не используется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 16 марта, 2017 Опубликовано 16 марта, 2017 · Жалоба Может он, например, срабатывает циклически.Да, есть там забавная особенность - WDTCSR не меняется, пока установлен флаг сработавшей собаки. Поэтому если перед записью в WDTCSR не сбросить флаг, то после сброса по собаке WDTCSR устанавливается на какой-то небольшой период, а повторная запись в него не работает, поскольку стоит флаг. И программа сбрасывается, не успев дойти до WDR(). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ioann_II 0 18 марта, 2017 Опубликовано 18 марта, 2017 (изменено) · Жалоба Как Вы узнаете, что не срабатывает, а останавливает работу МК? Может он, например, срабатывает циклически. Сначала проверьте снимаете ли Вы собачий флаг - в доке рекомендация его очищать даже если WatchDog не используется. Инициализацию я уже приводил. Настроен на интервал примерно 0,55с. После неё стоит следующее: LCD_String("INIT",0,0); sleep(3000); LCD_Command(0x01); LCD_String("NO WATHCHDOG!!!",0,0); и #pragma interrupt_handler wdt_isr:iv_WDT void wdt_isr(void) { //watchdog timeout LCD_String("INTERRUPT!!!",0,1); sleep(1000); resetFunc(); } Соответственно, если отключен, то вижу надпись "INIT", через полсекунды "NO WATCHDOG". Если включен в режиме прерываний, то вижу "INIT", затем "INTERRUPT". Когда в прерывании есть resetFunc(), то всё по кругу. Если включаю в режиме сброса, то вижу надпись "INIT", которая через полсекунды гаснет.... И ВСЁ!!!! более ничего не происходит. Отсюда делаю вывод, что в режиме сброса у меня он не заработал. Изменено 18 марта, 2017 пользователем IgorKossak [codebox] для длинного кода, [code] - для короткого! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 18 марта, 2017 Опубликовано 18 марта, 2017 · Жалоба Если включаю в режиме сброса, то вижу надпись "INIT", которая через полсекунды гаснет.... И ВСЁ!!!! более ничего не происходит.Еще раз внимательно перечитайте мое предыдущее сообщение и покажите настройку собаки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ioann_II 0 18 марта, 2017 Опубликовано 18 марта, 2017 (изменено) · Жалоба Еще раз внимательно перечитайте мое предыдущее сообщение и покажите настройку собаки. Вот настройки для режима прерываний - работает. WDR (); // сброс счетчика сторожевого таймера WDTCSR = WDTCSR | (1<<WDCE) | (1<<WDE); // запуск сторожевого таймера с предделителем на 512К (0,55с) WDTCSR = (1<<WDE) | (1<<WDIE) | (1<<WDP2) | (1<<WDP1) | (1<<WDP0); SEI(); // разрешить прерывания А вот настройки для режима сброс - не работает WDR (); // сброс счетчика сторожевого таймера WDTCSR = WDTCSR | (1<<WDCE) | (1<<WDE); // запуск сторожевого таймера с предделителем на 512К (0,55с) WDTCSR = (1<<WDE) | (1<<WDP2) | (1<<WDP1) | (1<<WDP0); SEI(); // разрешить прерывания Про флаг: как надо? При инициализации сделать сначала это?: MCUSR = MCUSR &~(1<<WDRF); Для ATMega8 аналогичным образом делал - работало... (в смысле не трогая регистр MCUSR) Изменено 18 марта, 2017 пользователем Ioann_II Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 18 марта, 2017 Опубликовано 18 марта, 2017 · Жалоба Про флаг: как надо? При инициализации сделать сначала это?: MCUSR = MCUSR &~(1<<WDRF); Да, это. Но не так. Флаги в этом регистре сбрасываются так: MCUSR = ~(1<<WDRF); Для ATMega8 аналогичным образом делал - работало... (в смысле не трогая регистр MCUSR)Может быть потому, что для этого контроллера надо читать документацию на ATmega328? Bit 3 – WDE: Watchdog System Reset Enable WDE is overridden by WDRF in MCUSR. This means that WDE is always set when WDRF is set. To clear WDE, WDRF must be cleared first. This feature ensures multiple resets during conditions causing failure, and a safe startup after the failure. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ioann_II 0 18 марта, 2017 Опубликовано 18 марта, 2017 · Жалоба Может быть потому, что для этого контроллера надо читать документацию на ATmega328? Да, получается что недочитал... Просто раньше работал с ATMega8, а на этот лишь бегло глянул документацию... Т.е., если я верно понял, то получается так, что раз я этот бит не чистил, то WatchDog начинал посылать бесконечную серию Reset.... и контроллер не работал... Спасибо, что ткнули носом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 18 марта, 2017 Опубликовано 18 марта, 2017 · Жалоба Т.е., если я верно понял, то получается так, что раз я этот бит не чистил, то WatchDog начинал посылать бесконечную серию Reset..Он после сброса оказывался включен с периодом 16 мс. И если за это время вы его не перенастроите - получите новый сброс. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ioann_II 0 19 марта, 2017 Опубликовано 19 марта, 2017 · Жалоба Он после сброса оказывался включен с периодом 16 мс. И если за это время вы его не перенастроите - получите новый сброс. Спасибо. Всё получилось. Эти 16мс подвели. У меня сначала стояла инициализация LCD, а это где-то 22мс. Теперь сначала настройка WatchDog, а в самом конце - LCD. Работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться