Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Дисплеи и индикация » Светодиодная матрица HUB75.


Светодиодная матрица HUB75.

Сообщений 1 страница 13 из 13

1

Подпрограмма переноса подготовленных буферов в матрицу. В данном случае использую две матрицы 64х32.
Длина строки 16 байт. Высота 16 бит верхней части, 16 нижней. Таких подпрограм 4 с учетом высоты символа 8 бит, и разукрашивания дисплея.

Код:
'=============================================================
Загрузка_верх_1:
  R_1 = 0 : G_1 = 0 : B_1 = 0 : R_2 = 0 : G_2 = 0 : B_2 = 0 'Обнуление всех данных для передачи
  Oe = 1                                                    'Отключение всего дисплея
  For Temp2 = 1 To 16                                       ' Загружаем 16 байт (одну строку)
'-----------------------------------------------------------------------------------------
    !push R16
    !push R17

    Loadadr Data1(temp2) , X
    !ld R16 , X
    !ldi R17 , 8    ' 8 бит в байте

 Next_bit1:         ' Загоняем данные
    '!SBRc R16 , 0
    ' R_1 = 1
    !SBRc R16 , 0
     G_1 = 1
    !SBRc R16 , 0
    B_1 = 1
    '!SBRs R16 , 0   ' Пропустить если бит в регистре установлен
    ' R_1 = 0
    !SBRs R16 , 0   ' Пропустить если бит в регистре установлен
     G_1 = 0
    !SBRs R16 , 0
     B_1 = 0
    !roR R16        ' Сдвигаем влево биты в байте
   Write_clk1:      ' Передаём тактовые импульсы
    Clk = 1
    Clk = 0

    !dec R17        ' Считаем биты
 !brne Next_Bit1

    !pop R16
    !pop R17
'-----------------------------------------------------------------------------------------=
  Next
  Pulseout Portg , 3 , 5                                    'Счелкаем защелкой для переноса содержимого регистров в буфера индикации
  Oe = 0                                                    'Включаем дисплей
Return
'======================================================================

Это код Алекандра для передачи по SPI.
В данном случае включаются зеленый, и синий одновременно. Красный закомментирован. Получается голубой цвет.
Строка = " Улица #" + Temper_str + "°C    &" + Vbatstr + "В "
Вся строка будет голубого цвета.
Как сделать например(" Улица) красный, (#" + Temper_str + "°C) зеленый, ( &" + Vbatstr + "В ") синий?
Между символами в скобках пробел. Шрифт этой строки 5х8. Те переход на другой цвет можно сделать на черном месте, если считать байтами.

0

2

https://upforme.ru/uploads/0000/25/b8/2019/t886449.jpg
Весь код.
https://disk.yandex.ru/d/kC3upO6X0G458w
Заметил, когда послал. Запятая неправильно стоит в идикации напряжения аккума уличного датчика температуры.
Передача идет по UART на HC-12. Выбрано место в тени, расстояние около 100м.

Отредактировано rom-i (2025-11-01 17:52:27)

0

3

Наверное как-то так. Совета прошу в ASM недопонимаю.

Код:
'==================================================================
Загрузка_верх_1:
  R_1 = 0 : G_1 = 0 : B_1 = 0 : R_2 = 0 : G_2 = 0 : B_2 = 0
  Oe = 1
  For U = 1 To 16                                           ' Загружаем 16 байт (одну строку)
      For W = 0 To 7
          Temp = Data1(u). W
          '---------------------------------------------------------------------------------
          If U = 1 Or U = 2 Or U = 3 Or U = 4 Or U = 5 And Temp = 1 Then
              R_1 = 1 : B_1 = 1                             'Фиолетовый
          End If
          '---------------------------------------------------------------------------------
          If U = 6 Or U = 7 Or U = 8 Or U = 9 Or U = 10 And Temp = 1 Then
              G_1 = 1 : B_1 = 1                             'Голубой
          End If
          '----------------------------------------------------------------------------------
          If U = 11 Or U = 12 Or U = 13 Or U = 14 Or U = 15 Or U = 16 And Temp = 1 Then
              R_1 = 1                                       'Красный
          End If
          '----------------------------------------------------------------------------------
          Clk = 1 : Clk = 0                                 ' Передаём тактовый импульс
          R_1 = 0 : G_1 = 0 : B_1 = 0
      Next W
   Next U
'-----------------------------------------------------------------------------------------=
  Pulseout Portg , 3 , 5
  Oe = 0
Return
'============================================================

Нет даташита. Сколько по времени тактуха.
Может нужно писать задержки.
Или:
          Clk = 1                                 ' Передаём тактовый импульс
          R_1 = 0 : G_1 = 0 : B_1 = 0
          Clk = 0
стоку Clk = 1 : Clk = 0                                 ' Передаём тактовый импульс
заменить на Pulseout Portb , 7 , 5                             'Clk Alias Portb.7
Надежда на то, что уже ктото делал.

Отредактировано rom-i (2025-11-01 16:58:42)

0

4

Мало того, что вложенный цикл, так еще и работу IF тормозите нещадно этими OR ... ;)

Можно же проще.
If U < 6 Then...
If U > 10 Then...
Диапазон 6 ... 10 выполняется при невыполнении первых двух условий.

+1

5

Nord написал(а):

