|
Неправильная работа Watch Dog Timer'a, WDT не работает |
|
|
|
Jun 27 2013, 08:24
|
Участник

Группа: Участник
Сообщений: 39
Регистрация: 19-12-08
Из: г.Северодонецк, Украина
Пользователь №: 42 608

|
Цитата(zombi @ Jun 27 2013, 00:28)  Если всё действительно так как Вы пишете то я в такой ситуации поступил бы след. образом. При условии что незакоченная инициализация LCD не приведёт к его порче. Т.е. когда мозг отказывается понимать происходящее а глаза не видят ошибку Закомментировал бы всю программу инициализации LCD и начал бы поочерёдно последовательно открывать по одной строке/команде проверяя после этого работоспособность. В конце концов обязательно найдёте ту самую виновницу... В своём посте чуть выше я писал, что содержимое функции инициализации LCD вообще не имеет значения. Я именно закомментировал ВСЕ строки в этой функции, оставил только вход и выход, и получил зависание. Я сам в шоке  Дело даже не в работоспособности/неработоспособности LCD в устройстве при отладке. Даже без функции инициализации всё работает на ура! При этом сама функция весьма простая, я её выкладывал. Просто - чудеса (он в чудеса не верит), я бы сам не поверил.
Сообщение отредактировал SerSh - Jun 27 2013, 08:28
|
|
|
|
|
Jun 27 2013, 10:34
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(zombi @ Jun 27 2013, 12:43)  Это ж бред. Вы сильно всё упростили. Выполнение некой функции занимает определенное время. Убрав вызов этой функции Вы измените временнЫе соотношения между наступлением неких событий. В коде присутствует некая ошибка, которая проявляется именно при наступлении определённых событий в неком, конкретном временнОм интервале. Меняя местами вызовы функций ТС изменяет эти временнЫе соотношения. На время тестирования устройства те самые "нехорошие" события разошлись во времени, но не факт, что через продолжительное время эти "нехорошие" события вновь не "сойдутся"... Так что, по большому счету, перестановка местами вызовов функций проблему не решает. И дело здесь, возможно, и не в инициализации LCD вовсе. Хотя и в такой "обсосанной" со всех старон теме, как инициализация LCD, ТС умудрился "накосячить"... Если у ТС LCD на HD44780, то "невооруженным взглядом" видны отклонения в коде от DS - они остались после исправлений с направлением передачи данных по шине данных. Вероятно, кроме LCD в изделии присутствуют и др компоненты, с которыми взаимодействует МК. Возможны "косяки" и при работе с ними... Заметил, что "баги" давольно "прочно" поселяются с частях программ, "кочующих" из проекта в проект годами. С трудом вериться, что в коде, "проверенном" не одним проектом, могут быть какие-то ошибки... Ан - могут ! Однажды я нашёл ошибку в коде "благополучно" применявшимся 10 лет ! Поиск в программе ошибок, связанных с временнЫм соотношением между наступлением неких событий - дело трудное и не предсказуемое по результату...
|
|
|
|
|
Jun 27 2013, 19:21
|
Участник

Группа: Участник
Сообщений: 39
Регистрация: 19-12-08
Из: г.Северодонецк, Украина
Пользователь №: 42 608

|
Цитата(zombi @ Jun 27 2013, 11:43)  Это ж бред. Вы думаете, что я не понимаю, что это похоже на бред? В своём посте чуть выше я написал о своих опасениях на этот счёт. Как пишет Палыч, очень возможно, что сейчас купированные симптомы потом вылезут где-то в другом месте. Что сейчас делать я не знаю, потому и обратился за помощью на форум. Я над этой проблемой ломаю голову уже третью неделю. Я ведь уже всё главное в программе сделал, а там куча разного железа: заняты все СОМ-порты, SPI, все таймеры... (не буду загружать). Короче, я думал, что уже включу WDT, и всё. Включил и всё... пропало! Тут только всё и началось. Если будет желание посмотрите сами на инициализацию. В комментах я отметил как было вначале, когда всё зависало.
Прикрепленные файлы
START.RAR ( 63.9 килобайт )
Кол-во скачиваний: 22
|
|
|
|
|
Apr 1 2015, 10:56
|
Участник

Группа: Участник
Сообщений: 19
Регистрация: 2-02-05
Пользователь №: 2 385

