Gerçek zamanlı saat yongaları neden BCD kullanıyor?


14

Piyasada düzinelerce farklı gerçek zamanlı saat yongasının yanı sıra dahili olarak ayrı olarak çalışan gerçek zamanlı saat modülüne sahip bir dizi işlemci gördüm.

Neredeyse hepsi zamanı sadece yıl-ay-gün-saat-dakika-saniye olarak depolamakla kalmaz, aynı zamanda tek tek alanlar bile ikili formattan ziyade BCD'de saklanır.

Bunun altında yatan bir neden var mı?

BCD formatının ikili dosyadan daha kullanışlı olduğu veya yıl-ay-gün-saat-dakika-saniye formatının düz 47-bit sayımdan daha yararlı olduğu bir saati görüntülemek yerine daha karmaşık bir şey yapan herhangi bir mikroişlemci uygulaması var mı? durumu değişimleri nelerdir?

Söyleyebileceğim kadarıyla, RTCC üreticileri fişlerini daha az kullanışlı hale getirmek için çok fazla devre ekliyor gibi görünüyor; işlemcilerdeki RTCC modüllerinin bu şekilde davranmasını anlamanın tek nedeni, işlemci satıcılarının kendi ürettikleri yerine önceden var olan bazı BCD uygulamalarını kullanmalarıdır.


2
Cevabı bilmiyorum ama 7-Segment Decoder'ın BCD'si ile herhangi bir korelasyon olup olmadığını merak ediyorum ?
Prof. Meow Meow

@Prof. Miyav Miyav: Güzel isim. Donanımda görüntülenecek sayıları depolamanın en pratik yöntemi BCD'dir. Sayıları diğer formatlarda görüntülenecek şekilde depolayan sistemler vardır, ancak birçok durumda, doğrudan sayıdan görsel temsiline eşleştirmek için bir ROM kullandılar (örneğin, arcade makinesi "Tank" kullanılan 6-bit skor sayaçları ve 512 Her bir skor değerini 8x8 şekline dönüştürmek için bayt ROM), ancak bu genellikle yalnızca maksimum sayısal değer oldukça küçükse uygulanabilirdi.
supercat

Yanıtlar:


12

Tüm RTC'ler BCD kodlaması kullanıyor mu?

Philips / NXP (hem bağımsız hem de ARM7 veya Cortex-M3 yongalarına entegre edilmiş) RTC'lerde BCD kodlaması kullanılmaz.

BCD RTC ile ilgili sorun nedir?

Düz sayıcı ile karşılaştırıldığında, bölünmüş bir BCD saati ile daha zor olan tek işlem zaman farkı hesaplamalarıdır (saniye eklemek veya geçen süreyi hesaplamak). "Mevcut kullanıcı tarafından ayarlanan alarm zamanından daha büyük olan zaman" gibi zaman karşılaştırmaları da aynı derecede kolaydır.

BCD (ve genel olarak bölünmüş alan) RTC'lerle ilgili güzel olan nedir?

Takvim tarihini önemsediğinizde alanları bölmek gerçekten güzel. İnsan takvimlerinde farklı uzunluklarda aylar ve artık yılların üstünde komik şeyler var. Bunu tek bir sayaçta yapmaya çalışın (neredeyse hiç güç kullanmamanız için bir bonus puanı alabilirsiniz). Oh ve bununla hafta günlerini (insanlar için tasarlanmış her türlü cihazda oldukça yararlı: alarm saatlerinden ısıtıcı kontrolörlerine) desteklemeyi deneyin.

BCD yaklaşımının ek bir özelliği vardır: zaman veya tarihte herhangi bir hesaplama yapmanıza gerek kalmadan, "her saniyede" veya "her on saniyede bir" kesintileri ücretsiz olarak alırsınız.

Rekor artık yıl hesaplaması NXP RTC'lerinde biraz kapalıdır, çünkü sadece 4 kurala göre bölünebilir. Doğru yaptı.

