Tại sao chip đồng hồ thời gian thực sử dụng BCD


14

Tôi đã thấy hàng chục chip đồng hồ thời gian thực khác nhau trên thị trường, cũng như một số bộ xử lý với mô-đun đồng hồ thời gian thực được tích hợp riêng.

Gần như tất cả chúng không chỉ lưu trữ thời gian như năm-tháng-ngày-phút-giây, mà ngay cả các trường riêng lẻ cũng được lưu trữ trong BCD thay vì định dạng nhị phân.

Có một số lý do cơ bản cho việc này?

Có ứng dụng vi xử lý nào làm bất cứ điều gì phức tạp hơn chỉ đơn giản là hiển thị đồng hồ trong đó định dạng BCD hữu ích hơn nhị phân, hoặc ở đó định dạng năm-tháng-giờ-phút-giây sẽ hữu ích hơn so với số lượng 47-bit thẳng của trạng thái dao động thay đổi?

Từ những gì tôi có thể nói, có vẻ như các nhà sản xuất RTCC đã bổ sung thêm rất nhiều mạch điện để làm cho chip của họ ít hữu dụng hơn; lý do duy nhất tôi có thể hình dung cho các mô-đun RTCC trong bộ xử lý hoạt động theo cách đó là các nhà cung cấp bộ xử lý sử dụng một số triển khai BCD có sẵn thay vì tự sản xuất.


2
Tôi không biết câu trả lời nhưng tôi tự hỏi liệu có bất kỳ mối tương quan nào với BCD với Bộ giải mã 7 phân đoạn không?
Giáo sư Meow Meow

@Prof. Meow Meow: Tên hay. Phương pháp thiết thực nhất để lưu trữ các số sẽ được hiển thị trong phần cứng là BCD. Có những hệ thống lưu trữ số được hiển thị ở các định dạng khác, nhưng trong nhiều trường hợp, chúng chỉ đơn giản sử dụng ROM để ánh xạ trực tiếp từ số sang biểu diễn trực quan của nó (ví dụ: máy arcade "Tank" sử dụng bộ đếm điểm 6 bit và 512 ROM byte để chuyển đổi từng giá trị điểm thành hình 8 x 8) nhưng điều này thường chỉ khả thi nếu giá trị số tối đa khá nhỏ.
supercat

Câu trả lời:


12

Có phải tất cả các RTC sử dụng mã hóa BCD?

Các RTC từ Philips / NXP (cả độc lập và được tích hợp vào chip ARM7 hoặc Cortex-M3) không sử dụng mã hóa BCD.

Có gì sai với BCD RTC?

Khi so sánh với bộ đếm phẳng, các thao tác duy nhất khó khăn hơn với đồng hồ BCD phân chia là các phép tính chênh lệch thời gian (thêm giây hoặc tính thời gian đã trôi qua). So sánh thời gian như: "là thời gian hiện tại lớn hơn thời gian báo thức do người dùng đặt" cũng dễ dàng như vậy.

Điều gì tốt đẹp về các RTC BCD (và nói chung là chia nhỏ)?

Chia các lĩnh vực là thực sự tốt đẹp khi bạn quan tâm đến ngày dương lịch. Lịch của con người có những điều thú vị như tháng có độ dài khác nhau và trên đỉnh của năm nhuận đó. Cố gắng làm điều đó trong một bộ đếm duy nhất (bạn có thể nhận được điểm thưởng khi sử dụng gần như không có sức mạnh). Oh và thử hỗ trợ các ngày trong tuần (khá hữu ích trong tất cả các loại thiết bị dành cho con người: từ đồng hồ báo thức đến bộ điều khiển máy sưởi) với điều này.

Cách tiếp cận BCD có một tính năng bổ sung: bạn nhận được các ngắt "mỗi giây" hoặc "cứ sau mười giây" miễn phí, mà không phải thực hiện bất kỳ phép tính nào về thời gian hoặc ngày.

Đối với tính toán năm nhuận kỷ lục là một chút trong các RTC NXP vì nó chỉ quan tâm đến quy tắc chia hết cho 4 và không kiểm tra phép chia cho 100 và 400. Nếu nó giữ bộ đếm năm trong BCD thì điều này có thể là tầm thường và rất có thể làm đúng

