- Вложения
-
- ИН-17.rar
- (11 КБ) 207 скачиваний
Часы на газоразрядных индикаторах
Вот. Нарисовано в Кореле. Вроде в такое отверстие удавалось вставить ИН-17 
- Реклама
- Сообщения: 1303
- Зарегистрирован: Вс апр 19, 2009 17:20:22
- Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Спасибо 
Опыт растет прямо пропорционально выведенному из строя оборудованию...
И снова вопрос по прерываниям: во встроенной функции AVRStudio6 (eeprom_write_byte) не увидел запрета прерываний на время записи. Можно, опять же, сделать просто
или нужно написать свою функцию записи EEPROM, где будут запрещаться прерывания именно во время записи?
Код: Выделить всё
cli();
eeprom_write_byte(&eep,x);
sei();А зачем их запрещать при записи в еепром?
«И всё-таки она вертится!»
Я сделал сервисное меню, в котором можно устанавливать разные параметры, как например, скорость смены цветов RGB-подсветки, поправка температуры, плавность смены цифр и т.д. Почему-то, иногда записываются неверные данные. Почитал, пишут, что прерывания могут мешать процедуре записи.
И еще, мои часы немного спешат, где-то на 0,5с в сутки, хотя кварц ставил "термостабильный". Хочу сделать коррекцию, чтобы раз в сутки часы подводились. Но установить время на 1307 можно только в секундах. Поэтому, если часы подводить назад, нужно их просто приостановить на n миллисекунд, а если вперед - установить время на 1307 на +n секунд больше текущего, и, если время перевода вперед не кратно 1 с, то снова остановить, на n миллисекунд.
Может, у кого-то есть другое готовое решение для такой коррекции?
И еще, мои часы немного спешат, где-то на 0,5с в сутки, хотя кварц ставил "термостабильный". Хочу сделать коррекцию, чтобы раз в сутки часы подводились. Но установить время на 1307 можно только в секундах. Поэтому, если часы подводить назад, нужно их просто приостановить на n миллисекунд, а если вперед - установить время на 1307 на +n секунд больше текущего, и, если время перевода вперед не кратно 1 с, то снова остановить, на n миллисекунд.
Может, у кого-то есть другое готовое решение для такой коррекции?
- Реклама
Есть: у Вас есть ёмкости от выводов кварца на общий провод? Замените одну ёмкость на подстроечник.
Errare humanum est
По ДШ 1307 емкостей не положено. Кварц вот такой, Cнагр = 12.5 пФ. По ДШ ± 20 ppm (±0,002%)
А, да, ds1307 не требует внешних резисторов и ёмкостей по выводам кварца, они уже внутри есть, только в ДШ на DS1307 написано, что max series resistance 45kOhm, а у Вашего кварца - 80kOhm. Но может можно внешнеё емкостью чуть подправить?
Кстати, не могут быть наводки по питанию или на линии X1, X2?
Кстати, не могут быть наводки по питанию или на линии X1, X2?
Errare humanum est
На правах оффтопа - Кто разбирается в подключении симисторов - посмотрите тут . Очередной шедевр инженерной китайской мысли . Не могу одолеть.
В таком случае от DS1307 стоило бы отказаться полностью, а счёт времени вести в софте. А там уже можно двигать в любую сторону и на любое время, кратное шагу таймера. На тех же AVR - до 1/128 секунды в сутки.И еще, мои часы немного спешат, где-то на 0,5с в сутки, хотя кварц ставил "термостабильный". Хочу сделать коррекцию, чтобы раз в сутки часы подводились. Но установить время на 1307 можно только в секундах.
Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
Я решил эту проблему просто - выход SQW завел на прерывание, один таймер настроил на 1/100 секунды от кварца 8МГц (да, стм32 так может), и получил 0,01 секундыwatchmaker писал(а):В таком случае от DS1307 стоило бы отказаться полностью
Опыт приходит сразу после того, как он был нужен...
Все равно тогда МК тактировать нужно кварцем. Часы я уже сделал, так что менять схему уже поздно, а вот софтовая коррекция - выход. Только вот в моей библиотеке для 1307 нет функции пуска-остановки часов. Пуск происходит при инициализации, а функция остановки просто отсутствует. По идее, в 7-й регистр нужно единицу записать, но боюсь чего-то намудрить. Если есть годная библиотека для 1307, поделитесь, пожалуйста.
Да, так и есть. есть там такой бит и он работает реально.
Я при старте проверяю его - если генератор отключен - включаю его.
И при установке часов я сначала останавливаю 1307 и обнуляю секунды, а после установки часов включаю генерацию этим флажком.

Я при старте проверяю его - если генератор отключен - включаю его.
И при установке часов я сначала останавливаю 1307 и обнуляю секунды, а после установки часов включаю генерацию этим флажком.
Очень нравится неон

Мой проектик часиков с термометром на любых 6ти газоразрядных лампах + куча функций
Ещё один - попроще

Светодиодный проект

My video on youtube nic SLvik78
Мой проектик часиков с термометром на любых 6ти газоразрядных лампах + куча функций
Ещё один - попроще
Светодиодный проект
My video on youtube nic SLvik78
Что-то никак не могу разобраться с остановкой 1307 (то что мне нужно для коррекции). Бит СН, управляющий тактовым генератором , судя по ДШ, почему-то находится в регистре секунд (в десятках секунд только 3 бита, решили сэкономить, наверное). Т. е. остановить/запустить 1307 я могу только перезаписав секунды? Тогда, каким чудом, при инициализации 1307 при включении часов не обнуляются секунды?
Функция инициализации в моей библиотеке 1307 выглядит вот так:
На сколько я понимаю, здесь включается SQW и определяется его частота. Не могу понять, где происходит запись "0" в СН?
Правильно ли я понимаю, чтобы установить БИТ СН в "1" (остановить часы), не сбросив секунды, мне нужно сначала считать время, а потом записать как-то так:
А чтобы снова запустить 1307 нужно снова отправит секунды, только без 0х80?
Функция инициализации в моей библиотеке 1307 выглядит вот так:
Код: Выделить всё
void rtc_init(unsigned char rs, unsigned char sqwe, unsigned char out)
{
rs&=3;
if (sqwe) rs|=0x10;
if (out) rs|=0x80;
i2c_start();
i2c_write(0xd0);
i2c_write(7);
i2c_write(rs);
i2c_stop();
}Правильно ли я понимаю, чтобы установить БИТ СН в "1" (остановить часы), не сбросив секунды, мне нужно сначала считать время, а потом записать как-то так:
Код: Выделить всё
i2c_start();
i2c_write(0xd0);
i2c_write(0);
i2c_write 0x80+(bin(sec));
i2c_stop();
Последний раз редактировалось vvsector85 Ср июн 08, 2016 19:04:39, всего редактировалось 2 раза.
Этот бит находится в регистре секунд по адресу 00
7й бит этого регистра и есть разрешение генерации.

7й бит этого регистра и есть разрешение генерации.
Очень нравится неон

Мой проектик часиков с термометром на любых 6ти газоразрядных лампах + куча функций
Ещё один - попроще

Светодиодный проект

My video on youtube nic SLvik78
Мой проектик часиков с термометром на любых 6ти газоразрядных лампах + куча функций
Ещё один - попроще
Светодиодный проект
My video on youtube nic SLvik78
Кажется, я понял. При первом включении мои часы не пойдут. Это случится только после установки времени, когда в первые 6 бит регистра 00 запишутся секунды, а в 7-й - "0". Вот почему в функции инициализации ничего не записывается в регистр 00. Иначе, при каждом выключении часов секунды сбрасывались бы.
Значит, нужно при включении часов выполнять проверку 7-го бита в регистре 00. Если он = 0 - ничего не делать, если 1 - записать 0.
Значит, нужно при включении часов выполнять проверку 7-го бита в регистре 00. Если он = 0 - ничего не делать, если 1 - записать 0.
Правильно.
Когда батарейка стоит на часах, то этот бит не сбрасывается и часы уже идут.
А при старте программы она проверяет этот бит если часы стоят прога обнуляет все регистры
и ставит 7й бит и время пошло.
По крайней мере у меня так сделано.

Когда батарейка стоит на часах, то этот бит не сбрасывается и часы уже идут.
А при старте программы она проверяет этот бит если часы стоят прога обнуляет все регистры
и ставит 7й бит и время пошло.
По крайней мере у меня так сделано.
Очень нравится неон

Мой проектик часиков с термометром на любых 6ти газоразрядных лампах + куча функций
Ещё один - попроще

Светодиодный проект

My video on youtube nic SLvik78
Мой проектик часиков с термометром на любых 6ти газоразрядных лампах + куча функций
Ещё один - попроще
Светодиодный проект
My video on youtube nic SLvik78
Так, вроде родил что-то. Гляньте, пожалуйста, а то не хочется лишний раз часы раскурочивать, чтобы прошить:
vars[7] - коррекция часов на vars[7] десятых секунд назад
vars[8] - коррекция часов на vars[8] десятых секунд вперед
vars[7] - коррекция часов на vars[7] десятых секунд назад
vars[8] - коррекция часов на vars[8] десятых секунд вперед
Код: Выделить всё
//================Коррекция времени================
if (corr_flag==0)
{
if ((H==1)&&(M==0)&&(S==30))
{
unsigned char corr_100ms;
corr_flag=1;
rtc_get_time(&H, &M, &S);
if (vars[7])
{
corr_100ms = vars[8]%10;
S=S-(vars[8]/10)+1;
rtc_write(0x00,0x80);
for(unsigned char i=0;i<=corr_100ms;i++)
{
_delay_ms(100);
}
rtc_write(0x00,bin(S));
}
if (vars[8])
{
corr_100ms = 10-(vars[8]%10);
S=S+(vars[8]/10)+1;
rtc_write(0x00,0x80);
for(unsigned char i=0;i<=corr_100ms;i++)
{
_delay_ms(100);
}
rtc_write(0x00,bin(S));
}
}
_delay_ms(1500);
corr_flag=0;
}
//=======Я не могу, ребята помогут.
Я только в ассемблере пишу проги.

Я только в ассемблере пишу проги.
Очень нравится неон

Мой проектик часиков с термометром на любых 6ти газоразрядных лампах + куча функций
Ещё один - попроще

Светодиодный проект

My video on youtube nic SLvik78
Мой проектик часиков с термометром на любых 6ти газоразрядных лампах + куча функций
Ещё один - попроще
Светодиодный проект
My video on youtube nic SLvik78


