ATmega1284 работает очень медленно, пока не перепрошил

Когда я включаю свой ATmega1284, он работает очень медленно - вероятно, менее одной десятой от его нормальной скорости, судя по циклически работающим светодиодам. Он настроен на использование внутреннего генератора без делителя, и я подтвердил, что CKOUT дает тактовую частоту 8 МГц.

Сброс не помогает, а вот если его прошить (просто прошить, а не фьюзы), то он вдруг снова начинает работать на полной скорости. lfuse равен 0xA2 (внутренний RC-генератор, без делителя).

Какова вероятная причина этого? Что еще я должен проверить?

только после включения? И после прошивки он работает нормально, пока вы не выключите питание? Это то, что вы имеете в виду?
Я только что пару раз включил его, и он возвращается с правильной скоростью. Так что, возможно, это первое включение после некоторого перерыва. Я собираюсь отключить его на некоторое время и посмотреть, если это имеет значение.
Вы решили эту проблему? Интересно, в чем проблема?
Я не. Я не смог надежно воспроизвести его, что немного затрудняет тестирование.

Ответы (1)

Вот контрольный список нескольких вещей, которые могут помочь в дальнейшем отследить проблему:

  • Если вы используете прерывания любой формы, убедитесь, что связанные линии ввода-вывода всегда находятся в стабильном состоянии. Например, если у вас есть кнопка, подключенная без функции подтягивания вверх/вниз, возможно, внешние факторы вызывают ее колебания. Кажущаяся медлительность может заключаться в том, что процессор тратит все свое время на обслуживание прерываний.

  • Убедитесь, что установлены соответствующие развязывающие конденсаторы. Хотя это может показаться маловероятным, потому что программирование, кажется, сбрасывается, это также может быть состояние генератора, которое сбрасывается путем его физического перемещения или подачи внешнего источника напряжения во время программирования.

  • Убедитесь, что вы обычно используете все в соответствии со спецификацией. Например, при работе со светодиодами, если вы посмотрите на нижнюю часть страницы 324 таблицы данных ATmega1284, вы увидите, что определенные группы контактов ввода-вывода имеют общий предел тока 100 мА.

  • Вы упомянули проблему, которую трудно повторить. Возможно, стоит отметить условия окружающей среды, такие как температура, наличие мобильных телефонов и т. д., в то время, когда это происходит. Для цепей с батарейным питанием, возможно, проверьте напряжение батареи в то время, для работающих от сети подумайте о таких вещах, как кондиционеры, которые могут ухудшить качество электроэнергии.

  • Если вы сделали только одно устройство, если это целесообразно, возможно, стоит создать вторую систему на случай, если вы случайно наткнулись на плохой компонент или что-то повредили во время сборки/разработки. Если нет, я бы хотя бы попробовал другой AVR.

  • Хотя это и не является хорошим долгосрочным решением, возможно, вы могли бы увидеть, решит ли включение сторожевого таймера проблему, обнаружив медленную работу программы и сбросив ее.

  • Вы упомянули примерно в десять раз медленнее. Возможно, вы могли бы значительно замедлить циклы синхронизации, чтобы ожидаемое время цикла составляло, скажем, 10 секунд. Тогда вы сможете измерить точное время с помощью секундомера и получить более точное представление. Если бы это было ровно 8 раз, это указывало бы на что-то странное с CKDIV8предохранителем. Похоже, вы справились с измерением, CKOUTно я оставлю это здесь на благо всех, у кого есть похожие проблемы.