Спойлер
Код: Выделить всё
#define max_adress (5*(Pos_Ctrl+1)) // Максимальный адрес для записи = количество групп ячеек * размер группы
#define Pos_min 0 // Смещения сохраненных значений в ЕЕПРОМ
#define Pos_chas 1
#define Pos_sut 2
#define Pos_Likv 3
#define Pos_Ctrl 4
#define Ctrl 0xAA // Контрольное значение. не м.б. равно 0xFF и 0x00
#define EE_read(adress, x) \
while(EECR & (1<<EEWE)); /*Ждать завершения предыдущей записи*/ \
EEARL = (adress); \
EECR |= (1<<EERE); /*Выполнить чтение*/ \
x = EEDR
#define EE_write(adress, x) \
while(EECR & (1<<EEWE)); /*Ждать завершения предыдущей записи*/ \
EEDR = (x); \
EEARL = adress; \
asm ("cli"); \
EECR |= (1<<EEMWE); /*Установить флаг EEMWE*/ \
EECR |= (1<<EEWE); /*Начать запись в EEPROM*/ \
asm ("sei")
#define EE_Proverka(x, y) \
EE_read ((OFFset + (x)), temp); /* Прочитаем записанное значение */ \
if (temp != (y)) /* Если оно не равно тому, что писали */ \
{ /* Запишем в следующую группу */ \
OFFset += Pos_Ctrl + 1; \
if (max_adress == OFFset) OFFset = 0; \
if (OFFset == OLD_OFFset) \
{ \
Flags.No_write = da; \
goto out; \
} \
goto back; \
}
#define EE_SAVE \
if (Flags.No_write == net) \
{ \
__label__ back, out; \
OLD_OFFset = OFFset; \
back: \
EE_write ((OFFset + Pos_min), minuti); /* Запишем новое значение минут в ЕЕПРОМ */ \
EE_Proverka (Pos_min, minuti) \
EE_write ((OFFset + Pos_chas), chasi); /* Запишем новое значение часов в ЕЕПРОМ */ \
EE_Proverka (Pos_chas, chasi) \
EE_write ((OFFset + Pos_sut), sutki); /* Запишем новое значение суток в ЕЕПРОМ */ \
EE_Proverka (Pos_sut, sutki) \
EE_write ((OFFset + Pos_Likv), Likv); /* Запишем новое значение времени Likv в ЕЕПРОМ */ \
EE_Proverka (Pos_Likv, Likv) \
EE_write ((OFFset + Pos_Ctrl), Ctrl); /* Запишем контрольное значение, по текущему смещению */ \
EE_Proverka (Pos_Ctrl, Ctrl) \
if (0 < OLD_OFFset) {EE_write ((OLD_OFFset - 1), 0xFF);} /* Делаем старое значение недействительным */ \
OFFset += Pos_Ctrl + 1; /* Устанавливаем смещение на следующий адрес */ \
if (max_adress == OFFset) OFFset = 0; \
out: \
; }Код: Выделить всё
void EE_save (void) // Функция сохранения значений времен
{
EE_SAVE;
}А если убрать проверку записи, то начинает затирать ячейки нулями... ((


