Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.83/82: Рейтинг темы: голосов - 82, средняя оценка - 4.83
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
Ответы с готовыми решениями:

Управление яркостью светодиодов бинарной модуляцией [AVR studio]
Здравствуйте, нужно реализовать эффект на светодиодах с изменением их яркости. Эффект такой:самый...

Управление яркостью лампочки
Здравствуйте. Есть контроллер, который через оптопару и симистор будет управлять яркостью обычной...

Управление яркостью светодиода двумя кнопками на Atmega8
задача была такая но проверить сейчас не на чем может кто посмотреть и сказать правильно я написал...

ATMega16 (ASM). Плавное управление яркостью, генерация звука и отображение на семисегментнике
Всем привет!!! помогите пож-та. у меня такая проблема. необходимо объединить 3 пункта программы и...

Последовательное плавное управление яркостью светодиодов
Нужно написать программку на Atmega48 в CodevisionAVR Используя PORTD 0 1 2 С начало загорается...

27
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
Цитата Сообщение от disis4
а на хрена мне эта обезъяна с гранатой? Когда рванет, хрен знает. Я уже писал о минусах этой RTOS. Таймерная служба этой RTOS - дамоклов меч висящий над тобой.
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
Цитата Сообщение от YTYOUT
Вот смотри в этом файле , для DIODE2 я взял тики из PDF-ка выложенного ЛИ.
Первый рисунок , где 15 тиков.
И ввел этот код в таблицу - остальное удалил , чтоб не мешало, кроме первого.
О как завелся! :) Наконец-то не детский вопрос? :) Благодарю, что откликнулся.
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
Цитата Сообщение от YTYOUT
Я с тебя потом кодом возьму, если вдруг понадобиться. :) Успехов!
Хы, код написать сначала нужно. Ты мне вот что скажи. Это что получается. На каждый тик (бит BAM) и состояние светодиодов строка таблицы требуется, что ли?
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
http://www.batsocks.co.uk/readme/p_art_bcm.htm
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
Цитата Сообщение от koyodzo
Там той таблицы 8 байт будет, если ВАМ на 256 уровней яркости и 8 светодиодов.
А чего ник на сахаре другой?
В смысле 8 байт? Не знаю, правильно ли я понял. В принципе я так представлял делать таблицу, при кол-ве светодиодов 8 штук, байт - состояние светодиодов. 8 байтов на каждый тик. Таблица нехиленькая получается, если эффект какой мутить.
Прикидываю способ вычисления, но это будет требовать 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
Цитата Сообщение от koyodzo
При чем тут эффект? Таблица для одного состояния всех светодиодов, из неё в прерываниях берутся данные и шлются в порт (или в несколько портов, тут уже возможны разные варианты реализации). Если содержимое таблицы не менять, то все светодиоды будут светиться с постоянной яркостью, определяемой этой таблицей.
Для эффектов используется другой тик, постоянный и намного более медленный, например 50-100 мсек, либо тик переменной длины, соответствующей времени между изменениями состояний всех светодиодов, и уже эта задача переписывает ту маленькую таблицу.
Имеется ввиду, что лучше разделить задачу отображения и задачу обновления данных для отображения, потому что они работают в сильно разных масштабах времени.
Вот это еще детальнее можно? Примерно, в алгортме, как это реализовать.
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%
koyodzoТаблица для одного состояния всех светодиодов, из неё в прерываниях берутся данные и шлются в порт
Это мы вчера нарисовали.
На входе у неё параметры какому светодиоду как быстро менять яркость, снова в виде массива (другого массива, отдельного
Такое напрашивалось на вариант эффекта "мерцание".
Т.е я пока не понимаю твой алгоритм
0
25.03.2013, 00:26
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.03.2013, 00:26

Управление яркостью через триммер и АЦП
Суть задания-используя переменный резистор стенда(подключенный к ацп) управлять яркостью...

ATmega48. Управление режимами светодиодов
Подскажите люди добрые ..... где тут прописана кнопка изменение режимов света диодов ??? Где это...

Управление блоком светодиодов (Code Vision AVR)
Имеется следующее задание: Запрограммировать мигание блоков светодиодов с портом B в Code Vision...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.