Perché i chip di clock in tempo reale usano il BCD


14

Ho visto dozzine di diversi chip di clock in tempo reale sul mercato, nonché un numero di processori con un modulo di clock in tempo reale alimentato separatamente e alimentato separatamente.

Quasi tutti non solo memorizzano il tempo come anno-mese-giorno-ore-minuti-secondi, ma anche i singoli campi sono memorizzati in formato BCD anziché in formato binario.

C'è qualche motivo di fondo per questo?

Esistono applicazioni a microprocessore che fanno qualcosa di più sofisticato della semplice visualizzazione di un orologio in cui il formato BCD è più utile del binario o in cui il formato anno-mese-giorno-ora-minuti-secondi sarebbe più utile di un semplice conteggio a 47 bit dei cambiamenti di stato dell'oscillatore?

Da quello che posso dire, sembra che i produttori di RTCC aggiungano molti circuiti extra per rendere i loro chip meno utili; l'unica ragione per cui riesco a pensare che i moduli RTCC nei processori si comportino in quel modo è che i produttori di processori usano un'implementazione BCD preesistente piuttosto che produrre la propria.


2
Non conosco la risposta, ma mi chiedo se esiste una correlazione tra BCD e Decoder a 7 segmenti ?
Prof. Meow Meow il

@Prof. Meow Meow: bel nome. Il metodo più pratico per memorizzare i numeri che verranno visualizzati nell'hardware è BCD. Esistono sistemi che memorizzano numeri da visualizzare in altri formati, ma in molti casi hanno semplicemente usato una ROM per mappare direttamente dal numero alla sua rappresentazione visiva (ad esempio la macchina arcade "Tank" utilizzava contatori di punteggi a 6 bit e un 512 byte ROM per convertire ogni valore di punteggio in una forma 8x8), ma questo era generalmente realizzabile solo se il valore numerico massimo era abbastanza piccolo.
supercat

Risposte:


12

Tutti gli RTC usano la codifica BCD?

Gli RTC di Philips / NXP (sia autonomi che integrati nei chip ARM7 o Cortex-M3) non usano la codifica BCD.

Cosa c'è che non va in un BCD RTC?

Rispetto al contatore piatto le uniche operazioni che sono più difficili con un orologio BCD diviso sono i calcoli della differenza di tempo (aggiunta di secondi o calcolo del tempo trascorso). Confronti temporali come: "l'ora corrente è superiore all'ora della sveglia impostata dall'utente" sono altrettanto facili.

Cosa c'è di bello negli RTC BCD (e generalmente in campo diviso)?

Dividere i campi è davvero bello quando ti preoccupi per la data del calendario. I calendari umani hanno cose divertenti come mesi di lunghezze diverse e in aggiunta a quegli anni bisestili. Prova a farlo in un singolo segnalino (puoi ottenere un punto bonus per non usare quasi nessun potere). Oh e prova a supportare i giorni della settimana (abbastanza utili in tutti i tipi di dispositivi destinati all'uomo: dalle sveglie ai controller di riscaldamento) con questo.

L'approccio BCD ha una funzione aggiuntiva: ottieni interruzioni "ogni secondo" o "ogni dieci secondi" gratuitamente, senza dover fare calcoli su orari o date.

Per il record dell'anno bisestile il calcolo è un po 'fuori nei RTC NXP poiché si occupa solo della divisione divisibile per 4 regole e non controlla la divisione per 100 e 400. Se mantenesse il contatore dell'anno in BCD questo sarebbe banale e molto probabilmente fatto bene.

Sommario

  1. Se vuoi un orologio monotonico, usane uno. Puoi acquistare un PIC o un AVR con il "contatore RTC" (che è solo un contatore asincrono con un oscillatore autonomo a 32 kHz). Tieni presente che sarà difficile visualizzare semplicemente la data. :)

  2. Quando è necessario visualizzare l'ora e la data e impostare gli allarmi in base all'immissione da parte dell'utente di orari e date, utilizzare un RTC. E ricorda che quando l'utente modifica l'ora e la data attuali, gli interrupt basati su RTC potrebbero non essere precisi.


