Может ли IDE работать с основной тактовой частотой 32 кГц?

Я где-то читал, что частота основной тактовой частоты 32768 Гц мешает не только функциям micros() и millis(), но и некоторым другим вещам. Это правда? Придется ли мне отказаться от Arduino IDE для программирования avr, работающего на частоте 32768 Гц?

, 👍-1

Обсуждение

Вам все еще нужно знать, нужны ли конденсаторы фильтра? https://electronics.stackexchange.com/questions/416523/32khz-crystal-for-avr-caps-needed, @VE7JRO

@VE7JRO Нет. А ты можешь ответить на этот вопрос?, @Alexander M

Извините, у меня нет для вас однозначного ответа. Здесь ведется дискуссия по этому поводу: https://forum.arduino.cc/index.php?topic=75397.0., @VE7JRO

Расскажите, пожалуйста, почему вам нужна основная тактовая частота 32,768 кГц. Слышали ли вы о проблеме XY http://xyproblem.info/ Большинство микроконтроллеров и процессоров, используемых в платах Arduino, способны использовать кристалл с частотой 32,768 кГц, но код Arduino не предназначен для такой низкой тактовой частоты., @Jot


1 ответ


3

Да, все сломается. Главный виновник вот в чем:

#define clockCyclesPerMicrosecond() ( F_CPU / 1000000L )

При любом значении ниже 1000000 результат вычисления будет равен 0.

Это означает, что код типа micros() сломается, поскольку он использует:

return ((m << 8) + t) * (64 / clockCyclesPerMicrosecond());

64/0 - это... гм... да... И что бы это ни было в конечном итоге, это умножение количества тиков. Итак... результат micros():... хм... да...

На самом деле при попытке скомпилировать что-либо получается (конечно, на UECIDE):

• Error at line 103 in file wiring.c:
    ‣ division by zero [-Werror=div-by-zero]

Поскольку при компиляции кода возникает ошибка, с этим мало что можно поделать.

Тем не менее, одна идея все же приходит на ум, и я думаю, она немного «сумасшедшая».

  • Установите в файле boards.txt значение 3276800 Гц

Тогда все расчеты будут действительными, однако все они будут отклоняться в 100 раз.

Поскольку плата фактически работает на частоте 32768, а API считает, что она работает на частоте 3276800, все, что вам нужно сделать, это использовать в расчетах значения в 100 раз меньше, чем обычно.

Например, чтобы задержать 1 секунду, вы должны использовать delay(10); вместо delay(1000);. Или вы умножите возвращаемое значение millis() на 100, чтобы получить реальное количество миллисекунд.

Скорость передачи данных должна быть в 100 раз выше, поэтому используйте Serial.begin(960000); вместо Serial.begin(9600);.

Конечно, lockCyclesPerMicro Second() не предназначен для работы со значениями типа 3276800, и F_CPU/1000000L приведет к тому, что 3 не будет 3.2768, как вам хочется, поэтому расчет времени будет немного неверным. Возможно, вам придется соответствующим образом настроить такие параметры, как скорость передачи данных, чтобы компенсировать это.

,