M41T56 ist ein Echtzeituhr-Chip, der ein Analogon zum beliebten DS1307 ist. Und obwohl selbst die Pinbelegung der Mikroschaltung gleich ist, weisen sie erhebliche Unterschiede auf, über die ich zu berichten versuchen werde.
Kurzbeschreibung
Ich werde nicht auf den Betrieb des IIC-Busses eingehen, ich stelle nur fest, dass beide Chips die Adresse 0xd0 haben. Um mit der Zeit zu arbeiten, enthält die Mikroschaltung sieben Kontoregister und ein Steuerregister. Kontoregister enthalten Zahlen im binären Dezimalformat, einige Bits haben jedoch eine besondere Bedeutung.
Registerxxx - Der Wert des Bits ist nicht definiert.
Bitsx - Nach dem Einschalten kann der Status des Bits beliebig sein.
Die Unterschiede beginnen in der Zuordnung der Bits 7, 6 und 5 des Taktregisters. Im M41T56 werden die Bits 7 und 6 verwendet, um den Übergang zum neuen Jahrhundert anzuzeigen, und die Bits 5 und 4 werden verwendet, um mehrere zehn Stunden zu zählen. Darüber hinaus ist das Zählen von Stunden nur im Modus 24 möglich, der AM / PM-Modus ist nicht verfügbar. In DS1307 wird Bit 7 nicht verwendet, eine Null in Bit 6 zeigt an, dass der Zählmodus 24 verwendet wird, und in diesem Fall enthalten die Bits 5 und 4 mehrere zehn Stunden. Wenn Bit 6 eins ist, wird Bit 5 zum AM / PM-Flag, und Bit 4 enthält mehrere zehn Stunden.
Signifikante Unterschiede bestehen im Steuerregister, das den Wortkorrekturstrich enthält.
Kurskorrektur
Mit M41T56 können Sie den Fehler des Quarzresonators im Bereich von -62 bis +124 ppm kompensieren, was eine Abweichung von nicht mehr als ± 5 Sekunden pro Monat ergibt. Für die Kompensation sind die sechs niedrigstwertigen Bits des Steuerregisters verantwortlich. Die Bits 4-0 enthalten eine vorzeichenlose Ganzzahl des Korrekturwerts, und Bit 5 legt die Korrekturrichtung fest. Wenn Bit 5 Null enthält, verlangsamt sich der Hub in Schritten von 2,034 ppm, andernfalls beschleunigt RTC in Schritten von 4,068 ppm. Dies ist unpraktisch, daher habe ich einige einfache Funktionen zum Konvertieren von ppm in Korrekturwörter und umgekehrt skizziert.
#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; }
Fehlererkennung
Weder DS1307 noch M41T56 können Generierungsfehler erkennen, sie garantieren jedoch, dass sich einige Bits beim Einschalten in einem bestimmten Zustand befinden. Wenn M41T56 im Steuerregister aktiviert ist, ist es 10xxxxxx. Um Programmabstürze zu verfolgen, können Sie den folgenden Algorithmus verwenden. Wenn beim Einschalten des Mikrocontrollers das RTC-Steuerregister 10xxxxxx enthält, liegt ein Stromausfall vor und es muss ein Wert in das Register geschrieben werden, dessen hohe Bits nicht gleich 10 sind. Am einfachsten ist es, das Korrekturwort mit den Bits 7 und 6 gleich Null zu schreiben.
Literatur