RTC를 얼마나 자주 쿼리해야합니까?


11

아직 RTC를 사용하지 않았으므로 실시간 시계를 읽는 "일반적인"방법을 완전히 확신하지 못합니다. 내가 생각한 몇 가지 접근법이 있지만 그것에 대한 조언을 기대하고있었습니다.

지금까지 시간을 읽고 사용하는 방법은 다음과 같습니다.

  1. 전원을 켤 때 날짜와 시간을 가져와 RAM에 저장 한 다음 타이머 인터럽트를 사용하여 매초마다 RAM 값을 증가시킵니다. 코드는 날짜 / 시간을 알아야 할 때마다 RAM의 값을 사용합니다.
  2. 타이머 인터럽트를 사용하여 매초마다 RTC를 쿼리하고 수신 된 날짜와 시간을 RAM에 복사하십시오. 다시, 코드는 날짜 / 시간을 알아야 할 때마다 RAM의 값을 사용합니다.
  3. 시간을 찾아야 할 때마다 RTC를 쿼리하고 응답을 직접 사용하십시오.

가장 좋은 방법은 무엇입니까?


15
최선의 방법은 최소한의 리소스를 사용하면서 사양을 충족시키는 방법입니다. 우리는 당신의 요구를 실제로 알지 못하기 때문에 "최고"는 우리에게 거의 의미가 없습니다.
Scott Seidman

모든 좋은 답변 나는 답변을 선택할 수 없습니다!
user9993

답변:


23

네 번째 옵션을 사용합니다.

대부분의 RTC 칩에는 1 초 펄스를 출력 할 수있는 옵션이 있습니다. 해당 펄스를 MCU의 인터럽트 가능 입력에 연결해야합니다.

  • 프로그램을 시작할 때 한 번 칩에서 시간을 얻거나 때로는 한 시간에서 한 번씩 실행하는 경우도 있습니다.
  • 그런 다음 인터럽트 신호는 MCU에서 인터럽트 루틴을 트리거하여 시간을 1 초씩 증가시킵니다.

이러한 배열은 RTC를 적극적으로 읽는 오버 헤드없이 RTC 의 두 번째 정확도 제공합니다 .


5
이 방법을 사용할 때는 어떤 클럭 에지가 증분을 나타내는 지 알고 해당 클럭 에지 동안 진행중인 판독 값을 포기해야합니다.
supercat

또는 판독 값이 ISR에 의해서만 트리거되는지 확인하십시오. 다음 ISR이 트리거되기 전에 1 초 간격으로 판독해야합니다.
Majenko

가능할 때마다 실시간 클록을 초당 1 틱보다 빠르게 실행하도록 설정하고 RTC 해상도를 이벤트 타이밍 요구에 맞게 충분히 미세하게 설정할 수있는 경우 범용 이벤트 타이밍에 사용하는 것이 좋습니다. 따라서 모든 RTC 틱에서 항상 인터럽트가 발생하는 것은 아닙니다. 또한 알람을 설정할 때 알람이 설정되는 시점의 RTC 시간을 정확히 알고 알람이 설정되는 동안 이동했는지 확인하기 위해 RTC를 폴링하는 것이 중요합니다. 32 비트 칩 공급 업체가 단순히 읽기 기능이있는 47 비트 카운터를 제공하지 않는 이유를 모르겠습니다.
supercat

... 상위 32 비트 또는 하한 31 + 클록 입력 상태, 동기화 지연없이 언제라도 켜고 끌 수있는 알람 및 알람이있을 때 언제든지 쓸 수있는 알람 레지스터 알람이 활성화 된 동안 증분이 발생하면 알람이 발생한다는 의미와 함께 해제됩니다 . 칩이 비동기 웨이크 업을 수용 할 수 있고 소프트웨어가 적절한 경우 폴링을 다시 확인하면 다른 하드웨어 동기화가 필요하지 않으며 소프트웨어는 다른 형태의 하드웨어 동기화로 인한 문제를 해결할 필요가 없습니다.
supercat

9

3 번째와 2 번째가 더 실행 가능합니다.

세 번째 접근 방식은 대부분의 경우에 사용하는 방법입니다. 이점은 RAM에서 RTC를 미러링하는 것에 대해 걱정할 필요가 없다는 것입니다. 직렬 버스를 통해 RTC를 조사하면 지연이 발생한다는 단점이 있습니다. 1 초에 한 번 데이터를 쓰고 있다면이 지연은 중요하지 않을 것입니다.

