Bạn không cần RTC để chế tạo đồng hồ: chip ATmega có tất cả phần cứng cần thiết để thực hiện các nhiệm vụ của chính RTC. Đây là cách thực hiện:
Nhận một tinh thể đồng hồ 32768 Hz: mua nó hoặc tháo rời một chiếc đồng hồ cũ. Những tinh thể này, được thiết kế đặc biệt để giữ thời gian, có độ trôi nhiệt độ cực nhỏ. Bạn cũng sẽ cần một trong những thứ đó nếu bạn muốn sử dụng chip RTC.
Định cấu hình cầu chì ATmega của bạn để chạy bộ dao động RC 8 MHz. Điều này sẽ làm cho millis()
chức năng của bạn không chính xác khủng khiếp, và cũng giải phóng các chân XTAL1 và XTAL2.
Kết nối tinh thể đồng hồ với các chân TOSC1 và TOSC2. Đây là các chân tương tự như XTAL1 và XTAL2 (9 và 10 trên 328P). Các tên khác nhau được sử dụng để có nghĩa là các chức năng khác nhau.
Định cấu hình Timer / Counter 2 cho hoạt động không đồng bộ, chế độ đếm bình thường, bộ đếm gộp trước được đặt thành 128 và cho phép ngắt tràn bộ định thời.
Bây giờ bạn sẽ nhận được một ngắt TIMER2_OVF với tốc độ rất ổn định một lần mỗi giây. Bạn chỉ cần tiến lên hiển thị đồng hồ thêm một giây trong ISR. Ở giữa các ngắt, bạn có thể đặt MCU ở chế độ ngủ rất sâu (chế độ ngủ tiết kiệm năng lượng: không có gì chạy ngoài Timer / Counter 2) và chạy trong nhiều năm trên một vài tế bào AA. Trừ khi màn hình hiển thị là đói điện, rõ ràng.
Tôi đã làm chính xác điều này để xây dựng đồng hồ treo tường 24 giờ một tay của tôi . Liên kết này bây giờ chỉ đến bản dịch tiếng Anh của tài liệu gốc bằng tiếng Pháp.
Hiệu chuẩn thạch anh
Nếu bạn không hiệu chỉnh thạch anh của mình, bạn có thể mong đợi một sự trôi dạt đáng kể, thường là vài giây mỗi tuần . Tốc độ trôi phụ thuộc vào điện dung đi lạc của các dấu vết kết nối tinh thể với MCU. Về nguyên tắc, nó có thể được loại bỏ bằng cách thêm một số điện dung bổ sung, tinh chỉnh. Điều đáng chú ý là bạn sẽ có cùng một vấn đề trôi dạt với RTC.
Nếu bạn hài lòng với loại chính xác này, thì hãy sống với nó và hạnh phúc. Tuy nhiên, nếu bạn quan tâm để đo độ trôi, bạn sẽ nhận thấy rằng nó rất ổn định. Sau đó, bạn có thể dễ dàng bù đắp phần mềm và đạt được độ chính xác vài giây mỗi năm .
Thuật toán để sửa lỗi trôi rất đơn giản. Từ độ lệch đo được, bạn tìm ra độ trễ chính xác giữa các ngắt, rất gần với 10 9 nano giây, sau đó:
#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;
}
}
Trong ví dụ trên, thạch anh hơi quá nhanh và phần mềm bù lại bằng cách bỏ lỡ một vài ngày. Nếu thạch anh quá chậm, mã tương tự sẽ thay vào đó đánh dấu hai lần một vài ngày một lần.
Kiểu hiệu chuẩn này cũng có thể được thực hiện đối với RTC, nhưng nó sẽ phức tạp hơn đáng kể vì RTC báo cáo thời gian ở dạng hỏng không tự nhiên cho vay đối với các phép toán số học.