Помоему это не очень надежно считать в BCD, проще наверно считать в двоичной форме а приводить к двум разрядам обычным вычитанием - в цикле вычитаем 10 из числа пока число не станет меньше 10, тогда количество итераций даст нам десятки, а то что останется в числе - единицы. С таким подходом проще выполнять манипуляции над числами, а сложный алгоритм возникает только при необходимости вывода на индикатор(если без секунд то это происходит раз в минуту).
Точно такой же алгоритм можно осуществить если у нас есть единый счетчик секунд, преобразовать его сразу в часы(считая сколько раз можно вычесть десятки часов пока число в секундах не станет меньше 10 часов) и т.д. вплоть до секунды. С таким алгоритмом легко реализовываются таймеры и автоматическое вычисление времени "до события".
попробовал считать раздельно десятки и единицы. HEX получился ещё больше, чем был раньше.
Ну, в наше время основной критерий - понятность для программиста, то бишь легкость сопровождения, трюки оправданы только если есть жесткие ограничения по быстродействию или объему памяти, так что до тех пор, пока программа "влазит", смысла оптимизировать нет - по крайней мере в этом изделии, где большое расширение функциональности не планируется.
Alexeyslav писал(а):
Помоему это не очень надежно считать в BCD, проще наверно считать в двоичной форме а приводить к двум разрядам обычным вычитанием - в цикле вычитаем 10 из числа пока число не станет меньше 10, тогда количество итераций даст нам десятки, а то что останется в числе - единицы.
Считать (в смысле, производить вычисления) действительно проще в двоичной форме, а выводить на индикацию - в двоично-десятичной. Однако, во первых, в часах весь счет сводится к операции инкремента, а основной вес приходится именно на индикацию, и во вторых, если используется DS1307 (лично мне проще навесить литиевую батарейку на RTC, чем городить резервное питание, да и календарь в таком случае добавить не проблема), то время там хранится в BCD (и неспроста наверное, а из тех же соображений) - так что удобнее считать именно в BCD.
Попутно задам вопрос - в моих часах при установке времени производится инкремент минут и часов при нажатой кнопке, потом это сохраняется в RTC. С часами все просто - всегда 24 часа, всегда 60 минут, ну и нулевые секунды. А как быть с календарем? Что будет, если я выставлю кнопками, скажем, 31 февраля 2014 года, и попытаюсь сохранить? Как отнесется к этому DS1307? Молча схавает и в итоге просто будет неверный календарь?
_________________ У кошки четыре ноги - вход, выход, земля и питание. Но трогать ее не моги - получится замыкание.
В RTC сделан BCD счет времени именно для удобства его последующего хранения и вывода. Когда понадобится посчитать интервал между двумя заданными моментами времени делать это в BCD крайне неудобно. Кроме того, такие микросхемы часов могут так же считать время и в простой двоичной форме, этот режим называется "счетчик".
Если календарь имеет автоматическую коррекцию високосного года, да даже если не имеет то скорей всего исправит некорректную дату до большего корректного значения при очередном инкременте, т.е. в начале суток.
В RTC сделан BCD счет времени именно для удобства его последующего хранения и вывода. Когда понадобится посчитать интервал между двумя заданными моментами времени делать это в BCD крайне неудобно.
Кроме того, такие микросхемы часов могут так же считать время и в простой двоичной форме, этот режим называется "счетчик".
Согласен.
Но не DS1307.
Но для простых часов это и неважно. К слову сказать, оценивать интервал времени между двумя событиями человеку удобнее и быстрее по обычным аналоговым стрелочным часам. Глядя же на цифровые, мозги требуется напрягать сильнее.
_________________ У кошки четыре ноги - вход, выход, земля и питание. Но трогать ее не моги - получится замыкание.
Карма: 46
Рейтинг сообщений: 977
Зарегистрирован: Ср май 28, 2008 00:32:54 Сообщений: 7615 Откуда: г. Россия
Рейтинг сообщения:0
Вот и мой, немного запоздалый новогодний подарочек. http://radiokot.ru/circuit/digital/home/188/ Я решил светодиодным 7ми сегментным матрицам жизнь дать и посмотреть как оно будет выглядеть. Ничего так - не хуже чем газоразряд.
Ничуть не хуже Сам раньше воспринимал LED семисегментники как что-то обыденное, неинтересное, и даже пошлое. А оказалось очень даже ничего А для страдающих гигантоманией так и вообще безальтернативным почти вариантом (хотя можно по старинке набрать сегменты из ламп накаливания).
_________________ У кошки четыре ноги - вход, выход, земля и питание. Но трогать ее не моги - получится замыкание.
Карма: 9
Рейтинг сообщений: 19
Зарегистрирован: Ср мар 10, 2010 22:28:34 Сообщений: 1287 Откуда: Запад Беларуси
Рейтинг сообщения:0
Насколько важно в параметрах проекта в CV AVR устанавливать частоту генератора? У меня в проекте стоит 4МГц. Вроде всё работает. Но когда пытаюсь выставить 0,032768МГц, компилятор начинает ругаться на функцию delay_us(40). Вроде как ему 40 за много. (Out of range)... Хватит ли мощности порта контроллера, чтобы раскачать ЗП-1 или придётся ставить ещё и КТ315?
Вообще-то от часового кварца заводится не контроллер, а таймер. Контроллер заводится от внутреннего RC. Который может быть выставлен как раз на 4 МГц. Часовой кварц цепляется на TOSC1 и TOSC2 + кондеры на землю по бокам, и от него заводится один из таймеров, который дает секундные прерывания (ну или 2 Гц если нужны разделительные точки). Софт то твой, или чужой? Авторство в шапке было твое, но сейчас я сильно в этом засомневался
Я не знаю, какой ток надо подавать на этот таинственный ЗП-1, смотри его даташит, а порт МК способен выдать на высоком уровне и принять на низком, 40 мА. Общий ток, потребляемый МК по выводам Vcc и GND должен быть не более 300 мА (эти данные относятся к ATMega , но ты смотри даташит на свой контроллер.
_________________ У кошки четыре ноги - вход, выход, земля и питание. Но трогать ее не моги - получится замыкание.
3П-1 это пьезоэлектрик, от 5 вольт будет совсем тихо, нужен транзистор и индуктивность параллельно излучателю в его коллекторную цепь - в зависимости от добротности индуктивности напряжение на динамике можно запросто раскачать до 30-50В. Индуктивность брать из расчета чтобы не входила в насыщение при минимальной частоте, либо придется управлять скважностью.
Цитата:
0,032768МГц, компилятор начинает ругаться на функцию delay_us(40)
Скорей слишком мало, на такой частоте один NOP будет выполнятся 30мкс, а алгоритм delay имеет в своем составе цикл и рассчитан минимум на десяток тактов - т.е. в твоем случае сможет сгенерировать задержку на такой тактовой частоте от 300мкс и больше.
С целью минимизации энергопотребления. на 32кГц он будет потреблять еще меньше чем на 4Мгц. В некоторых случаях вообще можно его завести на частоте 1кГц.
Карма: 9
Рейтинг сообщений: 19
Зарегистрирован: Ср мар 10, 2010 22:28:34 Сообщений: 1287 Откуда: Запад Беларуси
Рейтинг сообщения:0
Darth Cuauhtemoc писал(а):
Авторство в шапке было твое, но сейчас я сильно в этом засомневался
Прошивку писал САМ и ЭТО НЕ ПОДЛЕЖИТ ОБСУЖДЕНИЮ!!! Можно сказать, что это мой первый самописный проект для контроллера Attiny2313. Я сейчас подумал заменить ЗП-1 на что-нить другое. Например на 0,25Вт динамик. Но транзистор придётся в плату впаять...
Увеличил числа в функциях задержек. Теперь перестало ругаться, но в шпротеусе как-то странно ведёт себя точка. Лучше выложу весь проект. Может опрос кнопок вернуть обратно в основной цикл...
У вас тактовая частота контроллера реально 32кГц? Может, для маленьких задержек и правда NOP-ы использовать? Да и зачем они тогда при такой низкой тактовой частоте?
Прошивку писал САМ и ЭТО НЕ ПОДЛЕЖИТ ОБСУЖДЕНИЮ!!! ...это мой первый самописный...
Извини Просто подумалось так, что программа написана в расчете на высокую частоту такта, а ты просто решил поставить часовой кварц. Поэтому такой вывод и сделал.
Все же, я советую тебе заводить контроллер на высокой частоте, на таймер, который считает время, подавать часовую. Тогда не надо будет заботиться о задержках, тактах и всем таком прочем.
Xatrix писал(а):
Может опрос кнопок вернуть обратно в основной цикл...
Ну разумеется, в прерываниях вообще не должно быть задержек, они должны обрабатываться максимально быстро. Если в прерывании требуются "долгие" действия, то прерывание должно только инициировать их выполнение (правда, опрос кнопок сюда не относится - его можно целиком сунуть в главный цикл) - обработчик может просто установить флажок, который будет проверяться в главном цикле, и если установлен, то делаться необходимые действия (только не забыть флажок сбросить потом )
Alexeyslav писал(а):
С целью минимизации энергопотребления.
Часы с сетевым питанием - явно не тот случай. Все таки, это светики, а не ЖКИ на батарейках.
_________________ У кошки четыре ноги - вход, выход, земля и питание. Но трогать ее не моги - получится замыкание.
Карма: 9
Рейтинг сообщений: 19
Зарегистрирован: Ср мар 10, 2010 22:28:34 Сообщений: 1287 Откуда: Запад Беларуси
Рейтинг сообщения:0
Да ну наф эту высокую частоту... Задолбался с подгонкой частоты таймера, чтобы точно считали. Да, это не прожки на С++ и С# под Metro писать... Будет работать на частоте 32768Гц. Поубирал все задержки в индикации. Вроде нормально отображает. Интересно, как будет в железе работать. Также поменял с переполнения на совпадение. Осталось решить вопрос с пищалкой и обработкой события от нажатия кнопок...
А какое отношение имеет частота тактирования контроллера к скорости счета времени? Ведь 32768 кварц цепляется на 16-битный таймер, и он дает СТАБИЛЬНЫЕ прерывания по переполнению ровно каждую секунду. Независимо от тактовой частоты ядра микроконтроллера.
Кнопки тоже можно опрашивать в прерывании - если примерно 50 раз в секунду просто защелкивать и запоминать состояние кнопок то никакой дребезг не страшен. Причем, стабильности от этого интервала не требуется - 10...100Гц не заметишь никакой разницы. А потом в основном цикле сравниваешь сохраненное состояние с предыдущим обычной функцией XOR - таким образом детектируются моменты нажатия/отпускания.
Я на своих часах не стал асинхронный таймер использовать, так как функций много и о экономии потребления речи не идёт - врубил на 20МГц, и от тактовой считаю время. С программной коррекцией и в домашних условиях идут как вкопанные месяцами.
Да ну наф эту высокую частоту... Задолбался с подгонкой частоты таймера, чтобы точно считали.
Alexeyslav писал(а):
А какое отношение имеет частота тактирования контроллера к скорости счета времени? Ведь 32768 кварц цепляется на 16-битный таймер, и он дает СТАБИЛЬНЫЕ прерывания по переполнению ровно каждую секунду. Независимо от тактовой частоты ядра микроконтроллера.
Абсолютно верно. И совершенно по фэншую - именно для этого такая возможность и предусмотрена в AVR.
ploop писал(а):
Я на своих часах не стал асинхронный таймер использовать, так как функций много
Ну когда ноги TOSC1, TOSC2 уже заюзаны под что-то другое, тогда да.
Самый правильный вариант - заюзать термокомпенсированный генератор, скажем DS32kHz, и подать на вход таймера сигнал с него. Ну или на вход RTC, если он есть.
Только у этого DS32kHz цена некоммунистическая.
_________________ У кошки четыре ноги - вход, выход, земля и питание. Но трогать ее не моги - получится замыкание.
Во-во, да ещё найти его надо. Не, как практика показала, если часы дома (колебания температуры минимальны, +-2-3 градуса), то программную коррекцию, и пару месяцев настройки - будут ходить как атомные
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 257
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения