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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Неправильная работа Watch Dog Timer'a, WDT не работает
Палыч
сообщение Jun 20 2013, 06:49
Сообщение #16


Гуру
******

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



Цитата(SerSh @ Jun 20 2013, 10:15) *
Закомментировал все команды WDR, но всё осталось по-прежнему: через 2 сек. после старта - завис.

Осталось проверить, что WDT без всей остальной части Вашей программы нормально работает (это я Вам давно рекомендавал сделать). Собирите маленький проект, где будет только инициализация WDT (ну, ещё какой либо сигнал, что программа запустилась/перезапустилась). Если этот проектик будет нормально рестартовать через 2 сек, то ошибку нужно искать в остальной части Вашей программы: вероятно, где-то кто-то портит регистр WDTCSR (собственно, WDT m640 и отличается от m64 старшими битами этого регистра - возможностью вместо рестарта генерить прерывание).
Go to the top of the page
 
+Quote Post
SerSh
сообщение Jun 20 2013, 06:55
Сообщение #17


Участник
*

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



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


ОК, пошёл пилить...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 20 2013, 07:30
Сообщение #18


Гуру
******

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



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


--------------------
На любой вопрос даю любой ответ
"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
SerSh
сообщение Jun 20 2013, 07:54
Сообщение #19


Участник
*

Группа: Участник
Сообщений: 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 работает правильно, но кто-то ему мешает, кажется, (крестится). )))
Go to the top of the page
 
+Quote Post
SerSh
сообщение Jun 26 2013, 07:08
Сообщение #20


Участник
*

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



Неожиданное продолжение.
Стал возвращать в программу ранее закомментированые блоки и выяснил, что описанные выше проблемы появляются при наличии в тексте программы функции инициализации LCD - lcd_init();. Причём, обращение к LCD без инициализации ничего не портит (на экране, естественно, кракозябры, но это не важно), а только инициализация. Содержимое этой функции тоже не имеет большого значения, тем более, что сам LCD работает прекрасно, и библиотека связи с LCD написана где-то в 2003-2004 году и работает в десятке различных серийных приборах. В листинге инициализации тоже ничего особенного.
Короче, начал я койки переставлять ))) и пришёл к тому, что если сначала инициализировать WDT, а затем LCD, то всё работает как нужно: при наличии команд wdr всё работает, а при отсутствии - перезапускается через запрограммированное время, а если наоборот: сначала инициализировать LCD, а затем WDT, то всё виснет при отсутствии команд wdr.
Всё это мне кажется весьма подозрительным, боюсь неожиданных приключений.
Не будет ли у многоуважаемого Клуба каких-либо умных мыслей на сей счёт.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 26 2013, 07:40
Сообщение #21


Гуру
******

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



Цитата(SerSh @ Jun 26 2013, 11:08) *
Не будет ли у многоуважаемого Клуба каких-либо умных мыслей на сей счёт.

Информации - маловато...
Приведите текст функции ициализации LCD, а также часть схемы подключения LCD (или опишите словами связи МК - LCD).
Go to the top of the page
 
+Quote Post
SerSh
сообщение Jun 26 2013, 08:00
Сообщение #22


Участник
*

Группа: Участник
Сообщений: 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
 
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 26 2013, 09:59
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 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, да и то - если он ещё не запущен.
Вот такие у меня мысли...
Go to the top of the page
 
+Quote Post
SerSh
сообщение Jun 26 2013, 10:44
Сообщение #24


Участник
*

Группа: Участник
Сообщений: 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
Прикрепленные файлы
Прикрепленный файл  low_level_init.rar ( 1.45 килобайт ) Кол-во скачиваний: 18
 
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 26 2013, 11:32
Сообщение #25


Гуру
******

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



Беглый анализ кода показал: таки возможно встречное включение, более того - оно присутствует всегда !
Сигналы шины данных DB4-DB6 Вы "держите" в положении "на вывод" всегда, и только сигнал DB7 переключаете "на ввод" при чтении с LCD. Правильно делать - переключать всю группу DB4-DB7 "на ввод" при операции чтения. По соображениям "безопасности" эту группу сигналов (DB4-DB7) логичнее держать в высокоимендансном состоянии (т.е. "на ввод"), и только при выводе байта переводить в состояние "на вывод", а после окончания команды вывода - снова переводить в высокоимпендансное состояние.
Go to the top of the page
 
+Quote Post
SerSh
сообщение Jun 26 2013, 11:44
Сообщение #26


Участник
*

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



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

Спасибо, сейчас буду что-то посмотреть.
Go to the top of the page
 
+Quote Post
SerSh
сообщение Jun 26 2013, 12:59
Сообщение #27


Участник
*

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



К сожалению, хороших результатов нет. sad.gif
Установка BOD на 2,5...2,9В ничего не дала, всё как и было.
Библиотеку общения с LCD я подправил, теперь DB - на выход только при записи, всё остальное время на вход без pull-up'a.
Но изменений результата нет. Всё виснет при рестарте если WDT инициализировать после LCD.
Если сначала WDT, а затем LCD, то WDT срабатывает с рестартом через нужное время при отсутствии команд wrd.
Умных мыслей больше нет, остались одни выражения...
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 26 2013, 13:12
Сообщение #28


Гуру
******

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



Цитата(SerSh @ Jun 26 2013, 16:59) *
теперь DB - на выход только при записи, всё остальное время на вход без pull-up'a.
Надеюсь, что речь идёт о всех четырёх линиях шины данных. Или только о DB7 ?
Go to the top of the page
 
+Quote Post
SerSh
сообщение Jun 26 2013, 13:35
Сообщение #29


Участник
*

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



Цитата(Палыч @ Jun 26 2013, 16:12) *
Надеюсь, что речь идёт о всех четырёх линиях шины данных. Или только о DB7 ?

Нет, конечно вся тетрада! Но, главное, результат тот же... sad.gif
В любом случае большое спасибо всем принявшим участие в обсуждении, особенно товарищу Палычу!

Сообщение отредактировал SerSh - Jun 26 2013, 13:40
Go to the top of the page
 
+Quote Post
zombi
сообщение Jun 26 2013, 21:28
Сообщение #30


Гуру
******

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



Цитата(SerSh @ Jun 26 2013, 10:08) *
пришёл к тому, что если сначала инициализировать WDT, а затем LCD, то всё работает как нужно: а если наоборот: сначала инициализировать LCD, а затем WDT, то всё виснет при отсутствии команд wdr.

Если всё действительно так как Вы пишете то я в такой ситуации поступил бы след. образом.
При условии что незакоченная инициализация LCD не приведёт к его порче.
Т.е. когда мозг отказывается понимать происходящее а глаза не видят ошибку biggrin.gif
Закомментировал бы всю программу инициализации LCD и начал бы поочерёдно последовательно открывать по одной строке/команде проверяя после этого работоспособность.
В конце концов обязательно найдёте ту самую виновницу...


Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 9th July 2025 - 10:17
Рейтинг@Mail.ru


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