Добавлено after 5 hours 39 minutes 10 seconds: По просьбам трудящихся, пример очень простой программы для сей ёлки. В стиле для начинающих постараюсь, поэтому профи будет скучновато, но я всё же прошу по возможности прочитать с целью критики-исправлений-дополнений, если есть время, за что заранее благодарю.
Данная программа очень проста - предполагает свечение лишь одного светодиода в единицу нормального времени. Под нормальным временем подразумевается время не менее 1/10 секунды. Никаких комбинаций с одновременным свечением нескольких светодиодов напрямую или же через быстрое попеременное вкл-выкл (то есть, динамическая индикация) здесь нету.
Итак, предположим, что у нас некий абстрактный микроконтроллер, но на котором почему-то написано PIC18, что мистическим образом накладет лапу на синтаксис и радует тех, кто решил использовать именно такой мк. И есть спаянная ёлка. Будем делать эффекты. Первое, что обычно всегда приходит мне в голову, так это написать кучу состояний, неких "кадров", которые затем прокрутить. Разумеется, даже примерный подсчёт показывает, что это громадный и неэффективный объём данных, не зря же в свое время появилась gif-анимация и различные виды сжатия видео, где в каждом следующем кадре учитываются лишь изменения относительно предыдущего кадра, поэтому часовой видеофильм, показывающий неподвижную картину "Рождение Домомучительницы" будет по размеру несильно отличаться от подобного же, но идущего всего минуту: нет изменений - нет данных. Вторым приходит в голову - математика. Да, кучу светоэффектов можно описать математикой. Это очень компактно, удобно, но... не знаю, как кто, а я с трудом помню, как вычисляется дискриминант квадратного уравнения, и есть вполне оправданные сомнения, что даже если верно его помню, то не помню что с ним делать дальше. Поэтому всё максимально упростим, и поверьте, ваши родные и друзья придут в восторг от перемигивающихся зеленых огоньков и никто не догадается, как ужасно всё внутри.
Мы просто создадим массивы, где каждый элемент будет соответствовать состоянию светодиода, и будем считать это "кадром" нашей анимации. В моей ёлочке 56 светодиодов, а значит будет 56 "кадров", и 10 "стволов", т.е. выводов МК. Глядя на плату уже сделанной ёлки, вижу, что под это дело был отдан весь порт C (C0..C7) и две лапы порта А (А4, А5)
Думаю, ни у кого не возникнет вопрос: - А что тут делает TRIS? А вот у меня возник. Нам же нужно зажигать светодиоды, и всё. То есть, нужны лишь выходы. Инициализируем TRIS в режим выхода, и забываем о нём, зачем его-то в массив? И я так и сделал. Все порты на выход, всем состояние "0". Прекрасно, ничего не светится. И пытаемся зажечь наш первый светодиод, подавая "1" на, например, "ствол" номер 0:
Как видите, в итоге получается, что у светодиодов D10 и D1 на анодах логическая "1", то есть +V, на катодах "0", то есть -V. Ничто не мешает светиться обоим сразу, что они радостно и делают.
(небольшое отвлечение для совсем юных радиолюбителей: анод и катод на символе диода легко запоминается по формуле "Аткуда Куда", сам же символ стрелкообразной формой хорошо показывает "аткуда" и "куда")
Что же делать? Не нужон нам второй светодиод, он паразитный. Чтобы паразитный диод погасить, на его катоде не должен быть "0". -Идея!, - воскликнет кто-нибудь. - Давайте туда подадим "1", ведь следующий диод включен наоборот, он не будет светиться. Давайте. И обнаруживаем, что совершенно верно, ненужный светодиод больше не светится. Зато теперь светится другой, в другом ярусе...
Выходит, что в одном кадре должны быть только один "0" и одна "1". Что же тогда будет на других выходах? А ничего. И это состояние называется "Z-состояние", или "Высокоимпедансное"(высокоомное), на микроконтроллере его можно получить, переведя порт в режим входа с отключением подтягивающих резисторов (если они есть). Отсюда и необходимость в массиве TRIS: каждый наш "кадр" мы будем чётко указывать пару выводов микроконтроллера, настроенных на выход.
Дальше самое скучное: смотрим на ёлку, определяем, какие лапы мк для какого светодиода определить на выход, и записываем в массив. У меня получилось так:
Можно заметить, что ярусность дублируется - строки одинаковые. Жаль, что порт 8-битный... тогда хватило бы одного массива. На самом деле, leds_trisa4 и leds_trisa5 можно объединить в один, но для простоты дальнейшего доступа к выводу порта я оставлю так, да и как пример того, что может произойти, если выводы берутся из разных портов.
Ну вот, 50% работы сделано - обеспечили возможность свечения только выбранного светодиода. Теперь это и сделаем:
Ну вот, присвоив i какое-то значение от 0 до 55 мы получим какой-то "кадр".
Пора делать эффекты! Думаю, никакого труда не составляет сделать "бегущий огонёк" - просто пишем i++, и когда i станет больше 55 - снова его обнуляем. Ну и добавим возможность хаотичного зажигания и изменения скорости. Смешаем это в кучу, и позволим воле случая выбирать:
Код:
unsigned long ce = 0; //счётчик, который считает, через сколько кадров сменить эффект unsigned char effect = 1; // номер эффекта unsigned char speed = 1; // скорость "киноленты" //оработка прерывания таймера __interrupt() void ISR(void) { if (INTCONbits.TMR0IE && INTCONbits.T0IF) { INTCONbits.T0IF = 0; TMR0H = 100 + (speed * 10); // здесь изменяется интервал таймера, то есть "скорость киноленты" TMR0L = 0; if (++ce > 170){ // если прошло более 170 кадров - меняем эффект effect = rand()%3; // случайным образом выбираем один из трёх эффектов speed = rand()%11;// случайным образом выбираем одну из одиннадцати скоростей ce = 0; // сбрасываем счётчик кадров } switch (effect) // определяем, какой сейчас эффект { case 0: // первый эффект: случайный выбор светодиода i = rand()%56; break; case 1: // второй эффект: бегущий огонёк в одну сторону if (++i > 55) i = 0; break; case 2: // третий эффект: бегущий огонёк в другую сторону if (--i < 0) i = 55; break; } } }
Вот и всё. Ничего сложного и масса возможностей для оптимизации (например, очень легко выкинуть массивы *a4 и *a5, просто добавив несколько условий проверки i определенным значениям, кол-во которых существенно меньше элементов массива) Добавлено after 7 minutes 3 seconds: P. S. Не забудьте про токоограничивающие резисторы.
Последний раз редактировалось BlackKilkennyCat Пн ноя 23, 2020 22:44:36, всего редактировалось 4 раз(а).
Есть трехразрядный семисегментный индикатор с 6 выводами. По индикатору приходит в голову такое. 1. Определяем тип данных АК {Анод; Катод}. 2. Для цифр каждого из трех разрядов составляем таблицу состояний с типом данных АК, 10 строк (цифры), по 7 записей (сегменты), получится 3 таблицы. 3. Далее таблица 6 (строк) анодов х 5 записей (катодов), в нее для нужных цифр выбрать состояния катодов из всех таблиц состояний: все задействованные сегменты с 1 анодом, потом со 2 и т.д. до 6 анода. 4. После этого остается прокрутить получившуюся таблицу на порте МК. По моим подсчетам 450 байт уйдет на таблицы. Может есть идеи как сделать проще или лучше? Только не надо программу, лучше алгоритм. Не знаю насколько моя безграмотная писанина понятна.
Да там с ума сойти можно, да и не знаю в чем нарисовать схему, могу только таблицу в экселе с номерами анодов - катодов соответственно сегментам. Сейчас перечитал и понял что накосячил немного с алгоритмом. Наверно за счет этого идея не понятна.
Последний раз редактировалось shev1975 Пн ноя 23, 2020 20:34:45, всего редактировалось 1 раз.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Экселевский не получилось. Один сегмент битый. Схему придется рисовать наверно, понять что еще может засветиться при подаче 0 и 1, и нужно ли Z состояние.
Diptrace может удобно менять цвета проводников. Я не вижу навскидку какой-то удобной закономерности, и отводить на это дело полкилобайта, конечно, грешно, но удобнее всего.
Уже болит голова, давно я ее так не включал . Но как я понимаю, нужно делать общий 1 анод и на нужные катоды подавать соответствующие сигналы, и так по очереди перебирать аноды. Или наоборот общий катод, нужно разбираться что правильнее. Таким образом формировать динамическую индикацию. Схема немного не полная там еще есть 1 разряд с единицей и точка, индикатор для ФМ приемника, но поняв принцип будет не проблема задействовать остальное. Я так думаю что еще нужно будет в таблицы АК добавит состояние выхода, что бы учесть Z, это еще добавит расход памяти, но зато мало проводов . Надо попробовать составить таблицы, может тогда закономерность будет видна.
если это индикатор приёмника,то возникает вопрос возможных вариантов: первый разряд вряд ли отображает 1,2,3,4,5, а последний, возможно, отображает лишь 0 и 5
Это не принципиально, есть разные подобные индикаторы, на них и текст и цифры, главное понять принцип. Начал писать таблицу и понял что много ерунды написал. Как составлю, попробую сделать выводы, если не получится ничего толкового, то просто выложу новые наметки алгоритма.
Добавлено after 2 hours 22 minutes 17 seconds: Последняя идея такая. 1. таблица 3 х 7, для трех разрядов, соответствие сегментов - выводам, структура данных {Катод; Анод} 2. таблица символов, обычная для семисегментного индикатора. 3. массив для вывода данных 6х6, строки аноды, заполнение состояние катодов. Сношая первую и вторую таблицы заполняем массив для всех разрядов, то что не использовалось то Z, прокручиваем таблицу в порт. Плохо, проверить не получится быстро, макетка занята другим проектом.
Эксперимент окончил. Не серьезно конечно, не используя таймеры, но своего добился, цифры зажег на индикаторе, запитал просто через резисторы. Нужен еще ШИМ, зависимый от количества светодиодов включенных одновременно, но мне лень заморачиваться. Писал на Си в среде Ардуино. Может кому пригодится. Спойлерstruct AC { uint8_t Anode; uint8_t Cathode; }; struct AC table [3][7] = // таблица соответствия выводов сегментам, строки разряды, столбцы сегменты { { {0,5},{2,5},{4,5},{5,3},{3,5},{5,4},{0,4} }, { {4,3},{2,4},{3,4},{2,3},{5,2},{3,2},{4,2} }, { {1,2},{1,3},{4,1},{1,5},{1,4},{2,1},{3,1} } };
Добавлено after 2 minutes 49 seconds: shev1975, там навернфка тупа матрица но не 8х3 а иная причем я встречал индюки где часть диодоф сидела на техже ногах но в обратной поляре такие в какихто ксерах/факсах шли надергал тогла думал дохлые пока допер что на класику без внутренего чипа DC мало нок..
_________________ ZМудрость(Опыт и выдержка) приходит с годами. Все Ваши беды и проблемы, от недостатка знаний. Умный и у дурака научится, а дураку и .. Алберт Ейнштейн не поможет и ВВП не спасет.и МЧС опаздает
Яркость поднять несложно, но расходно по компонентам: нужно обеспечить полумостовой драйвер на каждый канал, то есть, сделать такой же порт ввода-вывода, как у микроконтроллера, только мощнее. Это потребует 20 транзисторов и 20 "ног" микроконтроллера, плюс обвязка из резисторов. Но если использовать "цифровые" транзисторы (со встроенными резисторами), то паять деталек станет значительно меньше. Использование сдвиговых регистров может помочь сохранить микроконтроллер, всё-таки стоимость последнего и дефицитность пока ещё актуальны. Получится так: В данной схеме сознательно не используется первый разряд регистра - это не сильно усложняет программу, но значительно упрощает трассировку платы. Разумеется, это не единственный вариант, но он один из самых доступных и недорогих, да и достаточно однотипные детали не так сложно монтировать. Следует учесть, что импульсный ток светодиодов имеет ограничение, и предварительно провести эксперимент: хватит ли максимального импульсного тока при нужной длительности/скважности импульса, чтобы обеспечить необходимую яркость. В архиве - схема в форматах Diptrace и PDF.
Я думал сдлеать на буферах 74HC244 поставить их 2шт и пусть ток 10мА на канал и 50 мА на микросхему Сама HC244 позволяет на ножку 20мА и суммарно на все ноги 70мА ну либо 3 HC244 и выходы запаралелить, чтоб 20мА гнать в линию и не перегружать вывод микросхемы ...
зачем НС они слабые и нежные-гавно кароче возми 74F244(531ап) там 1.5вт на корпус легко и не дохнет никогда я их гонял в хвост и в гриву во времена популярности ТТЛ и да пинаут тотже если че если PCB развели под НС/LS то замена на F не потребут ее менять при болшой нагрузке к верхам чипоф я клеил маленкий радиатор "алсил2 термоклем хотя и без него все работает
Добавлено after 1 minute 36 seconds: есть1 условие по 1 кер кондею 0.1мк на 1 корпус прям на питание!!! иначе могут сбоить
_________________ ZМудрость(Опыт и выдержка) приходит с годами. Все Ваши беды и проблемы, от недостатка знаний. Умный и у дурака научится, а дураку и .. Алберт Ейнштейн не поможет и ВВП не спасет.и МЧС опаздает
у буфероф 244/245 Z импеданс гарантирован про другое не скажу не изучал вапрос
_________________ ZМудрость(Опыт и выдержка) приходит с годами. Все Ваши беды и проблемы, от недостатка знаний. Умный и у дурака научится, а дураку и .. Алберт Ейнштейн не поможет и ВВП не спасет.и МЧС опаздает
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 40
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения