M41T56 est une puce d'horloge en temps réel, qui est un analogue du populaire DS1307. Et même si le brochage du microcircuit est le même, ils présentent des différences importantes, dont je vais essayer de parler.
Brève description
Je ne m'attarderai pas sur le fonctionnement du bus IIC, je constate juste que les deux puces ont l'adresse 0xd0. Pour travailler avec le temps, le microcircuit contient sept registres de comptes et un registre de contrôle. Les registres de comptes contiennent des nombres au format décimal binaire, cependant certains bits ont une signification particulière.
Registresxxx - la valeur du bit n'est pas définie.
Bitsx - après la mise sous tension, l'état du bit peut être quelconque.
Les différences commencent dans l'affectation des bits 7, 6 et 5 du registre d'horloge. Dans le M41T56, les bits 7 et 6 sont utilisés pour indiquer la transition vers le nouveau siècle, et les bits 5 et 4 sont utilisés pour compter des dizaines d'heures. De plus, le comptage des heures n'est possible qu'en mode 24, le mode AM / PM n'est pas disponible. Dans DS1307, le bit 7 n'est pas utilisé, un zéro dans le bit 6 indique que le mode de comptage 24 est utilisé, et dans ce cas, les bits 5 et 4 contiennent des dizaines d'heures. Si le bit 6 est égal à un, le bit 5 devient l'indicateur AM / PM et le bit 4 contient des dizaines d'heures.
Des différences importantes se trouvent dans le registre de contrôle, qui contient le mot de correction de course.
Correction de cap
Le M41T56 vous permet de compenser l'erreur du résonateur à quartz dans la plage de -62 à +124 ppm, ce qui donne un écart ne dépassant pas ± 5 secondes par mois. Pour la compensation, les six bits les moins significatifs du registre de contrôle sont responsables. Les bits 4-0 contiennent un entier non signé de la valeur de correction et le bit 5 définit la direction de correction. Si le bit 5 contient zéro, la course ralentit par incréments de 2,034 ppm, sinon RTC accélère par incréments de 4,068 ppm. Ceci n'est pas pratique, j'ai donc esquissé quelques fonctions simples pour convertir de ppm en mot de correction et vice versa.
#define MASK_CALIBR ((1 << 4) | (1 << 3) | (1 << 2) | (1 << 1) | (1 << 0)) #define MASK_CALIBR_SIGN (1 << 5) int8_t caliber_to_ppm(uint8_t caliber) { int8_t result = caliber & MASK_CALIBR; result = (uint8_t) result * 2; if ((caliber & MASK_CALIBR_SIGN) != 0) { result = -result; } else { result = (uint8_t) result * 2; } return result; } uint8_t ppm_to_caliber(int8_t ppm) { uint8_t result; if (ppm < 0) { result = (uint8_t) (-ppm + 1) / 2; result |= MASK_CALIBR_SIGN; } else { result = (uint8_t) (ppm + 2) / 4; } return result; }
Détection de panne
Ni le DS1307, mais le M41T56 ne peuvent détecter les échecs de génération, mais ils garantissent qu'à la mise sous tension, certains bits seront dans un certain état. M41T56 lorsqu'il est activé dans le registre de contrôle sera 10xxxxxx. Pour suivre les plantages de programmes, vous pouvez utiliser l'algorithme suivant. Si, lorsque le microcontrôleur est allumé, le registre de contrôle RTC contient 10xxxxxx, alors il y a eu une panne de courant et une valeur doit être écrite dans le registre dont les bits hauts ne sont pas égaux à 10. Le plus simple est d'écrire le mot de correction avec les bits 7 et 6 égaux à zéro.
Littérature