Часы на газоразрядных индикаторах

Что бы еще такого сделать?... Предлагайте! Обсудим все!!!
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: Часы на газоразрядных индикаторах

Сообщение uldemir »

Поюзал эти часики, поюзал... и... чего-то не хватает. А не хватает мне точности. Так как планировалось, что будет использована микросхема с RTC у которой, вроде, есть подстройка точности, то на плате не было предусмотрено место для подстроечного конденсатора. Пришлось думать как сделать программную коррекцию.

Так как время в "пике" обычно делают с использованием TMR1, а это 16-разрядный счетчик у которого нет возможности задать коэффициент пересчета, поэтому приходится загружать стартовое значение 0х8000, чтобы переполнение наступило через одну секунду, а не через две. Правда, по переполнению нельзя снова загружать тоже самое значение, иначе из-за неминуемой задержки часы будут отставать, причем, совершенно непрогнозируемо. Хотя в AN582 "эти итальянцы" так и сделали. :dont_know: Но я (и, наверняка, все остальные) делаю иначе - просто прибавляю к текущему состоянию то самое 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 сек). А может есть идеи лучше?
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Реклама
Аватара пользователя
Topaloff
Потрогал лапой паяльник
Сообщения: 349
Зарегистрирован: Вс фев 03, 2013 00:47:59
Откуда: Киев

Re: Часы на газоразрядных индикаторах

Сообщение Topaloff »

Я бы сделал наоборот: слева от точек отрицательные значения, справа положительные, как в термометре "0". Можно частотой мигания разделителя подсказывать. Так же можно принять, например "50" как ноль. Все же этот параметр будет меняться редко.
Но, как по-мне, для часов без секунд нет необходимости корректировать время каждый час. Еще можно устанавливать время с учетом ухода раз в сутки или двое, когда расхождение достигнет целого знаения; можно применить синхронизацию с внешними датчиками/устройствами для высокой точности хода, внешнее тактирование и т.п.
А частота кварца насколько сильно будет уходить с температурой?
Для устройств с нехваткой ног я пробовал использовать сброс в "00:00" в полночь по сигналу с ESP8266.
Реклама
Wandal
Грызет канифоль
Сообщения: 260
Зарегистрирован: Сб окт 31, 2015 03:14:43

Re: Часы на газоразрядных индикаторах

Сообщение Wandal »

uldemir
Без термокомпенсации это не имеет смысла.
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: Часы на газоразрядных индикаторах

Сообщение uldemir »

Ну две секунды в сутки надо же как-то компенсировать... А сортимент smd конденсаторов у меня очень мал, чтобы еще пытаться конденсаторами частоту подгонять. А надо хотя бы точности китайских часов достичь. Да и в комнате температура почти "стабильная".

Да и нету в жизни счастья. Самые близкие к точным часам у меня часы на ds3231. Часы на ds3231M по точности значительно хуже.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Dr.Tr.
Вымогатель припоя
Сообщения: 635
Зарегистрирован: Вс июл 17, 2016 04:38:20
Откуда: Минск

Re: Часы на газоразрядных индикаторах

Сообщение Dr.Tr. »

В любом ЗУСТЦе есть мелкие подстроечные конденсаторы. Припаиваем их, частотомер в лапы и вперёд :)) ! Стоит технология 0р. и 10 минут времени. Хотя думаю этого барахла у каждого...
память не сверло
Имея один мультиметр, можно измерить всё, кроме платы самого мультиметра.
Имея два мультиметра, можно измерить вообще всё.
Реклама
Wandal
Грызет канифоль
Сообщения: 260
Зарегистрирован: Сб окт 31, 2015 03:14:43

Re: Часы на газоразрядных индикаторах

Сообщение Wandal »

Две секунды в сутки это хороший результат для ширпотребных кварцев. Ошибка с четвёртого-пятого знака.
Программно можно корректировать частоту кварца до третьего знака после запятой. Хотите приключений - так вот они!
Реклама
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: Часы на газоразрядных индикаторах

