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

SerSh

Участник
  • Постов

    39
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о SerSh

  • Звание
    Участник
    Участник
  • День рождения 31.01.1968

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array
  1. Вы думаете, что я не понимаю, что это похоже на бред? В своём посте чуть выше я написал о своих опасениях на этот счёт. Как пишет Палыч, очень возможно, что сейчас купированные симптомы потом вылезут где-то в другом месте. Что сейчас делать я не знаю, потому и обратился за помощью на форум. Я над этой проблемой ломаю голову уже третью неделю. Я ведь уже всё главное в программе сделал, а там куча разного железа: заняты все СОМ-порты, SPI, все таймеры... (не буду загружать). Короче, я думал, что уже включу WDT, и всё. Включил и всё... пропало! Тут только всё и началось. Если будет желание посмотрите сами на инициализацию. В комментах я отметил как было вначале, когда всё зависало. START.RAR
  2. В своём посте чуть выше я писал, что содержимое функции инициализации LCD вообще не имеет значения. Я именно закомментировал ВСЕ строки в этой функции, оставил только вход и выход, и получил зависание. Я сам в шоке :) Дело даже не в работоспособности/неработоспособности LCD в устройстве при отладке. Даже без функции инициализации всё работает на ура! При этом сама функция весьма простая, я её выкладывал. Просто - чудеса (он в чудеса не верит), я бы сам не поверил.
  3. Нет, конечно вся тетрада! Но, главное, результат тот же... :( В любом случае большое спасибо всем принявшим участие в обсуждении, особенно товарищу Палычу!
  4. К сожалению, хороших результатов нет. :( Установка BOD на 2,5...2,9В ничего не дала, всё как и было. Библиотеку общения с LCD я подправил, теперь DB - на выход только при записи, всё остальное время на вход без pull-up'a. Но изменений результата нет. Всё виснет при рестарте если WDT инициализировать после LCD. Если сначала WDT, а затем LCD, то WDT срабатывает с рестартом через нужное время при отсутствии команд wrd. Умных мыслей больше нет, остались одни выражения...
  5. Спасибо, сейчас буду что-то посмотреть.
  6. Файлик с low_level_init'ом на всякий случай прикладываю. Да, включён, в фьюзы 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
  7. Схема порта LCD и функция инициализации LCD. Да, и ещё нужен define.h LCD.RAR defines.rar
  8. Неожиданное продолжение. Стал возвращать в программу ранее закомментированые блоки и выяснил, что описанные выше проблемы появляются при наличии в тексте программы функции инициализации LCD - lcd_init();. Причём, обращение к LCD без инициализации ничего не портит (на экране, естественно, кракозябры, но это не важно), а только инициализация. Содержимое этой функции тоже не имеет большого значения, тем более, что сам LCD работает прекрасно, и библиотека связи с LCD написана где-то в 2003-2004 году и работает в десятке различных серийных приборах. В листинге инициализации тоже ничего особенного. Короче, начал я койки переставлять ))) и пришёл к тому, что если сначала инициализировать WDT, а затем LCD, то всё работает как нужно: при наличии команд wdr всё работает, а при отсутствии - перезапускается через запрограммированное время, а если наоборот: сначала инициализировать LCD, а затем WDT, то всё виснет при отсутствии команд wdr. Всё это мне кажется весьма подозрительным, боюсь неожиданных приключений. Не будет ли у многоуважаемого Клуба каких-либо умных мыслей на сей счёт.
  9. Фьюз BOOTRST я не трогал, по умолчанию он равен 1, т.е. старт с адреса 0х0000. Видимо правда Ваша: что-то в основном цикле портит, например, WDTCSR. Сварганил я новый main(), вернее жёстко порезал старый. Оставил только инициализацию WDT, несколько переменных для цикла и прерывания по таймеру (refresh). При старте один раз пищит звуковой сигнал, а затем каждые пол-секунды коротко вспыхивает подсветка LCD. Если команда _wdr(); в цикле присутствует, то вспышки подсветки длятся бесконечно, а если _wdr(); убрать, то снова рестарт: короткий звуковой сигнал и четыре вспышки подсветки и цикл. Значит WDT работает правильно, но кто-то ему мешает, кажется, (крестится). )))
  10. Закомментировал все команды WDR, но всё осталось по-прежнему: через 2 сек. после старта - завис. Такое впечатление, что он уходит в рестарт, но попадает не на начальный адрес старта, а на какой-нибудь бутлоадер, которого на самом деле нет, и, пробегая по пустым местам, возвращается обратно, при этом портя стек.
  11. Я в предыдущем посте описал работу программы. А слово "кажется" использовал специально для Вас. ))) Задержку вставил сразу после инициализации WDT. И вовсе я не партизан, просто это не имеет значения. Её куда ни вставь, она и в Африке задержка. А вот это завтра утром на работе попробую. А сейчас - спать. Спокойной ночи, господа, спокойной ночи!...
  12. Кажется работает. Я вводил задержку специально чтобы сымитировать ситуацию "зависание - рестарт". Если задержку не вводить, то программа работает, и WDT как-то там себе живёт, не беспокоит. Как может цикл портить функционал программы мне не понятно. Происходит не отсутствие сброса МК, а его полной замерзание, даже перепрограммирование не помогает, а только выключение питания. Не совсем понятна идея. Если поставить просто глухой цикл типа while(1);, то всё повторяется - зависание. При этом не важно: открыты или закрыты все прерывания (проверял только что).
  13. Перед инициализацией WDT сбросил этот бит: clrbit (MCUSR, WDRF);. Не помогло!
  14. И когда его сбрасывать?
×
×
  • Создать...