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

Что бы еще такого сделать?... Предлагайте! Обсудим все!!!
Ответить
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Из какого прерывания? Естественно что прерывания для индикации должны идти с частотой не менее 1000Гц, тогда для 4 цифр получишь комфортные 250Гц частоту обновления, а если на 50 остановится - будет жуДко мерцать.
Контактная информация:
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1296
Зарегистрирован: Ср мар 10, 2010 22:28:34
Откуда: Запад Беларуси

Сообщение Xatrix »

По ходу таймеру по барабану на эти значения:

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

TCCR1A=0x00;
TCCR1B=0x01;
TCNT1H=0xf0;
TCNT1L=0x60;
OCR1AH=0x0f;
OCR1AL=0xa0;
TIMSK=0x40;
Как я их не менял, всё равно в протеусе одинаково показывает. Хоть бы после изменения этих переменных время на индикаторе начинало не точно с таймером протеуса считать...
Может проверить в железе?
Последний раз редактировалось Xatrix Вс фев 16, 2014 17:14:46, всего редактировалось 1 раз.
Изображение
Изображение
Реклама
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Это всё хорошо... но ПОЧЕМУ таймер должен реагировать на все эти значения? Ты его настроил так чтобы он реагировал?
Контактная информация:
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1296
Зарегистрирован: Ср мар 10, 2010 22:28:34
Откуда: Запад Беларуси

Сообщение Xatrix »

Как тогда ещё настраивается частота срабатывания прерывания?

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

interrupt [TIM1_COMPA] void timer1_compa_isr(void)
Есть ещё какие-то секретные переменные?
Последний раз редактировалось Xatrix Вс фев 16, 2014 18:15:59, всего редактировалось 1 раз.
Изображение
Изображение
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Частота прерываний от таймера всегда будет одинаковая независимо от значений в регистрах, и есть только одно исключение - режим работы таймера CTC когда он считает до значения равного регистру OCR1A и сбрасывается. Где и чем у тебя обеспечен этот режим работы таймера?
Контактная информация:
Реклама
Говорящий с текстолитом
Сообщения: 1699
Зарегистрирован: Вс июн 16, 2013 18:41:45

Сообщение Darth Cuauhtemoc »

Режим normal (ты сбросил все WGM на 0). Таймер считает от 0 до 0xFFFF, и какое бы ты ни записал значение в регистр сравнения, между прерываниями по сравнению всегда будет проходить одно и то же время, а именно время счета от 0 до 0xFFFF.
У кошки четыре ноги - вход, выход, земля и питание. Но трогать ее не моги - получится замыкание.
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1296
Зарегистрирован: Ср мар 10, 2010 22:28:34
Откуда: Запад Беларуси

Сообщение 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 раз в секунду.
Изображение
Изображение
Говорящий с текстолитом
Сообщения: 1699
Зарегистрирован: Вс июн 16, 2013 18:41:45

Сообщение 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 навсегда никогда больше не меняясь :)
У кошки четыре ноги - вход, выход, земля и питание. Но трогать ее не моги - получится замыкание.
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1296
Зарегистрирован: Ср мар 10, 2010 22:28:34
Откуда: Запад Беларуси

Сообщение 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;
всё заработало, как надо.
С точкой тоже пройденный вариант. Сразу когда узнал об инвертировании бита этим способом. протеус и реальная тинька точкой так и не моргнула.
Изображение
Изображение
Говорящий с текстолитом
Сообщения: 1699
Зарегистрирован: Вс июн 16, 2013 18:41:45

Сообщение Darth Cuauhtemoc »

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

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

PORTB |= 1 << dyn;
Ну в таком случае у тебя все правильно было. Извини, что сбил с толку :)
У кошки четыре ноги - вход, выход, земля и питание. Но трогать ее не моги - получится замыкание.
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1296
Зарегистрирован: Ср мар 10, 2010 22:28:34
Откуда: Запад Беларуси

Сообщение Xatrix »

Если честно, вот откуда у меня значения для таймера :oops:
timer.png
Обнулил эти:

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

TCNT1H=0x00;
TCNT1L=0x00;
Считает, как и прежде. Значит эта прога какая-то...
Изображение
Изображение
Говорящий с текстолитом
Сообщения: 1699
Зарегистрирован: Вс июн 16, 2013 18:41:45

Сообщение Darth Cuauhtemoc »

