У меня уличный он сейчас там стоит около 2070.
спасибо
Нашел у себя на компе даташит на драйвер - DP3246 - возможно родственник вашего 3216. Он для запуска требует загрузки конфигурации.
Вы ничего подобного не делаете?
Нет , ничего не делал,
Сделал простенький скечт, пины взял как в примере с Вашим шаблоном(проверьте если не трудно). Всё работает…
#define DMD_PIN_A PA1
#define DMD_PIN_B PA2
#define DMD_PIN_C PA3
#define DMD_PIN_nOE PA0
#define DMD_PIN_SCLK PA5
#define DMD_PIN_CLK PB9
#define DMD_PIN_R0 PB15
#define DMD_PIN_G0 PB14
#define DMD_PIN_B0 PB13
#define DMD_PIN_R1 PB12
#define DMD_PIN_G1 PB11
#define DMD_PIN_B1 PB10
uint8_t buffer_displ[10][160];
uint8_t rows = 0;
void setup() {
pinMode(DMD_PIN_A, OUTPUT);
pinMode(DMD_PIN_B, OUTPUT);
pinMode(DMD_PIN_C, OUTPUT);
pinMode(DMD_PIN_nOE, OUTPUT);
pinMode(DMD_PIN_SCLK, OUTPUT);
pinMode(DMD_PIN_CLK, OUTPUT);
pinMode(DMD_PIN_R0, OUTPUT);
pinMode(DMD_PIN_G0, OUTPUT);
pinMode(DMD_PIN_B0, OUTPUT);
pinMode(DMD_PIN_R1, OUTPUT);
pinMode(DMD_PIN_G1, OUTPUT);
pinMode(DMD_PIN_B1, OUTPUT);
Timer1.pause(); // tic
Timer1.setPeriod(100);
Timer1.attachInterrupt(TIMER_UPDATE_INTERRUPT, Reload_buffer); // активируем прерывание
Timer1.resume();
}
void loop() {
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 160; j++) {
buffer_displ[i][j] =0b100100;
delay(10);
}
}
}
void Reload_buffer(){
if(rows == 10) { rows = 0; }
digitalWrite(DMD_PIN_nOE, HIGH);//OE
digitalWrite(DMD_PIN_SCLK, HIGH);// LAT HIGH
digitalWrite(DMD_PIN_SCLK, LOW);// LAT LOW
// Цикл вывода светодиодов в строке
for(uint8_t i=0; i < 160; i++)
{// Выставляем биты включения светодиодов
GPIOB->regs->BSRR =(0b1111110000000000 << 16) | ( buffer_displ[rows][i] << 10 ) ;
// Отправляем выставленное значение
digitalWrite(DMD_PIN_CLK, LOW);//CLK Low
digitalWrite(DMD_PIN_CLK, HIGH);//CLK High
}
// Выставляем адрес строки для отображения
// GPIOA->BRR = 0b0000000000011110;
digitalWrite(DMD_PIN_B, HIGH);//Oe PA2
for (int r = 9; r >= 0; r--) {
if (rows % 10 == r) digitalWrite(DMD_PIN_C, HIGH);//SDI PA3
else digitalWrite(DMD_PIN_C, LOW);//SDI PA3
digitalWrite(DMD_PIN_A, HIGH);//DCLK PA1
digitalWrite(DMD_PIN_A, LOW);//DCLK PA1
}
digitalWrite(DMD_PIN_B, LOW);//Oe PA2
// GPIOA->BSRR = (rows << 1);
digitalWrite(DMD_PIN_nOE, LOW);//OE
rows++;
}
пины у меня другие, но вряд ли это влияет на работу… код посмотрю позже.
Спасибо.
Посмотрел, разница вот в чем. В этом коде Вы каждый раз заново задвигаете в регистр все 10 бит:
а я при каждом проходе лишь проталкиваю содержимое регистра на 1 бит вперед.
Вероятно этот регистр так не работает.
Если хотите, этот код как есть можно вставить в шаблон и проверить.
Попробовал так , как Вы сказали…
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);//Oe PA2
for (int r = 9; r >= 0; r--) {
if (curr_row % 10 == r) digitalWrite(pin_DMD_C, HIGH);//SDI PA3
else digitalWrite(pin_DMD_C, LOW);//SDI PA3
digitalWrite(pin_DMD_A, HIGH);//DCLK PA1
digitalWrite(pin_DMD_A, LOW);//DCLK PA1
}
digitalWrite(pin_DMD_B, LOW);//Oe PA2
}
Печалька… ![]()
Вадим, кажется вижу в чем проблема. Ваши пины для цветовых каналов не подходят. Вот цитата из описания к версии 0.9.0 со старого форума:
Важно - использование ДМА требует подключения матрицы к строго определенным пинам, цветовые каналы R0-G0-B0-R1-G1-B1 к пинам PA0-PA5, сигнал CLK - к PA6. Старый режим RGB с возможностью относительно свободного выбора пинов сохранен для совместмости, но код режима изменился - теперь он называется COLOR_4BIT_Packed. ДМА в этом режиме не используется.
Попробуйте запустить код в цветовом режиме COLOR_4BIT_Packed
DMD_RGB_SHIFTREG_ABC <RGB80x40s10_sh, COLOR_4BIT_Packed> dmd(mux_list, DMD_PIN_nOE, DMD_PIN_SCLK, custom_rgbpins, DISPLAYS_ACROSS, DISPLAYS_DOWN, ENABLE_DUAL_BUFFER);
Прощу прощения, библиотека большая, я уже сам начинаю забывать детали.
‘COLOR_4BIT_Packed’ was not declared in this scope
Наверно у меня Версия не самая последняя…
упс…
COLOR_4BITS_Packed
Ура, Заполняет по четверти экрана, начиная с левого верхнего угла,
Но сильно мерцает, и строки которые ещё не заполнены, тоже бледно мерцают…
поясните
попробуйте вернуть мой код set_mux() из сообщения 127
Сложно описать сначала заполняется четвёртая часть экрана, 40х20 пикселей слева сверху, затем сверху справа, затем снизу слева …
при заполнение бегут по 2 строки,цвет синий и всё сильно мерцает…
в итоге заполняется все?
Если да, то значит надо подбирать преобразование, которое в функции
get_base_addr()
Если нет - значит что-то работает неправильно.
Заполняется всё…
Вернул Ваш код из 126
Заполненные строки практически не мерцают, но мерцают соседние строки рядом с заполняемыми по одной сверху и снизу… но это наверное потому я nOE подключил некорректно …
тут удаленно ничего не могу сказать.
У Вас его надо к каким то определённым, из за Шима у меня PA0
пин OE нужно выбрать среди выходов таймера3 – PB0 PB1 PA6 PA7.