M41T56 adalah chip Real Time Clock, yang merupakan analog dari DS1307 yang populer. Dan meskipun pin pada sirkuit mikro adalah sama, mereka memiliki perbedaan yang signifikan, yang akan saya coba bicarakan.
Deskripsi singkat
Saya tidak akan memikirkan pengoperasian bus IIC, saya perhatikan hanya bahwa kedua chip memiliki alamat 0xd0. Untuk bekerja dengan waktu, sirkuit mikro berisi tujuh register hitung dan register kontrol. Register akun berisi angka dalam format desimal biner, namun beberapa bit memiliki arti khusus.
DaftarNilai xxx - bit tidak ditentukan.
Bitsx - setelah diaktifkan, keadaan bit bisa apa saja.
Perbedaannya dimulai pada penugasan bit 7, 6 dan 5 dari clock register. Dalam M41T56, bit 7 dan 6 digunakan untuk menunjukkan transisi ke abad baru, dan bit 5 dan 4 digunakan untuk menghitung puluhan jam. Selain itu, penghitungan jam hanya dimungkinkan dalam mode 24, mode AM / PM tidak tersedia. Dalam DS1307, bit 7 tidak digunakan, nol dalam bit 6 menunjukkan bahwa mode penghitungan 24 digunakan, dan dalam kasus ini, bit 5 dan 4 berisi puluhan jam. Jika bit 6 adalah satu, maka bit 5 menjadi bendera AM / PM, dan bit 4 berisi puluhan jam.
Perbedaan yang signifikan ada di register kontrol, yang berisi kata koreksi stroke.
Koreksi mata kuliah
M41T56 memungkinkan Anda untuk mengkompensasi kesalahan resonator kuarsa dalam kisaran -62 hingga +124 ppm, yang memberikan deviasi tidak lebih dari ± 5 detik per bulan. Untuk kompensasi bertanggung jawab enam bit paling tidak signifikan dari register kontrol. Bit 4-0 mengandung bilangan bulat yang tidak ditandatangani dari nilai koreksi, dan bit 5 menetapkan arah koreksi. Jika bit 5 mengandung nol, maka stroke melambat dalam langkah 2,034 ppm, jika tidak RTC mempercepat dalam langkah-langkah 4,068 ppm. Ini tidak nyaman, jadi saya membuat sketsa beberapa fungsi sederhana untuk mengkonversi dari ppm ke kata koreksi dan sebaliknya.
#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; }
Deteksi kesalahan
Baik DS1307, tetapi M41T56 dapat mendeteksi kesalahan generasi, tetapi mereka menjamin bahwa ketika daya dihidupkan, beberapa bit akan berada dalam keadaan tertentu. M41T56 saat diaktifkan di register kontrol akan menjadi 10xxxxxx. Untuk melacak crash program, Anda dapat menggunakan algoritma berikut. Jika, ketika mikrokontroler dihidupkan, register kontrol RTC berisi 10xxxxxx, maka ada kegagalan daya dan nilai harus ditulis ke dalam register yang bit-bit tingginya tidak sama dengan 10. Yang paling sederhana adalah menulis kata koreksi dengan bit 7 dan 6 sama dengan nol.
Sastra