실시간 클록 칩이 BCD를 사용하는 이유


14

시장에 출시 된 수십 가지의 실시간 클록 칩과 내장 전원 공급 식 실시간 클록 모듈이 내장 된 여러 프로세서를 보았습니다.

거의 모든 시간은 년-월-일-시-분-초로 시간을 저장할뿐만 아니라 개별 필드까지도 이진 형식이 아닌 BCD로 저장됩니다.

이것에 대한 근본적인 이유가 있습니까?

BCD 형식이 이진보다 유용하거나 년-월-일-시-분-초 형식이 47 비트보다 더 유용한 클록을 표시하는 것보다 더 정교한 작업을 수행하는 마이크로 프로세서 응용 프로그램이 있습니까? 발진기 상태 변화?

내가 알 수 있듯이 RTCC 제조업체는 칩을 덜 유용하게 만들기 위해 많은 추가 회로를 추가하는 것 같습니다. 프로세서에서 RTCC 모듈이 그런 식으로 작동하도록 할 수있는 유일한 이유는 프로세서 공급 업체가 자체 BCD 구현을 사용하지 않고 기존 BCD 구현을 사용하기 때문입니다.


2
나는 대답을 모르지만 BCD와 7-Segment Decoder와의 상관 관계가 있는지 궁금합니다 .
교수 Meow Meow

@ 교수 야옹 야 : 좋은 이름. 하드웨어에 표시 될 숫자를 저장하는 가장 실용적인 방법은 BCD입니다. 숫자를 다른 형식으로 표시하기 위해 저장 한 시스템이 있지만 대부분의 경우 ROM을 사용하여 숫자에서 시각적 표현으로 직접 매핑합니다 (예 : 아케이드 머신 "Tank"는 6 비트 점수 카운터를 사용했으며 512 바이트 ROM은 각 점수 값을 8x8 모양으로 변환하지만 최대 숫자 값이 상당히 작은 경우에만 일반적으로 작동했습니다.
supercat

답변:


12

모든 RTC가 BCD 인코딩을 사용합니까?

Philips / NXP의 RTC (독립형 및 ARM7 또는 Cortex-M3 칩에 통합)는 BCD 인코딩을 사용하지 않습니다.

BCD RTC에 어떤 문제가 있습니까?

플랫 카운터와 비교할 때 분할 BCD 클럭으로 더 어려운 작업은 시차 계산 (초 추가 또는 경과 시간 계산)입니다. "현재 시간이 사용자가 설정 한 알람 시간보다 큼"과 같은 시간 비교는 쉽습니다.

BCD (및 일반적으로 분할 필드) RTC의 장점은 무엇입니까?

달력 날짜를 관리 할 때 필드를 분할하면 정말 좋습니다. 휴먼 캘린더는 길이가 다른 달과 그 윤년 위에 재미있는 것들이 있습니다. 단일 카운터에서 그렇게하십시오 (거의 전력을 사용하지 않으면 보너스 포인트를 얻을 수 있습니다). 아, 그리고 요일을 지원해보십시오 (알람 시계에서 히터 컨트롤러에 이르기까지 모든 사람에게 유용한 모든 장치에 유용합니다).

BCD 접근 방식에는 시간 또는 날짜를 계산할 필요없이 "초마다"또는 "10 초마다"인터럽트가 무료로 제공됩니다.

기록적인 윤년 계산의 경우 NXP RTC에서 4 규칙으로 만 나눌 수 있고 100과 400으로 나누기를 확인하지 않기 때문에 NXP RTC에서 약간의 계산이 이루어집니다. BCD에서 연도 카운터를 유지하면 사소하고 아마도 아마도 잘했다.

요약

  1. 단조로운 시계를 원한다면 시계를 사용하십시오. "RTC 카운터"(자율 32kHz 발진기가있는 비동기 카운터)를 사용하여 PIC 또는 AVR을 구입할 수 있습니다. 단순히 날짜를 표시하는 것은 어려울 수 있습니다. :)

  2. 시간과 날짜를 표시하고 시간과 날짜의 사용자 입력을 기반으로 알람을 설정해야하는 경우 RTC를 사용하십시오. 또한 사용자가 현재 시간과 날짜를 변경하면 RTC 기반 인터럽트가 정확하지 않을 수 있습니다.


1
방금 프로세서가 죽었을 때 시간을 유지할 수 없다는 점을 제외하고는 거의 원하는 24 비트 RTC가있는 Gekko를 사용하기 시작했습니다. 또한 1 초 단위의 인터럽트 만 지원하는 바보 같은 BCD RTC 모듈이있는 ST Micro ARM을보고있었습니다. ST 칩에 3 년 이상 전원이 공급되지 않으면 RTC 프리 스칼라를 32 배 속도로 실행하고 소프트웨어 트릭을 사용하여 보상하여 깨우기 이벤트에서 1/32 초의 시간 해상도를 얻을 수 있지만 RTC에 저장된 시간은 달력 시간과 아무런 의미가 없습니다.
supercat

