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:
- 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.
- 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.
- 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?
microcontroller
rtc
user9993
la source
la source
Réponses:
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.
Cet arrangement vous donne la précision de la seconde du RTC sans la surcharge de lecture active du RTC.
la source
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.
la source
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.
la source
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". .
la source