Обсуждаем контроллеры компании Atmel.
Ответить

Семисегментный LED-индикатор. Эффекты анимации

Пт авг 21, 2020 20:00:54

Хотелось бы поэкспериментировать с этим индикатором в плане эффектов. Для начала решил написать вот такого вида, бегущий прочерк по часовой стрелке. Для отображения на индикаторе взял код (прерывание по Таймеру0) один из доступных в сети.
Код:
 - - - - -
|          |
 - - - - -

В общем всё взлетело, только код получился, как мне кажется очень кривой и громоздкий. И ещё появился один косяк. Яркость индикатора упала в два раза от оригинала ( таймера с которого я взял код обработки прерывания для динамической индикации). И не придумал, как можно обойтись одни таймером. И можно ли вообще одним только? Выслушаю все замечания и рекомендации.

Последний раз редактировалось ChipCard Сб авг 22, 2020 18:17:40, всего редактировалось 1 раз.

Re: Семисегментный LED-индикатор. Эффекты анимации

Пт авг 21, 2020 23:44:59

В массив "кадров" оформить было бы удобнее. И даже, возможно, экономичнее. Если подумать, то часть эффектов можно описать формулами.
Одним таймером обойтись можно, да и ненужно больше-то.
Например, так:
массив размерностью 4 - там храним значение каждого разряда. назовем Digs[]
i = 0
В бесконечном цикле main:
Port = Digs[i]
if i >3 i= 0

ну а по таймеру меняем содержимое Digs[]
Это не единственный вариант, да и не самый лучший - может плавать яркость, так как будет отвлечение на прерывания то там то сям.
Можно наоборот - переключение свечения разрядов переложить на таймер, а смену кадров в main, по некоему флагу счетчику, который накапливается в том таймере.

Вообще, если "кадры" загнать в массивы, то таймера необязательны, даже один. Можно бесконечно прокручивать в майне.

Яркость падает - индикация динамическая же, разряд (или сегменты - смотря на что опирается динамика) светятся лишь некий процент времени. В некоторых пределах лечится увеличением тока.

Re: Семисегментный LED-индикатор. Эффекты анимации

Сб авг 22, 2020 09:19:51

Я изначально размышлял про массив, но что-то мысль не пошла :). Надо попробовать по вашему рецепту. А про яркость, я пробовал изменить частоту и добавил запрет всех прерываний, чтоб контроллер не отвлекался при выполнении кода вывода на индикатор. Не помогло. Ток увеличивать не хотелось бы, решить программно.

Re: Семисегментный LED-индикатор. Эффекты анимации

Сб авг 22, 2020 10:12:10

Анимацию закладываем в параметры динамической индикации.
Собственно там, при хорошо проработанном алгоритме, никаких потерь яркости не должно быть - только другая картинка на определенное время замещает текущую.
Как вариант - попеременный вывод из двух массивов - основная видеопамять и буфер предобработки данных.
Один выводится, другой в это время обрабатывается.
Обработка дисплея делается автономной "прозрачной" - вывод очередного шага развертки и обработка счетчиков шагов по прерыванию (от чего удобнее - или по таймеру /ассемблер-Си/ или через спецприем для адуринки).
Остальное время - работает основная программа с буферами предподготовки и по спецфлагам содержимое тех буферов пересылается в основную видеопамять дисплея в момент "темного периода" (перед началом очередного цикла развертки).
8)

Re: Семисегментный LED-индикатор. Эффекты анимации

Сб авг 22, 2020 11:41:19

а зачем темный период? использовал буфер и работай с ним, а драйвер экрана будет брать из него по потребности

Re: Семисегментный LED-индикатор. Эффекты анимации

Сб авг 22, 2020 11:57:04

а зачем темный период?


Что конкретно имеется в виду?

Re: Семисегментный LED-индикатор. Эффекты анимации

Сб авг 22, 2020 12:54:04

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

Re: Семисегментный LED-индикатор. Эффекты анимации

Сб авг 22, 2020 13:19:44

Мне кажется, в данном случае это излишне. Всё прекрасно успеет обработаться пока светится разряд.

Re: Семисегментный LED-индикатор. Эффекты анимации

Сб авг 22, 2020 13:28:30

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

Re: Семисегментный LED-индикатор. Эффекты анимации

Сб авг 22, 2020 14:00:32

Верно. Поправлю только, что пересчитывать и опрашивать можно всё остальное время.

Re: Семисегментный LED-индикатор. Эффекты анимации

Сб авг 22, 2020 16:01:42

зачем мучаться?
1- гасишь разряд
2- обновляешь сегменты из массива элементов дисплея
3- зажигаешь разряд.

А обязательно именно так поступать, ведь при обычных частотах обновления экрана всё равно не будет заметно появление новых значений? В том коде, который я использую таже не так, верно?

Код:
 if (bc547 == 2) {RAZRIAD = 0b00000100; CHISLO = Razrad2;} //включаем 2-й разряд, остальные выключаем

