Например TDA7294

Форум РадиоКот • Просмотр темы - Ёлка новогодняя из светодиодиков. (чарлиплексинг)
Форум РадиоКот
Здесь можно немножко помяукать :)



Текущее время: Чт янв 21, 2021 14:08:07

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Ёлка новогодняя из светодиодиков. (чарлиплексинг)
СообщениеДобавлено: Пн ноя 23, 2020 18:44:44 
Собутыльник Кота

Карма: 36
Рейтинг сообщений: 798
Зарегистрирован: Ср ноя 29, 2017 06:58:50
Сообщений: 2915
Рейтинг сообщения: 8
Для обсуждения статьи https://radiokot.ru/artfiles/6598/

Добавлено after 5 hours 39 minutes 10 seconds:
По просьбам трудящихся, пример очень простой программы для сей ёлки. В стиле для начинающих постараюсь, поэтому профи будет скучновато, но я всё же прошу по возможности прочитать с целью критики-исправлений-дополнений, если есть время, за что заранее благодарю.

Данная программа очень проста - предполагает свечение лишь одного светодиода в единицу нормального времени. Под нормальным временем подразумевается время не менее 1/10 секунды. Никаких комбинаций с одновременным свечением нескольких светодиодов напрямую или же через быстрое попеременное вкл-выкл (то есть, динамическая индикация) здесь нету.

Итак, предположим, что у нас некий абстрактный микроконтроллер, но на котором почему-то написано PIC18, что мистическим образом накладет лапу на синтаксис и радует тех, кто решил использовать именно такой мк. И есть спаянная ёлка.
Будем делать эффекты. Первое, что обычно всегда приходит мне в голову, так это написать кучу состояний, неких "кадров", которые затем прокрутить. Разумеется, даже примерный подсчёт показывает, что это громадный и неэффективный объём данных, не зря же в свое время появилась gif-анимация и различные виды сжатия видео, где в каждом следующем кадре учитываются лишь изменения относительно предыдущего кадра, поэтому часовой видеофильм, показывающий неподвижную картину "Рождение Домомучительницы" будет по размеру несильно отличаться от подобного же, но идущего всего минуту: нет изменений - нет данных.
Вторым приходит в голову - математика. Да, кучу светоэффектов можно описать математикой. Это очень компактно, удобно, но... не знаю, как кто, а я с трудом помню, как вычисляется дискриминант квадратного уравнения, и есть вполне оправданные сомнения, что даже если верно его помню, то не помню что с ним делать дальше.
Поэтому всё максимально упростим, и поверьте, ваши родные и друзья придут в восторг от перемигивающихся зеленых огоньков и никто не догадается, как ужасно всё внутри.

Мы просто создадим массивы, где каждый элемент будет соответствовать состоянию светодиода, и будем считать это "кадром" нашей анимации.
В моей ёлочке 56 светодиодов, а значит будет 56 "кадров", и 10 "стволов", т.е. выводов МК.
Глядя на плату уже сделанной ёлки, вижу, что под это дело был отдан весь порт C (C0..C7) и две лапы порта А (А4, А5)

Ну, так и напишем:

Код:
#include <xc.h>
#include "main.h"

unsigned char leds_trisc[56] ={};
unsigned char leds_trisa4[56] ={};
unsigned char leds_trisa5[56] ={};
unsigned char leds_latc[56] ={};
unsigned char leds_lata4[56] ={};
unsigned char leds_lata5[56] ={};


Думаю, ни у кого не возникнет вопрос: - А что тут делает TRIS?
А вот у меня возник. Нам же нужно зажигать светодиоды, и всё. То есть, нужны лишь выходы. Инициализируем TRIS в режим выхода, и забываем о нём, зачем его-то в массив?
И я так и сделал. Все порты на выход, всем состояние "0". Прекрасно, ничего не светится. И пытаемся зажечь наш первый светодиод, подавая "1" на, например, "ствол" номер 0:
Изображение
Как видите, в итоге получается, что у светодиодов D10 и D1 на анодах логическая "1", то есть +V, на катодах "0", то есть -V. Ничто не мешает светиться обоим сразу, что они радостно и делают.

