Страница 2038 из 2451

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

Добавлено: Чт мар 23, 2017 13:08:41
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 сек). А может есть идеи лучше?

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

Добавлено: Чт мар 23, 2017 13:55:26
Topaloff
Я бы сделал наоборот: слева от точек отрицательные значения, справа положительные, как в термометре "0". Можно частотой мигания разделителя подсказывать. Так же можно принять, например "50" как ноль. Все же этот параметр будет меняться редко.
Но, как по-мне, для часов без секунд нет необходимости корректировать время каждый час. Еще можно устанавливать время с учетом ухода раз в сутки или двое, когда расхождение достигнет целого знаения; можно применить синхронизацию с внешними датчиками/устройствами для высокой точности хода, внешнее тактирование и т.п.
А частота кварца насколько сильно будет уходить с температурой?
Для устройств с нехваткой ног я пробовал использовать сброс в "00:00" в полночь по сигналу с ESP8266.

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

Добавлено: Чт мар 23, 2017 20:34:44
Wandal
uldemir
Без термокомпенсации это не имеет смысла.

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

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

Да и нету в жизни счастья. Самые близкие к точным часам у меня часы на ds3231. Часы на ds3231M по точности значительно хуже.

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

Добавлено: Чт мар 23, 2017 20:57:43
Dr.Tr.
В любом ЗУСТЦе есть мелкие подстроечные конденсаторы. Припаиваем их, частотомер в лапы и вперёд :)) ! Стоит технология 0р. и 10 минут времени. Хотя думаю этого барахла у каждого...

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

Добавлено: Чт мар 23, 2017 21:20:17
Wandal
Две секунды в сутки это хороший результат для ширпотребных кварцев. Ошибка с четвёртого-пятого знака.
Программно можно корректировать частоту кварца до третьего знака после запятой. Хотите приключений - так вот они!

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

Добавлено: Чт мар 23, 2017 21:26:13
uldemir
Не знаю, что такое 3усцт и какие там подстроечники... последний телевизор у меня был черно-белый. Почему-то все считают, что у всех должно быть то что есть у них. Один считает, что должны быть толпы плат от телевизоров, другой, что толпы китайских зарядок, третий - комповых блоков питания.
Но так как я не планировал подстроечники у меня там место только под 1206 конденсатор. И в высоту всего 3мм - дальше копыта ламп. Знаю, что есть SMD подстроечники, но, как уже упоминал - пока я безработный на свои удовольствия деньги тратить не могу - пользуюсь, только тем, что осталось с тучных времен.

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

Добавлено: Чт мар 23, 2017 21:55:32
Wandal
Я делал как тут написано: http://www.romanblack.com/one_sec.htm

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

Добавлено: Чт мар 23, 2017 22:12:35
uldemir
вы наверно пишете со смартфона. рассказали бы подробнее как вы реализовали брезенхейма у себя.

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

Добавлено: Пт мар 24, 2017 00:06:41
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, но я не помню...

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

Добавлено: Пт мар 24, 2017 01:26:35
watchmaker
Без термокомпенсации это не имеет смысла.
Смотря какой точности надо достичь. Если 0.5" в сутки - вполне можно и без термокомпенсации, а вот если порядка 10" в год - никак.

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

Добавлено: Пт мар 24, 2017 06:25:41
akl
Не заинтересовало. Удалил. :)

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

Добавлено: Пт мар 24, 2017 07:16:44
uldemir
Wandal писал(а):Забыл как страшный сон. Ок, вспоминаем
Нууу, это классическое... Я думал вы расскажете как привести к коэффициентам этого алгоритма простое желание "сделать коррекцию 1.8 секунды в сутки". Просто, пока я не могу формализовать это. С одной стороны вариант коррекции сразу на 24/128 секунды раз в два часа работает, но гораздо приятнее делать 1/128 раз в 300 секунд - плавнее будет изменение.

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

