Страница 6 из 9

Re: Часы на LED индикаторах.

Добавлено: Сб фев 15, 2014 20:11:50
Alexeyslav
Из какого прерывания? Естественно что прерывания для индикации должны идти с частотой не менее 1000Гц, тогда для 4 цифр получишь комфортные 250Гц частоту обновления, а если на 50 остановится - будет жуДко мерцать.

Re: Часы на LED индикаторах.

Добавлено: Вс фев 16, 2014 16:27:08
Xatrix
По ходу таймеру по барабану на эти значения:

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

TCCR1A=0x00;
TCCR1B=0x01;
TCNT1H=0xf0;
TCNT1L=0x60;
OCR1AH=0x0f;
OCR1AL=0xa0;
TIMSK=0x40;
Как я их не менял, всё равно в протеусе одинаково показывает. Хоть бы после изменения этих переменных время на индикаторе начинало не точно с таймером протеуса считать...
Может проверить в железе?

Re: Часы на LED индикаторах.

Добавлено: Вс фев 16, 2014 17:03:17
Alexeyslav
Это всё хорошо... но ПОЧЕМУ таймер должен реагировать на все эти значения? Ты его настроил так чтобы он реагировал?

Re: Часы на LED индикаторах.

Добавлено: Вс фев 16, 2014 17:19:40
Xatrix
Как тогда ещё настраивается частота срабатывания прерывания?

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

interrupt [TIM1_COMPA] void timer1_compa_isr(void)
Есть ещё какие-то секретные переменные?

Re: Часы на LED индикаторах.

Добавлено: Вс фев 16, 2014 17:36:09
Alexeyslav
Частота прерываний от таймера всегда будет одинаковая независимо от значений в регистрах, и есть только одно исключение - режим работы таймера CTC когда он считает до значения равного регистру OCR1A и сбрасывается. Где и чем у тебя обеспечен этот режим работы таймера?

Re: Часы на LED индикаторах.

Добавлено: Вс фев 16, 2014 17:41:05
Darth Cuauhtemoc
Режим normal (ты сбросил все WGM на 0). Таймер считает от 0 до 0xFFFF, и какое бы ты ни записал значение в регистр сравнения, между прерываниями по сравнению всегда будет проходить одно и то же время, а именно время счета от 0 до 0xFFFF.

Re: Часы на LED индикаторах.

Добавлено: Вс фев 16, 2014 18:13:01
Xatrix
т.е. надо было написать всего лишь это:

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

TCCR1A=0x00;
TCCR1B=0x0A;
TCNT1H=0xf8;
TCNT1L=0x30;
OCR1AH=0x07;
OCR1AL=0xd0;
и тогда само прерывание будет выглядеть так:

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

interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
    PORTB=indic[dyn];
    if ((msec<30)&&(dyn==1))PORTD &= ~(1 << 6); else PORTD |= 1<<6; // точка
    PORTB |= 1<<dyn;
    dyn++;
    if (dyn==4)
    {
        dyn=0;
        msec++;
        if (msec==250)
        {
            sec++;
            if (sec>59)
            {
                min++;
                sec=0;
            }
            if (min>59)
            {
                hour++;
                min=0;
            }
            if (hour>23)hour=0;
            msec=0;
            if (PIND.2==0) h=1;
            if (PIND.3==0) m=1;
        }
    }
}
Можно еще ввести переменную для опроса кнопок, чтобы опрос был 2 или 5 раз в секунду.

Re: Часы на LED индикаторах.

Добавлено: Вс фев 16, 2014 19:29:21
Darth Cuauhtemoc
Xatrix писал(а):т.е. надо было написать всего лишь это:
Не вдавался в подробности, вроде правильности значения для делителя и для компаратора, но где разрешение прерываний для таймера 1 по сравнению с регистром А (TIMSK = 0x10)? :) Какова необходимость что-либо записывать в TCNT1H и TCNT1L? С точки зрения интервала между прерываниями, начальное значение счетчика по барабану.

Но, оптимизировал бы один момент:
Было:

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

if ((msec<30)&&(dyn==1))PORTD &= ~(1 << 6); else PORTD |= 1<<6; // точка
Как сделал бы я:

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

if (msec == 30 && dyn == 1) PORTD ^= (1 << 6)
ибо незачем насиловать точку записью того же самого значения, какое было на каждой миллисекунде. Но это так, к слову, оно работало бы и без оптимизации.

А вот существенно - что такое PORTB? Это катодные ключи на семисегментник или анодные на знакоместа? Судя по

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

PORTB=indic[dyn];
катодные, а если судить по

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

PORTB |= 1<<dyn;
то анодные. Причем если анодные, то работать не будет - "бегущую 1" надо делать так (конечно, если значение старшей тетрады неважно и нули там допустимы)

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

PORTB = 1 << dyn;
а c |= у тебя получилось бы вот что:
Первое прерывание dyn == 0 PORTB == 0b00000001
Второе прерывание dyn == 1 PORTB == 0b00000011
Третье прерывание dyn == 2 PORTB == 0b00000111
Четвертое прерывание dyn == 3 PORTB == 0b00001111
ну а далее PORTB == 0b00001111 навсегда никогда больше не меняясь :)

Re: Часы на LED индикаторах.

Добавлено: Вс фев 16, 2014 21:05:17
Xatrix
Darth Cuauhtemoc писал(а):А вот существенно - что такое PORTB? Это катодные ключи на семисегментник или анодные на знакоместа?
и то, и другое.
0-3 - выходы на ключи
4-7 - выходы на К176ИД2
чтобы вывести время, сперва выполняется функция display, в которой числа разделяются на 2 цифры (десятки и единицы) и по этой цифре в массив indic записываются 1 байтовые числа из массива digits. В массиве digits первые 4 бита - нули, а вторые - цифры и когда я записываю в PORTВ значение массива indic - первые 4 бита порта обнуляются автоматически, тем самым закрывая ключи. Поэтому мне не приходится заботиться о принудительном закрытии транзисторов...