(небольшое отвлечение для совсем юных радиолюбителей: анод и катод на символе диода легко запоминается по формуле "Аткуда Куда", сам же символ стрелкообразной формой хорошо показывает "аткуда" и "куда")

Что же делать? Не нужон нам второй светодиод, он паразитный.
Чтобы паразитный диод погасить, на его катоде не должен быть "0".
-Идея!, - воскликнет кто-нибудь. - Давайте туда подадим "1", ведь следующий диод включен наоборот, он не будет светиться.
Давайте. И обнаруживаем, что совершенно верно, ненужный светодиод больше не светится. Зато теперь светится другой, в другом ярусе...

Выходит, что в одном кадре должны быть только один "0" и одна "1". Что же тогда будет на других выходах? А ничего. И это состояние называется "Z-состояние", или "Высокоимпедансное"(высокоомное), на микроконтроллере его можно получить, переведя порт в режим входа с отключением подтягивающих резисторов (если они есть).
Отсюда и необходимость в массиве TRIS: каждый наш "кадр" мы будем чётко указывать пару выводов микроконтроллера, настроенных на выход.

Дальше самое скучное: смотрим на ёлку, определяем, какие лапы мк для какого светодиода определить на выход, и записываем в массив. У меня получилось так:

Код:
unsigned char leds_trisc[56] ={ 0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0x7f,0xff,0xfe,    //1 ярус снизу
                                0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0x7f,0xff,0xfe,    //2 ярус
                                0xf7,0xf6,0xfa,0xdb,0xd7,0xb7,0xaf,0xef,         //3 ярус
                                0xf7,0xf6,0xfa,0xdb,0xd7,0xb7,0xaf,0xef,         //4 ярус
                                0xfb,0xbb,0xbf,0xf7,0x77,0x7f,                  //5 ярус
                                0xfb,0xbb,0xbf,0xf7,0x77,0x7f,                  //6ярус
                                0xfe,0xdf,0x5f,0x7e,                        //7 ярус
                                0xfe,0xdf,0x5f,0x7e};                        //8 ярус

unsigned char leds_trisa4[56] ={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0xff,
                                0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0xff,
                                0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
                                0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
                                0xff,0xff,0x00,0x00,0xff,0xff,
                                0xff,0xff,0x00,0x00,0xff,0xff,
                                0x00,0x00,0xff,0xff,
                                0x00,0x00,0xff,0xff};
                        
unsigned char leds_trisa5[56] ={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,
                                0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,
                                0x00,0xff,0xff,0xff,0xff,0xff,0xff,0x00,
                                0x00,0xff,0xff,0xff,0xff,0xff,0xff,0x00,
                                0x00,0xff,0xff,0xff,0xff,0x00,
                                0x00,0xff,0xff,0xff,0xff,0x00,
                                0xff,0xff,0xff,0xff,
                                0xff,0xff,0xff,0xff};


Можно заметить, что ярусность дублируется - строки одинаковые. Жаль, что порт 8-битный... тогда хватило бы одного массива. На самом деле, leds_trisa4 и leds_trisa5 можно объединить в один, но для простоты дальнейшего доступа к выводу порта я оставлю так, да и как пример того, что может произойти, если выводы берутся из разных портов.

Ну вот, 50% работы сделано - обеспечили возможность свечения только выбранного светодиода. Теперь это и сделаем:

Код:
unsigned char leds_latc[56] ={  0x01,0x04,0x04,0x10,0x10,0x40,0x40,0x00,0x00,0x01,
                                0x02,0x02,0x08,0x08,0x20,0x20,0x80,0x80,0x00,0x00,
                                0x08,0x08,0x04,0x04,0x08,0x08,0x10,0x10,
                                0x00,0x01,0x01,0x20,0x20,0x40,0x40,0x00,
                                0x04,0x04,0x00,0x00,0x80,0x80,
                                0x00,0x40,0x40,0x08,0x08,0x00,
                                0x01,0x20,0x20,0x01,
                                0x00,0x00,0x80,0x80};

