Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Требуется серъезная помощь бригады телепатов с RTC(+)

Отправлено Flasher 01 марта 2009 г. 11:57


Периодически, пока не выяснено в какой момент, в устройстве (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();
}



Составить ответ | Вернуться на конференцию.

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
поделите двойку на единицу:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru