|
|
  |
Неправильная работа Watch Dog Timer'a, WDT не работает |
|
|
|
Jun 20 2013, 06:49
|

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

|
Цитата(SerSh @ Jun 20 2013, 10:15)  Закомментировал все команды WDR, но всё осталось по-прежнему: через 2 сек. после старта - завис. Осталось проверить, что WDT без всей остальной части Вашей программы нормально работает (это я Вам давно рекомендавал сделать). Собирите маленький проект, где будет только инициализация WDT (ну, ещё какой либо сигнал, что программа запустилась/перезапустилась). Если этот проектик будет нормально рестартовать через 2 сек, то ошибку нужно искать в остальной части Вашей программы: вероятно, где-то кто-то портит регистр WDTCSR (собственно, WDT m640 и отличается от m64 старшими битами этого регистра - возможностью вместо рестарта генерить прерывание).
|
|
|
|
|
Jun 20 2013, 06:55
|
Участник

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

|
Цитата(Палыч @ Jun 20 2013, 09:49)  Осталось проверить, что WDT без всей остальной части Вашей программы нормально работает (это я Вам давно рекомендавал сделать). Собирите маленький проект, где будет только инициализация WDT (ну, ещё какой либо сигнал, что программа запустилась/перезапустилась). Если этот проектик будет нормально рестартовать через 2 сек, то ошибку нужно искать в остальной части Вашей программы: вероятно, где-то кто-то портит регистр WDTCSR (собственно, WDT m640 и отличается от m64 старшими битами этого регистра - возможностью вместо рестарта генерить прерывание). ОК, пошёл пилить...
|
|
|
|
|
Jun 20 2013, 07:54
|
Участник

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

|
Цитата(Сергей Борщ @ Jun 20 2013, 10:30)  Заодно фуз BOOTRST проверьте Фьюз BOOTRST я не трогал, по умолчанию он равен 1, т.е. старт с адреса 0х0000. Цитата(Палыч @ Jun 20 2013, 09:49)  Осталось проверить, что WDT без всей остальной части Вашей программы нормально работает (это я Вам давно рекомендавал сделать). Собирите маленький проект, где будет только инициализация WDT (ну, ещё какой либо сигнал, что программа запустилась/перезапустилась). Если этот проектик будет нормально рестартовать через 2 сек, то ошибку нужно искать в остальной части Вашей программы: вероятно, где-то кто-то портит регистр WDTCSR (собственно, WDT m640 и отличается от m64 старшими битами этого регистра - возможностью вместо рестарта генерить прерывание). Видимо правда Ваша: что-то в основном цикле портит, например, WDTCSR. Сварганил я новый main(), вернее жёстко порезал старый. Оставил только инициализацию WDT, несколько переменных для цикла и прерывания по таймеру (refresh). При старте один раз пищит звуковой сигнал, а затем каждые пол-секунды коротко вспыхивает подсветка LCD. Если команда _wdr(); в цикле присутствует, то вспышки подсветки длятся бесконечно, а если _wdr(); убрать, то снова рестарт: короткий звуковой сигнал и четыре вспышки подсветки и цикл. Значит WDT работает правильно, но кто-то ему мешает, кажется, (крестится). )))
|
|
|
|
|
Jun 26 2013, 07:08
|
Участник

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

|
Неожиданное продолжение. Стал возвращать в программу ранее закомментированые блоки и выяснил, что описанные выше проблемы появляются при наличии в тексте программы функции инициализации LCD - lcd_init();. Причём, обращение к LCD без инициализации ничего не портит (на экране, естественно, кракозябры, но это не важно), а только инициализация. Содержимое этой функции тоже не имеет большого значения, тем более, что сам LCD работает прекрасно, и библиотека связи с LCD написана где-то в 2003-2004 году и работает в десятке различных серийных приборах. В листинге инициализации тоже ничего особенного. Короче, начал я койки переставлять ))) и пришёл к тому, что если сначала инициализировать WDT, а затем LCD, то всё работает как нужно: при наличии команд wdr всё работает, а при отсутствии - перезапускается через запрограммированное время, а если наоборот: сначала инициализировать LCD, а затем WDT, то всё виснет при отсутствии команд wdr. Всё это мне кажется весьма подозрительным, боюсь неожиданных приключений. Не будет ли у многоуважаемого Клуба каких-либо умных мыслей на сей счёт.
|
|
|
|
|
Jun 26 2013, 08:00
|
Участник

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

|
Цитата(Палыч @ Jun 26 2013, 10:40)  Информации - маловато... Приведите текст функции ициализации LCD, а также часть схемы подключения LCD (или опишите словами связи МК - LCD). Схема порта LCD и функция инициализации LCD. Да, и ещё нужен define.h
Сообщение отредактировал SerSh - Jun 26 2013, 08:04
Прикрепленные файлы
LCD.RAR ( 59.41 килобайт )
Кол-во скачиваний: 19
defines.rar ( 2.13 килобайт )
Кол-во скачиваний: 14
|
|
|
|
|
Jun 26 2013, 09:59
|

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