unsigned char leds_lata4[56] ={ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,
                                0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                0x00,0x00,0x01,0x01,0x00,0x00,
                                0x00,0x00,0x00,0x00,0x00,0x00,
                                0x00,0x00,0x00,0x00,
                                0x01,0x01,0x00,0x00};

unsigned char leds_lata5[56] ={ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,
                                0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
                                0x00,0x00,0x00,0x00,0x00,0x00,
                                0x01,0x00,0x00,0x00,0x00,0x01,
                                0x00,0x00,0x00,0x00,
                                0x00,0x00,0x00,0x00};



Ура! Теперь пишем "проектор" нашего "кино":

Код:
int i = 0;
 
void main(void) {
       // инициализируем таймер, который будет генерировать прерывания, для смены "кадров"
      // что делает каждая строчка предлагаю разобраться самостоятельно по даташиту и/или учебнику
      // задача: заставить таймер бесконечно работать и генерировать событие (прерывание)
   T0CONbits.T08BIT = 0;
   T0CONbits.T0CS = 0;
   T0CONbits.PSA = 1;
   TMR0H = 0;
   TMR0L = 0;
   INTCONbits.T0IF = 0;
   INTCONbits.T0IE = 1;
   INTCONbits.PEIE = 1;
   INTCONbits.GIE = 1;
   T0CONbits.TMR0ON = 1;

   // бесконечная "кинолента"
    while(1)
    {   
        LATC = 0x00; // выключим все, чтобы во время дальнейших переключений не появились "артефакты"
      LATA = 0x00;
       
        TRISC = leds_trisc[i];   
        TRISAbits.TRISA4 = leds_trisa4[i];   
        TRISAbits.TRISA5 = leds_trisa5[i];
        LATC = leds_latc[i];
        LATAbits.LATA4 = leds_lata4[i];
        LATAbits.LATA5 = leds_lata5[i];
    }
}

Ну вот, присвоив 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 раз(а).

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ёлка новогодняя из светодиодиков. (чарлиплексинг)
СообщениеДобавлено: Пн ноя 23, 2020 20:10:22 
Прорезались зубы
Аватар пользователя

Зарегистрирован: Чт апр 02, 2009 17:46:04
Сообщений: 222
Откуда: Крым
Рейтинг сообщения: 0
Есть трехразрядный семисегментный индикатор с 6 выводами. По индикатору приходит в голову такое.
1. Определяем тип данных АК {Анод; Катод}.
2. Для цифр каждого из трех разрядов составляем таблицу состояний с типом данных АК, 10 строк (цифры), по 7 записей (сегменты), получится 3 таблицы.
3. Далее таблица 6 (строк) анодов х 5 записей (катодов), в нее для нужных цифр выбрать состояния катодов из всех таблиц состояний: все задействованные сегменты с 1 анодом, потом со 2 и т.д. до 6 анода.
4. После этого остается прокрутить получившуюся таблицу на порте МК.
По моим подсчетам 450 байт уйдет на таблицы. Может есть идеи как сделать проще или лучше? Только не надо программу, лучше алгоритм. Не знаю насколько моя безграмотная писанина понятна.


Вернуться наверх
 
JLCPCB, всего $2 за прототип печатной платы! Цвет - любой!

Отличное качество, подтвержденное более чем 600,000 пользователей! Более 10,000 заказов в день.

Зарегистрируйтесь и получите два купона по 5$ каждый:https://jlcpcb.com/quote

Не в сети
 Заголовок сообщения: Re: Ёлка новогодняя из светодиодиков. (чарлиплексинг)
СообщениеДобавлено: Пн ноя 23, 2020 20:15:27 
Собутыльник Кота