özet

  1. Monotonik bir saat istiyorsanız bir tane kullanın. "RTC sayacı" ile bir PIC veya AVR satın alabilirsiniz (bu sadece 32kHz osilatörlü asenkron bir sayaçtır). Yalnızca tarihi görüntülemenin zor olacağını unutmayın. :)

  2. Saati ve tarihi görüntülemeniz ve kullanıcının saat ve tarih girişine göre alarm ayarlamanız gerektiğinde, bir RTC kullanın. Ve kullanıcı geçerli saati ve tarihi değiştirdiğinde, RTC tabanlı kesintilerinizin yanlış olabileceğini unutmayın.


1
İşlemcinin öldüğü zaman zaman tutamaması dışında neredeyse istediğim şey olan 24 bit RTC'ye sahip Gekko'yu kullanmaya başladım. Ayrıca sadece bir saniyelik kesintileri destekleyen aptal BCD RTC modülüne sahip bir ST Micro ARM'ye bakıyordum. Eğer ST çipi üç yıldan fazla bir süre güçsüz kalmazsa, RTC ön kollarını 32x hızda çalıştırmak için jinx yapabilir ve daha sonra telafi etmek için yazılım hileleri kullanabilir, böylece uyandırma olaylarında 1/32 sn zaman çözünürlüğü elde edebilirim, ancak
RTC'de

1
... bu nedenle RTC'nin saçma biçiminden 1/32 saniyelik artışlara dönüştürme zorunluluğu can sıkıcı olacaktır, çünkü özellikle her uyku / uyanma döngüsünde böyle bir dönüşüm gerekli olacaktır. Sanırım kaç kişinin birleşik saniyelere dönüştürmeden RTCC okumalarını kullandığını merak ediyorum. Belki YMDHMS formatını değerli kılmak için yeterli vardır, ancak bence YMDHMS'yi insan I / O için ayırmak ve diğer her şey için düz saniye (veya herhangi bir kısmı) kullanmak çok daha yararlıdır .
supercat 06