1
Ho appena iniziato a utilizzare il Gekko, che ha un RTC a 24 bit che è quasi quello che voglio tranne che non riesce a tenere il tempo quando il processore è morto. Stavo anche guardando un ST Micro ARM, che ha un modulo BCD RTC sciocco che supporta gli interrupt solo su un secondo. Se il chip ST non fosse mai senza alimentazione per più di tre anni, potrei eseguire il jinx delle prescalar RTC per funzionare a una velocità di 32x, e quindi utilizzare i trucchi software per compensare, ottenendo così una risoluzione temporale di 1/32 di secondo sugli eventi di sveglia, ma i tempi memorizzati
nell'RTC

1
... quindi la necessità di convertire dal formato stupido dell'RTC in incrementi di 1/32 di secondo sarebbe fastidiosa, soprattutto perché una tale conversione sarebbe necessaria su ogni ciclo di sospensione / riattivazione. Immagino di essere curioso di sapere quante persone usano le letture RTCC senza convertirsi in secondi unificati. Forse ce ne sono abbastanza per rendere utile il formato YMDHMS, ma a mio avviso è molto più utile riservare YMDHMS per l' I / O umano e usare i secondi diretti (o qualunque altra frazione) per tutto il resto.
supercat

1
@jpc: La mia inclinazione sarebbe stata quella di non impostare mai il tempo del chip RTC, ma invece di mantenere "il tempo dall'installazione della batteria dell'orologio" e memorizzare la differenza tra questo e il tempo di parete. Ho usato quell'approccio in una generazione del prodotto che utilizzava un PIC separato per mantenere il tempo di batteria (il tempo su quel PIC era di sola lettura) e lo usavo su un chip con un contatore dritto. Mi è sembrata un'idea un po 'sciocca, avere l'RTC della macchina che memorizza un valore formattato in modo insignificante per la data, anche se se uso il chip ST Micro potrei farlo.
supercat

1
A proposito, la serie STM32F100 utilizza un RTC a 32 bit secondi (non BCD), ma la serie STM32F400 regredisce a un RTC codificato BCD. Sospiro.
Mark Lakata,

1
@FedericoRusso: il campo diviso avrebbe un senso, sebbene sia più appropriato essere un ostacolo che un aiuto nella maggior parte delle applicazioni. La scelta del BCD, tuttavia, sembra decisamente bizzarra come una scelta da abbinare a una CPU che non ha alcun supporto BCD .
Supercat,

3

Quando si utilizzano gli orologi alla fine, è più probabile che siano interessati a minuti e decine di secondi (verso la loro visualizzazione) rispetto al totale di secondi, minuti e così via. Nel caso in cui non ti interessino cifre separate, è probabile che non ti interessi nemmeno dei valori separati di minuti o secondi e che potresti anche usare un lungo contatore binario come hai suggerito.
È più semplice convertire da BCD a binario in software rispetto al contrario. E poiché i contatori BCD non richiedono un patrimonio immobiliare aggiuntivo rispetto ai contatori binari, ha senso scegliere per BCD.


2
Con quale frequenza un'applicazione non desidera fare nulla con una data e un'ora diverse dalla visualizzazione? Mi sembra che sia molto più comune voler fare cose come calcolare un tempo a una certa distanza in futuro, o determinare quanto tempo è trascorso da un determinato evento, ecc. Che è più facile da calcolare: la data e l'ora 45 secondi dopo il 28 febbraio 2000 alle 23:59:52, o 5097582 + 45 (quest'ultimo valore ipotizzava la mezzanotte del 01 gennaio 2000 come epoca)? Che ne dite di determinare se sono trascorsi 5 minuti tra il 28 febbraio 2000 alle 23:59 e il 01 marzo 2000 00:03 (contro 5097540.0 e 5184180.0)
supercat

1
Un RTC con un contatore a 48 bit per 65.536 secondi di secondo e un modulo di confronto allarmi che copriva i 24 bit inferiori sarebbe estremamente utile per i sistemi a bassa potenza poiché potrebbe essere utilizzato come base per la pianificazione del sistema operativo indipendentemente da processore svegliarsi e dormire. Se dovesse succedere qualcosa tra 4 secondi, il sistema potrebbe notare il valore RTC quando si dovrebbe verificare l'evento. Se tra 2 secondi il processore si trova senza nulla da fare, potrebbe impostare l'allarme RTC e andare in modalità di sospensione. Quando si verifica l'evento, il sistema si riattiva.
supercat