Tóm lược

  1. Nếu bạn muốn một chiếc đồng hồ đơn điệu thì hãy sử dụng một chiếc. Bạn có thể mua PIC hoặc AVR với "bộ đếm RTC" (chỉ là bộ đếm không đồng bộ với bộ dao động 32kHz tự trị). Chỉ cần nhớ rằng chỉ đơn giản là hiển thị ngày sẽ khó khăn. :)

  2. Khi bạn cần hiển thị thời gian và ngày và đặt báo thức dựa trên đầu vào của người dùng về thời gian và ngày, sau đó sử dụng RTC. Và hãy nhớ rằng khi người dùng thay đổi thời gian và ngày hiện tại thì các ngắt dựa trên RTC của bạn có thể không chính xác.


1
Tôi mới bắt đầu sử dụng Gekko, có RTC 24 bit gần như là điều tôi muốn ngoại trừ việc nó không thể giữ thời gian khi bộ xử lý chết. Tôi cũng đang xem xét một ST Micro ARM, có mô-đun BCD RTC ngớ ngẩn, chỉ hỗ trợ các ngắt trên cơ sở một giây. Nếu chip ST sẽ không bao giờ không có điện trong hơn ba năm, tôi có thể sử dụng các bộ định tuyến RTC để chạy ở tốc độ 32x, và sau đó sử dụng các thủ thuật phần mềm để bù lại, do đó có được độ phân giải thời gian 1/32 giây cho các sự kiện đánh thức, nhưng thời gian được lưu trữ trong RTC sẽ không có liên quan có ý nghĩa với thời gian theo lịch và ...
supercat

1
... Vì vậy, sự cần thiết phải chuyển đổi từ định dạng ngớ ngẩn của RTC sang gia số 1/32 giây sẽ gây khó chịu, đặc biệt là việc chuyển đổi như vậy sẽ được yêu cầu trong mỗi chu kỳ ngủ / thức dậy. Tôi đoán tôi tò mò có bao nhiêu người sử dụng các bài đọc RTCC mà không chuyển đổi thành giây thống nhất. Có thể có đủ để làm cho định dạng YMDHMS trở nên đáng giá, nhưng theo tôi thì việc dự trữ YMDHMS cho I / O của con người sẽ hữu ích hơn rất nhiều và sử dụng các giây thẳng (hoặc bất kỳ phân số nào) cho mọi thứ khác.
supercat

1
@jpc: Xu hướng của tôi thực sự sẽ là không bao giờ đặt thời gian cho chip RTC, mà thay vào đó hãy giữ "thời gian kể từ khi pin đồng hồ được lắp đặt" và lưu trữ sự khác biệt giữa thời gian đó và thời gian treo tường. Tôi đã sử dụng phương pháp đó trong một thế hệ sản phẩm sử dụng PIC riêng để duy trì thời gian sử dụng pin (thời gian trên PIC đó là chỉ đọc) và sẽ sử dụng nó trên chip với bộ đếm thẳng. Tuy nhiên, có vẻ như đó là một ý tưởng ngớ ngẩn, để RTC của máy lưu trữ một giá trị được định dạng ngày vô nghĩa, mặc dù nếu tôi sử dụng chip ST Micro, tôi có thể làm điều đó.
năm11

1
BTW, sê-ri STM32F100 sử dụng RTC 32 giây (không phải BCD), nhưng sê-ri STM32F400 hồi quy trở lại RTC được mã hóa BCD. Thở dài.
Đánh dấu Lakata

1
@FedericoRusso: Trường tách sẽ có ý nghĩa, mặc dù nó có nhiều khả năng trở thành một trở ngại hơn là trợ giúp trong hầu hết các ứng dụng. Mặc dù vậy, sự lựa chọn BCD có vẻ hết sức kỳ quái là một lựa chọn đi kèm với CPU không có bất kỳ hỗ trợ BCD nào .
supercat

3

Khi sử dụng đồng hồ cuối cùng, bạn có nhiều khả năng quan tâm đến phút và hàng chục giây (đối với việc hiển thị chúng) hơn là chỉ tổng số giây, phút, v.v. Trong trường hợp bạn không quan tâm đến các chữ số riêng biệt, có thể bạn không quan tâm đến các giá trị phút hoặc giây riêng biệt và bạn cũng có thể sử dụng bộ đếm nhị phân dài như bạn đề xuất.
Chuyển đổi từ BCD sang nhị phân trong phần mềm dễ dàng hơn so với cách khác. Và vì các bộ đếm BCD không yêu cầu nhiều bất động sản hơn các bộ đếm nhị phân, nên chọn BCD.


2
Bao lâu thì một ứng dụng muốn không làm gì với ngày và giờ ngoài việc hiển thị nó? Đối với tôi, dường như phổ biến hơn rất nhiều khi muốn thực hiện những việc như tính thời gian một khoảng cách trong tương lai hoặc xác định thời gian đã trôi qua kể từ một sự kiện cụ thể nào đó, v.v ... Dễ dàng hơn để tính toán: ngày và thời gian 45 giây sau ngày 28 tháng 2 năm 2000 23:59:52 hoặc 5097582 + 45 (giá trị sau giả sử nửa đêm 01 tháng 1 năm 2000 là thời đại)? Làm thế nào về việc xác định xem 5 phút đã trôi qua trong khoảng thời gian từ 28 đến tháng 2 năm 2000 23:59 và 01 tháng 3 năm 2000 00:03 (so với 5097540.0 và 5184180.0)
supercat

1
Một RTC với bộ đếm 48 bit trong 65,536 giây và mô-đun so sánh báo động bao gồm 24 bit dưới cùng hoặc cực kỳ tiện dụng cho các hệ thống năng lượng thấp vì nó có thể được sử dụng làm cơ sở cho việc lập lịch cho hệ điều hành độc lập với bộ xử lý thức và ngủ. Nếu một cái gì đó được cho là xảy ra 4 giây kể từ bây giờ, hệ thống có thể lưu ý giá trị RTC khi sự kiện sẽ xảy ra. Nếu 2 giây kể từ bây giờ bộ xử lý thấy mình không có gì để làm, nó có thể đặt báo thức RTC và đi ngủ. Khi sự kiện sẽ xảy ra, hệ thống sẽ thức dậy.
supercat

@supercat - đối với máy tính có mục đích chung, hãy để HĐH theo dõi thời gian và thực hiện "những điều hữu ích" với thông tin thời gian đó. RTC chỉ được tham khảo một lần để khởi tạo thông tin thời gian của HĐH và sau đó thời gian được cập nhật bằng các ngắt. Nhưng đối với nhiều mục đích sử dụng nhúng đơn giản, nhiều khả năng là vậy
Toybuilder

1
@Toybuilder: Cái sau chính xác là cách tiếp cận tôi đã sử dụng trong vài thế hệ khóa điện tử gần đây. Khó chịu lớn nhất của tôi là không có bất kỳ lựa chọn đầu ra xung nào giữa 32Khz và 16Hz (vì tôi không tin tưởng một pullup 1M hoạt động đáng tin cậy với đầu ra của bộ thu mở 32Khz, lựa chọn hợp lý duy nhất là 16Hz) và độ chùng của PIC mạch hẹn giờ.
năm11

1
@FedericoRusso: Nếu một người có bộ đếm thời gian nhị phân thẳng, người ta sẽ không phải chuyển đổi lại thành giờ, phút và giây, ngoại trừ có thể hiển thị có thể đọc được. Người ta chỉ cần thêm 3723 và thế là xong. Khi làm việc với các giá trị ngày / giờ của YMD-HMS, người ta cần một mã riêng để tăng và giảm, thời gian tiết kiệm ánh sáng ban ngày là một cơn ác mộng mà các nhà sản xuất chip dường như muốn thêm hỗ trợ bị hỏng [như một lệnh trừ đi số giờ trừ khi nó bằng không, trong trường hợp đó nó không làm gì cả]. DST là một nỗi đau trong nhị phân quá, nhưng không hoàn toàn gớm ghiếc.
supercat

3

Tôi nghi ngờ một số lý do:

Lịch sử - họ đã làm theo cách này một thời gian rồi. Nếu bạn muốn phần mới của bạn thay thế một số phần khác, thì nó phải hoạt động ít nhiều giống nhau. Vì vậy, bạn giữ với BCD.

Ứng dụng - nếu ai đó đang sử dụng RTC từ một micro nhỏ (thứ gì đó trong phạm vi 8 bit, như PIC cấp thấp), thì việc xử lý một số lượng lớn (chẳng hạn như bộ đếm 47 bit của bạn) là một nỗi đau lớn ở cổ. Thật dễ dàng hơn để xử lý các chữ số BCD, vì bạn không phải làm việc để phá vỡ mọi thứ.

