dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
|
|
1 | |
BAM. Управление яркостью светодиодов.23.03.2013, 18:57. Просмотров 15055. Ответов 27
Метки нет Все метки)
(
Подкиньте, пожалуйста идей, как лучше сделать. Хочу чтобы параллельно обрабатывалось какое-то кол-во светодиодов. Скажем пусть пока будут 8 штук. В идеале, разбросанные по разным портам. Одним или все портом пока получилось. А вот чтобы несколько,
пока в затруднениях. Сразу хочу сказать, в Си слаб, пишу на асме. Отвечать в алгоритмах. Что пока получилось: видео Итак, почему я выбрал BAM. Потому что вроде как требует меньше ресурсов. Как я сделал на данный момент. На видео видно, что работает сразу весь порт. Тут неважно, один светодиод или весь порт. Пока я разбирался как BAM работает. Вроде несложно. Алгоритм у меня следующий получился: PROC_BAM_CNT_1 - Счетчик сдвигов. Инициализируется в основном цикле числом 7, так как мы закидываем в регистр сравнения нижеупомянутую переменную. BAM_OCR_VOT - Переменная загружаемая в регистр сравнения восьмибитного таймера 0 или 2. В основном цикле в регистр сравнения закидывается 0b10000000, в переменную закидываем 0b01000000. В прерывании эта переменная закидывается в регистр сравнения и сдвигается вправо. Для регулировки яркости написал пока простую таблицу от 2 до 255 и обратно до 1. PROC_BAM_VOT - В этой переменной обрабатываемое на данный момент значение яркости. В основном цикле считали из таблицы значение, в нижеупомянутую переменную закинули указатель на следующее значение. По старшему биту проверили, горит\не горит светодиод. выставили пин, сдвинули влево закинули в переменную. В прерывании как только прошли все 8 битов BAM, cчитывается из таблицы следующее значение. POINT_BAM_VOT (двухбайтная переменная) - Указатель на следующее значение из таблицы. Ну а дальше все просто. В основном цикле мы уже завели старшее значение BAM. В прерывании обрабатываются остальные 7 битов BAM, счетчик обнулился, считываем новое значение яркости. Дальше идет по 8 раз. Ну а на таблице для нескольких светодиодов я споткнулся. Прикидываю как оптимизировать таблицу.
0
|
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
|
23.03.2013, 18:57 |
Ответы с готовыми решениями:
27
Управление яркостью светодиодов бинарной модуляцией [AVR studio] Управление яркостью лампочки Управление яркостью светодиода двумя кнопками на Atmega8 ATMega16 (ASM). Плавное управление яркостью, генерация звука и отображение на семисегментнике Последовательное плавное управление яркостью светодиодов |
disis4
0 / 0 / 0
Регистрация: 19.05.2012
Сообщений: 78
|
|
23.03.2013, 20:15 | 2 |
Почитай здесь:
http://iosyitistromyss.ru/avr-uchebnyj- ... denie.html
0
|
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
|
|
23.03.2013, 22:04 | 3 |
![]()
0
|
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
|
|
23.03.2013, 22:23 | 4 |
Приветствую!
Я не знаю в каком виде ты сделал градацию веса для светодиодов. Я исхожу из табличного. Как ты знаешь мы для ВАМ имеет вес - бинарный код по которому и будет светится/не светится диод на каждом тике. Итак утрировано. Мах вес = FF......Мин = 00 так ты сейчас и выводишь получая синус Нарисуй график по оси Х -расположены твои 8 светодиодов по оси У (тики)- ты вписываешь в столбик вес для первого светодиода 11111111(вес), для второго тоже в столбик 11011011(вес)-90% для третьего ....80% для восьмого 00000000. ( конечно значения взяты просто так) EXCEL в помощь Так для каждого тика получили бинарный код который и будем выводить в порт - т.е. тик1-11101010 тик2-11011010 тик3-10011000 1..........0 1..........0 тик(128или255)-10100100 Если расположишь от 100% 90% 80% ...10% 0 то по идее получится градация 1-самый яркий 8 -не горит Можешь играя направлением вывода из новой таблицы получить обратную градацию. Смещая адрес старта , с какого светодиода начинается вывод- по идее должен получится тот же синус.
0
|
23.03.2013, 22:23 | |
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
|
|
23.03.2013, 23:10 | 5 |
YTYOUT, покажи примерную таблицу. Скажем у меня 8 светодиодов. И несколько тиков. Все это в таблице.
0
|
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
|
|
24.03.2013, 01:26 | 6 |
Выкладываю для XP для 7-ки . Не знаю какой WIN у тебя стоит.
Что-то не получилось , чтобы в столбце КОД сразу преобразовывалось в HEX/ Счас разберусь - выложу [13.05 Кб]
0
|
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
|
|
24.03.2013, 02:04 | 7 |
Похоже EXCEL по столбцам не считает или что-то не понял
0
|
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
|
|
24.03.2013, 02:50 | 8 |
Вот смотри в этом файле , для DIODE2 я взял тики из PDF-ка выложенного ЛИ.
Первый рисунок , где 15 тиков. И ввел этот код в таблицу - остальное удалил , чтоб не мешало, кроме первого. [4.99 Кб]
0
|
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
|
|
24.03.2013, 03:15 | 9 |
![]()
0
|
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
|
|
24.03.2013, 11:47 | 10 |
Я с тебя потом кодом возьму, если вдруг понадобиться. :) Успехов!
0
|
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
|
|
24.03.2013, 12:27 | 11 |
![]()
0
|
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
|
|
24.03.2013, 13:34 | 12 |
Да, там в первом файле я так и расписывал- код для каждого тика построчно.
0
|
dosykus_2
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 4,017
|
|
24.03.2013, 14:31 | 13 |
0
|
koyodzo
0 / 0 / 0
Регистрация: 07.12.2012
Сообщений: 122
|
|
24.03.2013, 14:34 | 14 |
Там той таблицы 8 байт будет, если ВАМ на 256 уровней яркости и 8 светодиодов.
... (удалено)
0
|
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
|
|
24.03.2013, 15:17 | 15 |
Не понял , изобрази мысль :)
0
|
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
|
|
24.03.2013, 16:02 | 16 |
![]() Прикидываю способ вычисления, но это будет требовать SROM.
0
|
koyodzo
0 / 0 / 0
Регистрация: 07.12.2012
Сообщений: 122
|
|
24.03.2013, 19:04 | 17 |
При чем тут эффект? Таблица для одного состояния всех светодиодов, из неё в прерываниях берутся данные и шлются в порт (или в несколько портов, тут уже возможны разные варианты реализации). Если содержимое таблицы не менять, то все светодиоды будут светиться с постоянной яркостью, определяемой этой таблицей.
Для эффектов используется другой тик, постоянный и намного более медленный, например 50-100 мсек, либо тик переменной длины, соответствующей времени между изменениями состояний всех светодиодов, и уже эта задача переписывает ту маленькую таблицу. Имеется ввиду, что лучше разделить задачу отображения и задачу обновления данных для отображения, потому что они работают в сильно разных масштабах времени.
0
|
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
|
|
24.03.2013, 20:23 | 18 |
![]()
0
|
koyodzo
0 / 0 / 0
Регистрация: 07.12.2012
Сообщений: 122
|
|
24.03.2013, 20:49 | 19 |
Тут придётся оперировать более крупными понятиями, чем "регистр", "ячейка памяти" или "команда".
Смысл в том, что есть одна задача, которая берёт данные в ОЗУ о требуемой яркости нужных светодиодов и путём выдачи соответствующих уровней на нужные ножки в нужное время получаем нужные сигналы, которые при подключенных светодиодах выглядят как разная яркость светодиодов. ШИМ там или ВАМ используется - не важно, важно что на входе у неё данные о текущей яркости в виде массива или структуры, в общем в виде данных в ОЗУ Есть вторая задача (необязательно, может не быть), которая позволяет получать плавные (относительно) переходы яркости выбранных светодиодов. На входе у неё параметры какому светодиоду как быстро менять яркость, снова в виде массива (другого массива, отдельного), на выходе - результат изменения данных в массиве первой задачи. Тут может потребоваться синхронизация, тогда на выходе ещё один массив, аналогичный массиву первой задачи, а копирование между этими массивами производит первая задача в определённый момент времени, привязанный к периоду. Но это может и не нужно. Есть третья задача, которая берёт данные не важно откуда, которые содержат что-то вроде нот для музыканта, только это последовательность команд для светодиодов. Например, "светить Led5 в течении 1 секунды", или "менять яркость Led4 со скоростью +1 в 10 мсек" или ещё как-то, и она эту последовательность преобразовывает в изменения данных второй (или первой, если вторая отсутствует) задачи. Как именно вызываются сами задачи - по прерываниям, или ещё как-то, это отдельный вопрос. В принципе прерывания напрашиваются только для самой быстрой задачи, остальные могут выполняться в фоне, синхронизируясь по системному тику
0
|
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
|
|
25.03.2013, 00:26 | 20 |
Не понимаю , почему 8 байт и чего 8 байт? Для всей шкалы градации Байкало-Амурской Магистрали можно обойтись похоже и одним , но прибавить математики.
Т.е (FF - младшее значение веса) в зависимости от % получаем шкалу градаций. Например FF- 10% = 90% Т.е я пока не понимаю твой алгоритм
0
|
25.03.2013, 00:26 | |
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
|
25.03.2013, 00:26 |
Управление яркостью через триммер и АЦП ATmega48. Управление режимами светодиодов Управление блоком светодиодов (Code Vision AVR) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |