ATtiny44 millis() не работает с внешней тактовой частотой 16 МГц

Я использую ATtiny44 с Arduino IDE согласно этому руководству: http://highlowtech.org/?p=1695

У меня проблема с millis(). Когда я использую внутренние часы 1 МГц, они работают правильно, но когда я использую внешние часы 16 МГц, то millis() требуется гораздо больше времени, чем одна секунда, чтобы делиться на 1000.

Я протестировал его с LCD и скетчем Hello World, измененным для соответствия выводам ATtiny. Действительно ли millis() работает с Tiny?

Почему он работает правильно с частотой 1 МГц, а не с 16 МГц, которая используется в платформе Arduino?

, 👍0

Обсуждение

Вы забыли депрограммировать CKDIV8?, @Ignacio Vazquez-Abrams

Проверка на делимость millis() на 1000 — ужасная идея. При тактовой частоте 16 МГц millis не учитывает каждую миллисекунду: он обновляется только каждые 1024 мкс и иногда прыгает на 2 мс., @Edgar Bonet

Пожалуйста, опубликуйте конфигурацию предохранителей, @Talk2

Если вы конкретно укажете «гораздо больше времени», это поможет людям объяснить конкретную проблему, которую вы наблюдали. Как видите, существует несколько возможных интерпретаций проблемы., @Sean Houlihane


1 ответ


1

Дай-ка угадаю: «гораздо больше времени» — это примерно, ооо, 16 раз?

Когда была написана функция millis(), она должна была предполагать, каковы были входные часы. Нет способа определить скорость входных часов: для этого потребовались бы другие часы! Поэтому авторы функции определили начальную константу, установили ее в 1000000 и потребовали, чтобы любой, кто менял часы, должен был изменить эту константу.

Найдите константу и установите ее на 16000000. Вуаля!

Вот статья об исходном коде функции:

https://ucexperiment.wordpress.com/2012/03/16/examination-of-the-arduino-millis-function/

,