Сообщение uldemir »

Не знаю, что такое 3усцт и какие там подстроечники... последний телевизор у меня был черно-белый. Почему-то все считают, что у всех должно быть то что есть у них. Один считает, что должны быть толпы плат от телевизоров, другой, что толпы китайских зарядок, третий - комповых блоков питания.
Но так как я не планировал подстроечники у меня там место только под 1206 конденсатор. И в высоту всего 3мм - дальше копыта ламп. Знаю, что есть SMD подстроечники, но, как уже упоминал - пока я безработный на свои удовольствия деньги тратить не могу - пользуюсь, только тем, что осталось с тучных времен.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Wandal
Грызет канифоль
Сообщения: 260
Зарегистрирован: Сб окт 31, 2015 03:14:43

Re: Часы на газоразрядных индикаторах

Сообщение Wandal »

Я делал как тут написано: http://www.romanblack.com/one_sec.htm
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: Часы на газоразрядных индикаторах

Сообщение uldemir »

вы наверно пишете со смартфона. рассказали бы подробнее как вы реализовали брезенхейма у себя.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Wandal
Грызет канифоль
Сообщения: 260
Зарегистрирован: Сб окт 31, 2015 03:14:43

Re: Часы на газоразрядных индикаторах

Сообщение Wandal »

НИКАК! Забыл как страшный сон. Ок, вспоминаем:
Спойлер

Код: Выделить всё

unsigned long Bres;
unsigned long Xtal;

void main()
{
  OPTION_REG = 0x08;
  INTCON = 0xA0;
  Xtal = 16000000;
  TRISB = 0x00;
  PORTB = 0x00;
  
  while(1)
  {
  }
}

void interrupt()
{
  if (INTCON.T0IF)
  {
  bres += 1024;
  if(bres >= Xtal)
    {
    bres -= Xtal;
    PORTB=~PORTB;   // second++
    }
  INTCON.T0IF=0;
  }
}
Как-то ещё можно увеличить счётчик в 2*10, но я не помню...
watchmaker
Поставщик валерьянки для Кота
Сообщения: 2183
Зарегистрирован: Вс ноя 15, 2009 23:13:59
Откуда: Харьков
Контактная информация:

Re: Часы на газоразрядных индикаторах

Сообщение watchmaker »

Без термокомпенсации это не имеет смысла.
Смотря какой точности надо достичь. Если 0.5" в сутки - вполне можно и без термокомпенсации, а вот если порядка 10" в год - никак.
Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Часы на газоразрядных индикаторах

Сообщение akl »

Не заинтересовало. Удалил. :)
Последний раз редактировалось akl Пт мар 24, 2017 08:04:52, всего редактировалось 1 раз.
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: Часы на газоразрядных индикаторах

Сообщение uldemir »

Wandal писал(а):Забыл как страшный сон. Ок, вспоминаем
Нууу, это классическое... Я думал вы расскажете как привести к коэффициентам этого алгоритма простое желание "сделать коррекцию 1.8 секунды в сутки". Просто, пока я не могу формализовать это. С одной стороны вариант коррекции сразу на 24/128 секунды раз в два часа работает, но гораздо приятнее делать 1/128 раз в 300 секунд - плавнее будет изменение.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Аватара пользователя
RoboC
Мудрый кот
Сообщения: 1795
Зарегистрирован: Ср апр 04, 2012 09:55:53
Откуда: Северодонецк
Контактная информация:

Re: Часы на газоразрядных индикаторах

Сообщение RoboC »

Правда, по переполнению нельзя снова загружать тоже самое значение, иначе из-за неминуемой задержки часы будут отставать, причем, совершенно непрогнозируемо.
Я так понимаю, что из за того что длинна обработчика прерывания меняется в зависимости от значений счетчиков, но можно выровнять длину всех веток прерывания. Либо нопаим, либо коррекцией смещения таймера. Второе по коду будет короче, но первое понятнее.
В этом случае сама коррекция будет заключаться в модификации базового значения таймера, которую можно делать с очень маленьким шагом. :)