Меняется номер разряда и сразу выводится новое значение. Я спрашиваю из соображения, как делать правильно и при этом не наращивать объём кода.

Добавлено after 1 minute 19 seconds:
Специальный участок в конце развертки для служебных операций с погашенным экраном.

Так в моём случае его же и нет. Разве не так?

Re: Семисегментный LED-индикатор. Эффекты анимации

Сб авг 22, 2020 16:34:47

если не гасить перед обновлением - риск появления ложной засветки

Re: Семисегментный LED-индикатор. Эффекты анимации

Сб авг 22, 2020 17:13:46

конкретно в твоем случае ничего страшного не произойдёт, разве что в протеусе дисплей может завыкобениваться и начнёт всякую ерунду показывать.
но:
если тактовая у мк небольшая или частота переключения разрядов высокая или светодиоды в сегментах яркие или дисплей крупный, а в усилителях стоят медленные транзисторы, то эффект паразитной засветки соседних тазрядов может быть весьма ощутимым.
или если пришлось разместить сегменты на разные порты, то ты их не сможешь переключить за один такт => если их переключать при включенном разряде, то у них будет различаться время свечения и, значит, и яркость...
А посмотри на свой дисплей в темноте - может и ты паразитную засветку заметишь (особенно заметно на потушенном разряде)

Добавлено after 14 minutes:
BlackKilkennyCat, да, можно считать и опрашивать всё остальное время, но, если нужно связаться с часовой микросхемой или с датчиком температуры - то лучше не тянуть, т.к. только сразу после переключения разряда есть гарантированный вагон времени для связи, при которой ни ей никто не помешает, ни она никому...
только мы уже совсем отвлеклись от темы топика...

Добавлено after 7 minutes 57 seconds:
к теме - делал меню со спецэффектами перехода -
разместил всё меню в 2мерный массив (все подпункты одного пункта шли какбы одной строкой) текущее положение и цель перемещения задаввлась координатами в этом массиве (задавались координаты первого символа, остальные брались последующие от него в строке)
также для смягчения эффекта перехода был предусмотрен анимированный сдвиг по вертикали и/или горизонтали.

Добавлено after 2 minutes 36 seconds:
благодаря этоау меню легко ложится в топографичевкую память и становится удобным в обращении

Re: Семисегментный LED-индикатор. Эффекты анимации

Сб авг 22, 2020 17:54:28

А посмотри на свой дисплей в темноте - может и ты паразитную засветку заметишь (особенно заметно на потушенном разряде)


Так и есть ))

Re: Семисегментный LED-индикатор. Эффекты анимации

Сб авг 22, 2020 17:55:54

В качестве примера.

seven_segm_led_ind.h


seven_segm_led_ind.с


Этот код был написан для проекта, в котором донором послужил прибор Термодат.
termodat.jpg
(8.08 KiB) Скачиваний: 196

Re: Семисегментный LED-индикатор. Эффекты анимации

Сб авг 22, 2020 18:19:43

Буду разбираться...


ЗЫ к сожалению, плюсы на сегодня закончились )

Re: Семисегментный LED-индикатор. Эффекты анимации

Сб авг 22, 2020 19:59:50

Ivanoff-iv, ну, связываться-то со всякой периферией - это значительно быстрее, чем переключения индикаторов. Индикатор - десятки герц, тормознутая и2ц, например, сотни килогерц... так что, успеваем )) опять же, если еще и периферия хардварная, то вообще ещё и в слип уйти можно успеть :)

Добавлено after 1 hour 23 minutes 5 seconds:
Demiurg, к сожалению, это может быть лишь хорошим примером "Как нельзя программировать"

Re: Семисегментный LED-индикатор. Эффекты анимации

Сб авг 22, 2020 20:24:03

Мою работу оценивают мои клиенты.
Ваше замечание - Это ваше личное мнение. Укажите причины и выкладывайте свой пример. Гляну... Что касается моего примера, динамическая индикация. Работает, читайте внимательно, в основном цикле.

Re: Семисегментный LED-индикатор. Эффекты анимации

Сб авг 22, 2020 20:45:44

Это работа для клиентов?! Час от часу не легче...
Причины указывать - да весь код сплошная причина. Невообразимое количество бесполезных дефайнов и практически бессмысленных функций.

Re: Семисегментный LED-индикатор. Эффекты анимации

Сб авг 22, 2020 20:49:46

Понятно. Мне параллельно на ваше мнение. Потому что вы даже не разобрались. Впрочем, как я уже написал, мне параллельно.
Я не видел ваших примеров. Итак, почему написано именно так. Первое, да, много дефайнов. И много писанины. Но зато, в дальнейшем, правка кода минимальна. Долго запрягаем, быстро едем. Второе. Я могу назначить любой пин мк. В одном месте. Есть и третье и так далее. Если я написал именно так, значит этому есть причина.
Жду вашего конструктивного ответа.
Последний раз редактировалось Demiurg Сб авг 22, 2020 20:57:30, всего редактировалось 1 раз.
Ответить