Добавлено: Пт мар 24, 2017 08:33:58
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. При этом куча времени уже будет потеряна. :)

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

Добавлено: Пт мар 24, 2017 09:33:05
uldemir
Так! Я всё понял! (с)из мультика. Только надо еще придумать, как быть с приращениями и вычитаниями. т.е. как отличать опережение и отставание. И, может, получится какой-нибудь алгоритм.
RoboC писал(а):что из за того что длинна обработчика прерывания меняется
Не, на это можно бы наплевать. Просто типичная микрочиповская заморочка. Можно было бы использовать более внятные таймеры, чем динозаврообразные TMR0 и TMR1, но они не работают в спячке. А с прерыванием проблема в том, что само прерывание, может запаздывать. Во-первых, от момента, когда оно произойдёт: если произойдёт посреди "двухсловного" кода (типа GOTO) будет задержка на такт, А во-вторых, я сам в программе иногда запрещаю прерывания, чтобы модифицировать счетчики при установке времени. В третьих, счетчик двухбайтный, т.е. пока считываешь один байт, второй может уже переполнится. Ну и напоследок, счетчик идёт в асинхронном режиме, что еще дополнительно накладывает ограничение на валидность считанных данных (а в синхронном режиме счетчик считать не будет во время спячки). Но, даже оперируя только старшим байтом, получается разрешение коррекции 1/128 секунды. Вот сейчас попробую нарисовать этого Брезенхема, чтобы он просто равномерно вставлял эти плюс-минус 1/128 нужное число раз в течении 7200 секунд.
akl писал(а):Не заинтересовало. Удалил
Не, мы просто терпеливо ждали продолжения... картинки - это просто картинки. Тем более, что этот частотмер вы выкладывали уже не раз.

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

Добавлено: Пт мар 24, 2017 14:58:42
A_AVL
Wandal писал(а):uldemir
Без термокомпенсации это не имеет смысла.
Имеет. Температура в комнате практически постоянная.
Аналог подстроечного конденсатора из ничего я делал так: на обмоточный провод в лаковой изоляции диаметром ок.0.7-1.0 наматывается виток к витку тонкий обмоточный провод. Получается эрзац конденсатор. При настройке сматываем намотку пока не получим нужную частоту. Изгибаем, снова проверяем и обрезаем лишнее. Работает. Проверено.
2 Uldemir. У меня валяются smd подстроечники размером 1206 примерно от пейджера. Могу отправить почтой.

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

Добавлено: Пт мар 24, 2017 17:35:53
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. На тему, что у мишки в животике:
Изображение Изображение

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

Добавлено: Пт мар 24, 2017 19:27:05
SLvik
YarPv14 писал(а):
SLvik писал(а):
1)Для улучшения зажигания ячеек разряд должен поддерживаться (Принцип современной плазменной панели.) иначе при развёртке одни мерцают, другие плохо зажигаются, третьи вообще не горят.
Здравствуйте!
Можно Вас попросить показать схему высоковольтных ключей строк и столбцов, из осциллограмм в паспорте я не совсем понял как происходит управление этой панелью.
Там всё сделано на обычных транзисторах.
Один по катодам.
И два по анодам.
Выставляешь нужный код на катодах, а потом анодным +сом выбираешь столбик.
Всё просто как 2 пальца.
:)

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

Добавлено: Вс мар 26, 2017 04:50:40
/-/ekit
проверял я индикаторы ин-14 на работоспособность от простого блока питания от сети 120в.(сделал в доме 2 типа сети для удобства).
блок питания выдаёт 170в а индикатор сгорел :o :shock: :o :shock: . На сколько я знаю у них рабочее напряжение около 170в
Изображение
Может быть кто знает почему идикаторы сгорают?

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

Добавлено: Вс мар 26, 2017 05:42:37
uldemir
Индикаторам надо давать ток, а не напряжение.... http://radiokot.ru/forum/viewtopic.php?p=884779#p884779