Для побудови годинника вам не потрібен 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), і роками працювати на пару комірок AA. Окрім випадків, коли дисплей не має високої потужності.
Я зробив саме це, щоб побудувати свій 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 повідомляє про час у розбитому вигляді, який, природно, не піддається арифметичним операціям.