À quelle fréquence dois-je interroger un RTC?


11

Je n'ai pas encore utilisé un RTC donc je ne suis pas complètement sûr de la façon "normale" de lire une horloge en temps réel. Il y a quelques approches différentes auxquelles j'ai pensé, mais j'espérais avoir des conseils à ce sujet.

Voici les façons dont j'ai pensé à lire et à utiliser le temps jusqu'à présent:

  1. Obtenez la date et l'heure à la mise sous tension et enregistrez-la dans la RAM, puis en utilisant l'interruption du minuteur, augmentez les valeurs de la RAM toutes les secondes, etc. Le code utilise ensuite les valeurs de la RAM chaque fois qu'il a besoin de connaître la date / l'heure.
  2. Grâce à l'utilisation d'une interruption de minuterie, interrogez le RTC toutes les secondes et copiez la date et l'heure reçues dans la RAM. Encore une fois, le code utilise ensuite les valeurs en RAM chaque fois qu'il a besoin de connaître la date / l'heure.
  3. Chaque fois que j'ai besoin de connaître l'heure, d'interroger le RTC et d'utiliser sa réponse directement.

Quelle serait la meilleure approche?


15
La meilleure approche est celle qui répond à vos spécifications tout en utilisant un minimum de ressources. Puisque nous ne connaissons pas vraiment vos besoins, le «meilleur» n'a que très peu de sens pour nous.
Scott Seidman

Toutes les très bonnes réponses Je ne peux pas choisir de réponse!
user9993

Réponses:


23

J'utiliserais une quatrième option.

La plupart des puces RTC ont la possibilité de produire une impulsion de 1 seconde. Vous devez connecter cette impulsion à une entrée activée par interruption sur votre MCU.

  • Vous obtenez l'heure de la puce une fois au début de votre programme, et parfois à partir de là - peut-être une fois par heure.
  • Le signal d'interruption déclenche alors une routine d'interruption dans votre MCU dans laquelle vous augmentez le temps d'une seconde.

Cet arrangement vous donne la précision de la seconde du RTC sans la surcharge de lecture active du RTC.


5
Lorsque vous utilisez cette approche, il est important de savoir quel front d'horloge représente un incrément et également de s'assurer que toute lecture en cours pendant ce front d'horloge doit être abandonnée.
supercat

Ou assurez-vous que la lecture n'est déclenchée que par l'ISR - vous obtenez un intervalle d'une seconde pour effectuer la lecture avant le déclenchement de l'ISR suivant.
Majenko

Dans la mesure du possible, je préfère régler les horloges en temps réel pour qu'elles s'exécutent plus rapidement qu'un tick par seconde et les utiliser pour le chronométrage d'événement à usage général, si la résolution RTC peut être réglée assez fin pour correspondre aux besoins de chronométrage d'événement; il ne peut donc pas toujours y avoir d'interruption à chaque tick RTC. De plus, lors de la définition des alarmes, il est souvent important de savoir exactement quelle est l'heure RTC au moment où l'alarme est définie, et d'interroger le RTC pour voir s'il s'est déplacé pendant le réglage de l'alarme. Je ne sais pas pourquoi les fournisseurs de puces 32 bits ne proposent pas simplement un compteur 47 bits avec la possibilité de lire non plus ...
supercat

... les 32 bits supérieurs ou les 31 inférieurs plus l'état d'entrée d'horloge, ont une alarme qui peut être activée et désactivée à tout moment sans délai de synchronisation, et un registre d'alarme qui peut être écrit à tout moment lorsque l'alarme est off, avec sémantique que l'alarme se produit si un incrément se produit alors que l'alarme est activée . Si une puce peut accepter des réveils asynchrones et que le logiciel vérifie le polling le cas échéant, aucune autre synchronisation matérielle ne serait requise et le logiciel n'aurait pas à contourner les problèmes causés par d'autres formes de synchronisation matérielle.
supercat

9

Les 3e et 2e sont plus viables.

La 3ème approche est celle que j'utilise dans la plupart des cas. Son avantage est que je n'ai pas besoin de me soucier de la mise en miroir du RTC dans la RAM. Son inconvénient potentiel est que l'interrogation du RTC via le bus série introduit un retard. Si vous écrivez des données une fois par seconde, ce délai n'aura probablement pas d'importance.