Không khó lắm - Làm các bộ đếm BCD không khó lắm, và thực tế tôi nghĩ rằng nó không có nhiều cổng hơn là làm chúng nhị phân.

Mọi người có thể tưởng tượng một hệ thống trong đó bạn có các bộ đếm giờ, phút, vv riêng biệt thay vì BCD (do đó tránh được vấn đề 'phá vỡ số 47 bit'), nhưng nó không dễ dàng hơn nhiều và bạn sẽ thực hiện một số chuyển đổi khi hiển thị điều nào.


1
Số 48 bit sẽ là số giây 32 bit và phân số 16 bit. Làm việc với các số 32 bit trên micro 8 bit không phải là xấu. Tôi có thể tưởng tượng rằng trên một cái gì đó như 6502 có thể xử lý BCD được đóng gói độc đáo, định dạng BCD có thể tiết kiệm một vài byte trong một số trường hợp, mặc dù việc xử lý phức tạp thêm trong vài giây-phút sẽ bù lại bất kỳ lợi thế nào. Nhưng chắc chắn rằng những người đã xây dựng RTCC thành chip ARM của micro ST không mong muốn ai đó sử dụng 6502 để xử lý dữ liệu - không phải với ARM 32 bit đang ở ngay đó!
supercat

1
@supercat - trong khi không khó, thực hiện công việc 32 bit trên micro 8 bit vẫn là một nỗi đau trong <bleep>. Và trên một cái gì đó giống như PIC (với RẤT NHIỀU hướng dẫn & đăng ký & ram không gian hạn chế), điều đó thậm chí còn khó chịu hơn. Đối với chip ARM - Tôi sẽ đặt cược rằng nó có liên quan nhiều đến tiền lệ lịch sử hơn bất kỳ thứ gì khác - mọi người đều đã từng làm theo cách đó, vì vậy họ tiếp tục làm theo cách đó.
Michael Kohne

1
Tôi tự hỏi phần nào của những người sử dụng thiết bị ngoại vi RTCC không chuyển đổi ngày / lần thành bộ đếm giây kiểu Unix?
supercat

1
Supercat: Tất cả bọn họ? Sử dụng dấu thời gian kiểu Unix trong đồng hồ là gì? OTOH trường hợp sử dụng duy nhất của bạn là các báo động RTOS được phục vụ tốt hơn với bộ hẹn giờ bình thường hoặc với ngắt "gia tăng thứ hai" đơn giản từ RTC.
jpc

1
@jpc: Điều gì sẽ xảy ra nếu bạn muốn xác định xem một ngày nhất định có trong thời gian tiết kiệm ánh sáng ban ngày hay không, hoặc xác định xem một chương trình bắt đầu vào một ngày / giờ nhất định và kéo dài một độ dài nhất định sẽ chồng lấp lên một ngày khác? Những điều như vậy là dễ dàng với giây thẳng, nhưng khó hơn với YMDHMS. Đối với việc sử dụng bộ hẹn giờ bình thường, những gì tôi sử dụng hiện tại là tích tắc 1/16 giây từ chip RTC điều khiển TMR1 và TMR3 trên PIC; giúp tôi thức dậy chính xác 1/16 giây, hoạt động ngay cả khi đồng hồ CPU chính bị dừng và tôi lấy được tất cả thời gian của mình từ đó.
supercat

1

Tôi đồng ý với Michael Kohne rằng có rất nhiều động lực lịch sử.

MCU ban đầu cũng có ít không gian hơn cho mã và dữ liệu (ví dụ, nghĩ 128 BYTES RAM). Vì thông tin thời gian thường được sử dụng cho mục đích giao tiếp với con người, nên việc giữ dữ liệu gần nhất với định dạng được sử dụng để hiển thị / nhập từ con người sẽ có ý nghĩa hơn.

Một số MCU mới hơn có nhiều mã và không gian dữ liệu hơn đôi khi thực hiện các bộ đếm thời gian thực phần cứng - các thiết bị này thường giữ số nhị phân 32kHz.


