Часы на LED индикаторах.
Из какого прерывания? Естественно что прерывания для индикации должны идти с частотой не менее 1000Гц, тогда для 4 цифр получишь комфортные 250Гц частоту обновления, а если на 50 остановится - будет жуДко мерцать.
- Реклама
По ходу таймеру по барабану на эти значения:
Как я их не менял, всё равно в протеусе одинаково показывает. Хоть бы после изменения этих переменных время на индикаторе начинало не точно с таймером протеуса считать...
Может проверить в железе?
Код: Выделить всё
TCCR1A=0x00;
TCCR1B=0x01;
TCNT1H=0xf0;
TCNT1L=0x60;
OCR1AH=0x0f;
OCR1AL=0xa0;
TIMSK=0x40;Может проверить в железе?
Последний раз редактировалось Xatrix Вс фев 16, 2014 17:14:46, всего редактировалось 1 раз.
Это всё хорошо... но ПОЧЕМУ таймер должен реагировать на все эти значения? Ты его настроил так чтобы он реагировал?
Как тогда ещё настраивается частота срабатывания прерывания?
Есть ещё какие-то секретные переменные?
Код: Выделить всё
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
Последний раз редактировалось Xatrix Вс фев 16, 2014 18:15:59, всего редактировалось 1 раз.
Частота прерываний от таймера всегда будет одинаковая независимо от значений в регистрах, и есть только одно исключение - режим работы таймера CTC когда он считает до значения равного регистру OCR1A и сбрасывается. Где и чем у тебя обеспечен этот режим работы таймера?
- Реклама
- Сообщения: 1699
- Зарегистрирован: Вс июн 16, 2013 18:41:45
Режим normal (ты сбросил все WGM на 0). Таймер считает от 0 до 0xFFFF, и какое бы ты ни записал значение в регистр сравнения, между прерываниями по сравнению всегда будет проходить одно и то же время, а именно время счета от 0 до 0xFFFF.
У кошки четыре ноги - вход, выход, земля и питание. Но трогать ее не моги - получится замыкание.
т.е. надо было написать всего лишь это:
и тогда само прерывание будет выглядеть так:
Можно еще ввести переменную для опроса кнопок, чтобы опрос был 2 или 5 раз в секунду.
Код: Выделить всё
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;
}
}
}- Сообщения: 1699
- Зарегистрирован: Вс июн 16, 2013 18:41:45
Не вдавался в подробности, вроде правильности значения для делителя и для компаратора, но где разрешение прерываний для таймера 1 по сравнению с регистром А (TIMSK = 0x10)?Xatrix писал(а):т.е. надо было написать всего лишь это:
Но, оптимизировал бы один момент:
Было:
Код: Выделить всё
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;
Код: Выделить всё
PORTB = 1 << dyn;
Первое прерывание dyn == 0 PORTB == 0b00000001
Второе прерывание dyn == 1 PORTB == 0b00000011
Третье прерывание dyn == 2 PORTB == 0b00000111
Четвертое прерывание dyn == 3 PORTB == 0b00001111
ну а далее PORTB == 0b00001111 навсегда никогда больше не меняясь
У кошки четыре ноги - вход, выход, земля и питание. Но трогать ее не моги - получится замыкание.
и то, и другое.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
Ну в таком случае у тебя все правильно было. Извини, что сбил с толкуXatrix писал(а):В массиве digits первые 4 бита - нули, а вторые - цифры и когда я записываю в PORTВ значение массива indic - первые 4 бита порта обнуляются автоматически, тем самым закрывая ключи. Поэтому мне не приходится заботиться о принудительном закрытии транзисторов...
Код: Выделить всё
PORTB |= 1 << dyn;
У кошки четыре ноги - вход, выход, земля и питание. Но трогать ее не моги - получится замыкание.
Если честно, вот откуда у меня значения для таймера
Обнулил эти:
Считает, как и прежде. Значит эта прога какая-то...
Код: Выделить всё
TCNT1H=0x00;
TCNT1L=0x00;- Сообщения: 1699
- Зарегистрирован: Вс июн 16, 2013 18:41:45
Да конечно, куда денется, я ж говорил что начальное значение счетчика для интервала между прерываниями абсолютно параллельно.Xatrix писал(а):Считает, как и прежде. Значит эта прога какая-то...
У кошки четыре ноги - вход, выход, земля и питание. Но трогать ее не моги - получится замыкание.
Вместо ЗП-1 поставлю 0,25ГДШ-2 50ом. Пищит отлично. Подойдут ли номиналы резисторов для этого дина?
Или может поставить дин 0,5Вт, 8ом от компьютера?
Или может поставить дин 0,5Вт, 8ом от компьютера?
Прога-то как раз нормальная, такая частота получилась бы если бы ты загружал указанные значения TCNT1 в КАЖДОМ прерывании по переполнению. Так тоже можно делать, но только в случае когда не нужно точное значение частоты т.к. такой сброс происходит в момент когда таймер уже насчитает несколько тактов - а значит следующее прерывание будет позже прогнозируемого времени. Причем просчитать заранее эти такты довольно сложно, а если есть еще какие-то прерывания в программе - то и вовсе нельзя гарантировать.
Всё супер, отлично. Работает. Вот фотки, кому интересно:
https://www.dropbox.com/sh/n6rx1qe4i1jjp0b/_A2GnfbQx2
Питание от обычной зарядки для телефона. На плате предусмотрена возможность подключения телефонного аккумулятора, но пока не подключил...
Может добавить ещё один бит для будильника, чтобы звенел до тех пор, пока не нажму на кнопку?..
Теперь осталась долгая работа с подсчётом и исправлением погрешности...
https://www.dropbox.com/sh/n6rx1qe4i1jjp0b/_A2GnfbQx2
Питание от обычной зарядки для телефона. На плате предусмотрена возможность подключения телефонного аккумулятора, но пока не подключил...
Может добавить ещё один бит для будильника, чтобы звенел до тех пор, пока не нажму на кнопку?..
Теперь осталась долгая работа с подсчётом и исправлением погрешности...
- Сообщения: 1699
- Зарегистрирован: Вс июн 16, 2013 18:41:45
Слушай, и правда супер! Не хуже родных ВЛИшных выглядит
Респект
Поздравляю
Ну, теперь с МК освоился, желаю тебе побольше конструкций хороших
Тока в будущем если часы, моя тебе рекомендация - юзать RTC с батарейкой, ибо часы, в которых время сбивается при отключении питания - моветон
Ну а если без RTC, то все таки классика - запускать контроллер от набортного RC на высокой частоте, а кварц часовой цеплять на таймер. Так правильнее будет.
Ну, теперь с МК освоился, желаю тебе побольше конструкций хороших
Тока в будущем если часы, моя тебе рекомендация - юзать RTC с батарейкой, ибо часы, в которых время сбивается при отключении питания - моветон
Ну а если без RTC, то все таки классика - запускать контроллер от набортного RC на высокой частоте, а кварц часовой цеплять на таймер. Так правильнее будет.
У кошки четыре ноги - вход, выход, земля и питание. Но трогать ее не моги - получится замыкание.
Это, конечно понятно, когда дело касается меги8, а у меня используется tiny2313. Там возможностей немного меньше. Да и задача стояла полностью повторить функционал микры КА1016ХЛ1, но на МК, с чем тинька с дешифратором успешно справилась. Можно было бы и без К176ИД2, но для начала пойдёт.. 
Последний раз редактировалось Xatrix Пн фев 17, 2014 21:30:06, всего редактировалось 1 раз.
Xatrix, всё хорошо смотрится! Старым корпусам надо давать вторую жизнь. МОЛОДЕЦ!
- Сообщения: 1699
- Зарегистрирован: Вс июн 16, 2013 18:41:45
Если контроллер покупаешь, а не так, что есть ведро 2313 и надо их использовать - то вообще то контроллер подбирается под задачу, а не задача втискивается в имеющийся на руках контроллер. Т.е. смотришь, сколько надо ног, дабы корпуса не плодить, если часы - можно ли цепануть часовой кварц без внешней логики ну и т.п.
Я думал, светики бессовестно опошлят винтажный девайс, а нет оказывается. Смотрятся как родные 
Да вообще классноОРИОН писал(а):Xatrix, всё хорошо смотрится! Старым корпусам надо давать вторую жизнь. МОЛОДЕЦ!
У кошки четыре ноги - вход, выход, земля и питание. Но трогать ее не моги - получится замыкание.
Еще один вопрос.
построечный конденсатор можно ставить на любой вывод из 2-х XTAL или тут тоже есть определённости?
построечный конденсатор можно ставить на любой вывод из 2-х XTAL или тут тоже есть определённости?




