M41T56 é um chip de relógio em tempo real, que é análogo ao popular DS1307. E mesmo que a pinagem do microcircuito seja a mesma, eles têm diferenças significativas, sobre as quais tentarei falar.
Breve descrição
Não vou me debruçar sobre a operação do barramento IIC, observo apenas que os dois chips têm o endereço 0xd0. Para trabalhar com o tempo, o microcircuito contém sete registros de contas e um registro de controle. Registradores de contas contêm números no formato decimal binário, no entanto, alguns bits têm um significado especial.
RegistrosO valor de xxx bits não está definido.
Bitsx - após ligar, o estado do bit pode ser qualquer.
As diferenças começam na atribuição dos bits 7, 6 e 5 do registro do relógio. No M41T56, os bits 7 e 6 são usados para indicar a transição para o novo século, e os bits 5 e 4 são usados para contar dezenas de horas. Além disso, a contagem de horas é possível apenas no modo 24, o modo AM / PM não está disponível. No DS1307, o bit 7 não é usado, um zero no bit 6 indica que o modo de contagem 24 é usado e, neste caso, os bits 5 e 4 contêm dezenas de horas. Se o bit 6 é um, o bit 5 se torna o sinalizador AM / PM e o bit 4 contém dezenas de horas.
Diferenças significativas estão no registro de controle, que contém o curso de correção da palavra.
Correção de curso
O M41T56 permite compensar o erro do ressonador de quartzo na faixa de -62 a +124 ppm, o que resulta em um desvio não superior a ± 5 segundos por mês. Para compensação, os seis bits menos significativos do registro de controle são responsáveis. Os bits 4-0 contêm um número inteiro não assinado do valor de correção, e o bit 5 define a direção da correção. Se o bit 5 contiver zero, o curso diminui em passos de 2,034 ppm, caso contrário, o RTC acelera em passos de 4,068 ppm. Isso é inconveniente, por isso esbocei algumas funções simples para converter de ppm em palavra de correção e 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; }
Detecção de falhas
Nem o DS1307, mas o M41T56 podem detectar erros de geração, mas garantem que quando a energia for ligada, alguns bits estarão em um determinado estado. M41T56, quando ativado no registro de controle, será 10xxxxxx. Para rastrear falhas no programa, você pode usar o seguinte algoritmo. Se, quando o microcontrolador estiver ligado, o registro de controle RTC contiver 10xxxxxx, houve uma falha de energia e um valor deverá ser gravado no registro cujos bits altos não sejam iguais a 10. O mais simples é escrever a palavra de correção com os bits 7 e 6 iguais a zero.
Literatura