Периодически, пока не выяснено в какой момент, в устройстве (tiny2313от внутреннего RC+m41t56- почти аналог ds1307) останавливается RTC. Разводка соответсвует рекомендуемой.BOD включен. Питание от 220 через гасящий конденсатор -> стабилитрон на 13 вольт+220мкф для питания 12-вольтового реле, которое пока отключено -> 470 Ом +стабилитрон на 5,1+0.1мкф. К RTC подпаяна литиевая батарейка и 0,1 мкф параллельно.Подтяжки 4,7кОм. Все отмыто ацетоном и бензином Калоша. Кварц уже менял на другой тип.
Компилятор CodeVisionAVR 1.25.9
Код сгенерированный визардом для DS1307 и слегка изменен. Используется программный I2C. Код, модифицирующий время-дату, вызывается по командам USART.
Отлаживал также драконом- в программе просто замораживаются переменные, прочитанные rtc_get_time();
// I2C Bus initialization
i2c_init();
// Real Time Clock initialization
// Square wave output on pin SQW/OUT: On
// Square wave frequency: 512Hz
//if(rtc_read(0)&0x7F)rtc_write(0,0);
rtc_write(0x07,0xC0);
unsigned char rtc_read(unsigned char address)
{
unsigned char data;
i2c_start();
i2c_write(0xd0);
i2c_write(address);
i2c_start();
i2c_write(0xd1);
data=i2c_read(0);
i2c_stop();
return data;
}
void rtc_write(unsigned char address,unsigned char data)
{
i2c_start();
i2c_write(0xd0);
i2c_write(address);
i2c_write(data);
i2c_stop();
}
void rtc_get_time(void)
{
i2c_start();
i2c_write(0xd0);
i2c_write(0);
i2c_start();
i2c_write(0xd1);
sec=bcd2bin(i2c_read(1)&0x7F);
min=bcd2bin(i2c_read(1)&0x7F);
hour=bcd2bin(i2c_read(0)&0x3F);
i2c_stop();
}
void rtc_set_time(void)
{
i2c_start();
i2c_write(0xd0);
i2c_write(0);
i2c_write(bin2bcd(sec));
i2c_write(bin2bcd(min));
i2c_write(bin2bcd(hour));
i2c_stop();
}
void rtc_get_date(void)
{
i2c_start();
i2c_write(0xd0);
i2c_write(4);
i2c_start();
i2c_write(0xd1);
date=bcd2bin(i2c_read(1)&0x3F);
month=bcd2bin(i2c_read(1)&0x1F);
year=bcd2bin(i2c_read(0));
i2c_stop();
}
void rtc_set_date(void)
{
i2c_start();
i2c_write(0xd0);
i2c_write(4);
i2c_write(bin2bcd(date));
i2c_write(bin2bcd(month));
i2c_write(bin2bcd(year));
i2c_stop();
}