|
Та же песня! ATMega88 после интервала для срабатывания Watchdog происходит полное зависание контроллера, выводы переходят в z состояние и всё, прога не стартует заново. Код был портирован из ICCAVR где нормально работал в AtmelStudio с WinAVR, где и начались чудеса. Симптомы полностью соответствуют указанным ранее, питание в норме, BOD включен, BOOTRST в 1 и.т.д. Upd Нашел! Если инициализация watchdog происходит перед вызовом "_delay_ms(100)" (это из delay.h от winavr), то watchdog работает корректно, при превышении интервала происходит нормальный сброс контроллера. Если инициализацию поставить после этой задержки, то сброс по watchdog не происходит, все виснет намертво! Дальше разбираться не стал, некогда. Когда код был под ICCAVR задержка там была реализована другим образом и проблем не возникало, инициализировать watchdog можно было в любом месте программы. Думаю что это компилятор зараза! (Оптимизация стоит на -O2)
Сообщение отредактировал berberber - Apr 1 2015, 11:02
|
|
|
|
|
Apr 1 2015, 16:06
|
Местный
  
Группа: Участник
Сообщений: 333
Регистрация: 19-12-13
Из: Новосибирск
Пользователь №: 79 709

|
ТС, вам нужно сделать переменную в ОЗУ. И придумываем значение. Пусть будет 0xAA. В начале программы делаем следующее: проверяем переменную. Если переменная не равна 0xAA, делаем то что и должны в начале программы, инициализируем переменные, ввод-вывод, устройства, устанавливаем значение 0xAA. Если переменная равна 0xAA, то в обязательном порядке заново инициализируем то, что должно инициализироваться, дисплей к примеру. Поясняю: если происходит сброс по сторожевому значению, то в ОЗУ остались какие-то рабочие значения, из-за которых и происходит затык МК. Программа ведет себя так, как будто сброса не было. В ОЗУ остались установленные флаги, состояния. Работа с дисплеем у вас идет с опросом флага ожидания. И скорее всего, заглючивший дисплей после сброса - виновник зависания. Или еще какое устройство, которое инициализируется при включении устройства. Готовьте коньяк для Сергея.
Сообщение отредактировал demiurg1978 - Apr 1 2015, 16:07
|
|
|
|
|
Apr 2 2015, 08:47
|
Участник

Группа: Участник
Сообщений: 19
Регистрация: 2-02-05
Пользователь №: 2 385

|
Цитата(Сергей Борщ @ Apr 1 2015, 14:22)  я доказываю невиновность компилятора, а вы ставите бутылку коньяка Коньяк на доказательства менять не стану, он мне ближе к сердцу Проблема для меня потеряла актуальность, поскольку я ее обошел, но осадочек остался Кому интересно, прилагаю упрощенный пример: Если сперва идет задержка, потом инициализация watchdog, получаем полный висяк через 2 секунды. Если их поменять местами, каждые 2 секунды происходит нормальный сброс через watchdog. Код #include <avr/io.h> #include <avr/wdt.h> #include <util/delay.h>
int main(void) { _delay_ms(100);//delay 100ms wdt_reset(); WDTCSR|=(1<<WDCE)|(1<<WDE); WDTCSR = 0x0F;//watchdog init DDRD=0x01;PORTD=0x01;//LED ON while(1); }
|
|
|
|
|
Apr 2 2015, 09:03
|

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

|
Цитата(berberber @ Apr 2 2015, 10:47)  Кому интересно, прилагаю упрощенный пример: Чтобы подтвердить вину компилятора нужны как минимум листинги одного и второго вариантов. добавлено: Цитата(berberber @ Apr 2 2015, 10:47)  Если сперва идет задержка, потом инициализация watchdog, получаем полный висяк через 2 секунды. А собака случайно принудительно не включена фузами? Тогда, возможно, она успевает сработать во время задержки и программа просто не успевает дойти до перенастройки собаки. И кроме того, если предыдущий сброс был по собаке, то установившийся бит WDRF автоматически выставляет WDE. Это означает, что после сброса по собаке программа работает с включенной собакой с минимальным периодом в 16 мс. И если ее не перенастроить, через 16 мс произойдет повторный сброс. Что мы и наблюдаем, если до перенастройки стоит задержка много больше этих 16 мс - 2 секунды до первого сброса и потом постоянние повторные сбросы не доходя до выполнения полезных действий. Цитата • 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 start-up after the failure. Итак, компилятор снова оказался не при чем, виноват оказался программист, невнимательно читавший документацию. Как и в 99,9% остальных случаев, когда обвиняют компилятор. Надо было насчет коньяка додавить
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Apr 2 2015, 10:14
|
Местный
  
Группа: Участник
Сообщений: 333
Регистрация: 19-12-13
Из: Новосибирск
Пользователь №: 79 709

|
Цитата(berberber @ Apr 2 2015, 14:47)  Проблема для меня потеряла актуальность, поскольку я ее обошел, но осадочек остался  Вот это и плохо, что вы сейчас ее обошли не разобравшись. И когда-нибудь она опять всплывет. Кстати, да. Если у вас перенастраивается сторожевой таймер, то Сергей Борщ прав.
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|