Из какого прерывания? Естественно что прерывания для индикации должны идти с частотой не менее 1000Гц, тогда для 4 цифр получишь комфортные 250Гц частоту обновления, а если на 50 остановится - будет жуДко мерцать.
Как я их не менял, всё равно в протеусе одинаково показывает. Хоть бы после изменения этих переменных время на индикаторе начинало не точно с таймером протеуса считать... Может проверить в железе?
_________________
Последний раз редактировалось Xatrix Вс фев 16, 2014 17:14:46, всего редактировалось 1 раз.
Частота прерываний от таймера всегда будет одинаковая независимо от значений в регистрах, и есть только одно исключение - режим работы таймера CTC когда он считает до значения равного регистру OCR1A и сбрасывается. Где и чем у тебя обеспечен этот режим работы таймера?
Режим normal (ты сбросил все WGM на 0). Таймер считает от 0 до 0xFFFF, и какое бы ты ни записал значение в регистр сравнения, между прерываниями по сравнению всегда будет проходить одно и то же время, а именно время счета от 0 до 0xFFFF.
_________________ У кошки четыре ноги - вход, выход, земля и питание. Но трогать ее не моги - получится замыкание.
Не вдавался в подробности, вроде правильности значения для делителя и для компаратора, но где разрешение прерываний для таймера 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 навсегда никогда больше не меняясь
_________________ У кошки четыре ноги - вход, выход, земля и питание. Но трогать ее не моги - получится замыкание.
Карма: 9
Рейтинг сообщений: 19
Зарегистрирован: Ср мар 10, 2010 22:28:34 Сообщений: 1287 Откуда: Запад Беларуси
Рейтинг сообщения:0
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;
всё заработало, как надо. С точкой тоже пройденный вариант. Сразу когда узнал об инвертировании бита этим способом. протеус и реальная тинька точкой так и не моргнула.
В массиве digits первые 4 бита - нули, а вторые - цифры и когда я записываю в PORTВ значение массива indic - первые 4 бита порта обнуляются автоматически, тем самым закрывая ключи. Поэтому мне не приходится заботиться о принудительном закрытии транзисторов...
Код:
PORTB |= 1 << dyn;
Ну в таком случае у тебя все правильно было. Извини, что сбил с толку
_________________ У кошки четыре ноги - вход, выход, земля и питание. Но трогать ее не моги - получится замыкание.
Прога-то как раз нормальная, такая частота получилась бы если бы ты загружал указанные значения TCNT1 в КАЖДОМ прерывании по переполнению. Так тоже можно делать, но только в случае когда не нужно точное значение частоты т.к. такой сброс происходит в момент когда таймер уже насчитает несколько тактов - а значит следующее прерывание будет позже прогнозируемого времени. Причем просчитать заранее эти такты довольно сложно, а если есть еще какие-то прерывания в программе - то и вовсе нельзя гарантировать.
Карма: 9
Рейтинг сообщений: 19
Зарегистрирован: Ср мар 10, 2010 22:28:34 Сообщений: 1287 Откуда: Запад Беларуси
Рейтинг сообщения:0
Всё супер, отлично. Работает. Вот фотки, кому интересно: https://www.dropbox.com/sh/n6rx1qe4i1jjp0b/_A2GnfbQx2 Питание от обычной зарядки для телефона. На плате предусмотрена возможность подключения телефонного аккумулятора, но пока не подключил... Может добавить ещё один бит для будильника, чтобы звенел до тех пор, пока не нажму на кнопку?.. Теперь осталась долгая работа с подсчётом и исправлением погрешности...
Слушай, и правда супер! Не хуже родных ВЛИшных выглядит Респект Поздравляю Ну, теперь с МК освоился, желаю тебе побольше конструкций хороших
Тока в будущем если часы, моя тебе рекомендация - юзать RTC с батарейкой, ибо часы, в которых время сбивается при отключении питания - моветон Ну а если без RTC, то все таки классика - запускать контроллер от набортного RC на высокой частоте, а кварц часовой цеплять на таймер. Так правильнее будет.
_________________ У кошки четыре ноги - вход, выход, земля и питание. Но трогать ее не моги - получится замыкание.
Карма: 9
Рейтинг сообщений: 19
Зарегистрирован: Ср мар 10, 2010 22:28:34 Сообщений: 1287 Откуда: Запад Беларуси
Рейтинг сообщения:0
Это, конечно понятно, когда дело касается меги8, а у меня используется tiny2313. Там возможностей немного меньше. Да и задача стояла полностью повторить функционал микры КА1016ХЛ1, но на МК, с чем тинька с дешифратором успешно справилась. Можно было бы и без К176ИД2, но для начала пойдёт..
_________________
Последний раз редактировалось Xatrix Пн фев 17, 2014 21:30:06, всего редактировалось 1 раз.
Если контроллер покупаешь, а не так, что есть ведро 2313 и надо их использовать - то вообще то контроллер подбирается под задачу, а не задача втискивается в имеющийся на руках контроллер. Т.е. смотришь, сколько надо ног, дабы корпуса не плодить, если часы - можно ли цепануть часовой кварц без внешней логики ну и т.п.
ОРИОН писал(а):
Xatrix, всё хорошо смотрится! Старым корпусам надо давать вторую жизнь. МОЛОДЕЦ!
Да вообще классно Я думал, светики бессовестно опошлят винтажный девайс, а нет оказывается. Смотрятся как родные
_________________ У кошки четыре ноги - вход, выход, земля и питание. Но трогать ее не моги - получится замыкание.
Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 225
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения