--
Лайтпак: lightpack.googlecode.com
Отправить сообщение в группу: ligh...@googlegroups.com
Отписаться от сообщений группы: lightpack+...@googlegroups.com
Так только при переполнении разряда данные в драйверах и должны
обновляться.
Все данные для них должны быть готовы до времени отправки.
Сейчас буду смотреть код, но там не должно быть никаких мерцаний даже
в случае каких-то ошибок.
При переходе счетчика прерываний на следущий разряд надо:
-отправить 4 байта (по 2 байта на драйвер) по SPI. Отправка или
неотправка данных никак не влияет на отображаемые цвета: полученные
драйверами данные хранятся в сдвиговых регистрах до получения команды.
-после передачи всех 4 байт передернуть (LOW->HIGH->LOW) LATCH, дабы
перевести данные в сдвиговых регистрах на выходы драйверов.
Неоткуда здесь взяться мерцаниям. После переполнения разряда следущее
обновление должно быть после переполнения следущего разряда: до этого
момента данные на выходе драйверов не меняются.
Все эти 8 смен цветов по кругу при должной частоте должны давать
статичный оттенок света. При ошибке в рассчетах поворота массива -
просто получится другой цвет.
Мерцание может быть только при нестабильном цикле смены цветов.
В общем, попробую понять код, по какому алгоритму работает. С ходу мне
даже непонятно зачем таймер обнулять: он сам должен обнулиться при
прерывании.
P.S.
Мне показалось, или данные на драйвера посылаются по кругу каждое
прерывание, т.е. через равные промежутки времени? Дальше процедуры
BAM() пока не смотрел.
Логика работы сейчас следующая:- Срабатывает прерывание таймера1) Увеличивается номер текущего обрабатываемого бита2) Обновляются значения в драйверах, соответственно обрабатываемому биту3) Пересчитывается задержка до обработки следующего бита4) Сбрасывается счетчик таймера (он не сбрасывается автоматически при входе в прерывание, да и в процессе работы прерывания продолжает тикать)- Ожидание следующего прерыванияВсе цвета отображаются правильно, т.е. если задать определенный цвет, он будет отображаться верно (ну наверно все-таки относительно верно, см. ниже почему)Проблема в следующем: при установке вручную значений 0b00111110, 0b00111101, 0b00111100, 0b00111011 - в момент переключения никакого мерцания нет.При смене значения с 0b00111111 на 0b01000000 яркость светодиодов становится немного ниже и светодиоды в процессе смены цвета мерцают (плавное изменение цветов выключено).Если в прошивке просто попробовать с некоторой задержкой менять цвет с 0x00 до 0xFF, то будет заметно что яркость, то возрастает, то немного снижается и снова возрастает. C PWM таких проблем нет.Теперь про то зачем нам BAM, на данный момент при использовании 10 светодиодов в принципе не нужен, но чтобы подключить больше светодиодов придется уменьшать время нахождения контроллера в процессе формирования и передачи данных. Сейчас контроллер только и делает, что сидит в прерывании таймера и передает данные по SPI на драйверы, изредка прерываясь на обновление цветов, прилетевших с эвм. В BAM контроллер будет больше времени сидеть без дела, что позволит пересчитывать в это время текущий цвет (для плавного изменения цветов), а также чем меньше времени контроллер проводит в прерывании тем меньше вероятность потери USB-пакетов (хотя этим занимается другая подсистема контроллера и, как мне кажется, она достаточно асинхронна, чтобы не париться по этому поводу).PS: Что-то мне все больше кажется, что BAM пока нам не нужен.
26 апреля 2011 г. 19:38 пользователь kv35 <kv0...@gmail.com> написал:
>>В результате при переполнении разряда возникает мерцание (0b00011111 ->
0b00100000)
--
Лайтпак: lightpack.googlecode.com
Отправить сообщение в группу: ligh...@googlegroups.com
Отписаться от сообщений группы: lightpack+...@googlegroups.com
--
Лайтпак: lightpack.googlecode.com
Отправить сообщение в группу: ligh...@googlegroups.com
Отписаться от сообщений группы: lightpack+...@googlegroups.com
Пересчет задержки во время работы таймера?
Я делал немного иначе.
У меня таймер постоянно генерирует прерывания с равными промежутками.
Что для PWM, что для BAM.
Для этого достаточно настроить прерывание по совпадению и активировать
сброс при совпадении (Clear Timer on Compare).
Таймер постоянно будет считать от 0 и до заданного значения, при
достижении которого будет генерировать прерывание и автоматом
сбрасываться.
Никаких дополнительных вмешательств в работу таймера не требуется.
Далее..
для PWM: проверка совпадения счетчика прерывания со значением каждого
канала, при необходимости - обновление данных на драйверах
для BAM: проверка совпадения счетчика прерываний с 2^n (n:0-7), при
совпадении - отправка новых данных
Тут BAM выигрывает по двум параметрам: максимальное время работы
процедуры (можно увеличить частоту на пару порядков) и затрачиваемое
процессорное время в целом.
>Проблема в следующем: при установке вручную значений 0b00111110,
>0b00111101, 0b00111100, 0b00111011 - в момент переключения никакого
>мерцания нет.
>При смене значения с 0b00111111 на 0b01000000 яркость светодиодов становится
>немного ниже и светодиоды в процессе смены цвета мерцают (плавное изменение
>цветов выключено).
Не совсем понимаю какое значение вы меняете. Это значение яркости
канала?
Как долго происходит смена цвета, что они успевают померцать?
Для глаза изменение значение на единицу вообще должно быть мало
различимо.
Подозреваю, что проблема в рассчете поворота массива.
>Если в прошивке просто попробовать с некоторой задержкой менять цвет с 0x00
>до 0xFF, то будет заметно что яркость, то возрастает, то немного снижается и
>снова возрастает. C PWM таких проблем нет.
Да, было у меня подобное.. Некорретно поворачивал массив.
Посмотрю, как это у вас происходит.
>PS: Что-то мне все больше кажется, что BAM пока нам не нужен.
На данный момент это неприоритетная задача. PWM вполне справляется с
работой, так что с BAM можно не торопиться.
Но кто знает, когда и где понадобятся дополнительные ресурсы. Лучше
изучать более оптимальные решения просто для того, что бы была
возможность использовать их когда они будут востребованы.
А два других какраз работают волнообразно, и волнообразно инверсно.
Если, конечно, правильно вспоминаю.