Для создания часов вам не нужен RTC: чип ATmega имеет все оборудование, необходимое для выполнения функций самого RTC. Вот как:
Получите часовой кристалл на 32768 Гц: либо купите его, либо разберите старые часы. Эти кристаллы, специально предназначенные для выдерживания времени, имеют очень маленький температурный дрейф. Вам также понадобится один из них, если вы хотите использовать чип RTC.
Сконфигурируйте предохранители вашего ATmega для запуска 8-МГц RC генератора. Это сделает вашу millis()
функцию ужасно неточной, а также освободит контакты XTAL1 и XTAL2.
Подключите часовой кристалл к контактам TOSC1 и TOSC2. Это те же контакты, что и XTAL1 и XTAL2 (9 и 10 на 328P). Разные имена используются для обозначения разных функций.
Сконфигурируйте Таймер / Счетчик 2 для асинхронной работы, нормального режима подсчета, предварительного масштабирования, установленного на 128, и включите прерывание переполнения таймера.
Теперь вы получите прерывание TIMER2_OVF с очень постоянной частотой один раз в секунду. Вам нужно только продвинуть показ часов на одну секунду в ISR. В промежутках между прерываниями вы можете поместить MCU в очень глубокий режим сна (режим ожидания с энергосбережением: ничего не работает, кроме таймера / счетчика 2) и годами работать на паре ячеек АА. Если, конечно, дисплей потребляет много энергии.
Я сделал именно это, чтобы построить свои 24-часовые настенные часы с одной рукой . Эта ссылка указывает теперь на английский перевод оригинальной документации на французском языке.
Кварцевая калибровка
Если вы не откалибруете свой кварц, вы можете ожидать значительного дрейфа, обычно несколько секунд в неделю . Скорость дрейфа зависит от паразитной емкости следов, которые соединяют кристалл с MCU. В принципе, это может быть удалено добавлением некоторой дополнительной, точно настроенной емкости. Стоит отметить, что у вас будет та же проблема с дрейфом с RTC.
Если вы удовлетворены такой точностью, то живите ею и будьте счастливы. Однако, если вы захотите измерить дрейф, вы заметите, что он очень стабилен. Затем вы можете легко компенсировать это с помощью программного обеспечения и достичь точности в несколько секунд в год .
Алгоритм коррекции дрейфа очень прост. Из измеренного дрейфа вы вычисляете точную задержку между прерываниями, которая должна быть очень близка к 10 9 наносекундам, затем:
#define ONE_SECOND 1000000000 // in nanoseconds
#define ONE_INTERRUPT 999993482 // for example
ISR(TIMER2_OVF_vect)
{
static uint32_t unaccounted_time;
unaccounted_time += ONE_INTERRUPT;
while (unaccounted_time >= ONE_SECOND) {
advance_display_by_one_second();
unaccounted_time -= ONE_SECOND;
}
}
В приведенном выше примере кварц немного слишком быстрый, и программное обеспечение компенсирует это отсутствием галочки каждые несколько дней. Если бы кварц был слишком медленным, один и тот же код вместо двух раз отмечался бы каждые несколько дней.
Этот тип калибровки также может быть выполнен для RTC, но он будет значительно более сложным, потому что RTC сообщает время в разбивке, что, естественно, не подходит для арифметических операций.