Мало того, что вложенный цикл, так еще и работу IF тормозите нещадно этими OR ...
Можно же проще.
If U < 6 Then...
If U > 10 Then...
Диапазон 6 ... 10 выполняется при невыполнении первых двух условий.

Не правильно поняли. В образце последовательность. В релале каждый байт разукрашивать. Лучше бит.
Вот почему выбрано байтовое условие.
Например:
   Select case u
       Case 1 To 5 : ---
Или же:
   Select case u
        Case 1: ---
        Так 16 вариантов
Как это рассматриваете?

Отредактировано rom-i (2025-11-01 19:26:03)

0

6

Я не о вопросе понимания, а о более скоростном подходе к сравнению данных. ;)

Как-то был поднят вопрос о "неуспеваемости" МК.
Вот отсюда и пляшем... ;)

0

7

Да что же непонятного ? ;)

Неважно, что сравнивать в инструкции IF, биты или байты.
Важно КАК это делать и КАКИМ способом, о чем я и сказал выше и даже привел пример ускорения процесса.
Поставленная задача мне неведома, но приведенный фрагмент навел на размышления...

В Разделе  FAQ... есть Тема про скорость отработки операторов.
Думаю, она была пролистана хотя бы раз... ;)
Там много интересного... ;)

И Си тут ни при чем... Это так, лирическое... ;)

0

8

rom-i написал(а):

В этом, и есть важность. Без этого ответа остаешся один, просто один с программой(Bascom AVR).
Любая подсказка важна.

Ну, тут чем смог - тем помог, если помогло... ;)

А так что мешает изменить фрагмент в соответствии с предложенной логикой ?
И оценить, есть ли прирост скорости ?
Или надо расписать "от и до" ? ;)

0

9

Nord
Картинки выкладывают на этих матрицах.
На этой матрице можно нарисовать картинку. Но вопрос стал как ее разукрасить?

Отредактировано rom-i (2025-11-01 21:08:44)

0

10

rom-i написал(а):

Картинки выкладывают на этих матрицах.
На этой матрице можно нарисовать картинку. Но вопрос стал как ее разукрасить?

Я с подобными матрицами не работал, но подозреваю, что с/д там RGB.
Следовательно, на каждый должно быть порядка двух байт.
Где-то в них и кроется "раскраска"... ;)

0

11

Nord написал(а):

Я с подобными матрицами не работал, но подозреваю, что с/д там RGB.
Следовательно, на каждый должно быть порядка двух байт.
Где-то в них и кроется "раскраска"...

Передача по HUB75:
OE = 1 гасится матрица, что бы не было помех.
Дальше как SPI но данных сразу 6. Вот в чем вся проблема. R1,G1,B1 входы цветов верхних 16 строк, R2,G2,B2 соответсвенно нижних 16. Выставил 1 или 0 на нужных входах, тактнул Clk. Набил в данном случае 128 раз.
Строки выбираются входами A, B, C, D в обычном двоичном формате сразу для верха, и низа одновременно.
Выставил номер строки от 0000 до 1111, клацнул входом переноса данных регистров сдвига в выходные буфера.
OE = 0 включаем выходные драйвера светодиодов. По сути обычная динамическая индикация строчками.
Переключает их для равномерности свечения таймер
По ночалу писал обычным Shiftout. Годится для одного порта. Просто хоть как-то подружится с этой матрицей одним цветом. На ASM не работают If. Нельзя в текстовой стоке поменять цвета.
Есть еще одна засада. Шрифты берутся из обычного встоенного в Баском фонтэдитора. В нем символы пишутся столбиками, а передача идет строчками. Добавляется еще один буферный массив для переворачивания символов.
Верняя сттрока у меня часы. Для нее отдельный двухбайтный буфер. Изменяющиеся символы побитно сдвигаюся вниз. Следующая цифра заменяет предидущую. Красиво выглядит на секундах. Да, и сама строка появляется при первом включении построчно сверху в низ.

Отредактировано rom-i (2025-11-03 10:16:47)

0

12

Забыл рассказать при использовании Shiftout подсвечивались пиксели следующей строчки. На ASM этого нет.
В реале мое предложение на If может не работать из-за длительности. Расскажу в среду 5 числа.

0

13

На If даже UART бросил работать. Соседние строчки засвечиваются.

Код:
'==========================================================
Загрузка_верх_2:
  R_1 = 0 : G_1 = 0 : B_1 = 0 : R_2 = 0 : G_2 = 0 : B_2 = 0
  Oe = 1
  For U = 1 To 16                                           ' Загружаем 16 байт (одну строку)
      For W = 0 To 7
          Temp = Data1(u). W
          '---------------------------------------------------------------------------------
          If Temp = 1 Then
              Select Case U
               Case 1 To 4 : B_1 = 1
               Case 5 To 10 : G_1 = 1 : B_1 = 1
               Case 11 To 16 : R_1 = 1
              End Select
          End If
          '----------------------------------------------------------------------------------
          Clk = 1   ' Передаём тактовый импульс
          R_1 = 0 : G_1 = 0 : B_1 = 0
          Clk = 0
      Next W
   Next U
'-----------------------------------------------------------------------------------------=
  Pulseout Portg , 3 , 5
  Oe = 0
Return
'================================================================

Более рабочий код. Но все равно сильно замедляет. Даже мерцать начинает.

0


Вы здесь » Программирование ATMEL в BASCOM. » Дисплеи и индикация » Светодиодная матрица HUB75.