1
... 그래서 RTC의 어리석은 형식에서 1/32 초 단위로 변환해야 할 필요성은 성 가실 것입니다. 특히 그러한 수면 / 각성주기마다 변환이 필요하기 때문입니다. 통일 된 초로 변환하지 않고 RTCC 판독을 사용하는 사람이 얼마나 많은지 궁금합니다. 어쩌면 YMDHMS 형식을 가치있게 만들 정도로 충분할 수도 있지만, 인간 I / O를 위해 YMDHMS를 예약 하고 다른 모든 것에는 바로 몇 초 (또는 그 일부)를 사용하는 것이 훨씬 더 유용합니다 .
supercat

1
@jpc : 내 성향은 실제로 RTC 칩 시간을 설정하는 것이 아니라 "시계 배터리가 설치된 이후의 시간"을 유지하고 벽과 시간의 차이를 저장하는 것이 었습니다. 필자는 배터리 백업 시간을 유지하기 위해 별도의 PIC를 사용하고 (PIC의 시간이 읽기 전용 인 시간) 직선 카운터가있는 칩에서 사용하는 제품의 한 세대에이 접근 방식을 사용했습니다. 그러나 ST Micro 칩을 사용하면 기계의 RTC에 의미없는 날짜 형식의 값을 저장하는 것이 다소 바보 같은 생각처럼 보였습니다.
supercat

1
BTW에서 STM32F100 시리즈는 32 비트 초 RTC (BCD 아님)를 사용하지만 STM32F400 시리즈는 BCD 인코딩 RTC로 되돌아갑니다. 한숨.
Mark Lakata

1
@FedericoRusso : 분할 필드는 의미가 있지만 대부분의 응용 프로그램의 도움말보다 방해가되기 쉽습니다. 그러나 BCD의 선택은 BCD를 지원하지 않는 CPU와 번들로 제공하는 선택으로 기괴한 것처럼 보입니다 .
supercat

3

결국 시계를 사용할 때 총 초, 분 등보다 몇 분에서 수십 초 (시계를 표시하는 데)에 관심이있을 것입니다. 별도의 자릿수에 관심이없는 경우 분 또는 초 값을 신경 쓰지 않고 제안한대로 긴 이진 카운터를 사용할 수도 있습니다.
다른 방법보다 소프트웨어에서 BCD를 바이너리로 변환하는 것이 더 쉽습니다. BCD 카운터는 이진 카운터보다 많은 추가 공간을 필요로하지 않기 때문에 BCD를 선택하는 것이 좋습니다.


2
응용 프로그램이 표시하는 것 이외의 날짜 및 시간으로 아무 작업도 수행하지 않으려는 빈도는? 미래에는 어느 정도의 거리를 계산하거나 특정 이벤트 이후에 경과 한 시간을 결정하는 것이 훨씬 일반적인 것 같습니다. 날짜와 시간은 45 초입니다. 2000 년 2 월 28 일 23:59:52 또는 5097582 + 45 (2000 년 1 월 1 일 자정을 신기원으로 가정 한 후자의 값)? 2000 년 2 월 28 일 23:59와 2000 년 3 월 1 일 00:03 사이에 5 분이 경과했는지 확인하는 방법 (vs 5097540.0과 5184180.0)
supercat

1
65,536 초의 48 비트 카운터를 가진 RTC와 최하위 24 비트를 커버하는 알람 비교 모듈은 저전력 시스템에 매우 유용 할 것입니다. 프로세서 깨우기 및 잠자기. 지금부터 4 초간 어떤 일이 발생하면 시스템은 이벤트가 발생할 때 RTC 값을 기록 할 수 있습니다. 2 초 후 프로세서가 아무 조치도 취하지 않으면 RTC 경보를 설정하고 절전 모드로 전환 할 수 있습니다. 이벤트가 발생하면 시스템이 깨어납니다.
supercat

@supercat-범용 컴퓨터의 경우 OS에서 시간을 추적하고 해당 시간 정보로 "유용한 작업"을 수행하십시오. RTC는 OS의 시간 정보를 초기화하기 위해 한 번만 참조한 다음 인터럽트에 의해 시간이 업데이트됩니다. 그러나 많은 단순한 임베디드 사용의 경우 훨씬 더 가능성이 높습니다.
Toybuilder

