В моем проекте мне нужна самая высокая доступная скорость передачи данных UART между Atmega328p и BTM-222, поэтому я должен использовать кристалл 18,432,000 МГц для достижения скорости передачи 460,8 кбит / с без ошибок.
Но в то же время мне нужно измерение времени с высокой точностью. Раньше, когда я использовал кристалл с частотой 16 МГц, я использовал этот метод: Timer0 с 64 / предделителем. Так что для установки счетчика потребовалось 4us.
(1/16000000)*64 = 4us
4 мкс было моим разрешением измерения. Подсчет переполнения: переполнение счетчика происходит каждые 1024 мкс.
4us * 256 = 1024us
Тогда для получения масштабированного в нас времени существует уравнение:
время (uint32) = current_counter * 4 + overvlow_counter * 1024
Все просто, потому что умножение x4 и x1024 - это битовый сдвиг. Я использую длинное целое число, поэтому самое долгое время, которое я могу измерить, составляет
2 ^ 32 * 1 мс = 71 минута.
Отлично!
Затем, когда я использую кристалл 18432000 МГц, получается (1/18432000) * 64 = 3,47 (2), поэтому его нельзя вычислить с использованием моего простого предыдущего кода.
Может у вас есть идеи, что мне делать? У меня есть один: использовать внешний источник тактовой частоты 1MHz timer0, поступающий от кристалла. Мой вопрос: как подключить кристалл 1 МГц к выводу T0 и обеспечить источник тактовой частоты для timer0?