Идея такая: значение коррекции будет до 255 с шагом 1. Каждый час коррекция будет correction/8, а каждые сутки дополнительно (correction&7)*3
Проверка математики: например установим коррекцию 255. 255/8=31; 255&7=7 (младшие 3 бита единицы) итого суммарная коррекция 24*31+7*3=765 765/125=6,12 секунд в сутки. 0,255*24=6,12 Единственный минус такого подхода уменьшение максимальной коррекции с 9,6 до 6,12 сек в сутки.
Исправил тут
// коррекция
,,,,
,,,,
if (regim==r_clock+8) {//set hour
inc_dec_var(&correction,255); (724 строчка)
mask_next_regim(0x0F,0,211);
if (regim==211) {
EEPROM_write(EEPROM_correction, correction);
EEPROM_write(EEPROM_corr_flag, corr_flag);
}
return;
и тут
if (++hour[h_min]>=60)
{
if ( corr_flag & _BV(fl_corr_znak_pl) )//корекция часов
correct=correction/8;//для убыстрения
else
correct= 0x00-correction/8;
hour[h_min] =0;
hour[h_hour]++;
if (hour[h_hour]>=24)
{
if ( corr_flag & _BV(fl_corr_znak_pl) )//корекция часов
correct=correct+(correction&7)*3;//для убыстрения
else
correct=correct-(correction&7)*3;
hour[h_hour]=0;
if (++hour[h_day]>=7) hour[h_day]=0;
,,,,,
а еще заменил это if ( (i=EEPROM_READ(EEPROM_correction)) < sizeof(corr_in_lcd)/2 ); (132 строка)
на это if ( (i=EEPROM_READ(EEPROM_correction)) < 255 );
и еще заменил это result_in_bcd( pgm_read_word_near(&corr_in_lcd[correction]) ); (1392 строка)
на это result_in_bcd(correction);
Что значит pgm_read_word_near, так и не смог найти. Что это? В 132 строчке я не ошибся? Я ведь понятия не имею что это и для чего.
Это дополнение вызвало перерасход памяти, но выкинув не нужный более массив corr_in_lcd (из файла clock.h) место нашлось
Вроде работает. Буду тестировать точность.