La 2ème approche est bonne aussi. Le maintien d'une horloge miroir peut introduire une erreur de chronométrage, si l'appareil fonctionne pendant une longue période. L'horloge miroir peut dériver du RTC. Si vous lisez régulièrement le RTC, la dérive ne s'accumulera pas.
Cependant, je déconseille d'effectuer une communication série dans la routine de service d'interruption (ISR) elle-même. Définissez un indicateur dans l'ISR et effectuez la communication série dans le principal ().

ps Dans tous les cas, j'utilisais DS1307.


6

Certains RTC (par exemple MC68HC68T1 [qui, il est vrai, presque personne ne devrait plus utiliser]) interrompent leur comptage interne lors de la lecture afin de donner une réponse cohérente. Ils doivent être lus aussi rarement que possible afin de minimiser les perturbations. Lisez-les une fois, puis utilisez les interruptions du minuteur pour mettre à jour la valeur de temps stockée dans la RAM du MCU.


Ces conceptions époustouflent l'esprit. Les lectures qui se produisent pendant un incrément donnent des données aléatoires serait un problème facile à contourner. Les lectures qui font que les comptes sont manqués sont un problème qui ne peut être résolu qu'en acceptant les comptes perdus.
supercat

2
Apparemment, la double mise en mémoire tampon est une chose à laquelle certaines personnes ne pensent pas lorsqu'ils conçoivent leurs puces.
Ignacio Vazquez-Abrams

Si le code vérifie lors de l'interrogation pour s'assurer qu'une valeur n'a pas changé, il n'y a pas besoin de double tampon. Pour une horloge en temps réel sur puce, une telle interrogation répétée jusqu'à ce que rien ne change fonctionne même si une interruption essaie de lire le RTC en même temps que le code de la ligne principale le fait. Certaines conceptions à double tampon rendent difficile l'écriture de code de ligne principale et d'interruption qui peuvent coexister en toute sécurité, et je n'en ai jamais vu un que je considérerais vraiment "utile".
supercat

5

Je vais supposer que le RTC est soit une puce distincte avec son propre cristal, soit un module intégré à votre microcontrôleur qui a encore une source de temps distincte (comme un cristal 32 kHz) que l'horloge principale. Et la source de temps pour le RTC est plus précise que celle du microcontrôleur.

Pour déterminer la fréquence à laquelle vous devez lire le RTC, vous devez déterminer quelle erreur maximale peut avoir votre horloge principale. Par exemple, si le cristal principal est spécifié à 20 ppm, cela équivaut à 0,002%. Ainsi, une horloge basée uniquement sur la source d'horloge principale pourrait dériver 0,00002 * 3600 * 24 = 1,728 secondes par jour.

Donc, si vous ne lisez le RTC que deux fois par jour, et entre le temps incrémenté une fois par seconde en utilisant une interruption de minuterie, vous ne serez jamais éteint plus d'une seconde - ne serez jamais éteint plus d'une seconde par rapport au RTC qui est.

Si, comme je l'ai supposé plus tôt, votre RTC est soit une puce séparée avec son propre cristal, soit un module intégré à votre microcontrôleur, cela ne signifie pas qu'il est correct. Un RTC peut aussi avoir une erreur. Par exemple, s'il utilise un cristal de 32 kHz avec une tolérance de 5 ppm (qui sont juste un peu plus chers que ceux de 10 ppm), il pourrait être éteint de 0,43 seconde par jour - ou 13 secondes par mois.

Pour contourner ce problème, vous devrez régler le RTC, où vous écrivez un facteur de correction dans un registre. Cela vous permettra d'obtenir l'erreur pratiquement à zéro. Mais bien sûr, vous devrez avoir une troisième source d'horloge externe à utiliser comme référence lors du réglage. Aux États-Unis, une référence extrêmement précise est la ligne à 60 Hz CA, qui est garantie d'être exactement 60 * 60 * 60 * 24 (5 184 000) cycles sur une période de 24 heures entre les minuit successifs. Pour que cela soit utile, vous devez chronométrer pendant les 24 heures entières, car le 60 Hz peut en dériver entre les minuit.

Une autre excellente référence temporelle serait l'utilisation du GPS (précision 10 ns), si l'on avait déjà du matériel GPS dans son projet.

Si, à la place, vos heures RTC proviennent d'une source externe, comme l'heure du réseau cellulaire (appel AT + CCLK?), Ou d'un serveur de temps réseau utilisant NTP, vous pouvez utiliser la valeur RTC telle quelle car il n'y aura rien à "régler". .

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.