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

 
 
 
Reply to this topicStart new topic
> ATMega328P WatchDog
Ioann_II
сообщение Mar 12 2017, 02:29
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 7-06-05
Пользователь №: 5 797



Здравствуйте, Уважаемые коллеги.

Столкнулся с такой вот проблемой - не получается запустить сторожевой таймер в режиме Сброс.
Делаю так:

Код
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();      // разрешить прерывания

То, не работает. Точнее, срабатывает, но вместо перезапуска, останавливает работу МК. Далее помогает только если снять питание и подать заново.

Стакливался кто? или может, что-то не так делаю???

Спасибо.

Сообщение отредактировал IgorKossak - Mar 12 2017, 15:31
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!
Go to the top of the page
 
+Quote Post
controller_m30
сообщение Mar 15 2017, 03:17
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 356
Регистрация: 24-02-09
Пользователь №: 45 309



ATMega328P установлена на Arduino? Если да, то в интернете пишут что есть проблема с встроенным загрузчиком (geektimes), который и не даёт правильно работать WatchDog-у.

В отличие от обычного контроллера, который мы покупаем "чистым", в изделиях Arduino вшит загрузчик. Плюс его в том, что для программирования достаточно любого USB-UART переходника, с сигналами RX, TX. А минус - что ещё перед запуском основной программы которую мы пишем, этот загрузчик успевает настроить процессор удобным для себя образом, что в некоторых случаях может мешать работе загруженной программы.

Сообщение отредактировал controller_m30 - Mar 15 2017, 10:50
Go to the top of the page
 
+Quote Post
Ioann_II
сообщение Mar 15 2017, 23:02
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 7-06-05
Пользователь №: 5 797



Цитата(controller_m30 @ Mar 15 2017, 07:17) *
ATMega328P установлена на Arduino? Если да, то в интернете пишут что есть проблема с встроенным загрузчиком (geektimes), который и не даёт правильно работать WatchDog-у.

В отличие от обычного контроллера, который мы покупаем "чистым", в изделиях Arduino вшит загрузчик. Плюс его в том, что для программирования достаточно любого USB-UART переходника, с сигналами RX, TX. А минус - что ещё перед запуском основной программы которую мы пишем, этот загрузчик успевает настроить процессор удобным для себя образом, что в некоторых случаях может мешать работе загруженной программы.


Не установлена, загрузчика нет.
Go to the top of the page
 
+Quote Post
aiwa
сообщение Mar 16 2017, 09:04
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682



Цитата(Ioann_II @ Mar 12 2017, 04:29) *
То, не работает. Точнее, срабатывает, но вместо перезапуска, останавливает работу МК. Далее помогает только если снять питание и подать заново.


Как Вы узнаете, что не срабатывает, а останавливает работу МК?
Может он, например, срабатывает циклически.
Сначала проверьте снимаете ли Вы собачий флаг - в доке рекомендация его очищать даже если WatchDog не используется.

Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 16 2017, 09:27
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (aiwa @ Mar 16 2017, 11:04) *
Может он, например, срабатывает циклически.
Да, есть там забавная особенность - WDTCSR не меняется, пока установлен флаг сработавшей собаки. Поэтому если перед записью в WDTCSR не сбросить флаг, то после сброса по собаке WDTCSR устанавливается на какой-то небольшой период, а повторная запись в него не работает, поскольку стоит флаг. И программа сбрасывается, не успев дойти до WDR().


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Ioann_II
сообщение Mar 18 2017, 01:12
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 7-06-05
Пользователь №: 5 797



Цитата(aiwa @ Mar 16 2017, 12:04) *
Как Вы узнаете, что не срабатывает, а останавливает работу МК?
Может он, например, срабатывает циклически.
Сначала проверьте снимаете ли Вы собачий флаг - в доке рекомендация его очищать даже если 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", которая через полсекунды гаснет.... И ВСЁ!!!! более ничего не происходит.
Отсюда делаю вывод, что в режиме сброса у меня он не заработал.

Сообщение отредактировал IgorKossak - Mar 18 2017, 15:05
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 18 2017, 08:15
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Ioann_II @ Mar 18 2017, 03:12) *
Если включаю в режиме сброса, то вижу надпись "INIT", которая через полсекунды гаснет.... И ВСЁ!!!! более ничего не происходит.
Еще раз внимательно перечитайте мое предыдущее сообщение и покажите настройку собаки.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Ioann_II
сообщение Mar 18 2017, 11:13
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 7-06-05
Пользователь №: 5 797



Цитата(Сергей Борщ @ Mar 18 2017, 11:15) *
Еще раз внимательно перечитайте мое предыдущее сообщение и покажите настройку собаки.

Вот настройки для режима прерываний - работает.
Код
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)

Сообщение отредактировал Ioann_II - Mar 18 2017, 11:16
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 18 2017, 12:29
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Ioann_II @ Mar 18 2017, 13:13) *
Про флаг: как надо? При инициализации сделать сначала это?:
CODE
MCUSR = MCUSR &~(1<<WDRF);
Да, это. Но не так. Флаги в этом регистре сбрасываются так:
CODE
MCUSR = ~(1<<WDRF);


QUOTE (Ioann_II @ Mar 18 2017, 13:13) *
Для ATMega8 аналогичным образом делал - работало... (в смысле не трогая регистр MCUSR)
Может быть потому, что для этого контроллера надо читать документацию на ATmega328?

QUOTE
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.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Ioann_II
сообщение Mar 18 2017, 12:56
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 7-06-05
Пользователь №: 5 797



Цитата(Сергей Борщ @ Mar 18 2017, 15:29) *
Может быть потому, что для этого контроллера надо читать документацию на ATmega328?

Да, получается что недочитал... Просто раньше работал с ATMega8, а на этот лишь бегло глянул документацию...
Т.е., если я верно понял, то получается так, что раз я этот бит не чистил, то WatchDog начинал посылать бесконечную серию Reset.... и контроллер не работал...
Спасибо, что ткнули носом.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 18 2017, 14:46
Сообщение #11


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Ioann_II @ Mar 18 2017, 14:56) *
Т.е., если я верно понял, то получается так, что раз я этот бит не чистил, то WatchDog начинал посылать бесконечную серию Reset..
Он после сброса оказывался включен с периодом 16 мс. И если за это время вы его не перенастроите - получите новый сброс.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Ioann_II
сообщение Mar 19 2017, 09:09
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 7-06-05
Пользователь №: 5 797



Цитата(Сергей Борщ @ Mar 18 2017, 17:46) *
Он после сброса оказывался включен с периодом 16 мс. И если за это время вы его не перенастроите - получите новый сброс.

Спасибо. Всё получилось.
Эти 16мс подвели. У меня сначала стояла инициализация LCD, а это где-то 22мс. Теперь сначала настройка WatchDog, а в самом конце - LCD. Работает.
Go to the top of the page
 
+Quote Post

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

 


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


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