Автор Тема: часы на DS1307  (Прочитано 35626 раз)

mim

  • Hero Member
  • *****
  • Сообщений: 2700
    • Просмотр профиля
Re:часы на DS1307
« Ответ #70 : Апрель 22, 2012, 15:06:05 »
Flowcode4_2.fcf_avr – Коды сегментов размещены в массиве.
 
Flowcode4_2_INT.fcf_avr – Небольшое изменение предыдущей программы и динамическая индикации организуется через прерывание. В этой теме уже был пример про динамическую индикацию на прерывании.
 
Flowcode4_2_INT_2.fcf_avr – Чем короче вычисления в прерывании, тем лучше. Всегда есть место упрощениям.
 
Сравните Flowcode4_2_INT.fcf_avr с Flowcode4_2_INT_2.fcf_avr

Общая схема для всех программ.
 

masivnik

  • Jr. Member
  • **
  • Сообщений: 58
    • Просмотр профиля
Re:часы на DS1307
« Ответ #71 : Апрель 22, 2012, 16:21:57 »
Спасибо большое за уделяемое время!!! Надо выбирать время на изучение - которого, как и у всех, маловато...
Еще один вопрос: при снятии напряжения питания и обратном включении происходит инициализация часовой микросхемы - обнуление секунд и её конфигурация (тактовый сигнал). В результате обнуления секунд - часы начинают отставать и чем чаще, тем больше отстают... Если совсем убрать обнуление секунд, то ,при снятии батарейки (села), часы не запустятся.  Вопрос - как убрать данный недостаток?
Я, в моем варианте, производил, в случае необходимости, принудительную инициализацию - нажатием всех трех кнопок(выдержка и обнуление). Или, другой вариант, производить инициализацию при каждой установке часов или минут. Но тут я не знаю - правильно ли постоянно, при установке часов или минут, долбить по инициализации?

mim

  • Hero Member
  • *****
  • Сообщений: 2700
    • Просмотр профиля
Re:часы на DS1307
« Ответ #72 : Апрель 22, 2012, 16:35:13 »
Иван Николаевич пишет:
Цитировать

1. Я, в моем варианте, производил, в случае необходимости, принудительную инициализацию - нажатием всех трех кнопок(выдержка и обнуление). Или, другой вариант, производить инициализацию при каждой установке часов или минут.
2. Но тут я не знаю - правильно ли постоянно, при установке часов или минут, долбить по инициализации?


1. Вполне разумно.
Я бы тоже делал так.
Самое первое включение - часы стоят.
Устанавливаем часы, и минуты ("часы" еще не запущены).
Во многих часах есть кнопка коррекция хода (точная установка по сигналу точного времени) - это пуск секунд (обнуление секунд при нормальной работе). Вот здесь и нужно ставить инициализацию Нулем.
При дальнейшем снятии и подаче напряжения ни какой инициализации не происходит - только при нажатии коррекции хода.
2. Ничего страшного в этом нет...

masivnik

  • Jr. Member
  • **
  • Сообщений: 58
    • Просмотр профиля
Re:часы на DS1307
« Ответ #73 : Апрель 23, 2012, 17:31:36 »
Забегая вперед, данного "сообщения", в первую очередь, хочу поблагодарить mim-а!!! Он многое, что указал и указывает - на что стоит обратить внимание и, в первую очередь, реально помогает. Огромное спасибо и низкий поклон!!!
Последние сообщение mim, с примерами, я еще не изучил, но могу точно сказать, что обязательно изучу..., т.к. многое для меня ново и я даже не имел представления, что есть такие способы решений, которые мне очень и очень пригодятся в дальнейшем. Скажу, что читать все темы форума или даже одну, но в которой довольно много страниц с проектами, с одной стороны познавательно, но довольно долгое дело да и, в силу своего не знания, не все понимаю. А руки то так и хотят уже собрать железку и запустить её.
Вот и я не выдержал и на прошлой неделе переделал свой первый проект FC внедрив, для меня, новое, но оставив часть довольно не правильного старого, да и новое не совсем до конца доделанное и в чем-то не правильное.
Сегодня я прошил свою железку - все работает и часы не мигает.
Кому интересно - смотрите архив(в "Часы Будильник и Термометр - готов", в FC - есть комментарии). Пусть он немного корявый - но на 100% рабочий.

Мне, исходя из рекомендаций mim, нужно еще узнать, по мимо массивов (это уже есть выше от mim), как реализовать: "Переписать опрос кнопок. Чтение порта в одну переменную. Возможность использовать для опроса кнопок порты сканирования индикатора."
Честно скажу, что до изучения темы "Часы на семисегментнике и AVR" я пока ещё не дошел. Каюсь, каюсь, но ни как не выберу время на её изучение...

masivnik

  • Jr. Member
  • **
  • Сообщений: 58
    • Просмотр профиля
Re:часы на DS1307
« Ответ #74 : Апрель 25, 2012, 16:19:19 »
Пытаюсь проанализировать сообщения с примерами от mim-a.
Пока успел только проанализировать "Flowcode4_2.fcf_avr – Коды сегментов размещены в массиве." (скорее всего - не правильно)