Xatrix писал(а):Считает, как и прежде. Значит эта прога какая-то...
Да конечно, куда денется, я ж говорил что начальное значение счетчика для интервала между прерываниями абсолютно параллельно.
У кошки четыре ноги - вход, выход, земля и питание. Но трогать ее не моги - получится замыкание.
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1296
Зарегистрирован: Ср мар 10, 2010 22:28:34
Откуда: Запад Беларуси

Сообщение Xatrix »

Вместо ЗП-1 поставлю 0,25ГДШ-2 50ом. Пищит отлично. Подойдут ли номиналы резисторов для этого дина?
Или может поставить дин 0,5Вт, 8ом от компьютера?
Изображение
Изображение
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Прога-то как раз нормальная, такая частота получилась бы если бы ты загружал указанные значения TCNT1 в КАЖДОМ прерывании по переполнению. Так тоже можно делать, но только в случае когда не нужно точное значение частоты т.к. такой сброс происходит в момент когда таймер уже насчитает несколько тактов - а значит следующее прерывание будет позже прогнозируемого времени. Причем просчитать заранее эти такты довольно сложно, а если есть еще какие-то прерывания в программе - то и вовсе нельзя гарантировать.
Контактная информация:
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1296
Зарегистрирован: Ср мар 10, 2010 22:28:34
Откуда: Запад Беларуси

Сообщение Xatrix »

Всё супер, отлично. Работает. Вот фотки, кому интересно:
https://www.dropbox.com/sh/n6rx1qe4i1jjp0b/_A2GnfbQx2
Питание от обычной зарядки для телефона. На плате предусмотрена возможность подключения телефонного аккумулятора, но пока не подключил...
Может добавить ещё один бит для будильника, чтобы звенел до тех пор, пока не нажму на кнопку?.. :))
Теперь осталась долгая работа с подсчётом и исправлением погрешности... :)
Изображение
Изображение
Говорящий с текстолитом
Сообщения: 1699
Зарегистрирован: Вс июн 16, 2013 18:41:45

Сообщение Darth Cuauhtemoc »

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

Тока в будущем если часы, моя тебе рекомендация - юзать RTC с батарейкой, ибо часы, в которых время сбивается при отключении питания - моветон :)
Ну а если без RTC, то все таки классика - запускать контроллер от набортного RC на высокой частоте, а кварц часовой цеплять на таймер. Так правильнее будет.
У кошки четыре ноги - вход, выход, земля и питание. Но трогать ее не моги - получится замыкание.
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1296
Зарегистрирован: Ср мар 10, 2010 22:28:34
Откуда: Запад Беларуси

Сообщение Xatrix »

Это, конечно понятно, когда дело касается меги8, а у меня используется tiny2313. Там возможностей немного меньше. Да и задача стояла полностью повторить функционал микры КА1016ХЛ1, но на МК, с чем тинька с дешифратором успешно справилась. Можно было бы и без К176ИД2, но для начала пойдёт.. :))
Последний раз редактировалось Xatrix Пн фев 17, 2014 21:30:06, всего редактировалось 1 раз.
Изображение
Изображение
Друг Кота
Аватара пользователя
Сообщения: 5252
Зарегистрирован: Чт окт 04, 2012 09:46:20
Откуда: г. Ростов-на-Дону

Сообщение ОРИОН »

Xatrix, всё хорошо смотрится! Старым корпусам надо давать вторую жизнь. МОЛОДЕЦ!
Говорящий с текстолитом
Сообщения: 1699
Зарегистрирован: Вс июн 16, 2013 18:41:45

Сообщение Darth Cuauhtemoc »

Если контроллер покупаешь, а не так, что есть ведро 2313 и надо их использовать - то вообще то контроллер подбирается под задачу, а не задача втискивается в имеющийся на руках контроллер. Т.е. смотришь, сколько надо ног, дабы корпуса не плодить, если часы - можно ли цепануть часовой кварц без внешней логики ну и т.п.
ОРИОН писал(а):Xatrix, всё хорошо смотрится! Старым корпусам надо давать вторую жизнь. МОЛОДЕЦ!
Да вообще классно :) Я думал, светики бессовестно опошлят винтажный девайс, а нет оказывается. Смотрятся как родные :)
У кошки четыре ноги - вход, выход, земля и питание. Но трогать ее не моги - получится замыкание.
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1296
Зарегистрирован: Ср мар 10, 2010 22:28:34
Откуда: Запад Беларуси

Сообщение Xatrix »

Еще один вопрос.
построечный конденсатор можно ставить на любой вывод из 2-х XTAL или тут тоже есть определённости?
Изображение
Изображение
Ответить

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