@supercat - per i computer di uso generale, lascia che il sistema operativo tenga traccia del tempo e faccia "cose ​​utili" con quelle informazioni sul tempo. L'RTC viene consultato una sola volta per inizializzare le informazioni sull'ora del sistema operativo, quindi l'ora viene aggiornata dagli interrupt. Ma per molti semplici usi embedded, è molto più probabile che
Toybuilder il

1
@Toybuilder: Quest'ultimo è esattamente l'approccio che ho finito per usare nelle ultime generazioni di serratura elettronica. I miei maggiori fastidi sono stati la mancanza di scelte di uscita ad impulsi tra 32Khz e 16Hz (poiché non mi fidavo di un pullup da 1M per operare in modo affidabile con un'uscita open-collector da 32Khz, l'unica scelta ragionevole era 16Hz) e la sciattezza del PIC circuito timer.
supercat

1
@FedericoRusso: se uno avesse un contatore del tempo binario, non sarebbe necessario riconvertire in ore, minuti e secondi, tranne forse per la visualizzazione leggibile dall'uomo. Uno aggiunge semplicemente 3723 e basta. Quando si lavora con i valori data / ora YMD-HMS, è necessario un codice separato per l'incremento e il decremento, l'ora legale è un incubo per il quale i produttori di chip sembrano voler aggiungere un supporto non funzionante [come un comando che sottrae uno dal conteggio delle ore tranne quando è zero, nel qual caso non fa nulla]. L'ora legale è un dolore anche in binario, ma non altrettanto orribile.
supercat

3

Sospetto diversi motivi:

Storico: lo fanno da un po 'di tempo. Se vuoi che la tua nuova parte sostituisca un'altra parte, allora deve funzionare più o meno allo stesso modo. Quindi continui con il BCD.

Applicazione - se qualcuno sta usando un RTC da un piccolo micro (qualcosa nel range di 8 bit, come un PIC di fascia bassa), gestire un numero elevato (come il tuo contatore a 47 bit) è un grande dolore al collo. È molto più facile gestire le cifre BCD, poiché non devi lavorare per rompere le cose.

Non così difficile - Fare i contatori BCD non è così difficile, e in effetti penso che non siano molte più porte che farle binarie.

Si può immaginare un sistema in cui si ottengono contatori separati di ore, minuti, ecc. In binario anziché in BCD (evitando così il problema di "abbattere il numero a 47 bit"), ma non è molto più facile e si faranno alcuni conversioni quando si visualizza la cosa comunque.


1
Il numero di 48 bit sarebbe un numero di 32 bit di secondi e una frazione di 16 bit. Lavorare con numeri a 32 bit su un micro a 8 bit non è poi così male. Posso immaginare che su qualcosa come un 6502 in grado di gestire bene il BCD impacchettato, il formato BCD potrebbe risparmiare alcuni byte in alcuni casi, sebbene l'ulteriore complessità della gestione tra secondi-ore-minuti compenserebbe qualsiasi vantaggio. Ma sicuramente le persone che hanno costruito un RTCC nei chip ARM di ST micro non si aspettavano che qualcuno usasse un 6502 per elaborare i dati, non con un ARM a 32 bit seduto proprio lì!
supercat

1
@supercat - anche se non è difficile, fare il lavoro a 32 bit sul micro a 8 bit è ancora un dolore nel <bleep>. E su qualcosa come un PIC (con istruzioni MOLTO limitate e registri e spazi di ram) è ancora più un dolore. Per quanto riguarda il chip ARM - scommetto che ha più a che fare con il precedente storico di ogni altra cosa - tutti sono abituati a farlo in quel modo, quindi continuano a farlo in quel modo.
Michael Kohne,

1
Mi chiedo quale parte delle persone che usano le periferiche RTCC non convertano le date / le ore in contatori di secondi in stile Unix?
supercat

1
supercat: tutti loro? A che servono timestamp in stile Unix in un orologio? OTOH l'unico caso d'uso sono gli allarmi RTOS che sono meglio serviti con un normale timer o con un semplice interrupt di "secondo incremento" dall'RTC.
jpc,

1
@jpc: Cosa succede se si desidera determinare se una determinata data è nell'ora legale o se un programma che inizia in una determinata data / ora e dura una certa lunghezza si sovrappone ad un'altra? Queste cose sono facili con pochi secondi, ma più difficili con YMDHMS. Per quanto riguarda l'utilizzo di un normale timer, quello che uso attualmente è un tick di 1/16 di secondo da un chip RTC che guida TMR1 e TMR3 su un PIC; questo mi dà un risveglio accurato di 1/16 di secondo che funziona anche quando l'orologio della CPU principale è fermo, e ne ricavo tutti i miei tempi.
supercat