1
@Toybuilder : 후자는 지난 몇 세대의 전자 잠금 장치에서 사용했던 접근법입니다. 가장 큰 불만은 32Khz와 16Hz 사이의 펄스 출력 선택이 없다는 것입니다 (32Khz 오픈 컬렉터 출력으로 안정적으로 작동하기 위해 1M 풀업을 신뢰할 수 없기 때문에 유일한 합리적인 선택은 16Hz였습니다) 및 PIC의 부패 타이머 회로.
supercat

1
@FedericoRusso : 직선 이진 시간 카운터가 있다면 사람이 읽을 수있는 표시를 제외하고 시간, 분 및 초로 다시 변환 할 필요가 없습니다. 하나는 단순히 3723을 추가하면됩니다. YMD-HMS 날짜 / 시간 값으로 작업 할 때 증가 및 감소를위한 별도의 코드가 필요합니다. 일광 절약 시간은 칩 제조업체가 깨진 지원을 추가하려고하는 악몽입니다. 0이면 아무 것도하지 않습니다]. DST는 바이너리에서도 고통이지만 끔찍한 것은 아닙니다.
supercat

3

몇 가지 이유가 의심됩니다.

역사적-그들은 한동안 이런 식으로 해왔습니다. 새 부품을 다른 부품으로 교체하려면 거의 동일하게 작동해야합니다. 따라서 BCD를 유지하십시오.

응용 프로그램-누군가가 작은 마이크로 (저급 PIC와 같은 8 비트 범위의 RTC)에서 RTC를 사용하는 경우 많은 수 (예 : 47 비트 카운터)를 처리하는 것이 목에 큰 고통입니다. BCD 숫자를 다루는 것이 훨씬 쉽습니다. 일을 해체 할 필요가 없기 때문입니다.

그렇게 어렵지 않습니다-BCD 카운터를 만드는 것은 그렇게 어렵지 않으며 실제로 바이너리를하는 것보다 더 많은 게이트가 아니라고 생각합니다.

BCD 대신 이진수로 별도의 시간, 분 등의 카운터를 얻는 시스템을 상상할 수 있습니다 (따라서 '47 비트 숫자 나누기 '문제를 피할 수는 없습니다). 그렇게 쉽지는 않으며 일부를 할 것입니다. 어쨌든 표시 할 때 변환.


1
48 비트 숫자는 32 비트 수의 초와 16 비트 소수입니다. 8 비트 마이크로에서 32 비트 숫자로 작업하는 것은 그리 나쁘지 않습니다. 패킹 된 BCD를 잘 처리 할 수있는 6502와 같은 경우 BCD 형식은 경우에 따라 몇 바이트를 절약 할 수 있지만 몇 분에서 몇 분 사이의 캐리 처리가 복잡해지면 이점을 상쇄 할 수 있다고 상상할 수 있습니다. 그러나 ST 마이크로의 ARM 칩에 RTCC를 구축 한 사람들은 누군가 32502 ARM이 아닌 6502를 사용하여 데이터를 처리 할 것으로 기대하지 않았습니다!
supercat

1
@supercat-어렵지 않지만 8 비트 마이크로에서 32 비트 작업을하는 것은 여전히 ​​<bleep>의 고통입니다. 그리고 PIC와 같은 것 (매우 제한된 명령 및 레지스터 및 램 공간이 있음)에는 훨씬 더 고통 스럽습니다. ARM 칩에 관해서는-다른 것보다 역사적 선례와 더 관련이있는 베팅 할 것입니다. 모두가 그렇게하는 데 익숙해 져서 계속 그렇게하고 있습니다.
Michael

1
RTCC 주변 장치를 사용하는 사람들 중 일부가 날짜 / 시간을 Unix 스타일의 초 카운터로 변환하지 않는 이유는 무엇입니까?
supercat

1
supercat : 그들 모두? 시계에서 유닉스 스타일 타임 스탬프는 어떤 용도로 사용됩니까? OTOH의 유일한 사용 사례는 RTOS 알람이며 일반 타이머 또는 RTC의 간단한 "두 번째 증분"인터럽트로 더 잘 제공됩니다.
jpc

1
@jpc : 주어진 날짜가 일광 절약 시간인지 여부를 결정하거나 특정 날짜 / 시간에 시작하여 특정 길이를 지속하는 프로그램이 다른 프로그램과 겹칠 지 여부를 결정하려면 어떻게해야합니까? 이러한 작업은 몇 초만에 쉽지만 YMDHMS에서는 더 어렵습니다. 일반 타이머를 사용하는 경우 현재 사용하는 것은 PIC에서 TMR1 및 TMR3을 구동하는 RTC 칩의 1/16 초 틱입니다. 그것은 주 CPU 클럭이 멈춰도 작동하는 1/16 초의 정확한 웨이크 업을 제공하며, 그로부터 모든 타이밍을 얻습니다.
supercat