두 번째 접근 방식도 좋습니다. 장치가 장시간 실행되는 경우 미러 시계를 유지 관리하면 시간 표시 오류가 발생할 수 있습니다. 미러 클럭은 RTC와 다르게 표류 할 수 있습니다. RTC를 정기적으로 읽으면 드리프트가 누적되지 않습니다.
그러나 ISR (인터럽트 서비스 루틴) 자체에서 직렬 통신을 수행하지 않는 것이 좋습니다. ISR에서 플래그를 설정하고 main ()에서 직렬 통신을 수행하십시오.

ps 모든 경우에 DS1307을 사용하고있었습니다.


6

일부 RTC (예 : MC68HC68T1 [아무도 더 이상 아무도 사용하지 않아야 함])는 일관된 응답을 제공하기 위해 읽을 때 내부 계산을 일시 중지합니다. 방해를 최소화하기 위해 가능한 한 드물게 읽어야합니다 . 그것들을 한 번 읽은 다음 타이머 인터럽트를 사용하여 MCU의 RAM에 저장된 시간 값을 업데이트하십시오.


그러한 디자인은 마음을 사로 잡습니다. 증가 데이터에서 발생하는 읽기 임의 데이터는 해결하기 쉬운 문제입니다. 읽은 수를 놓치면 카운트를 잃어 버리는 것 외에는 해결할 수없는 문제가 있습니다.
supercat

2
분명히 이중 버퍼링은 칩을 설계 할 때 사람들이 생각하지 못하는 것입니다.
Ignacio Vazquez-Abrams

폴링 할 때 값이 변경되지 않도록 코드를 검사하면 이중 버퍼링이 필요하지 않습니다. 온칩 실시간 클록의 경우, 주 코드가 수행하는 것과 동시에 인터럽트가 RTC를 읽으려고 시도하더라도 변경이 없을 때까지 반복 폴링이 작동합니다. 일부 이중 버퍼 디자인은 안전하게 공존 할 수있는 메인 라인 및 인터럽트 코드를 작성하는 것을 어렵게 만들고 실제로 "유용한"것으로 생각되는 것을 본 적이 없습니다.
supercat

5

RTC는 자체 크리스털이있는 별도의 칩이거나 메인 클럭과 별도의 시간 소스 (예 : 32kHz 크리스털)가있는 마이크로 컨트롤러와 통합 된 모듈이라고 가정하겠습니다. RTC의 시간 소스는 마이크로 컨트롤러의 시간 소스보다 정확합니다.

RTC를 얼마나 자주 읽어야하는지 결정하려면 메인 클럭이 가질 수있는 최대 오류를 파악해야합니다. 예를 들어, 주 결정이 20ppm으로 지정되면 0.002 %와 동일합니다. 따라서 메인 클럭 소스를 기반으로하는 클럭은 하루 0.00002 * 3600 * 24 = 1.728 초를 표류 할 수 있습니다.

따라서 하루에 두 번만 RTC를 읽고 타이머 인터럽트를 사용하여 1 초에 한 번 증가한 시간 사이에 RTC와 비교하여 1 초 이상 꺼져 있지 않아야합니다.

앞서 언급했듯이 RTC가 자체 크리스털이있는 별도의 칩이거나 마이크로 컨트롤러와 통합 된 모듈 인 경우 이것이 정확하다는 의미는 아닙니다. RTC에도 오류가있을 수 있습니다. 예를 들어, 허용 오차가 5ppm (10ppm보다 약간 비싸다) 인 32kHz 크리스털을 사용하는 경우 하루 0.43 초 또는 매월 13 초 떨어져있을 수 있습니다.

이 문제를 해결하려면 RTC를 조정해야합니다. 여기서 RTC를 조정 계수로 다시 레지스터에 씁니다. 그렇게하면 실제로 오류를 0으로 만들 수 있습니다. 물론 튜닝을 수행 할 때 기준으로 사용할 세 번째 외부 클록 소스가 있어야합니다. 미국에서 매우 정확한 기준은 60Hz AC 라인이며, 연속 자정 사이에 24 시간 동안 정확히 60 * 60 * 60 * 24 (5,184,000) 사이클 이 보장 됩니다 . 이 기능을 유용하게 사용하려면 60Hz가 자정 사이에 표류 할 수 있으므로 전체 24 시간 동안 시간을 ​​보내야합니다.

또 다른 우수한 시간 기준은 프로젝트에 GPS 하드웨어가 이미있는 경우 GPS (10ns 정확도)를 사용하는 것입니다.

RTC 시간이 셀룰러 네트워크 시간 (AT + CCLK? 호출)과 같은 외부 소스 또는 NTP를 사용하는 네트워크 시간 서버에서 온 경우 "조정"할 것이 없으므로 RTC 값을 그대로 사용할 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.