1
@jpc: Eğimim aslında RTC çip süresini asla ayarlamamıştı, bunun yerine "saat pilinin takılmasından bu yana geçen süreyi koru" ve duvarla duvar arasındaki farkı saklardı. Bu yaklaşımı, pil destekli zamanı korumak için ayrı bir PIC kullanan (bu PIC'deki zaman salt okunurdu) ve düz sayacı olan bir çipte kullanacak olan bir nesil üründe kullandım. Yine de, makinenin RTC'sinin anlamsız bir şekilde tarih formatlı bir değer depolaması biraz aptalca bir fikir gibi görünüyordu, ancak ST Micro çipini kullanırsam bunu yapabilirim.
supercat

1
BTW, STM32F100 serisi 32 bit saniye RTC kullanır (BCD değil), ancak STM32F400 serisi BCD kodlu RTC'ye geri döner. İç çekmek.
Mark Lakata

1
@FedericoRusso: Bölünmüş alan bir anlam ifade eder, ancak çoğu uygulamada bir yardımdan ziyade bir engel olmak daha uygundur. Bununla birlikte, BCD'nin seçimi , herhangi bir BCD desteği olmayan bir CPU ile paketlemek için bir seçim olarak düpedüz tuhaf görünüyor .
supercat

3

Sonunda saatler kullanırken, sadece toplam saniye, dakika ve benzeri sürelerden çok dakikalar ve onlarca saniye (onları göstermeye doğru) ile ilgilenme olasılığı daha yüksektir. Ayrı basamaklarla ilgilenmemeniz durumunda, ayrı dakika veya saniye değerlerini umursamamanız ve önerdiğiniz gibi uzun bir ikili sayaç da kullanabilmenizdir.
Yazılımda BCD'den ikili dosyaya dönüştürmek diğer yoldan daha kolaydır. Ve BCD sayaçları ikili sayaçlar üzerinde bu kadar fazla gayrimenkul gerektirmediğinden, BCD için seçim yapmak mantıklıdır.


2
Bir uygulama ne sıklıkta görüntülenmesi dışında bir tarih ve saatle hiçbir şey yapmak istemez? Bana öyle geliyor ki, gelecekte belli bir mesafeyi hesaplamak veya belirli bir olaydan bu yana ne kadar zaman geçtiğini belirlemek gibi şeyler yapmak çok daha yaygındır. Hesaplanması daha kolay: tarih ve saat 45 saniye 28-Şubat-2000'den sonra 23:59:52 veya 5097582 + 45 (son değer 01-Ocak-2000 gece yarısı olarak varsayılırsa)? 28-Şubat-2000 23:59 ve 01-Mar-2000 00:03 arasında 5 dakikanın geçip geçmediğini belirlemeye ne dersiniz (vs 5097540.0 ve 5184180.0)
supercat

1
Saniyenin 65,536. saniyesinde 48 bit sayacı olan bir RTC ve alt 24 biti kapsayan bir alarm karşılaştırma modülü, düşük güç sistemleri için son derece kullanışlıdır, çünkü işletim sistemi planlamasından bağımsız olarak kullanılabilir işlemci uyanma ve uyku. Bundan 4 saniye sonra bir şey olması gerekiyorsa, olayın gerçekleşmesi gerektiğinde sistem RTC değerini not edebilir. Eğer 2 saniye sonra işlemci kendisini yapacak bir şey bulamazsa, RTC alarmını ayarlayabilir ve uyku moduna geçebilir. Olayın gerçekleşmesi gerektiğinde, sistem uyanacaktır.
supercat

@supercat - genel amaçlı bilgisayarlar için, işletim sisteminin zamanı takip etmesine izin verin ve bu zaman bilgileriyle "yararlı şeyler" yapın. İşletim Sisteminin zaman bilgisini başlatmak için RTC'ye yalnızca bir kez danışılır ve sonra kesinti ile zaman güncellenir. Ancak birçok basit gömülü kullanım için, bu daha olasıdır
Toybuilder

1
@Toybuilder: Sonuncusu, son birkaç nesil elektronik kilitte kullandığım yaklaşım. En büyük sıkıntılarım 32Khz ve 16Hz arasında herhangi bir darbe çıkışı seçeneği olmamasıydı (32Mhz açık kollektör çıkışı ile güvenilir bir şekilde çalışmak için 1M'lik bir çekime güvenmediğimden, tek makul seçim 16Hz idi) ve PIC'lerin özensizliği zamanlayıcı devresi.
supercat

1
@FedericoRusso: Birinin düz ikili bir zaman sayacı varsa, belki de insan tarafından okunabilen ekran dışında saat, dakika ve saniyeye geri dönmek zorunda kalmazdı. Biri basitçe 3723 ekler ve hepsi bu. YMD-HMS tarih / saat değerleri ile çalışırken, artırım ve azaltma için ayrı bir kod gerekir, gün ışığından yararlanma saati, yonga üreticilerinin kırık destek eklemek istediği bir kabustur [ sıfır, bu durumda hiçbir şey yapmaz]. DST de ikili bir ağrıdır, ancak iğrenç değildir.
Supercat

3

Çeşitli nedenlerden şüpheleniyorum:

Tarihsel - bir süredir bu şekilde yapıyorlar. Yeni parçanızın başka bir parçayı değiştirmesini istiyorsanız, daha fazla veya daha az aynı şekilde çalışması gerekir. Böylece BCD ile devam edersiniz.

Uygulama - birisi küçük bir mikrodan (düşük uçlu bir PIC gibi 8 bitlik bir aralıkta) bir RTC kullanıyorsa, çok sayıda (47 bitlik sayacınız gibi) uğraşmak boyunda büyük bir ağrıdır. Bir şeyleri parçalamak için çalışmak zorunda olmadığınızdan, BCD basamaklarıyla baş etmek çok daha kolaydır.

O kadar da zor değil - BCD sayaçlarını yapmak o kadar da zor değil ve aslında bence bunları ikili yapmaktan çok daha fazla kapı değil.

BCD yerine ikili saat, dakika vb. Sayaçları aldığınız bir sistem düşünülebilir (böylece '47 bitlik sayıyı bozmaktan kaçınılırsınız), ancak o kadar kolay değil ve bazılarını yapacaksınız. her şeyi görüntülerken dönüşümler.


1
48 bit sayı 32 bit saniye ve 16 bit kesir olacaktır. 8 bitlik bir mikroda 32 bitlik sayılarla çalışmak o kadar da kötü değil. Paketlenmiş BCD'yi güzel bir şekilde işleyebilen 6502 gibi bir şeyde, BCD formatının bazı durumlarda birkaç bayt tasarruf edebileceğini düşünebilirim, ancak saniye-saat-dakika arasındaki taşıma işleminin ek karmaşıklığı herhangi bir avantajı dengeleyecektir. Ama elbette ST micro'nun ARM çiplerine bir RTCC inşa eden insanlar, birisinin verileri işlemek için 6502 kullanmasını beklemiyorlardı - 32 bit ARM'nin orada oturmasıyla değil!
supercat

1
@supercat - zor olmasa da, 8 bit mikro üzerinde 32 bit iş yapmak hala <bleep> bir acıdır. Ve bir PIC gibi bir şey (ÇOK sınırlı talimat ve kayıt ve koç alanları ile) daha da acı. ARM çipine gelince - bahse girerim, tarihsel emsal ile her şeyden daha önemli - herkes bu şekilde yapmaya alışkın, bu yüzden bunu yapmaya devam ediyorlar.
Michael Kohne

1
Acaba RTCC çevre birimleri kullanan insanların hangi kısmının tarihleri ​​/ saatleri Unix tarzı saniye sayaçlarına dönüştürmüyor?
supercat

1
supercat: Hepsi mi? Bir saatte Unix tarzı zaman damgaları ne işe yarar? OTOH sizin tek kullanım durumunuz, normal bir zamanlayıcı ile veya RTC'den basit bir "ikinci artış" kesintisi ile daha iyi servis edilen RTOS alarmlarıdır.
jpc

1
@jpc: Belirli bir tarihin gün ışığından yararlanma saatinde olup olmadığını belirlemek veya belirli bir tarih / saatte başlayan ve belirli bir süre süren bir programın başka bir tarihle çakışıp çakışmadığını belirlemek isterseniz ne olur? Bu tür şeyler düz saniyelerle kolaydır, ancak YMDHMS ile daha zordur. Normal bir zamanlayıcı kullanmaya gelince, şu anda kullandığım PIC üzerinde TMR1 ve TMR3 kullanan bir RTC çipinden 1/16 sn'lik bir kene; Bu, ana CPU saati durdurulduğunda bile çalışan 1/16 saniyelik doğru bir uyanma sağlar ve tüm zamanlamamı bundan alırım.
supercat 06

1

Michael Kohne ile çok fazla tarihsel momentum olduğuna katılıyorum.

Erken MCU'larda da kod ve veri için çok daha az yer vardı (örneğin 128 BYTES RAM düşünün). Zaman bilgisi genellikle insan arabirimi amacıyla kullanıldığından, verileri insanlara göstermek / giriş yapmak için kullanılan biçime en yakın tutmak daha mantıklıydı.

Daha fazla kod ve veri alanına sahip bazı yeni MCU'lar bazen donanım gerçek zamanlı sayaçları uygular - bu cihazlar genellikle ikili sayıları 32kHz keneler tutar.


Atari 2600 (128 bayt RAM) için kod yazdım ve BCD'nin erdemlerini biliyorum. Skorlar gibi şeyler neredeyse her zaman BCD'de hesaplanır; seviye numaraları bazen vardır. 6502'de bile, iki tarih / saatin beş dakika içinde olup olmadığını ve gün ışığından yararlanma saatinin geçerli olup olmadığını belirlemem gerekirse 32 bit saniyelik bir sayacı YMDHMS'ye dönüştürme kodunun bu tür dönüşümleri yapmadan bu hesaplamaları yapmak için kod kadar kompakt olmalıdır. Daha yeni CPU'lara gelince, ana CPU'nun hayatta kalmasını gerektiren düz 32Khz sayaçlarla bazılarını gördüm ...
supercat

... ancak ayrı olarak çalışan bir RTCC'ye sahip olduğunu fark ettiğim çipler BCD YMDHMS kullanıyor.
supercat

Daha yeni CPU'lar daha ucuz olduğu ve biraz daha az akım kullandığı için bunu yapar (özellikle kullanılan yarı iletken işlemi RTC'ler yerine CPU yapmak için optimize edildiğinden özellikle önemlidir).
jpc

@jpc: BCD YMDHMS'yi kullanmak neden daha ucuz ve daha düşük akım? Altında 32 bit bir karşılaştırıcı ile 47-bit salt okunur bir sayaç bir RTC çip tüm tarih ayrıştırma şeyler daha basit olacağını düşünüyorum. BCD tarih devresinin, uzun süredir unutulmuş bir sihir nedeniyle, modern yöntemlerle mevcut olandan daha düşük akımlar elde etmek için bir tasarıma yerleştirilebilecek bazı ana filmleri olmadığı sürece, BCD'nin neden daha ucuz veya kullanacağı net değil daha az akım?
supercat

@Toybuilders'ın yeni CPU'ların tam sayaçlı RPC'leri değil sadece sayaçları olduğunu belirttiği cevabı düşünüyordum.
jpc

1

Herkes ilgileniyorsa, sadece ST'nin 32F serisine bakıyorum ve yeni 32L serisi bir BCD RTC kullanırken, 32F yapılandırılabilir prescalar ile düz bir 32 bit sayaç kullanıyor ve bunun için ayrı bir pil girişi sağlıyor gibi görünüyor (yaşasın! ). Yapılandırılabilir bir prescalar olmadan daha uzun bir düz sayacım olurdu (bu yüzden 1 / 256sec doğruluk elde edebilirim, ancak sarma konusunda endişelenmeden yıllarca sürebilirim), ancak 1 / 64sec için reçeteyi ayarlayacak olsaydım zamanlayıcı çalışabilirdi taşmadan iki yıl. İdeal değil, ama çok kötü değil. Birisi makineyi çok uzun süre kapalı kaldıktan sonra (2.1+ yıl) çalıştırırsa, saat / tarihin tespit edilemez şekilde 2.1 yıl geriye kayması, ancak neredeyse büyük bir sorun olmaması (tezgahın taşma bayrağı var, ancak çok yararlı olmaz birçok durumda. Makine kapatılmadan önce iki yıl açıksa ve üç ay sonra açıldıysa, zamanlayıcının taşması beklenir; soru iki kez taşmış olup olmadığı olurdu ve bunun için herhangi bir bayrak bilmiyorum.


0

Maxim, DS1372U ile tam olarak istediğinizi yapıyor gibi görünüyor . 1μA'dan daha azına ihtiyaç duyar, maliyeti 1,7 USD'dir ve DigiKey ve Mouser'da mevcuttur (!). Tek sorun, 1 saniyeden daha fazla hassasiyetle alarm sunmadığı ve en düşük çıkış saat hızının $ \ yaklaşık $ 4 kHz olmasıdır.


1
Biraz pahalı ve bir saniyeden daha küçük artışları okumak için hiçbir şekilde izin vermez. Bir 4096Hz çıkış iyi olurdu, ancak saniyenin 1 / 65536'sı için düşük ve 15/65536 için yüksek olsaydı çok daha güzel olurdu. Açık kollektör çıkışları mümkün olduğunca az olmalıdır.
süper kedi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.