1

Concordo con Michael Kohne sul fatto che ci sia molto slancio storico.

I primi MCU avevano anche molto meno spazio per codice e dati (ad esempio 128 BYTES di RAM). Poiché le informazioni temporali vengono spesso utilizzate per scopi di interfacciamento umano, ha più senso mantenere i dati più vicini al formato utilizzato per visualizzare / immettere dagli umani.

Alcuni MCU più recenti con più spazio per codice e dati a volte implementano contatori hardware in tempo reale - questi dispositivi mantengono spesso conteggi binari di tick a 32kHz.


Ho codificato per l'Atari 2600 (128 byte RAM) e conosco le virtù del BCD. Cose come i punteggi sono quasi sempre calcolate in BCD; i numeri di livello a volte lo sono. Anche su un 6502, però, mi aspetto che se avessi bisogno di determinare se due data / ora erano entro cinque minuti l'una dall'altra e determinare se l'ora legale era in vigore, il codice per convertire un contatore di 32 bit in YMDHMS sarebbe essere compatto come il codice per fare quei calcoli senza fare tali conversioni. Per quanto riguarda le CPU più recenti, ne ho viste alcune con contatori diretti a 32Khz che richiedono che la CPU principale sia viva ...
supercat

... ma i chip che ho notato che hanno un RTCC alimentato separatamente utilizzano BCD YMDHMS.
supercat

Le CPU più recenti lo fanno poiché è più economica e consuma un po 'meno corrente (particolarmente importante poiché il processo a semiconduttore utilizzato è ottimizzato per produrre CPU e non RTC).
jpc,

@jpc: Perché è più economico e a bassa corrente utilizzare BCD YMDHMS? Penserei che un contatore di sola lettura a 47 bit con un comparatore sui 32 bit in basso sarebbe più semplice di tutte le cose di analisi della data in un chip RTC. A meno che non ci sia un film principale di un circuito di data BCD che, a causa di una magia arcana dimenticata da lungo tempo, può essere inserito in un progetto per ottenere correnti più basse di quelle disponibili con i metodi moderni, non sono chiaro perché BCD sarebbe più economico o utilizzabile meno corrente?
supercat

Stavo pensando alla risposta di @Toybuilders in cui ha affermato che le nuove CPU hanno solo contatori e non RPC in piena regola.
jpc,

1

Nel caso qualcuno fosse interessato, sto solo guardando la serie 32F della ST e sembra che mentre la nuova serie 32L utilizza un BCD RTC, la 32F utilizza un contatore diretto a 32 bit con prescalar configurabile e fornisce un input separato per la batteria (evviva! ). Avrei preferito avere un contatore dritto più lungo senza un prescalar configurabile (quindi avrei potuto ottenere una precisione di 1 / 256sec ma mantenere il tempo per anni senza doversi preoccupare di avvolgere) ma se dovessi impostare la prescale per 1/64sec il timer potrebbe funzionare due anni senza traboccare. Non ideale, ma non troppo male. Un po 'antiestetico che se qualcuno accende la macchina dopo che è stata spenta per troppo tempo (2,1+ anni), l'ora / data scivolerebbe in modo inosservabile di 2,1 anni, ma difficilmente un grosso problema (il contatore ha una bandiera di troppo pieno, ma in molti casi che non sarebbero terribilmente utili. Se la macchina fosse stata accesa per due anni prima di essere spenta e tre mesi dopo fosse stata accesa, il timer dovrebbe traboccare; la domanda sarebbe se fosse traboccato due volte, e non conosco alcuna bandiera per quello.


0

Maxim sembra fare proprio quello che vuoi con DS1372U . Ha bisogno di meno di 1μA, costa 1,7 USD ed è disponibile (!) Su DigiKey e Mouser. L'unico problema è che non sembra offrire allarmi con precisione superiore a 1 secondo e la frequenza di clock di uscita più bassa è $ \ circa $ 4kHz.


1
È un po 'costoso e non consente in alcun modo di leggere incrementi inferiori a un secondo. Un'uscita a 4096Hz sarebbe piacevole, anche se sarebbe molto più bella se fosse bassa per 1/65536 di secondo e alta per 15/65536. Le uscite open collector dovrebbero essere il più basse possibile.
supercat
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.