1

나는 역사적인 역사가 많다는 마이클 코네 (Michael Kohne)에 동의한다.

초기 MCU는 또한 코드 및 데이터를위한 공간이 훨씬 적었습니다 (예 : 128 바이트의 RAM을 생각하십시오). 시간 정보는 종종 사람과의 인터페이스 목적으로 사용되기 때문에 데이터를 사람에게 표시하거나 입력하는 데 사용되는 형식에 가장 가까운 데이터를 유지하는 것이 더 합리적입니다.

더 많은 코드 및 데이터 공간을 가진 일부 최신 MCU는 때때로 하드웨어 실시간 카운터를 구현합니다. 이러한 장치는 종종 32kHz 틱의 이진 수를 유지합니다.


Atari 2600 (128 bytes RAM)을 코딩했으며 BCD의 장점을 알고 있습니다. 점수와 같은 것은 거의 항상 BCD에서 계산됩니다. 레벨 번호는 때때로 있습니다. 그러나 6502에서도 두 날짜 / 시간이 서로 5 분 이내인지 여부를 확인하고 일광 절약 시간이 유효한지 여부를 결정 해야하는 경우 32 비트 초 카운터를 YMDHMS로 변환하는 코드는 그러한 변환을 수행하지 않고 이러한 계산을 수행하려면 코드만큼 압축하십시오. 최신 CPU의 경우, 메인 CPU가 살아 있어야하는
32Khz

...하지만 별도의 RTCC를 사용하는 칩은 BCD YMDHMS를 사용합니다.
supercat

최신 CPU는 저렴하고 전류 소비가 적기 때문에이 작업을 수행합니다 (특히 사용되는 반도체 프로세스가 RTC가 아닌 CPU를 만들기 위해 최적화 되었기 때문에 중요 함).
jpc

@jpc : BCD YMDHMS를 사용하는 것이 왜 더 저렴하고 낮은 전류입니까? 하단 32 비트에 비교기가있는 47 비트 읽기 전용 카운터가 RTC 칩의 모든 날짜 구문 분석 항목보다 간단하다고 생각합니다. 오랫동안 잊혀진 신비한 마법 때문에 현대적인 방법으로 사용할 수있는 것보다 낮은 전류를 달성 할 수있는 디자인에 뛰어들 수있는 BCD 날짜 회로의 일부 마스터 필름이 없다면 BCD가 왜 더 저렴하거나 사용되는지 명확하지 않습니다. 적은 전류?
supercat

@Toybuilders의 답변에 따르면 새로운 CPU에는 카운터 만 있고 완전한 RPC는 없습니다.
jpc

1

누군가 관심이 있다면 ST의 32F 시리즈를보고 새로운 32L 시리즈가 BCD RTC를 사용하는 반면 32F는 구성 가능한 프리 스칼라가있는 직선 32 비트 카운터를 사용하고 별도의 배터리 입력을 제공하는 것으로 보입니다 (hooray! ). 프리 스칼라를 구성 할 수없는 카운터가 길어 졌을 것입니다 (따라서 1/256 초 정확도를 얻을 수 있지만 랩핑에 대해 걱정할 필요없이 몇 년 동안 시간을 ​​유지할 수 있습니다) .1 / 64 초로 프리 스케일을 설정하면 타이머가 실행될 수 있습니다 넘치지 않고 2 년. 이상적이지는 않지만 너무 나쁘지는 않습니다. 너무 오래 (2.1 년 이상) 전원을 껐다 켜면 누군가 전원을 켜면 시간 / 날짜가 2.1 년까지 감지되지 않지만 큰 문제 (카운터에 오버플로 플래그가 있지만 별로 도움이되지 않는 많은 경우. 전원을 끄기 전에 2 년 동안 기기를 켜고 3 개월 후 전원을 켜면 타이머가 오버플로 될 것으로 예상됩니다. 문제는 그것이 두 번 오버플로되었는지 여부이며, 나는 그것에 대한 깃발을 모른다.


0

Maxim은 DS1372U로 원하는 것을하고있는 것 같습니다 . 1μA 미만, 비용 1.7 USD이 필요하며 DigiKey 및 Mouser에서 사용 가능합니다 (!). 유일한 문제는 1 초 이상의 정밀도로 알람을 제공하지 않는 것 같고 가장 낮은 출력 클럭 속도는 $ \ approx $ 4kHz입니다.


1
조금 비싸며 1 초 미만의 증분을 읽을 수있는 방법이 없습니다. 4096Hz 출력은 좋지만 1/65536 초 동안 낮고 15/65536에서는 높으면 훨씬 더 좋습니다. 오픈 컬렉터 출력은 가능한 한 낮아야합니다.
supercat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.