это главное
это нормально с такими матрицами. Надо подобрать порядок заполнения буфера
это главное
это нормально с такими матрицами. Надо подобрать порядок заполнения буфера
Если готовы попробовать, могу вам новый шаблон под свою библиотеку собрать. На основе Ваших изысканий, так сказать.
Мне было бы интересно узнать, заработает или нет.
Завтра попробую подобрать последовательность заполнения буфера, отпишусь
Ваш шаблон попробую для Вас, я перешёл на STM32CubeIde так как Ардуино глючил…
Вы на каком контроллере все это делаете? F407 ?
Шаблон пришлю часа через три, но это не срочно, попробуйте когда будет время…
шаблон
#define RGB80x40s10_sh 44 // 80x40 1/10 Shift
template<int COL_DEPTH>
class DMD_RGB_SHIFTREG_ABC<RGB80x40s10_sh, COL_DEPTH> : public DMD_RGB_BASE2<COL_DEPTH>
{
public:
DMD_RGB_SHIFTREG_ABC(uint8_t* mux_list, byte _pin_nOE, byte _pin_SCLK, uint8_t* pinlist,
byte panelsWide, byte panelsHigh, bool d_buf = false) :
DMD_RGB_BASE2<COL_DEPTH>(3, mux_list, _pin_nOE, _pin_SCLK, pinlist,
panelsWide, panelsHigh, false, COL_DEPTH, 10, 80, 40)
{}
protected:
void set_mux(uint8_t curr_row) override {
// Just shift the row mux by one for incremental access
digitalWrite(this->pin_DMD_B, HIGH);
digitalWrite(this->pin_DMD_C, (curr_row == 0)); // Shift out 1 for line 0, 0 otherwise
digitalWrite(this->pin_DMD_A, HIGH); // Clock out this bit
digitalWrite(this->pin_DMD_A, LOW);
digitalWrite(this->pin_DMD_B, LOW);
}
uint16_t get_base_addr(int16_t x, int16_t y) override {
this->transform_XY(x, y);
uint8_t pol_y = y % this->pol_displ;
x += (y / this->DMD_PIXELS_DOWN) * this->WIDTH;
uint16_t base_addr = (pol_y % this->nRows) * this->x_len +
(x / this->DMD_PIXELS_ACROSS) * this->multiplex * this->DMD_PIXELS_ACROSS +
(pol_y / this->nRows) * this->DMD_PIXELS_ACROSS + x % this->DMD_PIXELS_ACROSS;
return base_addr;
}
};
Использование в коде
DMD_RGB_SHIFTREG_ABC <RGB80x40s10_sh, COLOR_4BITS> dmd(mux_list, DMD_PIN_nOE, DMD_PIN_SCLK, custom_rgbpins, DISPLAYS_ACROSS, DISPLAYS_DOWN, ENABLE_DUAL_BUFFER);
Пока тестирую на 103C8T6
ПРЕДУПРЕЖДЕНИЕ: библиотека DMD_STM32 должна запускаться на архитектурах [stm32 и может быть несовместима с вашей платой на архитектуре rp2040].
D:\arduino_1.6\sketch_dec25a\sketch_dec25a.ino: In instantiation of 'void DMD_RGB_SHIFTREG_ABC<44, COL_DEPTH>::set_mux(uint8) [with int COL_DEPTH = 4; uint8 = unsigned char]':
D:\arduino_1.6\sketch_dec25a\sketch_dec25a.ino:105:1: required from here
sketch_dec25a:23: error: 'class DMD_RGB_SHIFTREG_ABC<44, 4>' has no member named 'pin_DMD_B'; did you mean 'pin_DMD_CLK'?
digitalWrite(this->pin_DMD_B, HIGH);
~~~~~~^~~~~~~~~
pin_DMD_CLK
sketch_dec25a:24: error: 'class DMD_RGB_SHIFTREG_ABC<44, 4>' has no member named 'pin_DMD_C'; did you mean 'pin_DMD_CLK'?
digitalWrite(this->pin_DMD_C, (curr_row == 0)); // Shift out 1 for line 0, 0 otherwise
~~~~~~^~~~~~~~~
pin_DMD_CLK
sketch_dec25a:25: error: 'class DMD_RGB_SHIFTREG_ABC<44, 4>' has no member named 'pin_DMD_A'; did you mean 'pin_DMD_CLK'?
digitalWrite(this->pin_DMD_A, HIGH); // Clock out this bit
~~~~~~^~~~~~~~~
pin_DMD_CLK
sketch_dec25a:26: error: 'class DMD_RGB_SHIFTREG_ABC<44, 4>' has no member named 'pin_DMD_A'; did you mean 'pin_DMD_CLK'?
digitalWrite(this->pin_DMD_A, LOW);
~~~~~~^~~~~~~~~
pin_DMD_CLK
sketch_dec25a:27: error: 'class DMD_RGB_SHIFTREG_ABC<44, 4>' has no member named 'pin_DMD_B'; did you mean 'pin_DMD_CLK'?
digitalWrite(this->pin_DMD_B, LOW);
~~~~~~^~~~~~~~~
pin_DMD_CLK
Несколько библиотек найдено для "Adafruit_GFX.h"
Используется: D:\arduino_1.6\libraries\Adafruit_GFX_Library
Не используется: C:\Program Files (x86)\Arduino\libraries\Adafruit-GFX-Library
exit status 1
'class DMD_RGB_SHIFTREG_ABC<44, 4>' has no member named 'pin_DMD_B'; did you mean 'pin_DMD_CLK'?
упс… забыл внести правки в версии 0.9
Отредактируйте метод set_mux() таким образом, остальное все нормально
void set_mux(uint8_t curr_row) override {
byte pin_DMD_A = this->mux_pins[0];
byte pin_DMD_B = this->mux_pins[1];
byte pin_DMD_C = this->mux_pins[2];
// Just shift the row mux by one for incremental access
digitalWrite(pin_DMD_B, HIGH);
digitalWrite(pin_DMD_C, (curr_row == 0)); // Shift out 1 for line 0, 0 otherwise
digitalWrite(pin_DMD_A, HIGH); // Clock out this bit
digitalWrite(pin_DMD_A, LOW);
digitalWrite(pin_DMD_B, LOW);
}
Сделал как Вы сказали не работает…хаотичные несколько вертикальных полос по 2,3штуки
слева и справа высотой …
Ок, спасибо.
PS
Уточните пожалуйста, на какой плате вы пробовали?
Тестирую на этом чипе STM32F103C8T6
Просто странно, что вообще не работает. Этот код должен быть полностью аналогичен Вашему из сообщения 103 и далее…
Хм… Может что напортачил, когда вносил изменения в последних версиях. Проверить мне все равно не на чем, матриц с шифт регистрами у меня не осталось…
Проверю, попробую ещё раз…
Может ошибаюсь, а какого вида сигнал У Васзагружается в
pin_DMD_C
Как я понял у меня загружается такого вида 0b1000000000 чтобы первая строка
и 0b0000000001 чтобы последняя (условно). То есть единица просто сдвигается…
А может у Вас грузится номер строки в двоичном формате например 0b011 для третьей например.
да точно такой же:
Вот мой код для Вашего теста посмотрите может я чего не заметил…
#include "DMD_RGB.h"
#define RGB80x40s10_sh 44 // 80x40 1/10 Shift
template<int COL_DEPTH>
class DMD_RGB_SHIFTREG_ABC<RGB80x40s10_sh, COL_DEPTH> : public DMD_RGB_BASE2<COL_DEPTH>
{
public:
DMD_RGB_SHIFTREG_ABC(uint8_t* mux_list, byte _pin_nOE, byte _pin_SCLK, uint8_t* pinlist,
byte panelsWide, byte panelsHigh, bool d_buf = false) :
DMD_RGB_BASE2<COL_DEPTH>(3, mux_list, _pin_nOE, _pin_SCLK, pinlist,
panelsWide, panelsHigh, false, COL_DEPTH, 10, 80, 40)
{}
protected:
void set_mux(uint8_t curr_row) override {
byte pin_DMD_A = this->mux_pins[0];
byte pin_DMD_B = this->mux_pins[1];
byte pin_DMD_C = this->mux_pins[2];
// Just shift the row mux by one for incremental access
digitalWrite(pin_DMD_B, HIGH);
digitalWrite(pin_DMD_C, (curr_row == 0)); // Shift out 1 for line 0, 0 otherwise
digitalWrite(pin_DMD_A, HIGH); // Clock out this bit
digitalWrite(pin_DMD_A, LOW);
digitalWrite(pin_DMD_B, LOW);
}
uint16_t get_base_addr(int16_t x, int16_t y) override {
this->transform_XY(x, y);
uint8_t pol_y = y % this->pol_displ;
x += (y / this->DMD_PIXELS_DOWN) * this->WIDTH;
uint16_t base_addr = (pol_y % this->nRows) * this->x_len +
(x / this->DMD_PIXELS_ACROSS) * this->multiplex * this->DMD_PIXELS_ACROSS +
(pol_y / this->nRows) * this->DMD_PIXELS_ACROSS + x % this->DMD_PIXELS_ACROSS;
return base_addr;
}
};
// Fonts includes
#include "st_fonts/UkrRusArial14.h"
#pragma GCC diagnostic ignored "-Wnarrowing"
#pragma GCC diagnostic ignored "-Woverflow"
#include "gfx_fonts/GlametrixLight12pt7b.h"
#include "gfx_fonts/GlametrixBold12pt7b.h"
#pragma GCC diagnostic warning "-Wnarrowing"
#pragma GCC diagnostic warning "-Woverflow"
//Number of panels in x and y axis
#define DISPLAYS_ACROSS 1
#define DISPLAYS_DOWN 1
// Enable of output buffering
// if true, changes only outputs to matrix after
// swapBuffers(true) command
// If dual buffer not enabled, all output draw at matrix directly
// and swapBuffers(true) cimmand do nothing
#define ENABLE_DUAL_BUFFER false
// ==== DMD_RGB pins ====
// mux pins - A, B, C... all mux pins must be selected from same port!
#define DMD_PIN_A PA1
#define DMD_PIN_B PA2
#define DMD_PIN_C PA3
#define DMD_PIN_D PA4
#define DMD_PIN_E PB8
// put all mux pins at list
uint8_t mux_list[] = { DMD_PIN_A , DMD_PIN_B , DMD_PIN_C , DMD_PIN_D , DMD_PIN_E };
// pin OE must be one of PB0 PB1 PA6 PA7
#define DMD_PIN_nOE PA0
#define DMD_PIN_SCLK PA5
// Pins for R0, G0, B0, R1, G1, B1 channels and for clock.
// By default the library uses RGB color order.
// If you need to change this - reorder the R0, G0, B0, R1, G1, B1 pins.
// All this pins also must be selected from same port!
uint8_t custom_rgbpins[] = { PB9, PB15,PB14,PB13,PB12,PB11,PB10 }; // CLK, R0, G0, B0, R1, G1, B1
// Fire up the DMD object as dmd<MATRIX_TYPE, COLOR_DEPTH>
// We use 64x32 matrix with 16 scans and 4bit color:
DMD_RGB_SHIFTREG_ABC <RGB80x40s10_sh, COLOR_4BITS> dmd(mux_list, DMD_PIN_nOE, DMD_PIN_SCLK, custom_rgbpins, DISPLAYS_ACROSS, DISPLAYS_DOWN, ENABLE_DUAL_BUFFER);
uint16_t bg = 0; // background - black
uint16_t fg = 0; // foreground
void setup(void)
{
dmd.init();
fg = dmd.Color888(0, 0, 255);
dmd.setBrightness(50);
}
void loop(void) {
// fill the matrix with points row by row
for (int i = 0; i < dmd.height(); i++) {
for (int j = 0; j < dmd.width(); j++) {
dmd.drawPixel(j,i, fg);
delay(30);
}
}
// clear the screen
dmd.fillScreen(bg);
}
Вадим, видимо вставилось не все - прокрутка не работает, я вижу только полтора десятка строк
Исправил, вставил весь код…
не вижу ошибок.
Не выкидывайте пока этот код :), я попробую найти ошибку у себя.
Добавка - проверил одну догадку - не помогло. Пока больше идей нет.
Кстати, Вадим, много у вас таких матриц? Я бы купил у вас одну для тестов.
(запись удалена автором)
этот ?
Светодиодный модуль Qiangli интерьерный P4 320X160 -