Карма: 36
Рейтинг сообщений: 798
Зарегистрирован: Ср ноя 29, 2017 06:58:50
Сообщений: 2915
Рейтинг сообщения: 0
лучше бы нарисовать схему индикатора.


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Шестое юбилейное мероприятие в процессе
Не в сети
 Заголовок сообщения: Re: Ёлка новогодняя из светодиодиков. (чарлиплексинг)
СообщениеДобавлено: Пн ноя 23, 2020 20:25:56 
Прорезались зубы
Аватар пользователя

Зарегистрирован: Чт апр 02, 2009 17:46:04
Сообщений: 222
Откуда: Крым
Рейтинг сообщения: 0
Да там с ума сойти можно, да и не знаю в чем нарисовать схему, могу только таблицу в экселе с номерами анодов - катодов соответственно сегментам. Сейчас перечитал и понял что накосячил немного с алгоритмом. Наверно за счет этого идея не понятна.


Последний раз редактировалось shev1975 Пн ноя 23, 2020 20:34:45, всего редактировалось 1 раз.

Вернуться наверх
 
Безмостовые ККМ для 99% КПД!

Схема коррекции коэффициента мощности (ККМ) на основе так называемого «тотемного столба» (Totem Pole) обладает минимально возможными потерями и потенциально может обеспечить самые жесткие требования к энергоэффективности источников питания. Компания Wolfspeed представляет референсную разработку – плату ККМ CRD-02AD065N на базе собственных карбид-кремниевых MOSFET и диодов с наилучшими в отрасли характеристиками.

Читать статью>>
Не в сети
 Заголовок сообщения: Re: Ёлка новогодняя из светодиодиков. (чарлиплексинг)
СообщениеДобавлено: Пн ноя 23, 2020 20:27:33 
Собутыльник Кота

Карма: 36
Рейтинг сообщений: 798
Зарегистрирован: Ср ноя 29, 2017 06:58:50
Сообщений: 2915
Рейтинг сообщения: 0
ну... хотя бы таблицу.


Вернуться наверх
 
Вебинар «Параметры выше, цена ниже. Обновление в линейке AC/DC- и DC/DC-преобразователей MORNSUN» (26.01.2021)

Приглашаем 26 января на бесплатный вебинар, посвящённый преимуществам и отличиям новых источников питания и DC/DC-преобразователей Mornsun. На вебинаре будут рассмотрены изолированные и неизолированные DC/DC-преобразователи последнего, четвертого, поколения (R4) и компактные модульные источники питания второго и третьего поколений (семейства LS/R3 и LD/R2) на плату. Рассмотрим новую группу продукции – встраиваемые источники питания в кожухе.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Ёлка новогодняя из светодиодиков. (чарлиплексинг)
СообщениеДобавлено: Пн ноя 23, 2020 20:39:59 
Прорезались зубы
Аватар пользователя

Зарегистрирован: Чт апр 02, 2009 17:46:04
Сообщений: 222
Откуда: Крым
Рейтинг сообщения: 0
Экселевский не получилось. Один сегмент битый. Схему придется рисовать наверно, понять что еще может засветиться при подаче 0 и 1, и нужно ли Z состояние.


Вложения:
Индикатор.png [25.33 KiB]
Скачиваний: 156
Вернуться наверх
 


Не в сети
 Заголовок сообщения: Re: Ёлка новогодняя из светодиодиков. (чарлиплексинг)
СообщениеДобавлено: Пн ноя 23, 2020 21:22:49 
Собутыльник Кота

Карма: 36
Рейтинг сообщений: 798
Зарегистрирован: Ср ноя 29, 2017 06:58:50
Сообщений: 2915
Рейтинг сообщения: 0
Получившаяся схема:
Изображение
в формате Diptrace
Вложение:
7seg_charli.zip [3.65 KiB]
Скачиваний: 118


Diptrace может удобно менять цвета проводников.
Я не вижу навскидку какой-то удобной закономерности, и отводить на это дело полкилобайта, конечно, грешно, но удобнее всего.


Вернуться наверх
 


