библиотека LedControl
- Войдите на сайт для отправки комментариев
Добрый день, форумчане.
Вот решил на днях разобраться с такой замечательной штукой, как Arduino. Разумеется, первое что захотелось сделать - это простенькую анимацию на четырех подборках лед-матриц 8 на 8 (MAX7219). И мне как-то показалось, что не слишком тут всё радужно...
В 2007 году, талантливый человек Eberhard Fahle подарил нам эту замечательную библиотеку, которой все пользуются не зная проблем. Быстренько написав несколько строчек кода, я замерил время, которое затрачивается на заполнение всей моей сборки матриц - 39156 микросекунд. Мне показалось, что для одного кадра, это слишком много.. Все же не так много информации передается. Растыкав замер времени по всему коду библиотеки удалось вычислить злое место и слегка над ним поработать, время заполнения матрицы снизилось до 19524 микросекунд, что уже намного больше меня стало радовать. Это тоже не предел и есть над чем поработать.
Легкий гуглежь не дал результатов по данному поводу, поэтому я решил закинуть эту косметическую переработку на гит. Если кому так же нужна скорость - пользуйтесь на здоровье.
https://github.com/Teonates/LedControlBoosted
Вижу программный SPI. А значит, если использовать аппаратный, подготовку данных для очередной команды можно выполнять параллельно передаче. А если вместо аппаратного SPI, не имеющего буферизации передатчика, использовать USART MSPIM, с буферизацией передачи, то пока будут два байта передаваться точно все успеете. А значит и ограничением времени станет в чистом виде скорость SPI.
Я же по тем же граблям прошелся в проекте AVRcanoid, который тут же рядом )
И ни фига не понял, почему при необходимости послать команду одному разряду, нужно посылать еще NOP в два раза больше раз, чем общее количество разрядов минус один. MAX7219 этого совершенно не требует. Можно всегда посылать 16 бит и не более.
Итого, на вывод во все 8 разрядов (по максимуму) при правильном подходе (8МГц SPI) понадобится всего лишь 16 микросекунд. Можно еще добавить 2 микросекунды на команду интенсивности.
Я сохранил логику оригинальной библиотеки, просто переписав код более быстрым образом. Как уже сказал, разбираться со всем этим начал вот, буквально на этой неделе. Так что для меня тут еще много вопросов :) Но за дельные советы - огромное спасибо! Если будет время - попробую переработать идиологически.
Но чтобы за 16 микросекунд уложиться в вывод всех 8 разрядов, нужно обязательно перейти на USART MSPIM. В принципе, если взять мой код (https://github.com/vpetryaev/ST7735) файлы ST7735_spi.* почистить от лишнего инициализацию в st7735_spi_tft_init() и взять для передачи функцию st7735_spi_send_word_data(), убрав из нее обработку DC (cli, sbi %[port],%[pin], sei и параметры port и pin), то тогда и будет 16 микросекунд.
Но чтобы за 16 микросекунд уложиться в вывод всех 8 разрядов, нужно обязательно перейти на USART MSPIM. В принципе, если взять мой код (https://github.com/vpetryaev/ST7735) файлы ST7735_spi.* почистить от лишнего инициализацию в st7735_spi_tft_init() и взять для передачи функцию st7735_spi_send_word_data(), убрав из нее обработку DC (cli, sbi %[port],%[pin], sei и параметры port и pin), то тогда и будет 16 микросекунд.
Ассемблер! Последний раз я на нем программировал еще на спектруме :) Вот как раз уже начал почитывать в этом направлении. Огромное спасибо за наработки, как освоюсь чуть лучше с асмом, полностью перепишу библиотеку. Эта стандартная оказалась слишком академичной.
И ни фига не понял, почему при необходимости послать команду одному разряду, нужно посылать еще NOP в два раза больше раз, чем общее количество разрядов минус один. MAX7219 этого совершенно не требует. Можно всегда посылать 16 бит и не более.
Не требует если у Вас одна MAX7219. У ТС же их несколько, насколько я понял, а когда несколько, то требует ещё как, см. стр. 10 даташита.
Этот момент я проглядел. Виноват.
То есть у нас выбор, либо мы MAX7219 соединяем последовательно с одним CS, теряя скорость при каждой команде во столько раз, сколько у нас всего контроллеров. Либо мы соединяем их параллельно, сами выбрая нужный по CS (напрямую или через дешифратор).
На самом деле, с учетом того, что MAX7219 поддерживает 10МГц по SPI (значит мы можем использовать 8МГц SPI у Arduino), то даже вывод всех знаков на восемь последовательно соединеных контроллеров потребует 16*8*8=1024мкс ~1мс. Что глазом вряд ли удастся заметить.