И ещё вопрос, на F407 в режиме DMA не генерируется сигнал на PA0-PA6 анализатор показывает L сигнал.
Уверены, что не напутали с характеристиками? Покажите, пожалуйста, четкие фото панели с обратной стороны.
Речь точно про эту библиотеку? Она не поддерживает контроллеры F407
С модулем точно ничего не перепутал,данные брал с конфиг брал с приёмной карты novastar, с другими паттерна и работает ещё хуже . За f407 извиняюсь,просто читал ваши посты про dma и думал удалось реализовать. На плате нашлись 74hc245c + icnd2013ep и ещё какие-то микрухи (скорее всего драйвера) на них не читается маркировка от слова совсем.
Хм… просто 104х52 необычный размер. Хотя если подумать, с промежутком 3мм это получается почти стандартные 320х160 мм.
Судя по наклейке на панели, используются драйвера icn2013 и sm16306. Первый самый обычный, а вот со вторым встречаюсь в первый раз. Даташит на китайском и сразу не могу сказать, заработает он или нет.
Сейчас не дома и смогу заняться этим на следующей неделе.
DMA работает, но я работаю с платами "блекпил’ с контроллерами F401 и F411, с F407 не пробовал.
Посмотрел код dma в библиотеке, скорее всего проблема лишь в выбранном таймере, потому что выходы tim1 это PE
Здравствуйте. Все еще разбираюсь в библиотеке и в файле DMD_STM32.cpp увидел две функции с одинаковым названием: DMD::drawChar.
int DMD::drawChar(const int bX, const int bY, const unsigned char letter, uint16_t color, byte orientation)
{
uint8_t height = Font->get_height();
return drawChar(bX, bY, letter, color, 0, height, orientation);
}
/*--------------------------------------------------------------------------------------*/
int DMD::drawChar(const int bX, const int bY, const unsigned char letter, uint16_t color, int16_t miny, int16_t maxy, byte orientation)
{
if ((bX >= _width) || (bY >= _height)) return -1;
unsigned char c = letter;
if (!Font->is_char_in(c)) return 0;
uint8_t fg_col_bytes[4];
uint8_t bg_col_bytes[4];
uint16_t bg_color = inverse_color(color);
uint8_t height = Font->get_height();
// temp parameter for beta version
uint8_t matrix_h = 16;
if (c == ' ') { //CHANGED FROM ' '
if (orientation) { // vertical scroll
this->drawFilledBox(bX, bY, bX + height, bY + matrix_h, bg_color);
return height;
}
else { // normal scroll
int charWide = Font->get_char_width(' ');
this->drawFilledBox(bX, bY + miny, bX + charWide, bY + maxy, bg_color);
return charWide;
}
}
if (Font->is_gfx_font()) {
DMD_GFX_Font* ff = (DMD_GFX_Font*)Font;
GFXfont* gfxFont_p = ff->get_font_by_char(c);
c -= ff->get_first_by_char(c);
#if (defined(__STM32F1__) || defined(__STM32F4__))
GFXglyph* glyph = &((gfxFont_p->glyph)[c]);
uint8_t* bitmap = gfxFont_p->bitmap;
#endif
uint16_t bo = pgm_read_word(&glyph->bitmapOffset);
uint8_t w = pgm_read_byte(&glyph->width);
uint8_t h = pgm_read_byte(&glyph->height);
int8_t yo = height + (int8_t)pgm_read_byte(&glyph->yOffset);
uint8_t xx, yy, bits = 0, bit = 0, bsize, hh;
int8_t xo = (int8_t)pgm_read_byte(&glyph->xOffset);
uint8_t ww = pgm_read_byte(&glyph->xAdvance);
if (orientation) { // vertical scroll
xo = yo;
yo = w + (matrix_h - w) / 2;
hh = xo + h;
ww = hh;
this->drawFilledBox(bX, bY, bX + hh, bY + matrix_h, bg_color);
}
else {
if (fast_Hbyte) {
getColorBytes(fg_col_bytes, color);
getColorBytes(bg_col_bytes, bg_color);
}
this->drawFilledBox(bX, bY + miny, bX + ww, bY + maxy, bg_color);
}
for (yy = 0; yy < h; yy++) {
for (xx = 0; xx < w; xx++) {
if (!(bit++ & 7)) {
bits = pgm_read_byte(&bitmap[bo++]);
}
if ((!orientation) && (fast_Hbyte)) {
bsize = ((w - xx) > 8) ? 8 : (w - xx);
uint8_t bbit = (bit - 1) & 7;
if (bsize > (8 - bbit)) bsize = 8 - bbit;
drawHByte(bX + xo + xx, bY + yo + yy, bits, bsize, fg_col_bytes, bg_col_bytes);
bit += bsize - 1;
xx += bsize - 1;
bits <<= bsize;
}
else {
uint16_t col;
if (bits & 0x80) { col = color; }
else { col = bg_color; }
if (orientation) { // vertical scroll
writePixel(bX + xo + yy, bY + yo - xx, col);
}
else {
writePixel(bX + xo + xx, bY + yo + yy, col);
}
bits <<= 1;
}
}
}
return ww;
}
else {
DMD_Standard_Font* ff = (DMD_Standard_Font*)Font;
uint8_t width = ff->get_char_width(c);
uint8_t bytes = (height + 7) / 8;
uint16_t index = ff->get_bitmap_index(c);
c -= ff->get_first();
if (bX < -width || bY < -height) return width;
// last but not least, draw the character
for (uint8_t j = 0; j < width; j++) { // Width
for (uint8_t i = bytes - 1; i < 254; i--) { // Vertical Bytes
uint8_t data = pgm_read_byte(ff->font_ptr + index + j + (i * width));
int offset = (i * 8);
if ((i == bytes - 1) && bytes > 1) {
offset = height - 8;
}
for (uint8_t k = 0; k < 8; k++) { // Vertical bits
if ((offset + k >= i * 8) && (offset + k <= height)) {
if (data & (1 << k)) {
writePixel(bX + j, bY + offset + k, color);
}
else {
writePixel(bX + j, bY + offset + k, bg_color);
}
}
}
}
}
return width;
}
}
Хотелось бы узнать, почему эти функции имеют одинаковые имена и почему не происходит конфликта из-за этого?
Гугал: “Перегрузка функций С++”. Читать до понимания
Функция - это не только название, но и параметры !
Честно говоря, я жду сделанную вами библиотеку для 80х40 , 1/10 scan.
@Vahoo
вот с этим шаблоном что выводит?
У меня еще вопрос: как можно сделать две бегущие строки одновременно?
Я попытался сделать по аналогии через функцию dmd.stepMarquee(); но у меня сдвигается только последний нарисованный массив. А первый массив стоит статично.
вручную циклическим изменением координаты текста
dmd.stepMarquee(); может быть только один
Можете запустить код, заполняющий матрицу по одному пикселю по строкам?
Буду рад помощи)
@craftish
Здравствуйте
Покажите часть кода скетча, где задаются пины и инициализацию объекта DMD.
Какую плату используете?
Пожалуйста, запустите тест заполнения матрицы с этими шаблонами:
#define RGB80x40_S10_pt1 4,80,40,10,1
и
#define RGB80x40_S10_pt2 4,80,40,10,2
и запишите видео с заполнением хотя бы первых 5-6 строк
Если хотите, можем перейти в почту
#define RGB104x52_S13_craft 4,112,52,13,3
// ==== DMD_RGB pins ====
// mux pins - A, B, C... all mux pins must be selected from same port!
#define DMD_PIN_A PB6
#define DMD_PIN_B PB5
#define DMD_PIN_C PB11
#define DMD_PIN_D PB10
#define DMD_PIN_E PB1
// 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 PB0
#define DMD_PIN_SCLK PB7
// 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[] = { PA6, PA0,PA1,PA2,PA3,PA4,PA5 }; // CLK, R0, G0, B0, R1, G1, B1
DMD_RGB <RGB104x52_S13_craft, COLOR_4BITS> dmd(mux_list, DMD_PIN_nOE, DMD_PIN_SCLK, custom_rgbpins, DISPLAYS_ACROSS, DISPLAYS_DOWN, ENABLE_DUAL_BUFFER);