Изначально, в проект, ввели переменную типа STRING - COD[12] и ограничили её 12 «цифрами» (если не ошибаюсь, то максимальное её значение может состоять из 20 «цифр» или точнее «значений»). «Цифрами» или «значений» - не знаю, как правильно назвать, может и совсем по другому?
При помощи вычисления, каждой «цифре» переменной COD[12] присваиваем значение:
Вычисления
COD[0] = 192 – десятичное значение 0 (НУЛЯ) и на сегменте с общим АНОДОМ
COD[1] = 249 – значение 1…
COD[2] = 164 – …
COD[3] = 176 – …
COD[4] = 153 – …
COD[5] = 146 – …
COD[6] = 130 – …
COD[7] = 248 – …
COD[8] = 128 – …
COD[9] = 144 – …
COD[10] = 191 – а это значение на сегменте ДЕФИС
COD[11] = 255 – значение НИЧЕГО, т.е. сегмент погашен, на все катоды сегмента, с общим АНОДОМ, значение 1.
В макросе «Numer_seg» при выводе на индикатор значений, переменная COD[12] будет принимать значения переменных seg… (COD[seg…]). К примеру, выводим на второй сегмент индикатора цифру десятков часов seg2 равную 1, т.е. COD[seg2] = COD[1] = 249.
Интересно, на мой взгляд, сделано с выводом ДЕФИС-а (COD[DEF]): есть переменная DEF и её значение может быть, исходя из вычисления в макросе «Numer_seg», равно 10 или 11, т.е. соответственно 191 или 255.

Применили, для моего понимания, новое вычисление с переменными, полученными с часовой микросхемы:
mm_des = Read_1307.mm>>4
mm_ed = Read_1307.mm&15
hh_des = Read_1307.hh>>4
hh_ed = Read_1307.hh&15
Насколько я понимаю, то вычисление «mm_des = Read_1307.mm>>4» - выделяет десятки минут, а «mm_ed = Read_1307.mm&15» - единицы. Попытаюсь понять и описать:
Если я правильно понимаю, то считываемые значения часов и минут, с часовой микросхемы, имеет двоично-десятичный код к которому применен метод левого сдвига. К примеру: считали, с часовой микросхемы, значение минут равное в десятичной системе 34. И это значение, в двоично-десятичном коде к которому применен метод левого сдвига, будет выглядеть 00110100. Если мне не изменяет память (давно учился в технаре и после него практически не касался процессоров), можно разложить данный код в вид

Получается, что вычислением «mm_des = Read_1307.mm>>4» сдвигаем полученный двоично-десятичный код в права на 4 и в результате получаем код 0011, что в десятичном значении будет равно 3-ем. А вот как называется функция «&» в вычислении «mm_ed = Read_1307.mm&15» - я не знаю. Но, исходя из результата данного вычисления, получается, что оно убирает из двоично-десятичного кода первые старшие четыре «разряда» и в результате получаем код 0100 равный в десятичном значении 4-ем. Таким образом, производится отдельное вычисление десятков и единиц.

Хотелось бы ещё кое-что изменить – уменьшить количество переменных и убрать лишнее вычисление, а именно: удалить переменные mm_des, mm_ed,  hh_des и  hh_ed и вместо них сразу использовать соответственно seg5, seg6, seg2 и seg3. Т.е вычисления в макросе «Read_1307» примет вид
seg5 = Read_1307.mm>>4
seg6 = Read_1307.mm&15
seg2 = Read_1307.hh>>4
seg3 = Read_1307.hh&15

masivnik

  • Jr. Member
  • **
  • Сообщений: 58
    • Просмотр профиля
Re:часы на DS1307
« Ответ #75 : Апрель 25, 2012, 17:27:00 »
Далее "Flowcode4_2_INT.fcf_avr – Небольшое изменение предыдущей программы и динамическая индикации организуется через прерывание."

Интересно, интересно:
Частота обновления индикатора – практически 100 Гц.
Я, так понимаю, задержка на вывод информации является само прерывание. Т.е. если в свойствах прерывания изменить частоту ухода в прерывание, вместо деления 1:64 (8мГц/64 = 125Гц) поставить 1:256 (31,25Гц), то тем самым мы уменьшим частоту вывода информации – станет 25 Гц.
Или если хотим несколько уменьшить частоту индикации, то вносим в макрос «INT_SEGM» небольшую задержку, если увеличить, то изменить частоту ухода в прерывание на 1:8, ну или до 8мГц – 1:1. Все зависит от преследуемой задачи.

masivnik

  • Jr. Member
  • **
  • Сообщений: 58
    • Просмотр профиля
Re:часы на DS1307
« Ответ #76 : Апрель 25, 2012, 17:46:17 »
Ух, успел - "Flowcode4_2_INT_2.fcf_avr – Чем короче вычисления в прерывании, тем лучше. Всегда есть место упрощениям. Сравните Flowcode4_2_INT.fcf_avr с Flowcode4_2_INT_2.fcf_avr"

Спасибо mim!!!
Индикация по сегментам происходит уже с лева на право путем сдвига переменной «shot_seg = shot_seg<<1».
И действительно – зачем лишние вычисления, если при достижении соответствующего последнего сегмента индикации можно сразу обнулить переменную «shot_seg = 4».
Это актуально и не только к ПРЕРЫВАНИЮ…
Спасибо за мастер класс!!!