Не в сети
 Заголовок сообщения: Re: Ёлка новогодняя из светодиодиков. (чарлиплексинг)
СообщениеДобавлено: Пн ноя 23, 2020 21:43:03 
Прорезались зубы
Аватар пользователя

Зарегистрирован: Чт апр 02, 2009 17:46:04
Сообщений: 222
Откуда: Крым
Рейтинг сообщения: 0
Уже болит голова, давно я ее так не включал :)) . Но как я понимаю, нужно делать общий 1 анод и на нужные катоды подавать соответствующие сигналы, и так по очереди перебирать аноды. Или наоборот общий катод, нужно разбираться что правильнее. Таким образом формировать динамическую индикацию. Схема немного не полная там еще есть 1 разряд с единицей и точка, индикатор для ФМ приемника, но поняв принцип будет не проблема задействовать остальное. Я так думаю что еще нужно будет в таблицы АК добавит состояние выхода, что бы учесть Z, это еще добавит расход памяти, но зато мало проводов :)) .
Надо попробовать составить таблицы, может тогда закономерность будет видна.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ёлка новогодняя из светодиодиков. (чарлиплексинг)
СообщениеДобавлено: Пн ноя 23, 2020 21:51:05 
Собутыльник Кота

Карма: 36
Рейтинг сообщений: 798
Зарегистрирован: Ср ноя 29, 2017 06:58:50
Сообщений: 2915
Рейтинг сообщения: 0
если это индикатор приёмника,то возникает вопрос возможных вариантов:
первый разряд вряд ли отображает 1,2,3,4,5, а последний, возможно, отображает лишь 0 и 5


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ёлка новогодняя из светодиодиков. (чарлиплексинг)
СообщениеДобавлено: Вт ноя 24, 2020 00:23:53 
Прорезались зубы
Аватар пользователя

Зарегистрирован: Чт апр 02, 2009 17:46:04
Сообщений: 222
Откуда: Крым
Рейтинг сообщения: 0
Это не принципиально, есть разные подобные индикаторы, на них и текст и цифры, главное понять принцип. Начал писать таблицу и понял что много ерунды написал. Как составлю, попробую сделать выводы, если не получится ничего толкового, то просто выложу новые наметки алгоритма.

Добавлено after 2 hours 22 minutes 17 seconds:
Последняя идея такая.
1. таблица 3 х 7, для трех разрядов, соответствие сегментов - выводам, структура данных {Катод; Анод}
2. таблица символов, обычная для семисегментного индикатора.
3. массив для вывода данных 6х6, строки аноды, заполнение состояние катодов.
Сношая первую и вторую таблицы заполняем массив для всех разрядов, то что не использовалось то Z, прокручиваем таблицу в порт.
Плохо, проверить не получится быстро, макетка занята другим проектом.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ёлка новогодняя из светодиодиков. (чарлиплексинг)
СообщениеДобавлено: Чт ноя 26, 2020 21:36:54 
Прорезались зубы
Аватар пользователя

Зарегистрирован: Чт апр 02, 2009 17:46:04
Сообщений: 222
Откуда: Крым
Рейтинг сообщения: 0
Эксперимент окончил. Не серьезно конечно, не используя таймеры, но своего добился, цифры зажег на индикаторе, запитал просто через резисторы. Нужен еще ШИМ, зависимый от количества светодиодов включенных одновременно, но мне лень заморачиваться. Писал на Си в среде Ардуино. Может кому пригодится.
Пришлось отодвинуть скобки от восьмерок, а то получились милые 8)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ёлка новогодняя из светодиодиков. (чарлиплексинг)
СообщениеДобавлено: Пт ноя 27, 2020 20:56:57 
Прорезались зубы
Аватар пользователя

Зарегистрирован: Чт апр 02, 2009 17:46:04
Сообщений: 222
Откуда: Крым
Рейтинг сообщения: 0
Удалось обойтись без ШИМа, добавил диоды параллельно резисторам.
Изображение


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: Agaev, Dmitry_nv, SlavaL и гости: 25


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y