Tôi đã mã hóa cho Atari 2600 (RAM 128 byte) và tôi biết những ưu điểm của BCD. Những thứ như điểm số gần như luôn được tính trong BCD; số cấp độ đôi khi là. Tuy nhiên, ngay cả trên 6502, tôi vẫn mong rằng nếu tôi cần xác định xem hai ngày / lần có trong vòng năm phút với nhau không và xác định xem thời gian tiết kiệm ánh sáng ban ngày có hiệu lực hay không, mã để chuyển đổi bộ đếm 32 giây thành YMDHMS nhỏ gọn như mã để thực hiện các tính toán mà không thực hiện các chuyển đổi đó. Đối với các CPU mới hơn, tôi đã thấy một số bộ đếm 32Khz thẳng yêu cầu CPU chính vẫn còn sống ...
supercat

... nhưng các chip mà tôi nhận thấy có RTCC được cấp nguồn riêng sử dụng BCD YMDHMS.
supercat

Các CPU mới hơn làm điều này vì nó rẻ hơn và sử dụng dòng điện ít hơn một chút (đặc biệt quan trọng vì quy trình bán dẫn được sử dụng được tối ưu hóa để tạo CPU chứ không phải RTC).
jpc

@jpc: Tại sao sử dụng BCD YMDHMS rẻ hơn và thấp hơn? Tôi nghĩ rằng một bộ đếm chỉ đọc 47 bit với bộ so sánh ở 32 bit dưới cùng sẽ đơn giản hơn tất cả các công cụ phân tích ngày trong một chip RTC. Trừ khi có một số phim chính về mạch ngày BCD, do một số phép thuật bị lãng quên từ lâu, có thể được đưa vào một thiết kế để đạt được dòng điện thấp hơn so với các phương pháp hiện đại, tôi không rõ tại sao BCD sẽ rẻ hơn hoặc sử dụng ít hiện tại?
năm11

Tôi đã suy nghĩ về câu trả lời của @Toybuilders, trong đó anh ta tuyên bố rằng các CPU mới hơn chỉ có bộ đếm và không có RPC đầy đủ.
jpc

1

Trong trường hợp bất cứ ai quan tâm, tôi chỉ nhìn vào sê-ri 32F của ST và có vẻ như trong khi sê-ri 32L mới hơn sử dụng BCD RTC, 32F sử dụng bộ đếm 32 bit thẳng với bộ định trước cấu hình và cung cấp đầu vào pin riêng cho nó (hooray! ). Tôi muốn có một bộ đếm thẳng dài hơn mà không cần cài đặt trước có thể định cấu hình (vì vậy tôi có thể có được độ chính xác 1/256 giây nhưng vẫn giữ được thời gian trong nhiều năm mà không phải lo lắng về việc gói) nhưng nếu tôi đặt cài đặt trước cho 1/64 giây thì bộ hẹn giờ có thể chạy Hai năm không tràn. Không lý tưởng, nhưng không quá tệ. Một chút thiếu thẩm mỹ rằng nếu ai đó bật máy sau khi máy bị tắt quá lâu (2.1+ năm), thời gian / ngày sẽ không bị phát hiện trở lại sau 2,1 năm, nhưng hầu như không phải là vấn đề lớn (bộ đếm có cờ tràn, nhưng trong nhiều trường hợp sẽ không hữu ích lắm Nếu máy đã bật trong hai năm trước khi tắt nguồn và được cấp nguồn vào ba tháng sau đó, bộ hẹn giờ sẽ bị tràn; câu hỏi sẽ là liệu nó có bị tràn hai lần không và tôi không biết bất kỳ lá cờ nào cho điều đó.


0

Maxim dường như đang làm những gì bạn muốn với DS1372U . Nó cần ít hơn 1μA, chi phí 1,7 USD và có sẵn (!) Trên DigiKey và Mouser. Vấn đề duy nhất là nó dường như không cung cấp báo thức với độ chính xác hơn 1 giây và tốc độ xung nhịp đầu ra thấp nhất là $ \ xấp xỉ $ 4kHz.


1
Nó hơi tốn kém, và nó không cho phép bất kỳ cách nào để đọc ra số gia nhỏ hơn một giây. Đầu ra 4096Hz sẽ tốt, mặc dù nó sẽ đẹp hơn nếu nó ở mức thấp 1/65536 của giây và cao cho 15/65536. Đầu ra collector mở nên càng ít càng tốt.
supercat
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.