시계를 구축하기 위해 RTC가 필요하지 않습니다. ATmega 칩에는 RTC 자체의 임무를 수행하는 데 필요한 모든 하드웨어가 있습니다. 방법은 다음과 같습니다.
32768Hz 시계 크리스털을 구입하십시오 : 시계를 사거나 오래된 시계를 분해하십시오. 시간 유지를 위해 특별히 설계된이 결정은 온도 드리프트 가 매우 작습니다. RTC 칩을 사용하려면이 중 하나가 필요합니다.
8MHz RC 발진기가 나오도록 ATmega의 퓨즈를 구성하십시오. 이로 인해 millis()
기능 이 매우 부정확 해지고 XTAL1 및 XTAL2 핀이 해제됩니다.
시계 크리스털을 TOSC1 및 TOSC2 핀에 연결합니다. 이들은 XTAL1 및 XTAL2와 동일한 핀입니다 (328P의 9 및 10). 다른 이름은 다른 기능을 의미하는 데 사용됩니다.
비동기 작업, 일반 카운팅 모드, 프리스케일러가 128로 설정되도록 타이머 / 카운터 2를 구성하고 타이머 오버 플로우 인터럽트를 활성화하십시오.
이제 초당 1 회의 매우 안정적인 속도로 TIMER2_OVF 인터럽트가 발생합니다. ISR에서 시계 표시를 1 초만 진행하면됩니다. 인터럽트 사이에서 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는 시간을 자연스럽게 산술 연산에 적합하지 않은 세분화 된 형태로보고하기 때문에 훨씬 더 복잡합니다.