Хотелось бы живой информации об этом регистре, кто применял его в своих разработках и есть ли смысл с ним связываться.
З.Ы. Точность не плывет, часы нормально ходят, просто хочу вывести как дополнительную фишку к часам.
Код: Выделить всё
// Устанавливаем смещение времени
void DS3231::setAgingOffset(int8_t offset) {
uint8_t temp;
// Преобразовать 8-битное знаковое значение в значение регистра
if (offset < 0) {
// Вычислить дополнение до двух для отрицательного значения
temp = ~(-offset) + 1;
} else {
// Положительное значение регистра
temp = (uint8_t)offset;
}
// Запись регистра смещения старения
writeRegister(DS3231_AGING_OFFSET, temp);
// Для применения изменения смещения старения требуется преобразование температуры
startTemperatureConversion();
}
// Читаем значение смещения времени
int8_t DS3231::getAgingOffset() {
uint8_t temp;
// Чтение регистра старения
temp = readRegister(DS3231_AGING_OFFSET);
// Преобразовать в 8-битное знаковое значение
if (temp & 0x80) {
// Вычислить дополнение до двух для отрицательного значения регистра старения
return (int8_t)(temp | 0x80);
} else {
// Положительное значение регистра старения
return (int8_t)temp;
}
}
// Запуск преобразования температуры
void DS3231::startTemperatureConversion() {
uint8_t controlReg;
// Проверяем, установлен ли флаг занятости температуры
if (readRegister(DS3231_STATUS) & (1 << DS3231_BSY)) {
// Если флаг занятости установлен, выходим из функции
return;
}
// Начать преобразование температуры
controlReg = readRegister(DS3231_CONTROL) | (1 << DS3231_CONV);
// Запись регистра управления
writeRegister(DS3231_CONTROL, controlReg);
}
Код: Выделить всё
// коррекция хода часов
static void set_correct() {
// Если нажата кнопка bt0, сбрасываем счетчик и переходим к настройке корр. температуры
if (bt2.isClick()) count = 0, menu = TemperCorect, pisk(), _delay_ms(2);
uint8_t tmp = 0;
if (bt3.isClick()) {
pisk();
count = 0;
if (Corect < 100) { // если число положительное
Corect++;
if (Corect > 55) Corect = 55; // при переполнении не выходить за пределы (max = +5,5 сек/сутки)
} else { // если число отрицательное
Corect--;
if (Corect < 129) Corect = 0; // при приближении к 0 перейти в положительную часть
}
cor_ten_day = 0; // сбросить счетчик дней корректировки
at24c_write_byte(0x50, MEM_CORECT, Corect); // сохранить в EEPROM
at24c_write_byte(0x50,MEM_COR_TEN_DAY, cor_ten_day); // сохранить в EEPROM
}
if (bt4.isClick()) {
pisk();
count = 0;
if (Corect < 100) { // если число положительное
if (Corect == 0) Corect = 129; // при 0 перейти в отрицательную часть
else Corect--;
} else { // если число отрицательное
Corect++;
if (Corect > 183) Corect = 183; // при переполнении не выходить за пределы (max = -5.5 сек/сутки)
}
cor_ten_day = 0; // сбросить счетчик дней корректировки
at24c_write_byte(0x50, MEM_CORECT, Corect); // сохранить в EEPROM
at24c_write_byte(0x50,MEM_COR_TEN_DAY, cor_ten_day); // сохранить в EEPROM
}