Добавлено..
Спойлер

Код: Выделить всё

void interrupt isr_routine(void) {
    static unsigned char pos, blink;
    
    TEST_PIN = 0;
    if (TMR0IE && TMR0IF) {
        TMR0IF = 0;
    }
    if (TMR2IE && TMR2IF) {   // Прерывание для дисплея 488 Гц
        TMR2IF = 0;
        PORTA = 0x3F;         // выключаем аноды
        PORTB = 0x00;           // выключаем катоды
        if (++pos > 3) { pos = 0; blink++; flag.frame = 1;}
        if ((videobuff[pos] & BLINK) && (blink & BLINK_MASK)) {
            PORTA = 0x3F ^ (grid_sel[pos]);
        } else {
            switch (videobuff[pos] & ~(BLINK)) {
                case 0: PORTB = 0x80; PORTA = 0x3F ^ (grid_sel[pos]); break;
                case 1: PORTA = 0x7F ^ (grid_sel[pos]); break;
                case 2: PORTB = 0x40; PORTA = 0x3F ^ (grid_sel[pos]); break;
                case 3: PORTA = 0xBF ^ (grid_sel[pos]); break;
                case 4: PORTB = 0x20; PORTA = 0x3F ^ (grid_sel[pos]); break;
                case 5: PORTB = 0x08; PORTA = 0x3F ^ (grid_sel[pos]); break;
                case 6: PORTB = 0x04; PORTA = 0x3F ^ (grid_sel[pos]); break;
                case 7: PORTB = 0x02; PORTA = 0x3F ^ (grid_sel[pos]); break;
                case 8: PORTB = 0x10; PORTA = 0x3F ^ (grid_sel[pos]); break;
                case 9: PORTB = 0x01; PORTA = 0x3F ^ (grid_sel[pos]); break;
                default: PORTB = 0x00;PORTA = 0x3F ^ (grid_sel[pos]); break;
            }
        }
        if (kbddelay) kbddelay--;
        if (displaydelay) displaydelay--;
        if ((PORTC ^ KEY_SET) & KEY_SET) blink = 0;
        
    }
    if (TMR1IE && TMR1IF) {
        TMR1IF = 0;
        TMR1H += 0x80;
        flag.seconds = 1;
        if (++reg_SS > 59) {
            reg_SS = 0;
            if (++reg_MM > 59) {
                reg_MM = 0;
                if (++reg_HH > 23) {
                    reg_HH = 0;
                }
            }
        }
        
    }
    TEST_PIN = 1;
}

Глянул исходник.
Исходя из того что прерывания у вас 2 , коррекция как таковая смысла не имеет, по моему мнению.

Пусть меня поправят, но в ПИК вектор прерывания один. Когда произойдет прерывание по переполнению таймера 1 , и в это время будет выполнятся прерывание от таймера 0 или таймера 2, флаг подымится, закончится прерывание от таймера 2, программа вернется, выполнит одну команду(?) и уйдет на прерывание по переполнению таймера 1. При этом куча времени уже будет потеряна. :)
Последний раз редактировалось RoboC Пт мар 24, 2017 09:34:45, всего редактировалось 1 раз.
У того, кто делает — получается редко. У того, кто не делает — не получается никогда.
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: Часы на газоразрядных индикаторах

Сообщение uldemir »

Так! Я всё понял! (с)из мультика. Только надо еще придумать, как быть с приращениями и вычитаниями. т.е. как отличать опережение и отставание. И, может, получится какой-нибудь алгоритм.
RoboC писал(а):что из за того что длинна обработчика прерывания меняется
Не, на это можно бы наплевать. Просто типичная микрочиповская заморочка. Можно было бы использовать более внятные таймеры, чем динозаврообразные TMR0 и TMR1, но они не работают в спячке. А с прерыванием проблема в том, что само прерывание, может запаздывать. Во-первых, от момента, когда оно произойдёт: если произойдёт посреди "двухсловного" кода (типа GOTO) будет задержка на такт, А во-вторых, я сам в программе иногда запрещаю прерывания, чтобы модифицировать счетчики при установке времени. В третьих, счетчик двухбайтный, т.е. пока считываешь один байт, второй может уже переполнится. Ну и напоследок, счетчик идёт в асинхронном режиме, что еще дополнительно накладывает ограничение на валидность считанных данных (а в синхронном режиме счетчик считать не будет во время спячки). Но, даже оперируя только старшим байтом, получается разрешение коррекции 1/128 секунды. Вот сейчас попробую нарисовать этого Брезенхема, чтобы он просто равномерно вставлял эти плюс-минус 1/128 нужное число раз в течении 7200 секунд.
akl писал(а):Не заинтересовало. Удалил
Не, мы просто терпеливо ждали продолжения... картинки - это просто картинки. Тем более, что этот частотмер вы выкладывали уже не раз.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Аватара пользователя
A_AVL
Потрогал лапой паяльник
Сообщения: 311
Зарегистрирован: Чт фев 10, 2011 10:22:20
Откуда: Беларусь
Контактная информация:

Re: Часы на газоразрядных индикаторах

Сообщение A_AVL »

Wandal писал(а):uldemir
Без термокомпенсации это не имеет смысла.
Имеет. Температура в комнате практически постоянная.
Аналог подстроечного конденсатора из ничего я делал так: на обмоточный провод в лаковой изоляции диаметром ок.0.7-1.0 наматывается виток к витку тонкий обмоточный провод. Получается эрзац конденсатор. При настройке сматываем намотку пока не получим нужную частоту. Изгибаем, снова проверяем и обрезаем лишнее. Работает. Проверено.
2 Uldemir. У меня валяются smd подстроечники размером 1206 примерно от пейджера. Могу отправить почтой.
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: Часы на газоразрядных индикаторах

Сообщение uldemir »

Спасибо, конечно, но проблема не в подстроечнике, а в решении задачи. Вот сделал счет времени теперь так:
Спойлер

Код: Выделить всё

// Прерывание от 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 раз.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Аватара пользователя
SLvik
Друг Кота
Сообщения: 7622
Зарегистрирован: Ср май 28, 2008 00:32:54
Откуда: г. Россия
Контактная информация:

Re: Часы на газоразрядных индикаторах

Сообщение SLvik »

YarPv14 писал(а):
SLvik писал(а):
1)Для улучшения зажигания ячеек разряд должен поддерживаться (Принцип современной плазменной панели.) иначе при развёртке одни мерцают, другие плохо зажигаются, третьи вообще не горят.
Здравствуйте!
Можно Вас попросить показать схему высоковольтных ключей строк и столбцов, из осциллограмм в паспорте я не совсем понял как происходит управление этой панелью.
Там всё сделано на обычных транзисторах.
Один по катодам.
И два по анодам.
Выставляешь нужный код на катодах, а потом анодным +сом выбираешь столбик.
Всё просто как 2 пальца.
:)
Аватара пользователя
/-/ekit
Опытный кот
Сообщения: 898
Зарегистрирован: Ср мар 15, 2017 23:40:22

Re: Часы на газоразрядных индикаторах

Сообщение /-/ekit »

проверял я индикаторы ин-14 на работоспособность от простого блока питания от сети 120в.(сделал в доме 2 типа сети для удобства).
блок питания выдаёт 170в а индикатор сгорел :o :shock: :o :shock: . На сколько я знаю у них рабочее напряжение около 170в
Изображение
Может быть кто знает почему идикаторы сгорают?
Андрей осторожно взял у нее коробочку и с удивлением
убедился, что это радиоприемник.
- Вот это да! - пробормотал он - Неужели детекторный?
(братья Стругацкие, Град обреченный)
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: Часы на газоразрядных индикаторах

Сообщение uldemir »

Индикаторам надо давать ток, а не напряжение.... http://radiokot.ru/forum/viewtopic.php?p=884779#p884779
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Ответить

Вернуться в «Умные мысли»