Специально поставил:

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

PORTB = 1 << dyn;
и проверил в протеусе. Ничего не работает, а когда вернул на место:

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

PORTB |= 1 << dyn;
всё заработало, как надо.
С точкой тоже пройденный вариант. Сразу когда узнал об инвертировании бита этим способом. протеус и реальная тинька точкой так и не моргнула.

Re: Часы на LED индикаторах.

Добавлено: Вс фев 16, 2014 21:09:15
Darth Cuauhtemoc
Xatrix писал(а):В массиве digits первые 4 бита - нули, а вторые - цифры и когда я записываю в PORTВ значение массива indic - первые 4 бита порта обнуляются автоматически, тем самым закрывая ключи. Поэтому мне не приходится заботиться о принудительном закрытии транзисторов...

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

PORTB |= 1 << dyn;
Ну в таком случае у тебя все правильно было. Извини, что сбил с толку :)

Re: Часы на LED индикаторах.

Добавлено: Вс фев 16, 2014 21:15:56
Xatrix
Если честно, вот откуда у меня значения для таймера :oops:
timer.png
Обнулил эти:

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

TCNT1H=0x00;
TCNT1L=0x00;
Считает, как и прежде. Значит эта прога какая-то...

Re: Часы на LED индикаторах.

Добавлено: Вс фев 16, 2014 21:29:11
Darth Cuauhtemoc
Xatrix писал(а):Считает, как и прежде. Значит эта прога какая-то...
Да конечно, куда денется, я ж говорил что начальное значение счетчика для интервала между прерываниями абсолютно параллельно.

Re: Часы на LED индикаторах.

Добавлено: Вс фев 16, 2014 22:00:49
Xatrix
Вместо ЗП-1 поставлю 0,25ГДШ-2 50ом. Пищит отлично. Подойдут ли номиналы резисторов для этого дина?
Или может поставить дин 0,5Вт, 8ом от компьютера?

Re: Часы на LED индикаторах.

Добавлено: Вс фев 16, 2014 22:09:15
Alexeyslav
Прога-то как раз нормальная, такая частота получилась бы если бы ты загружал указанные значения TCNT1 в КАЖДОМ прерывании по переполнению. Так тоже можно делать, но только в случае когда не нужно точное значение частоты т.к. такой сброс происходит в момент когда таймер уже насчитает несколько тактов - а значит следующее прерывание будет позже прогнозируемого времени. Причем просчитать заранее эти такты довольно сложно, а если есть еще какие-то прерывания в программе - то и вовсе нельзя гарантировать.

Re: Часы на LED индикаторах.

Добавлено: Пн фев 17, 2014 20:23:33
Xatrix
Всё супер, отлично. Работает. Вот фотки, кому интересно:
https://www.dropbox.com/sh/n6rx1qe4i1jjp0b/_A2GnfbQx2
Питание от обычной зарядки для телефона. На плате предусмотрена возможность подключения телефонного аккумулятора, но пока не подключил...
Может добавить ещё один бит для будильника, чтобы звенел до тех пор, пока не нажму на кнопку?.. :))
Теперь осталась долгая работа с подсчётом и исправлением погрешности... :)

Re: Часы на LED индикаторах.

Добавлено: Пн фев 17, 2014 20:33:40
Darth Cuauhtemoc
Слушай, и правда супер! Не хуже родных ВЛИшных выглядит :) Респект :) Поздравляю :beer:
Ну, теперь с МК освоился, желаю тебе побольше конструкций хороших :)

Тока в будущем если часы, моя тебе рекомендация - юзать RTC с батарейкой, ибо часы, в которых время сбивается при отключении питания - моветон :)
Ну а если без RTC, то все таки классика - запускать контроллер от набортного RC на высокой частоте, а кварц часовой цеплять на таймер. Так правильнее будет.

Re: Часы на LED индикаторах.

Добавлено: Пн фев 17, 2014 20:48:44
Xatrix
Это, конечно понятно, когда дело касается меги8, а у меня используется tiny2313. Там возможностей немного меньше. Да и задача стояла полностью повторить функционал микры КА1016ХЛ1, но на МК, с чем тинька с дешифратором успешно справилась. Можно было бы и без К176ИД2, но для начала пойдёт.. :))

Re: Часы на LED индикаторах.

Добавлено: Пн фев 17, 2014 20:55:01
ОРИОН
Xatrix, всё хорошо смотрится! Старым корпусам надо давать вторую жизнь. МОЛОДЕЦ!

Re: Часы на LED индикаторах.

Добавлено: Пн фев 17, 2014 20:57:13
Darth Cuauhtemoc
Если контроллер покупаешь, а не так, что есть ведро 2313 и надо их использовать - то вообще то контроллер подбирается под задачу, а не задача втискивается в имеющийся на руках контроллер. Т.е. смотришь, сколько надо ног, дабы корпуса не плодить, если часы - можно ли цепануть часовой кварц без внешней логики ну и т.п.
ОРИОН писал(а):Xatrix, всё хорошо смотрится! Старым корпусам надо давать вторую жизнь. МОЛОДЕЦ!
Да вообще классно :) Я думал, светики бессовестно опошлят винтажный девайс, а нет оказывается. Смотрятся как родные :)

Re: Часы на LED индикаторах.

Добавлено: Вт фев 18, 2014 03:33:51
Xatrix
Еще один вопрос.
построечный конденсатор можно ставить на любой вывод из 2-х XTAL или тут тоже есть определённости?