Поюзал эти часики, поюзал... и... чего-то не хватает. А не хватает мне точности. Так как планировалось, что будет использована микросхема с RTC у которой, вроде, есть подстройка точности, то на плате не было предусмотрено место для подстроечного конденсатора. Пришлось думать как сделать программную коррекцию.
Так как время в "пике" обычно делают с использованием TMR1, а это 16-разрядный счетчик у которого нет возможности задать коэффициент пересчета, поэтому приходится загружать стартовое значение 0х8000, чтобы переполнение наступило через одну секунду, а не через две. Правда, по переполнению нельзя снова загружать тоже самое значение, иначе из-за неминуемой задержки часы будут отставать, причем, совершенно непрогнозируемо. Хотя в AN582 "эти итальянцы" так и сделали. Но я (и, наверняка, все остальные) делаю иначе - просто прибавляю к текущему состоянию то самое 0х8000. Правда, тут еще один нюанс - счетчик 16-разрядный, а микроконтроллер только восьмиразрядный. Поэтому, это смещение прибавляется только в старший байт счетчика, а младший принципиально не трогается.
Вот тут и появилась мысля, а почему прибавлять именно 0х8000? Можно для коррекции прибавлять и иное значение. Тут я прикинул, что будет, если секунду укоротить (или удлиннить) на 1/8 секунды (прибавлять не 0х8000, а 0х9000 или 0х7000), скажем, раз в час? Очень просто, если такое творить раз в час, то в результате 24 таких отклонений, суммарное отклонение составит 3 секунды. А если изменить только младший бит (0х8100 или 0x7F00), то минимальный шаг коррекции будет 0,1875 c. Поэтому я решил, делать коррекцию раз в два часа. Тогда коррекция в 16 единиц составит 1.5 секунды в сутки, а одна единица около 0.1 секунды (0,09375).
Самая большая проблема, как сделать отображение этой настройки на индикаторе часов, на котором нет возможности вывести знак "-" и нет даже запятых? А вот как:
Код:
" 0:0 " -> 0 "01: " -> 1 " :01" -> -1
Таким образом вводится коррекция от -99 до 99 (+/- 9.2 сек). А может есть идеи лучше?
_________________ А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Я бы сделал наоборот: слева от точек отрицательные значения, справа положительные, как в термометре "0". Можно частотой мигания разделителя подсказывать. Так же можно принять, например "50" как ноль. Все же этот параметр будет меняться редко. Но, как по-мне, для часов без секунд нет необходимости корректировать время каждый час. Еще можно устанавливать время с учетом ухода раз в сутки или двое, когда расхождение достигнет целого знаения; можно применить синхронизацию с внешними датчиками/устройствами для высокой точности хода, внешнее тактирование и т.п. А частота кварца насколько сильно будет уходить с температурой? Для устройств с нехваткой ног я пробовал использовать сброс в "00:00" в полночь по сигналу с ESP8266.
Ну две секунды в сутки надо же как-то компенсировать... А сортимент smd конденсаторов у меня очень мал, чтобы еще пытаться конденсаторами частоту подгонять. А надо хотя бы точности китайских часов достичь. Да и в комнате температура почти "стабильная".
Да и нету в жизни счастья. Самые близкие к точным часам у меня часы на ds3231. Часы на ds3231M по точности значительно хуже.
_________________ А люди посмотрят и скажут: "Собаки летят. Вот и осень."
В любом ЗУСТЦе есть мелкие подстроечные конденсаторы. Припаиваем их, частотомер в лапы и вперёд ! Стоит технология 0р. и 10 минут времени. Хотя думаю этого барахла у каждого...
_________________ память не сверло Имея один мультиметр, можно измерить всё, кроме платы самого мультиметра. Имея два мультиметра, можно измерить вообще всё.
Две секунды в сутки это хороший результат для ширпотребных кварцев. Ошибка с четвёртого-пятого знака. Программно можно корректировать частоту кварца до третьего знака после запятой. Хотите приключений - так вот они!
Не знаю, что такое 3усцт и какие там подстроечники... последний телевизор у меня был черно-белый. Почему-то все считают, что у всех должно быть то что есть у них. Один считает, что должны быть толпы плат от телевизоров, другой, что толпы китайских зарядок, третий - комповых блоков питания. Но так как я не планировал подстроечники у меня там место только под 1206 конденсатор. И в высоту всего 3мм - дальше копыта ламп. Знаю, что есть SMD подстроечники, но, как уже упоминал - пока я безработный на свои удовольствия деньги тратить не могу - пользуюсь, только тем, что осталось с тучных времен.
_________________ А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Нууу, это классическое... Я думал вы расскажете как привести к коэффициентам этого алгоритма простое желание "сделать коррекцию 1.8 секунды в сутки". Просто, пока я не могу формализовать это. С одной стороны вариант коррекции сразу на 24/128 секунды раз в два часа работает, но гораздо приятнее делать 1/128 раз в 300 секунд - плавнее будет изменение.
_________________ А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Правда, по переполнению нельзя снова загружать тоже самое значение, иначе из-за неминуемой задержки часы будут отставать, причем, совершенно непрогнозируемо.
Я так понимаю, что из за того что длинна обработчика прерывания меняется в зависимости от значений счетчиков, но можно выровнять длину всех веток прерывания. Либо нопаим, либо коррекцией смещения таймера. Второе по коду будет короче, но первое понятнее. В этом случае сама коррекция будет заключаться в модификации базового значения таймера, которую можно делать с очень маленьким шагом.
Глянул исходник. Исходя из того что прерывания у вас 2 , коррекция как таковая смысла не имеет, по моему мнению.
Пусть меня поправят, но в ПИК вектор прерывания один. Когда произойдет прерывание по переполнению таймера 1 , и в это время будет выполнятся прерывание от таймера 0 или таймера 2, флаг подымится, закончится прерывание от таймера 2, программа вернется, выполнит одну команду(?) и уйдет на прерывание по переполнению таймера 1. При этом куча времени уже будет потеряна.
_________________ У того, кто делает — получается редко. У того, кто не делает — не получается никогда.
Последний раз редактировалось RoboC Пт мар 24, 2017 09:34:45, всего редактировалось 1 раз.
Так! Я всё понял! (с)из мультика. Только надо еще придумать, как быть с приращениями и вычитаниями. т.е. как отличать опережение и отставание. И, может, получится какой-нибудь алгоритм.
RoboC писал(а):
что из за того что длинна обработчика прерывания меняется
Не, на это можно бы наплевать. Просто типичная микрочиповская заморочка. Можно было бы использовать более внятные таймеры, чем динозаврообразные TMR0 и TMR1, но они не работают в спячке. А с прерыванием проблема в том, что само прерывание, может запаздывать. Во-первых, от момента, когда оно произойдёт: если произойдёт посреди "двухсловного" кода (типа GOTO) будет задержка на такт, А во-вторых, я сам в программе иногда запрещаю прерывания, чтобы модифицировать счетчики при установке времени. В третьих, счетчик двухбайтный, т.е. пока считываешь один байт, второй может уже переполнится. Ну и напоследок, счетчик идёт в асинхронном режиме, что еще дополнительно накладывает ограничение на валидность считанных данных (а в синхронном режиме счетчик считать не будет во время спячки). Но, даже оперируя только старшим байтом, получается разрешение коррекции 1/128 секунды. Вот сейчас попробую нарисовать этого Брезенхема, чтобы он просто равномерно вставлял эти плюс-минус 1/128 нужное число раз в течении 7200 секунд.
akl писал(а):
Не заинтересовало. Удалил
Не, мы просто терпеливо ждали продолжения... картинки - это просто картинки. Тем более, что этот частотмер вы выкладывали уже не раз.
_________________ А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Имеет. Температура в комнате практически постоянная. Аналог подстроечного конденсатора из ничего я делал так: на обмоточный провод в лаковой изоляции диаметром ок.0.7-1.0 наматывается виток к витку тонкий обмоточный провод. Получается эрзац конденсатор. При настройке сматываем намотку пока не получим нужную частоту. Изгибаем, снова проверяем и обрезаем лишнее. Работает. Проверено. 2 Uldemir. У меня валяются smd подстроечники размером 1206 примерно от пейджера. Могу отправить почтой.
Спасибо, конечно, но проблема не в подстроечнике, а в решении задачи. Вот сделал счет времени теперь так: Спойлер
Код:
// Прерывание от TMR1 #define WINDOW_SIZE 7200 if (TMR1IE && TMR1IF){ TMR1IF = 0; while (TMR1L > 0xF8); TMR1H += next_correction; flag.seconds = 1; if (++reg_SS > 59){ reg_SS = 0; if (++reg_MM > 59){ reg_MM = 0; if (++reg_HH > 23){ reg_HH = 0; } } } // а теперь Брезенхем: // вставляем в 2-х часовой интервал заданное число коррекций if (correction >= 0){ error += correction; if (error >= WINDOW_SIZE){ error -= WINDOW_SIZE; next_correction = 0x81; } else { next_correction = 0x80; } } else { error -= correction; if (error >= WINDOW_SIZE){ error -= WINDOW_SIZE; next_correction = 0x7F; } else { next_correction = 0x80; } } }
Осталось зашить в кристалл и убедиться в работоспособности.
p.s. самое интересное, что решая одну задачу, находишь лучшее решение для другой, уже законченной, конструкции. У часов то, всего две кнопки. Как крутить эту коррекцию вверх-вниз и сообщить, что ввод закончен? В предыдущих сделал одна кнопка вверх, другая - вниз. А выход только через выключение питания. А тут подумал, что простого таймоута достаточно. Пришлось еще те часы раскручивать и перепрошивать.
p.p.s. На тему, что у мишки в животике:
_________________ А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Последний раз редактировалось uldemir Сб мар 25, 2017 08:53:31, всего редактировалось 1 раз.
Заголовок сообщения: Re: Часы на газоразрядных индикаторах
Добавлено: Пт мар 24, 2017 19:27:05
Друг Кота
Карма: 46
Рейтинг сообщений: 977
Зарегистрирован: Ср май 28, 2008 00:32:54 Сообщений: 7616 Откуда: г. Россия
Рейтинг сообщения:1
YarPv14 писал(а):
SLvik писал(а):
1)Для улучшения зажигания ячеек разряд должен поддерживаться (Принцип современной плазменной панели.) иначе при развёртке одни мерцают, другие плохо зажигаются, третьи вообще не горят.
Здравствуйте! Можно Вас попросить показать схему высоковольтных ключей строк и столбцов, из осциллограмм в паспорте я не совсем понял как происходит управление этой панелью.
Там всё сделано на обычных транзисторах. Один по катодам. И два по анодам. Выставляешь нужный код на катодах, а потом анодным +сом выбираешь столбик. Всё просто как 2 пальца.
проверял я индикаторы ин-14 на работоспособность от простого блока питания от сети 120в.(сделал в доме 2 типа сети для удобства). блок питания выдаёт 170в а индикатор сгорел . На сколько я знаю у них рабочее напряжение около 170в Может быть кто знает почему идикаторы сгорают?
_________________ Андрей осторожно взял у нее коробочку и с удивлением убедился, что это радиоприемник. - Вот это да! - пробормотал он - Неужели детекторный? (братья Стругацкие, Град обреченный)
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 28
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения