Перейти к содержанию
    

Неправильная работа Watch Dog Timer'a

Закомментировал все команды WDR, но всё осталось по-прежнему: через 2 сек. после старта - завис.

Осталось проверить, что WDT без всей остальной части Вашей программы нормально работает (это я Вам давно рекомендавал сделать). Собирите маленький проект, где будет только инициализация WDT (ну, ещё какой либо сигнал, что программа запустилась/перезапустилась). Если этот проектик будет нормально рестартовать через 2 сек, то ошибку нужно искать в остальной части Вашей программы: вероятно, где-то кто-то портит регистр WDTCSR (собственно, WDT m640 и отличается от m64 старшими битами этого регистра - возможностью вместо рестарта генерить прерывание).

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Осталось проверить, что WDT без всей остальной части Вашей программы нормально работает (это я Вам давно рекомендавал сделать). Собирите маленький проект, где будет только инициализация WDT (ну, ещё какой либо сигнал, что программа запустилась/перезапустилась). Если этот проектик будет нормально рестартовать через 2 сек, то ошибку нужно искать в остальной части Вашей программы: вероятно, где-то кто-то портит регистр WDTCSR (собственно, WDT m640 и отличается от m64 старшими битами этого регистра - возможностью вместо рестарта генерить прерывание).

 

ОК, пошёл пилить...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Заодно фуз BOOTRST проверьте

Фьюз BOOTRST я не трогал, по умолчанию он равен 1, т.е. старт с адреса 0х0000.

 

Осталось проверить, что WDT без всей остальной части Вашей программы нормально работает (это я Вам давно рекомендавал сделать). Собирите маленький проект, где будет только инициализация WDT (ну, ещё какой либо сигнал, что программа запустилась/перезапустилась). Если этот проектик будет нормально рестартовать через 2 сек, то ошибку нужно искать в остальной части Вашей программы: вероятно, где-то кто-то портит регистр WDTCSR (собственно, WDT m640 и отличается от m64 старшими битами этого регистра - возможностью вместо рестарта генерить прерывание).

 

Видимо правда Ваша: что-то в основном цикле портит, например, WDTCSR.

Сварганил я новый main(), вернее жёстко порезал старый. Оставил только инициализацию WDT, несколько переменных для цикла и прерывания по таймеру (refresh). При старте один раз пищит звуковой сигнал, а затем каждые пол-секунды коротко вспыхивает подсветка LCD.

Если команда _wdr(); в цикле присутствует, то вспышки подсветки длятся бесконечно, а если _wdr(); убрать, то снова рестарт: короткий звуковой сигнал и четыре вспышки подсветки и цикл. Значит WDT работает правильно, но кто-то ему мешает, кажется, (крестится). )))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Неожиданное продолжение.

Стал возвращать в программу ранее закомментированые блоки и выяснил, что описанные выше проблемы появляются при наличии в тексте программы функции инициализации LCD - lcd_init();. Причём, обращение к LCD без инициализации ничего не портит (на экране, естественно, кракозябры, но это не важно), а только инициализация. Содержимое этой функции тоже не имеет большого значения, тем более, что сам LCD работает прекрасно, и библиотека связи с LCD написана где-то в 2003-2004 году и работает в десятке различных серийных приборах. В листинге инициализации тоже ничего особенного.

Короче, начал я койки переставлять ))) и пришёл к тому, что если сначала инициализировать WDT, а затем LCD, то всё работает как нужно: при наличии команд wdr всё работает, а при отсутствии - перезапускается через запрограммированное время, а если наоборот: сначала инициализировать LCD, а затем WDT, то всё виснет при отсутствии команд wdr.

Всё это мне кажется весьма подозрительным, боюсь неожиданных приключений.

Не будет ли у многоуважаемого Клуба каких-либо умных мыслей на сей счёт.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не будет ли у многоуважаемого Клуба каких-либо умных мыслей на сей счёт.

Информации - маловато...

Приведите текст функции ициализации LCD, а также часть схемы подключения LCD (или опишите словами связи МК - LCD).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Информации - маловато...

Приведите текст функции ициализации LCD, а также часть схемы подключения LCD (или опишите словами связи МК - LCD).

 

Схема порта LCD и функция инициализации LCD.

Да, и ещё нужен define.h

LCD.RAR

defines.rar

Изменено пользователем SerSh

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

... функция инициализации LCD.

Не увидел того, чего хотел: настройка направлений информации на пинах МК и установка сигналов с "начальные" состояния.

 

Включен ли BOD? Какой уровень установлен?

 

Не будет ли у многоуважаемого Клуба каких-либо умных мыслей на сей счёт.

Мысль такая:

Замечено, что AVR при определенных "неполадках" питания могут становиться в некое "раскоряченное" состаяние, при котором нарушается нормальная их работа. Например, при очень медленном нарастании напряжения питания (несколько секунд) AVR легко поставить в такое вот "раскоряченное" состояние: работать - не работает, на сигнал сброса - не реагирует, только снятие и подача "нормального" питания...

Думаю, что что-то этакое имеет место и у Вас. О похожих симптомах Вы говорили в предыдущих сообщениях... Возможно, при инициализации пинов МК и LCD на некоторое малое время имеет место встречное включение сигналов: например, МК на каком-то сигнале выдаёт низкий уровень, а в это же время LCD на этом же проводнике пытается держать высокий уровень. При этом происходит "проседание" напряжения питания и МК (веренее в Вашем случае - его какая-то часть, связанная с WDT) переходит в "раскоряченное" состояние.

Правда, я наблюдал полностью не работающий МК (конкретно - m128) в таком "раскоряченном" состоянии, в m640, возможно, "раскорячивается" только WDT, да и то - если он ещё не запущен.

Вот такие у меня мысли...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не увидел того, чего хотел: настройка направлений информации на пинах МК и установка сигналов с "начальные" состояния.

Файлик с low_level_init'ом на всякий случай прикладываю.

 

Включен ли BOD? Какой уровень установлен?

Да, включён, в фьюзы BODLEVEL прошиваю 4, что соответствует 4,1...4,5В. CKSEL прошиваю F, SUT=1. Всё это соответствует "Crystal Oscillator, BOD enabled" (таблица 10-4) при частоте кварца 14.7456МГц

 

Вот такие у меня мысли...

Спасибо за Ваши мысли. Сейчас попробую поиграться с разными напряжениями BOD.

Кстати, питание проца - рядом стоящий импульсный стабилизатор (типа КРЕНка=+5В). Для силовых цепей есть отдельная такая же КРЕНка, но на 12В. Общий провод - большой полигон (плата двусторонняя). Кондёр (чип) по питанию проца припаян как раз под ним на полигоне. Аналогичным образом ведёт себя совершенно другая плата, но с таким же контроллером (мега640), стартовая инициализация у них похожая.

low_level_init.rar

Изменено пользователем SerSh

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Беглый анализ кода показал: таки возможно встречное включение, более того - оно присутствует всегда !

Сигналы шины данных DB4-DB6 Вы "держите" в положении "на вывод" всегда, и только сигнал DB7 переключаете "на ввод" при чтении с LCD. Правильно делать - переключать всю группу DB4-DB7 "на ввод" при операции чтения. По соображениям "безопасности" эту группу сигналов (DB4-DB7) логичнее держать в высокоимендансном состоянии (т.е. "на ввод"), и только при выводе байта переводить в состояние "на вывод", а после окончания команды вывода - снова переводить в высокоимпендансное состояние.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Беглый анализ кода показал: таки возможно встречное включение, более того - оно присутствует всегда !

Сигналы шины данных DB4-DB6 Вы "держите" в положении "на вывод" всегда, и только сигнал DB7 переключаете "на ввод" при чтении с LCD. Правильно делать - переключать всю группу DB4-DB7 "на ввод" при операции чтения. По соображениям "безопасности" эту группу сигналов (DB4-DB7) логичнее держать в высокоимендансном состоянии (т.е. "на ввод"), и только при выводе байта переводить в состояние "на вывод", а после окончания команды вывода - снова переводить в высокоимпендансное состояние.

Спасибо, сейчас буду что-то посмотреть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

К сожалению, хороших результатов нет. :(

Установка BOD на 2,5...2,9В ничего не дала, всё как и было.

Библиотеку общения с LCD я подправил, теперь DB - на выход только при записи, всё остальное время на вход без pull-up'a.

Но изменений результата нет. Всё виснет при рестарте если WDT инициализировать после LCD.

Если сначала WDT, а затем LCD, то WDT срабатывает с рестартом через нужное время при отсутствии команд wrd.

Умных мыслей больше нет, остались одни выражения...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

теперь DB - на выход только при записи, всё остальное время на вход без pull-up'a.
Надеюсь, что речь идёт о всех четырёх линиях шины данных. Или только о DB7 ?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Надеюсь, что речь идёт о всех четырёх линиях шины данных. Или только о DB7 ?

Нет, конечно вся тетрада! Но, главное, результат тот же... :(

В любом случае большое спасибо всем принявшим участие в обсуждении, особенно товарищу Палычу!

Изменено пользователем SerSh

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

пришёл к тому, что если сначала инициализировать WDT, а затем LCD, то всё работает как нужно: а если наоборот: сначала инициализировать LCD, а затем WDT, то всё виснет при отсутствии команд wdr.

Если всё действительно так как Вы пишете то я в такой ситуации поступил бы след. образом.

При условии что незакоченная инициализация LCD не приведёт к его порче.

Т.е. когда мозг отказывается понимать происходящее а глаза не видят ошибку :biggrin:

Закомментировал бы всю программу инициализации LCD и начал бы поочерёдно последовательно открывать по одной строке/команде проверяя после этого работоспособность.

В конце концов обязательно найдёте ту самую виновницу...

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...