|
Цитата(SerSh @ Jun 26 2013, 12:00)  ... функция инициализации LCD. Не увидел того, чего хотел: настройка направлений информации на пинах МК и установка сигналов с "начальные" состояния. Включен ли BOD? Какой уровень установлен? Цитата(SerSh @ Jun 26 2013, 11:08)  Не будет ли у многоуважаемого Клуба каких-либо умных мыслей на сей счёт. Мысль такая: Замечено, что AVR при определенных "неполадках" питания могут становиться в некое "раскоряченное" состаяние, при котором нарушается нормальная их работа. Например, при очень медленном нарастании напряжения питания (несколько секунд) AVR легко поставить в такое вот "раскоряченное" состояние: работать - не работает, на сигнал сброса - не реагирует, только снятие и подача "нормального" питания... Думаю, что что-то этакое имеет место и у Вас. О похожих симптомах Вы говорили в предыдущих сообщениях... Возможно, при инициализации пинов МК и LCD на некоторое малое время имеет место встречное включение сигналов: например, МК на каком-то сигнале выдаёт низкий уровень, а в это же время LCD на этом же проводнике пытается держать высокий уровень. При этом происходит "проседание" напряжения питания и МК (веренее в Вашем случае - его какая-то часть, связанная с WDT) переходит в "раскоряченное" состояние. Правда, я наблюдал полностью не работающий МК (конкретно - m128) в таком "раскоряченном" состоянии, в m640, возможно, "раскорячивается" только WDT, да и то - если он ещё не запущен. Вот такие у меня мысли...
|
|
|
|
|
Jun 26 2013, 10:44
|
Участник

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

|
Цитата(Палыч @ Jun 26 2013, 12:59)  Не увидел того, чего хотел: настройка направлений информации на пинах МК и установка сигналов с "начальные" состояния. Файлик с low_level_init'ом на всякий случай прикладываю. Цитата(Палыч @ Jun 26 2013, 12:59)  Включен ли BOD? Какой уровень установлен? Да, включён, в фьюзы BODLEVEL прошиваю 4, что соответствует 4,1...4,5В. CKSEL прошиваю F, SUT=1. Всё это соответствует "Crystal Oscillator, BOD enabled" (таблица 10-4) при частоте кварца 14.7456МГц Цитата(Палыч @ Jun 26 2013, 12:59)  Вот такие у меня мысли... Спасибо за Ваши мысли. Сейчас попробую поиграться с разными напряжениями BOD. Кстати, питание проца - рядом стоящий импульсный стабилизатор (типа КРЕНка=+5В). Для силовых цепей есть отдельная такая же КРЕНка, но на 12В. Общий провод - большой полигон (плата двусторонняя). Кондёр (чип) по питанию проца припаян как раз под ним на полигоне. Аналогичным образом ведёт себя совершенно другая плата, но с таким же контроллером (мега640), стартовая инициализация у них похожая.
Сообщение отредактировал SerSh - Jun 26 2013, 10:54
|
|
|
|
|
Jun 26 2013, 11:44
|
Участник

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

|
Цитата(Палыч @ Jun 26 2013, 14:32)  Беглый анализ кода показал: таки возможно встречное включение, более того - оно присутствует всегда ! Сигналы шины данных DB4-DB6 Вы "держите" в положении "на вывод" всегда, и только сигнал DB7 переключаете "на ввод" при чтении с LCD. Правильно делать - переключать всю группу DB4-DB7 "на ввод" при операции чтения. По соображениям "безопасности" эту группу сигналов (DB4-DB7) логичнее держать в высокоимендансном состоянии (т.е. "на ввод"), и только при выводе байта переводить в состояние "на вывод", а после окончания команды вывода - снова переводить в высокоимпендансное состояние. Спасибо, сейчас буду что-то посмотреть.
|
|
|
|
|
Jun 26 2013, 12:59
|
Участник

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

|
К сожалению, хороших результатов нет. Установка BOD на 2,5...2,9В ничего не дала, всё как и было. Библиотеку общения с LCD я подправил, теперь DB - на выход только при записи, всё остальное время на вход без pull-up'a. Но изменений результата нет. Всё виснет при рестарте если WDT инициализировать после LCD. Если сначала WDT, а затем LCD, то WDT срабатывает с рестартом через нужное время при отсутствии команд wrd. Умных мыслей больше нет, остались одни выражения...
|
|
|
|
|
Jun 26 2013, 13:35
|
Участник

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

|
Цитата(Палыч @ Jun 26 2013, 16:12)  Надеюсь, что речь идёт о всех четырёх линиях шины данных. Или только о DB7 ? Нет, конечно вся тетрада! Но, главное, результат тот же...  В любом случае большое спасибо всем принявшим участие в обсуждении, особенно товарищу Палычу!
Сообщение отредактировал SerSh - Jun 26 2013, 13:40
|
|
|
|
|
Jun 26 2013, 21:28
|

Гуру
     
Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106

|
Цитата(SerSh @ Jun 26 2013, 10:08)  пришёл к тому, что если сначала инициализировать WDT, а затем LCD, то всё работает как нужно: а если наоборот: сначала инициализировать LCD, а затем WDT, то всё виснет при отсутствии команд wdr. Если всё действительно так как Вы пишете то я в такой ситуации поступил бы след. образом. При условии что незакоченная инициализация LCD не приведёт к его порче. Т.е. когда мозг отказывается понимать происходящее а глаза не видят ошибку Закомментировал бы всю программу инициализации LCD и начал бы поочерёдно последовательно открывать по одной строке/команде проверяя после этого работоспособность. В конце концов обязательно найдёте ту самую виновницу...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|