Когда я включаю свой ATmega1284, он работает очень медленно - вероятно, менее одной десятой от его нормальной скорости, судя по циклически работающим светодиодам. Он настроен на использование внутреннего генератора без делителя, и я подтвердил, что CKOUT дает тактовую частоту 8 МГц.
Сброс не помогает, а вот если его прошить (просто прошить, а не фьюзы), то он вдруг снова начинает работать на полной скорости. lfuse равен 0xA2 (внутренний RC-генератор, без делителя).
Какова вероятная причина этого? Что еще я должен проверить?
Вот контрольный список нескольких вещей, которые могут помочь в дальнейшем отследить проблему:
Если вы используете прерывания любой формы, убедитесь, что связанные линии ввода-вывода всегда находятся в стабильном состоянии. Например, если у вас есть кнопка, подключенная без функции подтягивания вверх/вниз, возможно, внешние факторы вызывают ее колебания. Кажущаяся медлительность может заключаться в том, что процессор тратит все свое время на обслуживание прерываний.
Убедитесь, что установлены соответствующие развязывающие конденсаторы. Хотя это может показаться маловероятным, потому что программирование, кажется, сбрасывается, это также может быть состояние генератора, которое сбрасывается путем его физического перемещения или подачи внешнего источника напряжения во время программирования.
Убедитесь, что вы обычно используете все в соответствии со спецификацией. Например, при работе со светодиодами, если вы посмотрите на нижнюю часть страницы 324 таблицы данных ATmega1284, вы увидите, что определенные группы контактов ввода-вывода имеют общий предел тока 100 мА.
Вы упомянули проблему, которую трудно повторить. Возможно, стоит отметить условия окружающей среды, такие как температура, наличие мобильных телефонов и т. д., в то время, когда это происходит. Для цепей с батарейным питанием, возможно, проверьте напряжение батареи в то время, для работающих от сети подумайте о таких вещах, как кондиционеры, которые могут ухудшить качество электроэнергии.
Если вы сделали только одно устройство, если это целесообразно, возможно, стоит создать вторую систему на случай, если вы случайно наткнулись на плохой компонент или что-то повредили во время сборки/разработки. Если нет, я бы хотя бы попробовал другой AVR.
Хотя это и не является хорошим долгосрочным решением, возможно, вы могли бы увидеть, решит ли включение сторожевого таймера проблему, обнаружив медленную работу программы и сбросив ее.
Вы упомянули примерно в десять раз медленнее. Возможно, вы могли бы значительно замедлить циклы синхронизации, чтобы ожидаемое время цикла составляло, скажем, 10 секунд. Тогда вы сможете измерить точное время с помощью секундомера и получить более точное представление. Если бы это было ровно 8 раз, это указывало бы на что-то странное с CKDIV8
предохранителем. Похоже, вы справились с измерением, CKOUT
но я оставлю это здесь на благо всех, у кого есть похожие проблемы.
Джиппи
Ишвара
Преподобный
Ишвара