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

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

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

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



WS2812B

Сообщений 91 страница 120 из 128

91

Ассемблер, только для ускорения процесса

Почти без ASM

$map              ' Получаем карту распределения памяти компилятором Bascom
  $regfile = "m1284pdef.dat"       ' Используемый контроллер
  $crystal = 16000000       ' 8 МГц    , кварц для стабильной работы USART во всём диапазоне скоростей передачи и приёма
  $framesize = 512       'размер области используемой и необходимой для преобразований
  $hwstack = 512       ' Размер аппаратного стека
  $swstack = 512       ' Размер программного стека

  Const Amount_rgb = 16

'*******************************************************************************
                     'Переменные для получения случайного числа
'*******************************************************************************
  Dim Rnd_a As Byte '
  Dim Rnd_b As Byte       '
  Dim Rnd_c As Byte       'выходное случайное число

  Rnd_a = 123 : Rnd_b = 23 : Rnd_c = 18       'Начальные Значения. Любые, Кроме 0

  Declare Sub Hsv2rgb(byval In_h As Byte , Byval In_s As Byte , Byval In_v As Byte , Out_r As Byte , Out_g As Byte , Out_b As Byte)

  Dim Hr As Byte
  Dim Hg As Byte
  Dim Hb As Byte
  Dim Sr As Byte
  Dim Sg As Byte
  Dim Sb As Byte
  Dim Tmp As Byte
  Dim Temps As Word
  Dim In_h_byte As Byte , In_s_byte As Byte , In_v_byte As Byte

  Config Rainbow = 1 , Rb0_len = Amount_rgb , Rb0_port = Porta , Rb0_pin = 3 , _
  '                                                               ^--- connected to pin 3
  '                                             ^--------------------- connected to portD
  '                                ^---------------------------------- 49 leds on stripe
  '                ^-------------------------------------------------- 1 channel

  Const Led_len = 3
  Const Farbspeicher = 3 * Led_len

  Dim Led_array(farbspeicher) As Byte
  Const Beginn_rot = Led_len + 1
  Const Beginn_blau = Beginn_rot + Led_len

  Dim N1 As Byte
  Dim N2 As Byte
  Dim N3 As Byte
'НАЧАЛЬНЫЕ ЗНАЧЕНИЯ ПАЛИТРЫ
  N1 = 0 : N2 = 64 : N3 = 128

  Dim Color(3) As Byte
  R Alias Color(_base) : G Alias Color(_base + 1) : B Alias Color(_base + 2)

  Dim Color_up As Byte
  Dim Min_color_up As Byte
  Dim Brightness_up As Byte
  Dim Count_fire_up As Byte
  Dim Saturation_up As Byte
  Dim Temp_1_rgb_led As Byte
  Dim Temp_2_rgb_led As Byte
  Dim Count_rainbow_up As Byte
  Dim Flag_rgb_effect_up As Byte
  Dim Count_color_fire_up As Byte
  Dim Count_color_rainbow_up As Byte
  Dim Direction_saturation_up As Byte

  Rb_selectchannel 0       ' select first channel
  Rb_clearcolors       'clear colors in memory
  Rb_send

  Dim Rgb_led_up(20) As Byte

  Rgb_led_up(1) = 0
  Rgb_led_up(2) = 8
  Rgb_led_up(3) = 16
  Rgb_led_up(4) = 30
  Rgb_led_up(5) = 60
  Rgb_led_up(6) = 110
  Rgb_led_up(7) = 120
  Rgb_led_up(8) = 140
  Rgb_led_up(9) = 160
  Rgb_led_up(10) = 170
  Rgb_led_up(11) = 180
  Rgb_led_up(12) = 190
  Rgb_led_up(13) = 200
  Rgb_led_up(14) = 210
  Rgb_led_up(15) = 220
  Rgb_led_up(16) = 230

'===============================================================================
'--------------  Разрешаем работу необходимых прерываний  ----------------------
'===============================================================================

'===============================================================================

'------------  Разрешаем работу всех включенных прерываний  --------------------
'  Enable Interrupts
'===============================================================================

'         Предварительная проверка и запуск

'===============================================================================

  Min_color_up = 8
  Color_up = 12
  Brightness_up = 255
  Saturation_up = 255

'0 - радуга, 1 - огонь
  Flag_rgb_effect_up = 0

  Rb_selectchannel 0

'===============================================================================

'                   Г Л А В Н Ы Й         Ц И К Л
  Main:
'===============================================================================

       Gosub Processing_rgb
       Rb_send

       Waitms 20

'   Power Idle       ' Отправляем МК на тихий час
'===============================================================================
  Goto Main
End
'===============================================================================
'       П О Д К Л Ю Ч Е Н И Е     Р А Б О Ч И Х     М О Д У Л Е Й
'===============================================================================

'===============================================================================
  Processing_rgb:
'-------------------------------------------------------------------------------
       If Flag_rgb_effect_up = 0 Then

           Count_color_rainbow_up = 0

           For Count_rainbow_up = 1 To Amount_rgb
               Incr Rgb_led_up(count_rainbow_up)
               Temp_1_rgb_led = Rgb_led_up(count_rainbow_up) - 85
               Temp_2_rgb_led = Rgb_led_up(count_rainbow_up) - 170
               R = Lookup(rgb_led_up(count_rainbow_up) , Hsv)
               G = Lookup(temp_1_rgb_led , Hsv)
               B = Lookup(temp_2_rgb_led , Hsv)
               Rb_setcolor Count_color_rainbow_up , Color(1)
               Incr Count_color_rainbow_up
           Next Count_rainbow_up

'           Flag_write_ws2812_up = 1

         Else

             Count_color_fire_up = 0

             For Count_fire_up = 1 To Amount_rgb
                 Rgb_led_up(count_fire_up) = Rnd(color_up)

                 If Rgb_led_up(count_fire_up) < Min_color_up Then
                     Rgb_led_up(count_fire_up) = Min_color_up
                 End If

                 Gosub Rnd_byte

                 Brightness_up = Rnd_c       'Rnd(255)

                 If Brightness_up < 200 Then
                     Brightness_up = 200
                 End If

                 Call Hsv2rgb(rgb_led_up(count_fire_up) , Saturation_up , Brightness_up , R , G , B)

                 Rb_setcolor Count_color_fire_up , Color(1)
                 Incr Count_color_fire_up

             Next Count_fire_up       'For Count_fire_up = 1 To Amount_rgb

             If Direction_saturation_up = 0 Then
                 If Saturation_up < 255 Then
                     Incr Saturation_up
                   Else
                     Direction_saturation_up = 1
                 End If       'If Насыщеность < 255 Then
               Else
                 If Saturation_up > 130 Then
                     Decr Saturation_up
                   Else
                     Direction_saturation_up = 0
                 End If       'If Насыщеность > 130 Then
             End If       'If Направ_насыщеность = 0 Then

'             Flag_write_ws2812_up = 1

         End If     'If Flag_rgb_effect_up = 0 Then

'       Flag_update_up = 0
'-------------------------------------------------------------------------------
  Return
'===============================================================================

'===============================================================================
  Rnd_byte:       'Формирование случайного числа
'-------------------------------------------------------------------------------
    !Lds R16 , {Rnd_a}       'загрузка
    !Lds R17 , {Rnd_b}
    !Lds R18 , {Rnd_c}
    !Mov R16 , R17  'A=B
    !Mov R17 , R18  'B=C
    !Lsl R17        'B<<1
    !Brcc _Null
    !Sbr R17 , 1    'добавляем "1" в D1 если 7 бит до сдвига был "1"
   _null:
    !Mov R18 , R16  'С=B+A
    !Add R18 , R17  '-||-
    !Sts {Rnd_a} , R16       'выгрузка
    !Sts {Rnd_b} , R17
    !Sts {Rnd_c} , R18
'-------------------------------------------------------------------------------
  Return
'===============================================================================

'===============================================================================
'==========Функция преобразования HSV в RGB==========
'http://ru.wikipedia.org/wiki/HSV_(%D1%86%D0%B2%D0%B5%D1%82%D0%BE%D0%B2%D0%B0%D1%8F_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C)
'===============================================================================
  Sub Hsv2rgb(byval In_h As Byte , Byval In_s As Byte , Byval In_v As Byte , Out_r As Byte , Out_g As Byte , Out_b As Byte)
'-------------------------------------------------------------------------------
   'Получим логарифмические значения цвета RGB каналов для заданного цвета из расчитанной таблицы
   Hr = Lookup(in_h , Hsv_red)
   Hg = Lookup(in_h , Hsv_green)
   Hb = Lookup(in_h , Hsv_blue)
   'Получим значения насыщенности
   In_s = Lookup(in_s , Saturation)
   Temps = Hr * In_s

   Temps = Temps / 256

   Temps = Temps + 255
   Temps = Temps - In_s
   Sr = Temps
   Temps = Hg * In_s

   Temps = Temps / 256

   Temps = Temps + 255
   Temps = Temps - In_s
   Sg = Temps
   Temps = Hb * In_s

   Temps = Temps / 256

   Temps = Temps + 255
   Temps = Temps - In_s
   Sb = Temps
   'Получим значения яркости
   In_v = Lookup(in_v , Brightness)
   Temps = In_v * Sr

   Temps = Temps / 256

   Out_r = Temps
   Temps = In_v * Sg

   Temps = Temps / 256

   Out_g = Temps
   Temps = In_v * Sb

   Temps = Temps / 256

   Out_b = Temps
'-------------------------------------------------------------------------------
  End Sub
'===============================================================================

'===============================================================================
  Hsv:
'-------------------------------------------------------------------------------
   Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
   Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
   Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
   Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
   Data 255 , 252 , 246 , 240 , 234 , 228 , 222 , 216 , 210 , 204 , 198
   Data 192 , 186 , 180 , 174 , 168 , 162 , 156 , 150 , 144 , 138 , 132
   Data 126 , 120 , 114 , 108 , 102 , 96 , 90 , 84 , 78 , 72 , 66
   Data 60 , 54 , 48 , 42 , 36 , 30 , 24 , 18 , 12 , 6
   Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
   Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
   Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
   Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
   Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
   Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
   Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
   Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
   Data 6 , 12 , 18 , 24 , 30 , 36 , 42 , 48 , 54 , 60 , 66
   Data 72 , 78 , 84 , 90 , 96 , 102 , 108 , 114 , 120 , 126 , 132
   Data 138 , 144 , 150 , 156 , 162 , 168 , 174 , 180 , 186 , 192 , 198
   Data 204 , 210 , 216 , 222 , 228 , 234 , 240 , 246 , 252 , 255
   Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
   Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
   Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
   Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
'===============================================================================

'===============================================================================
  Saturation:       '========== Насыщенность ==========
'-------------------------------------------------------------------------------
   Data 0 , 6 , 12 , 17 , 22 , 27 , 32 , 37 , 42 , 46 , 51 , 55 , 59 , 64 , 68 , 72
   Data 76 , 80 , 84 , 87 , 91 , 94 , 98 , 101 , 105 , 108 , 111 , 114 , 117 , 120 , 123 , 126
   Data 129 , 131 , 134 , 137 , 139 , 142 , 144 , 147 , 149 , 151 , 154 , 156 , 158 , 160 , 162 , 164
   Data 166 , 168 , 170 , 172 , 174 , 175 , 177 , 179 , 180 , 182 , 184 , 185 , 187 , 188 , 190 , 191
   Data 193 , 194 , 195 , 197 , 198 , 199 , 200 , 201 , 203 , 204 , 205 , 206 , 207 , 208 , 209 , 210
   Data 211 , 212 , 213 , 214 , 215 , 216 , 217 , 217 , 218 , 219 , 220 , 221 , 221 , 222 , 223 , 224
   Data 224 , 225 , 226 , 226 , 227 , 228 , 228 , 229 , 229 , 230 , 231 , 231 , 232 , 232 , 233 , 233
   Data 234 , 234 , 235 , 235 , 235 , 236 , 236 , 237 , 237 , 238 , 238 , 238 , 239 , 239 , 240 , 240
   Data 240 , 241 , 241 , 241 , 242 , 242 , 242 , 242 , 243 , 243 , 243 , 244 , 244 , 244 , 244 , 245
   Data 245 , 245 , 245 , 246 , 246 , 246 , 246 , 246 , 247 , 247 , 247 , 247 , 247 , 248 , 248 , 248
   Data 248 , 248 , 248 , 249 , 249 , 249 , 249 , 249 , 249 , 250 , 250 , 250 , 250 , 250 , 250 , 250
   Data 250 , 251 , 251 , 251 , 251 , 251 , 251 , 251 , 251 , 251 , 252 , 252 , 252 , 252 , 252 , 252
   Data 252 , 252 , 252 , 252 , 252 , 252 , 253 , 253 , 253 , 253 , 253 , 253 , 253 , 253 , 253 , 253
   Data 253 , 253 , 253 , 253 , 253 , 254 , 254 , 254 , 254 , 254 , 254 , 254 , 254 , 254 , 254 , 254
   Data 254 , 254 , 254 , 254 , 254 , 254 , 254 , 254 , 254 , 254 , 254 , 254 , 254 , 255 , 255 , 255
   Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
'===============================================================================

'===============================================================================
  Brightness:       '========== Яркость ==========
'-------------------------------------------------------------------------------
   Data 0 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1
   Data 1 , 1 , 1 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2
   Data 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 3 , 3 , 3 , 3 , 3
   Data 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 4 , 4 , 4 , 4 , 4 , 4
   Data 4 , 4 , 4 , 4 , 4 , 4 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 6
   Data 6 , 6 , 6 , 6 , 6 , 6 , 6 , 7 , 7 , 7 , 7 , 7 , 7 , 8 , 8 , 8
   Data 8 , 8 , 8 , 9 , 9 , 9 , 9 , 9 , 10 , 10 , 10 , 10 , 10 , 11 , 11 , 11
   Data 11 , 12 , 12 , 12 , 12 , 13 , 13 , 13 , 14 , 14 , 14 , 14 , 15 , 15 , 15 , 16
   Data 16 , 16 , 17 , 17 , 18 , 18 , 18 , 19 , 19 , 20 , 20 , 21 , 21 , 21 , 22 , 22
   Data 23 , 23 , 24 , 24 , 25 , 25 , 26 , 27 , 27 , 28 , 28 , 29 , 30 , 30 , 31 , 32
   Data 32 , 33 , 34 , 35 , 35 , 36 , 37 , 38 , 39 , 39 , 40 , 41 , 42 , 43 , 44 , 45
   Data 46 , 47 , 48 , 49 , 50 , 51 , 52 , 53 , 55 , 56 , 57 , 58 , 59 , 61 , 62 , 63
   Data 65 , 66 , 68 , 69 , 71 , 72 , 74 , 76 , 77 , 79 , 81 , 82 , 84 , 86 , 88 , 90
   Data 92 , 94 , 96 , 98 , 100 , 102 , 105 , 107 , 109 , 112 , 114 , 117 , 119 , 122 , 125 , 127
   Data 130 , 133 , 136 , 139 , 142 , 145 , 148 , 151 , 155 , 158 , 162 , 165 , 169 , 172 , 176 , 180
   Data 184 , 188 , 192 , 197 , 201 , 205 , 210 , 214 , 219 , 224 , 229 , 234 , 239 , 244 , 250 , 255
'===============================================================================

'===============================================================================
  Hsv_red:          '========== Цветовой тон для красного ==========
'-------------------------------------------------------------------------------
   Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
   Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
   Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
   Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
   Data 255 , 252 , 246 , 240 , 234 , 228 , 222 , 216 , 210 , 204 , 198
   Data 192 , 186 , 180 , 174 , 168 , 162 , 156 , 150 , 144 , 138 , 132
   Data 126 , 120 , 114 , 108 , 102 , 96 , 90 , 84 , 78 , 72 , 66
   Data 60 , 54 , 48 , 42 , 36 , 30 , 24 , 18 , 12 , 6
   Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
   Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
   Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
   Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
   Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
   Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
   Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
   Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
   Data 6 , 12 , 18 , 24 , 30 , 36 , 42 , 48 , 54 , 60 , 66
   Data 72 , 78 , 84 , 90 , 96 , 102 , 108 , 114 , 120 , 126 , 132
   Data 138 , 144 , 150 , 156 , 162 , 168 , 174 , 180 , 186 , 192 , 198
   Data 204 , 210 , 216 , 222 , 228 , 234 , 240 , 246 , 252 , 255
   Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
   Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
   Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
   Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
'===============================================================================

'===============================================================================
  Hsv_green:        ' ========== Цветовой тон для зелёного ==========
'-------------------------------------------------------------------------------
   Data 6 , 12 , 18 , 24 , 30 , 36 , 42 , 48 , 54 , 60 , 66
   Data 72 , 78 , 84 , 90 , 96 , 102 , 108 , 114 , 120 , 126 , 132
   Data 138 , 144 , 150 , 156 , 162 , 168 , 174 , 180 , 186 , 192 , 198
   Data 204 , 210 , 216 , 222 , 228 , 234 , 240 , 246 , 252 , 255
   Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
   Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
   Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
   Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
   Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
   Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
   Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
   Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
   Data 255 , 252 , 246 , 240 , 234 , 228 , 222 , 216 , 210 , 204 , 198
   Data 192 , 186 , 180 , 174 , 168 , 162 , 156 , 150 , 144 , 138 , 132
   Data 126 , 120 , 114 , 108 , 102 , 96 , 90 , 84 , 78 , 72 , 66
   Data 60 , 54 , 48 , 42 , 36 , 30 , 24 , 18 , 12 , 6
   Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
   Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
   Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
   Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
   Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
   Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
   Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
   Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
'===============================================================================

'===============================================================================
  Hsv_blue:         '========== Цветовой тон для синего ==========
'-------------------------------------------------------------------------------
   Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
   Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
   Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
   Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
   Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
   Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
   Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
   Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
   Data 6 , 12 , 18 , 24 , 30 , 36 , 42 , 48 , 54 , 60 , 66
   Data 72 , 78 , 84 , 90 , 96 , 102 , 108 , 114 , 120 , 126 , 132
   Data 138 , 144 , 150 , 156 , 162 , 168 , 174 , 180 , 186 , 192 , 198
   Data 204 , 210 , 216 , 222 , 228 , 234 , 240 , 246 , 252 , 255
   Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
   Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
   Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
   Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
   Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
   Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
   Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
   Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
   Data 255 , 252 , 246 , 240 , 234 , 228 , 222 , 216 , 210 , 204 , 198
   Data 192 , 186 , 180 , 174 , 168 , 162 , 156 , 150 , 144 , 138 , 132
   Data 126 , 120 , 114 , 108 , 102 , 96 , 90 , 84 , 78 , 72 , 66
   Data 60 , 54 , 48 , 42 , 36 , 30 , 24 , 18 , 12 , 6
'===============================================================================

0

92

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

Мою глупую программу тоже прошу переписать по лучьшему подходу

А тамочки и переписывать то нечего.

Разве что if .... then
               end if

заменить на таблицу, будет на много быстрее.

0

93

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

Не понял как привязать SPI к длительности 1,25us.

Я пока тоже не совсем всё понял. Просто времени не всегда хватает посидеть, подумать.

0

94

sasha_1973
В таблице столкнулся с проблемой. Предидущие светюны должны оставаться светится, а таблица не может брать ранние значения. Или мож чего недопонимаю.
Спасибо за радугу. Дописал массив под 120 матриц с шагом цвета 2 бита. Довольно красиво. Огонь не понравился, вычеркнул. У тиньки озу не хватает. Пришлось перейти на мегу328. С 8 нормально, но вдруг чего добавить решиться.
https://upforme.ru/uploads/0000/25/b8/2019/t300700.jpg

0

95

sasha_1973
Почему в подпрограмме огонь работает только красный цвет?
https://upforme.ru/uploads/0000/25/b8/2019/t83277.jpg

0

96

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

Почему в подпрограмме огонь работает только красный цвет?

Мне кажется у Вас Протеус неправильно отрабатывает. У меня именно всплески огня.

А в железе как ?

0

97

sasha_1973
Железо пока недоступно. Ленты только заказаны.
Можно скрин имеено как у Вас?
Еще хотел спросить про команду Rb_selectchannel 0. Что означает активный канал?
Использую два порта. Каждый привязан к своему АЦП. Если значение обоих АЦП < 8 (пока так для протеус), на обоих лентах (пока) радуга.
https://upforme.ru/uploads/0000/25/b8/2019/t96591.jpg
https://upforme.ru/uploads/0000/25/b8/2019/t152009.jpg
Переключение портов.

Код:
 If Ацп_радуга_0 < 8 And Ацп_радуга_1 < 8 Then
       Rb_changepin Nprt , 0
       Gosub Processing_rgb
       Rb_send

       Rb_changepin Nprt , 1
       Gosub Processing_rgb
       Rb_send
       Waitms 20
    Else
       Rb_changepin Nprt , 0
       Уровень = Ацп_0
       If Уровень > 119 Then Уровень = 119
       Gosub Индикатор_уровня

       Rb_changepin Nprt , 1
       Уровень = Ацп_1
       If Уровень > 119 Then Уровень = 119
       Gosub Индикатор_уровня
 End If

Отредактировано rom-i (2023-02-14 19:48:41)

0

98

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

Можно скрин имеено как у Вас?

Сколько не пытался, получается, как и у Вас. Хотя при симуляции визуально огонь.

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

Еще хотел спросить про команду Rb_selectchannel 0. Что означает активный канал?

Абсолютно точно, при условии использовании встроенной в Bascom функции.

0

99

Переиначил код с массивами, с обращением к таблице. Rgb_led_up(count_rainbow_up)

Код:
           Count_color_rainbow_up = 0
           For Count_rainbow_up = 1 To Amount_rgb
               Incr Rgb_led_up(count_rainbow_up)
               Temp_1_rgb_led = Rgb_led_up(count_rainbow_up) - 85
               Temp_2_rgb_led = Rgb_led_up(count_rainbow_up) - 170
               R = Lookup(rgb_led_up(count_rainbow_up) , Hsv)
               G = Lookup(temp_1_rgb_led , Hsv)
               B = Lookup(temp_2_rgb_led , Hsv)
               Rb_setcolor Count_color_rainbow_up , Color(1)
               Incr Count_color_rainbow_up
           Next Count_rainbow_up

Без массива влезает в тиньку 85.

Код:
           Count_color_rainbow_up = 0
           For Count_rainbow_up = 1 To Amount_rgb
               Rgb_led = Lookup(count_rainbow_up , Яркость)
               Rgb_led = Rgb_led + Сдвиг
               Temp_1_rgb_led = Rgb_led - 85
               Temp_2_rgb_led = Rgb_led - 170
               R = Lookup(rgb_led , Hsv)
               G = Lookup(temp_1_rgb_led , Hsv)
               B = Lookup(temp_2_rgb_led , Hsv)
               Rb_setcolor Count_color_rainbow_up , Color(1)
               Incr Count_color_rainbow_up
           Next Count_rainbow_up
           Incr Сдвиг
           Rb_send

Задавал вопрос "что сдвигается", все промолчали.

Отредактировано rom-i (2023-02-18 21:21:36)

0

100

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

Задавал вопрос "что сдвигается", все промолчали.

Вы знаете, когда пытаешься разобраться в таком коде, то в глазах просто пляшут чёртики. Без обид, но с именами переменных нужно что-то делать.
Вот почему именно Count_color_rainbow_up? Почему нельзя просто Count_Up.
Или зачем Temp_1_rgb_led когда можно просто Tmp1, ну и так далее Rgb_Led просто Led, мы ведь и так знаем, что это RGB.
Тогда вам и самому будет легче разобраться.
Соглашусь что со вкусами не спорят, но мне кажется, что чем меньше в коде мусора, тем самому проще.
Ветераны вспомнят как на заре компьютеров все имена имели не более 8 символов. Скорее всего мы там и научились лаконичности.  8-)
Извиняйте, что влез в ваш разговор, но это просто маленький совет.

Отредактировано sva-don (2023-02-19 11:07:25)

+2

101

Как готовые модули на WS2812 но уже матрицами 16х16?
https://upforme.ru/uploads/0000/25/b8/2019/t210324.jpg
Может кто занимался спекранализатором ЗЧ? Основу взять расчет спектра.
На этих матрицах должно красиво получиься.

Отредактировано rom-i (2023-03-09 08:53:14)

0

102

Имею массив и 16 переменных(16 столбцов). Переменная принимает 16 значений.
Матрица создана змейкой. Начьнем цикл с 1 до 16. То есть каждый четный столбец будет вверх ногами.
Например первый столбец идет от пикселя 0 до 15 вверх. Второй от 16 до 31 идет вниз. Как перевернуть второй?

0

103

https://upforme.ru/uploads/0000/25/b8/2019/t874145.jpg

Код:
$regfile = "m328def.dat"
'$crystal = 26601712
$crystal = 16000000
'----------------------KONFIGURACJA--------------------
Const Falloff = 1       'iloњж cykli po jakim sіupki opadn№, wolne opadanie
Const Lcd_offset = 1
Const Czulosc = 20
Const Amount_rgb = 256
'----------------------STAЈE---------------------------
Const Timer1_h = _xtal / 44000
Const Timer1_l = _xtal / 2000
Const Poziom_a = 8 -(czulosc * 0.4)
'------------------------ZMIENNE--------------------------
Dim Div As Iram Integer At 16
Dim K As Byte
Dim I As Byte
Dim Tmp_s As Integer
Dim Tmp_c As Integer
Dim Beta As Iram Byte At 30
Dim Suma As Word
Dim Sam As Byte
Dim Sampling As Bit
Dim Rex_t As Integer , Imx_t As Integer
Dim Dane(32) As Integer
Dim Sample_h(32) As Integer
Dim Sample_l(32) As Integer
Dim Okno(32) As Byte
Dim Rex(16) As Integer
Dim Sinus(40) As Integer
Dim Wynik(16) As Byte , Wynik_o(16) As Byte
Dim Sing As Single
Dim Poziom As Integer
Dim Falloff_count(16) As Byte

Dim N As Byte , W As Byte , L As Byte
Dim Пиксель As Byte
'===============================================================================
  Config Rainbow = 1 , Rb0_len = Amount_rgb , Rb0_port = Portb , Rb0_pin = 0

  Dim Color(3) As Byte
  R Alias Color(_base) : G Alias Color(_base + 1) : B Alias Color(_base + 2)

  Rb_selectchannel 0       ' select first channel
  Rb_clearcolors       'clear colors in memory
  Rb_send
'===============================================================================
Config Adc = Single , Prescaler = 4 , Reference = Avcc
Start Adc
'===============================================================================
Config Timer1 = Timer , Prescale = 1
On Compare1a Sampleh
On Compare1b Samplel
Compare1a = Timer1_h
Compare1b = Timer1_l
'===============================================================================
For K = 0 To 31
  Sinus(k + 1) = Lookup(k , Tab_sin)
  Okno(k + 1) = Lookup(k , Okno_hanning)
Next K

Sinus(33) = Lookup(0 , Tab_sin)
Sinus(34) = Lookup(1 , Tab_sin)
Sinus(35) = Lookup(2 , Tab_sin)
Sinus(36) = Lookup(3 , Tab_sin)
Sinus(37) = Lookup(4 , Tab_sin)
Sinus(38) = Lookup(5 , Tab_sin)
Sinus(39) = Lookup(6 , Tab_sin)
Sinus(40) = Lookup(7 , Tab_sin)
'===============================================================================
Enable Interrupts
Disable Int0 : Disable Int1
Enable Timer1 : Start Timer1
'*******************************************************************************
Главный_цикл:

  Gosub Sample_high
  Main_1:
  If Sampling = 1 Then Goto Main_1

  Gosub Sample_low
  Main_3:
  If Sampling = 1 Then Goto Main_3

  Gosub Copy_low
  Gosub Dft
  Gosub Przelicz_low

  Gosub Copy_high
  Gosub Dft
  Gosub Przelicz_high

  Gosub Индикация

Goto Главный_цикл
'*******************************************************************************
Sample_low:       'pobiera 32 prуbki z czкstotliwoњci№ 2kHz
  Config Adc = Single , Prescaler = Auto , Reference = Avcc
  Start Adc
  Timer1 = 0
  Enable Compare1b
  Sam = 0
  Sampling = 1
Return
'-------------------------------------------------------------------------------
Samplel:
  Timer1 = 0
  Incr Sam
  Sample_l(sam) = Getadc(1)
  If Sam = 32 Then
     Disable Compare1b
     Sampling = 0
  End If
Return
'===============================================================================
Sample_high:       'pobiera 32 prуbki z czкstotliwoњci№ 44kHz
  Config Adc = Single , Prescaler = 2 , Reference = Avcc
  'ADC dziaіa juї doњж niestabilnie na preskalerze 2 ale na 4 juї sie nie wyrobi i prubkuje z f=37kHz
  ' przez duїe f pojawiaja sie szumy jak podajemy sygnaі z generatora
  Start Adc
  Timer1 = 0
  Enable Compare1a
  Sam = 0
  Sampling = 1
Return
'-------------------------------------------------------------------------------
Sampleh:
  Timer1 = 0
  Incr Sam
  Sample_h(sam) = Getadc(0)
  If Sam = 32 Then
     Disable Compare1a
     Sampling = 0
  End If
Return
'===============================================================================
Copy_high:
   Poziom = 0

   For K = 1 To 32
      Div = Sample_h(k)
      !asr r17
      !ror r16
      !asr r17
      !ror r16
      Sample_h(k) = Div
      Poziom = Poziom + Sample_h(k)
   Next K

   Div = Poziom
      !asr r17
      !ror r16
      !asr r17
      !ror r16
      !asr r17
      !ror r16
      !asr r17
      !ror r16
      !asr r17
      !ror r16
   Poziom = Div

   For K = 1 To 32
      Dane(k) = Sample_h(k) - Poziom
      Dane(k) = Dane(k) * Okno(k)
      Div = Dane(k)
      !asr r17
      !ror r16
      !asr r17
      !ror r16
      !asr r17
      !ror r16
      !asr r17
      !ror r16
      !asr r17
      !ror r16
      !asr r17
      !ror r16
      !asr r17
      !ror r16
      !asr r17
      !ror r16
      Dane(k) = Div

      If Dane(k) > 127 Then Dane(k) = 127
      If Dane(k) < -127 Then Dane(k) = -127

   Next K
Return
'===============================================================================
Copy_low:
   Poziom = 0

   For K = 1 To 32
      Div = Sample_l(k)
      !asr r17
      !ror r16
      !asr r17
      !ror r16
      Sample_l(k) = Div
      Poziom = Poziom + Sample_l(k)
   Next K

   Div = Poziom
      !asr r17
      !ror r16
      !asr r17
      !ror r16
      !asr r17
      !ror r16
      !asr r17
      !ror r16
      !asr r17
      !ror r16
   Poziom = Div

   For K = 1 To 32
      Dane(k) = Sample_l(k) - Poziom
      Dane(k) = Dane(k) * Okno(k)
      Div = Dane(k)
      !asr r17
      !ror r16
      !asr r17
      !ror r16
      !asr r17
      !ror r16
      !asr r17
      !ror r16
      !asr r17
      !ror r16
      !asr r17
      !ror r16
      !asr r17
      !ror r16
      !asr r17
      !ror r16
      Dane(k) = Div

      If Dane(k) > 127 Then Dane(k) = 127
      If Dane(k) < -127 Then Dane(k) = -127

   Next K
Return
'===============================================================================
Dft:
For K = 1 To 15
 Rex_t = 0
 Imx_t = 0

   For I = 0 To 31
      Beta = I * K
      Beta = Beta And 31
      Tmp_s = Sinus(beta + 1) * Dane(i + 1)
      Tmp_c = Sinus(beta + 8) * Dane(i + 1)

      Div = Tmp_s
      !asr r17
      !ror r16
      !asr r17
      !ror r16
      !asr r17
      !ror r16
      !asr r17
      !ror r16
      !asr r17
      !ror r16
      !asr r17
      !ror r16
      !asr r17
      !ror r16
      !asr r17
      !ror r16
      Tmp_s = Div

      Div = Tmp_c
      !asr r17
      !ror r16
      !asr r17
      !ror r16
      !asr r17
      !ror r16
      !asr r17
      !ror r16
      !asr r17
      !ror r16
      !asr r17
      !ror r16
      !asr r17
      !ror r16
      !asr r17
      !ror r16
      Tmp_c = Div

      Rex_t = Rex_t + Tmp_c
      Imx_t = Imx_t - Tmp_s
   Next I

      Div = Rex_t
      !asr r17
      !ror r16
      !asr r17
      !ror r16
      !asr r17
      !ror r16
      Rex_t = Div

      Div = Imx_t
      !asr r17
      !ror r16
      !asr r17
      !ror r16
      !asr r17
      !ror r16
      Imx_t = Div

   Tmp_c = Rex_t * Rex_t
   Tmp_s = Imx_t * Imx_t

   Tmp_c = Tmp_c + Tmp_s
   Rex(k + 1) = Sqr(tmp_c)

Next K
Return
'===============================================================================
Przelicz_high:
Suma = Rex(3)
Wynik(9) = Suma

Suma = Rex(4)
Wynik(10) = Suma

Suma = Rex(5)
Wynik(11) = Suma

Suma = Rex(6)
Wynik(12) = Suma

Suma = Rex(7)
If Rex(8) > Suma Then Suma = Rex(8)
Wynik(13) = Suma

Suma = Rex(9)
If Rex(10) > Suma Then Suma = Rex(10)
Wynik(14) = Suma

Suma = Rex(11)
If Rex(12) > Suma Then Suma = Rex(12)
If Rex(13) > Suma Then Suma = Rex(13)
Wynik(15) = Suma

Suma = Rex(14)
If Rex(15) > Suma Then Suma = Rex(15)
If Rex(16) > Suma Then Suma = Rex(16)
Wynik(16) = Suma
Return
'===============================================================================
Przelicz_low:
Suma = Rex(2)
Wynik(1) = Suma

Suma = Rex(3)
Wynik(2) = Suma

Suma = Rex(4)
Wynik(3) = Suma

Suma = Rex(5)
If Rex(6) > Suma Then Suma = Rex(6)
Wynik(4) = Suma

Suma = Rex(7)
If Rex(8) > Suma Then Suma = Rex(8)
Wynik(5) = Suma

Suma = Rex(9)
If Rex(10) > Suma Then Suma = Rex(10)
Wynik(6) = Suma

Suma = Rex(11)
If Rex(12) > Suma Then Suma = Rex(12)
If Rex(13) > Suma Then Suma = Rex(13)
Wynik(7) = Suma

Suma = Rex(14)
If Rex(15) > Suma Then Suma = Rex(15)
If Rex(16) > Suma Then Suma = Rex(16)
Wynik(8) = Suma
Return
'===============================================================================
Индикация:

 For K = 1 To 16       'w ci№gu jednej pкtli obliczany i wyњwietlany 1 sіupek 1/10

   Sing = Wynik(k) * 0.1
   Sing = Log10(sing)
   Sing = Czulosc * Sing       ' Const Czulosc = 20
   Tmp_c = Sing + Poziom_a       ' Poziom_a = 8 -(czulosc * 0.4)

   If Tmp_c < 0 Then Tmp_c = 0
   If Tmp_c > 16 Then Tmp_c = 16

   Wynik(k) = Tmp_c       'przeniesienie wyniku z TMP_C do zmiennej WYNIK

   If Wynik(k) > Wynik_o(k) Then
       Wynik_o(k) = Wynik(k)
     Else
       If Falloff_count(k) = Falloff Then       'Const Falloff = 1
           If Wynik_o(k) > 0 Then Decr Wynik_o(k)
           Falloff_count(k) = 0
       End If
           Incr Falloff_count(k)
   End If

 Next K

 Пиксель = 0
'-------------------------------------------------------------------------------
 For W = 1 To 16

   If W = 1 Or W = 3 Or W = 5 Or W = 7 Or W = 9 Or W = 11 Or W = 13 Or W = 15 Then

       If Wynik_o(w) = 0 Then
            For N = 1 To 16
               R = 0 : G = 0 : B = 0 : Rb_setcolor Пиксель , Color(1)
               Incr Пиксель
            Next
          Else
            For N = 1 To Wynik_o(w)
               B = Lookup(n , Синий)
               G = Lookup(n , Зеленый)
               R = Lookup(n , Красный)
               Rb_setcolor Пиксель , Color(1)
               Incr Пиксель
            Next

            For N = Wynik_o(w) + 1 To 16
                R = 0 : G = 0 : B = 0 : Rb_setcolor Пиксель , Color(1)
                Incr Пиксель
            Next
       End If
   End If
'-------------------------------------------------------------------------------
   If W = 2 Or W = 4 Or W = 6 Or W = 8 Or W = 10 Or W = 12 Or W = 14 Or W = 16 Then

          Пиксель = Пиксель + 15
       If Wynik_o(w) = 0 Then
            For N = 1 To 16
               R = 0 : G = 0 : B = 0 : Rb_setcolor Пиксель , Color(1)
               Decr Пиксель
            Next
          Else
            For N = 1 To Wynik_o(w)
               B = Lookup(n , Синий)
               G = Lookup(n , Зеленый)
               R = Lookup(n , Красный)
               Rb_setcolor Пиксель , Color(1)
               Decr Пиксель
            Next

            For N = Wynik_o(w) + 1 To 16
                R = 0 : G = 0 : B = 0 : Rb_setcolor Пиксель , Color(1)
                Decr Пиксель
            Next
       End If
          Пиксель = Пиксель + 17
   End If

 Next W

 Rb_send
'-------------------------------------------------------------------------------
Return
'===============================================================================
Синий:
Data 0 , 255 , 128 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
'===============================================================================
Зеленый:
Data 0 , 0 , 128 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 128 , 0 , 0
'===============================================================================
Красный:
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 128 , 255 , 255
'===============================================================================
Tab_sin:
Data 0% , 50% , 98% , 142% , 181% , 213% , 237% , 251%
Data 255% , 251% , 237% , 213% , 181% , 142% , 98% , 50%
Data 0% , -50% , -98% , -142% , -181% , -213% , -237% , -251%
Data -255% , -251% , -237% , -213% , -181% , -142% , -98% , -50%
'===============================================================================
Okno_hanning:
Data 0 , 3 , 10 , 23 , 40 , 60 , 84 , 109 , 134 , 160 , 184 , 206 , 225 , 240 , 250 , 255 , 255 , 250 , 240 , 225 , 206 , 184 , 160 , 134 , 109 , 84 , 60 , 40 , 23 , 10 , 3 , 0
'===============================================================================
Okno_hamming:
Data 20 , 23 , 30 , 42 , 57 , 76 , 97 , 120 , 144 , 168 , 190 , 210 , 228 , 241 , 251 , 255 , 255 , 251 , 241 , 228 , 210 , 190 , 168 , 144 , 120 , 97 , 76 , 57 , 42 , 30 , 23 , 20
'===============================================================================
Okno_blackman:
Data 0 , 1 , 4 , 10 , 18 , 31 , 48 , 69 , 94 , 122 , 151 , 181 , 208 , 230 , 246 , 255 , 255 , 246 , 230 , 208 , 181 , 151 , 122 , 94 , 69 , 48 , 31 , 18 , 10 , 4 , 1 , 0

https://upforme.ru/uploads/0000/25/b8/2019/t108931.png
Схема под жкху. Нужны только фильтра.
В меньший контролер не влазит в озу буфер самой Rainbow для 256 пикселей. По этому 32 выбран.

Отредактировано rom-i (2023-03-19 13:16:07)

+2

104

Получилась неплохая тема.
https://disk.yandex.ru/d/w-3WiS_t4ta6OA
Схема не нужна, на печатке все есть.

0

105

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

Получилась неплохая тема.
https://disk.yandex.ru/d/w-3WiS_t4ta6OA

А кроме Яндекса куда нибудь ?

0

106

sasha_1973
Укажите путь.
Как обратно, не знаю.
89 пост. Как, не знаю. Но, Вы передали файлы.
Нужна альтернатива катаклизму.
Решил добавить анимашек, и сталкиваюсь с лентой уложенной змейкой.
1 пиксель 3 байта. 16 пикселей на столбец. (49-R; 50-G;51-B) пиксель идет вверхногами. Не могу перевернуть с помощью самого Баском. Получилось только заданием самой таблицы.
Но это не совсем правильно. Ардуинщики пользуються библиотеками. На Баском мы делаем все сами.
Код для одного столбца.

Код:
Data &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H66 , &H00 , &HFF , &HFF , &H00 , &HFF , &H66 , &H00 , &HFF , &H66 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &HFF , &H00 , &H00 , &H00 , &H00 , &H00

Следующий нужно массив "радуги" набивать с конца, или таблицу писать наоборот. Или использовать совет умных людей, и 48 байт перевернуть.
Получается по детски.
https://upforme.ru/uploads/0000/25/b8/2019/t434935.jpg
Просто каждый второй столбец написан наоборот. Мое решение без советов. Куда деваться.
Рабочий код выложен в 103 посте. Просто добавил фон(без сигнала). Изменил аналоговую часть. Питается от 12В, и входа АЦП имеют уровень половины. Так более правильно работает формула. Не с 0 рисует ирменение АЦП, а с полуровня. Отрицательные состовляющие участвуют в теме.

Отредактировано rom-i (2023-04-14 22:32:52)

0

107

Быстрое вычисление Фурье измеряет изменения уровня на входе АЦП за определенное время. Получаешь сам уровень+изменения амплитуды за участок времени(частота). Спектр.

0

108

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

Решил добавить анимашек, и сталкиваюсь с лентой уложенной змейкой.
1 пиксель 3 байта. 16 пикселей на столбец.
(49-R; 50-G;51-B) пиксель идет вверхногами.
Не могу перевернуть с помощью самого Баском.

А если использовать массив ?
Нужные адреса массива "перевернуть" проще.
А из уже готового массива гнать данные в ленту...

Не так давно байты в массиве "переворачивали", используйте ту же технологию... ;)

0

109

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

sasha_1973
Укажите путь.
Как обратно, не знаю.
89 пост. Как, не знаю. Но, Вы передали файлы.
Нужна альтернатива катаклизму.

Честно говоря, ничего не понял ?

0

110

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

А если использовать массив ?
Нужные адреса массива "перевернуть" проще.

Больше создать массивов не реально. Сама библиотека радуги уже массив из 256х24 бита.

Код:
 L = 0
 For K = 0 To 255
    R = Lookup(l , Fire1)
    Incr L
    G = Lookup(l , Fire1)
    Incr L
    B = Lookup(l , Fire1)
    Incr L
    Rb_setcolor K , Color(1)
 Next K
  Rb_send
 Waitms 100

Одна картинка огня, и ее таблица. Массив в SRAM Rb_setcolor K , Color(1), и передача в ленту  Rb_send.

Код:
Fire1:
Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00
Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00
Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00
Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00
Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &HFF , &H00 , &H00 , &H00 , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &H00 , &H00 , &H00
Data &H00 , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H66 , &H00 , &HFF , &H66 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00
Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H66 , &H00 , &HFF , &H66 , &H00 , &HFF , &HFF , &H00 , &HFF , &HFF , &H00 , &HFF , &H66 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00
Data &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H66 , &H00 , &HFF , &HFF , &H00 , &HFF , &H66 , &H00 , &HFF , &H66 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &HFF , &H00 , &H00 , &H00 , &H00 , &H00
Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H66 , &H00 , &HFF , &HFF , &H00 , &HFF , &H66 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00
Data &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H66 , &H00 , &HFF , &HFF , &H00 , &HFF , &H66 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00
Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H66 , &H00 , &HFF , &H66 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &H00 , &H00 , &H00
Data &H00 , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00
Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &HFF , &H00 , &H00 , &HFF , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00
Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00
Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00
Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00
'======

Сдесь каждый четный столбец уже перевернут. Программу для рисования использую lcd-image-converter. Отличная пруга, но нет змейки. Можно сверху вниз, или наоборот.
В мега8 1кб уже не хватает SRAM. По этому пришлось перейти на мега328 с 2кб озу.

Отредактировано rom-i (2023-04-17 21:27:09)

+1

111

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

Просто каждый второй столбец написан наоборот. Мое решение без советов. Куда деваться.

Вот элементарное решение разворота нужных полос.
Код написал специально полный для теста. Хотя сам разворот очень прост. Задаёте в константах нужное число столбцов и количество светодиодов в них и всё.
Небольшое количество кода только для теста. Надеюсь, что комментарии окажут правильное направление.
Да, я взял простой массив. В реале там в каждом светодиоде их три, так что нужно будет это учесть.

Код:
 '*****************************************************************************
'*                                                   Разворот массива                                                                *
'*****************************************************************************
$regfile = "m644pdef.dat "                                  'Определение кристалла и частоты"
$crystal = 16000000
$baud = 9600
$hwstack = 32                                               ' default use 32 for the hardware stack
$swstack = 10                                               ' default use 10 for the SW stack
$framesize = 24                                             ' default use 24 for the frame space
'--------------------------------- Конфигурация -------------------------------
Config submode = new
Config Com1 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
'----------------------------------- Константы -----------------------------------
Const Column = 16                                           'Количество столбцов
Const Pieces = 16                                           'Количество СД в столбце
Const Delta = Pieces * 2                                    'Разность между первыми СД в столбцах для разворота
Const DeltaLast = Pieces - 1                                'Разность между первым и последним светодиодами для разворота
Const NumCol = Column \ 2                                   'Количество столбцов для разворота. Делим нацело
'---------------------------------- Переменные --------------------------------
Dim i , j , x , y as Word                                   'Счётчик буфера
Dim A(Column * Pieces) as Byte                              'Тестовый массив
Dim C(NumCol) as Word                                       'Массив номеров столбцов для разворота
Dim Count as Word                                           'Счётчик записи в тестовый массив
Dim Tmp as Byte                                             'Временная переменная
'------------------------------ Подпрограммы ----------------------------------
'Тестовая печать
Sub PrintTest
'Распечатка для наглядности Column строк по Pieces в строке
   Count = 1
   For i = 1 To Column
      For j = 1 to Pieces
         Print A(Count) ; "  ";
         Incr Count
      Next j
      Print
   Next i
End Sub
'Тестовая генерация массива
Sub Generate
   Count = 1                                                   'Установка счётчика
   For i = 1 to Column                                      'Цикл перебора столбцов
      For j = 1 to Pieces                                   'Цикл записи в массив
         A(Count) = j                                       'Запишем значение в массив
         Incr Count                                         'Переход на следующую позицию
      Next j
   Next i
End Sub
'Формирование номеров столбцов которые нужно развернуть
Sub NumSort
   j = Pieces + 1
   For i = 1 To NumCol
      C(i) = j
      j = j + Delta
   Next i
End Sub
'--------------------------------- Программа -----------------------------------
Call Generate                                               'Генерация тестового массива
Print "Массив до разворота"
Call PrintTest                                              'Печать массива до разворота
Call NumSort                                                'Генерация номеров столбцов для разворота
'Начнём разворот
Y = DeltaLast                                               'Номер последнего светодиода для разворота
For i = 1 To NumCol                                         'Разворачиваем все нужные столбцы
   X = C(i)                                                    'Начинаем с первого столбца
   Y = X + DeltaLast
   While X < Y                                              'Разворот одного столбца
      Tmp = A(X)
      A(X) = A(Y)
      A(Y) = Tmp
      Incr X
      Decr Y
   Wend
Next i
Print "Массив после разворота"
Call PrintTest                                              'Печать массива после разворота
end

Вот результат работы.
https://upforme.ru/uploads/0000/25/b8/819/t633561.jpg

Отредактировано sva-don (2023-04-21 14:16:08)

0

112

И ещё одно маленькое дополнение.
В продаже есть адресуемые ленты типа CX2802. SMD 5x5мм, Обмен по SPI (линия данных и линия тактирования), частота обмена до 2 МГц. Протокол совместим с WS2801. Питание 5 вольт.
Преимущество использование налицо. Стандартный SPI без всяких дурацких задержек и недоделанных библиотеках.
Есть 30, 60, 100 и 144 светодиода на метр.           
https://upforme.ru/uploads/0000/25/b8/819/t789331.jpg
Кстати, использование такой ленты даёт возможность не рисовать эти дурацкие таблицы с рисунком вывода, а спокойно формировать их в реальном времени используя манипуляции с массивом.
Делал как то лампу с эффектами. Приведу пример только одного из эффектов. Я назвал его солнечный зайчик.
Светодиоды загораются  случайным цветом и появляются в случайном порядке, что выглядит весьма интересно.

Код:
Sub SunBunny
   Local Cikl as Word
   Local P1 , P2 , P3 , P4 as Byte
   For Cikl = 1 to 550                                      'Всего исполнить 550 циклов

      Call GenColor(0)                                      'Генерим случайный цвет
      Tmp = RND(57) : P1 = Ncell(Tmp)                       'Выбираем случайный светодиод 1. Определяем номер его пикселя
      A(P1) = R : A(P1 + 1) = B : A(P1 + 2) = G             'Зажигаем светодиод

      Call GenColor(0)                                      'Генерим случайный цвет
      Tmp = RND(57) : P2 = Ncell(Tmp)                       'Выбираем случайный светодиод 2
      A(P2) = R : A(P2 + 1) = B : A(P2 + 2) = G             'Зажигаем светодиод

      Call GenColor(0)                                      'Генерим случайный цвет
      Tmp = RND(57) : P3 = Ncell(Tmp)                       'Выбираем случайный светодиод 3
      A(P3) = R : A(P3 + 1) = B : A(P3 + 2) = G             'Зажигаем светодиод

      Call GenColor(0)                                      'Генерим случайный цвет
      Tmp = RND(57) : P4 = Ncell(Tmp)                       'Выбираем случайный светодиод 4
      A(P4) = R : A(P4 + 1) = B : A(P4 + 2) = G             'Зажигаем светодиод
      Call Send

      Waitms 150                                            'Через 150 мс
      A(P1) = 0 : A(P1 + 1) = 0 : A(P1 + 2) = 0             'гасим его
      A(P2) = 0 : A(P2 + 1) = 0 : A(P2 + 2) = 0
      A(P3) = 0 : A(P3 + 1) = 0 : A(P3 + 2) = 0
      A(P4) = 0 : A(P4 + 1) = 0 : A(P4 + 2) = 0
   Next Cikl                                                'Повторим
   Waitms 500                                               'Подождём перед выходом
End Sub

Как видим всё довольно просто. Нужно только напрячь голову и придумать свой неповторимый эффект.
Или вот радуга.

Sub RainbowUp
   k = 1
   For j = 1 to 7
      Select Case j
         Case 1 : Mr(1) = 255 : Mg(1) = 0 : Mb(1) = 0
         Case 2 : Mr(2) = 255 : Mg(2) = 100 : Mb(2) = 0
         Case 3 : Mr(3) = 210 : Mg(3) = 210 : Mb(3) = 0
         Case 4 : Mr(4) = 0 : Mg(4) = 255 : Mb(4) = 0
         Case 5 : Mr(5) = 60 : Mg(5) = 60 : Mb(5) = 255
         Case 6 : Mr(6) = 0 : Mg(6) = 0 : Mb(6) = 255
         Case 7 : Mr(7) = 80 : Mg(7) = 0 : Mb(7) = 100
      End Select
      For i = k to N Step 21
         A(i) = Mr(j) : A(i + 1) = Mb(j) : A(i + 2) = Mg(j)
         Call Send
         Waitms 100
      Next i
      k = k + 3
      waitms 100
   Next j
   Wait 5
End Sub

Отредактировано sva-don (2023-04-21 14:49:27)

+1

113

sva-don написал(а):

Преимущество использование налицо. Стандартный SPI без всяких дурацких задержек и недоделанных библиотеках.

Может быть. Но пока тема идет именно про WS2812B. Разработчики соединили их змейкой, и дали библиотеку на С++. Почему не использовать принцип нормальной индикации. Нет, змейка.
Мы имеем библиотеку радуга, других подходов пока небыло. На старом БАСКОМ с дурья начал писать под SPI код. Столкнулся с действительно дурацкими задержками.

0

114

sva-don
Пытался так делать, но запутался. Const DeltaLast = Pieces - 1
Таблицу создаю lcd-image-converter-20141214. Можно сразу выбрать 24 битные значения RGB в HEX для неважно сколько пикселей в строке, или столбце.
https://disk.yandex.ru/d/9kp4ymFBBCYVAQ
Пригодиться, если нет.
Две версии. 64, и 32 бит систему. Установка не нать. Для тренировки огонек 16х16 пикселей.

Отредактировано rom-i (2023-04-22 20:24:36)

0

115

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

Пытался так делать, но запутался. Const DeltaLast = Pieces - 1

Всё очень просто.
Const Column = 16                         'Количество столбцов
Const Pieces = 10                           'Количество светодиодов в столбце
Const Delta = Pieces * 2=20            'Разность между первыми светодиодами в столбцах для разворота. Например у вас есть 16 столбцов по 10 светодиодов.
                                                     'Номера СД идут так, первый столбец 1-10, второй 11-20, третий 21-30 и т.д.
                                                     'Нам нужно развернуть столбцы с чётными номерами, т.е. 2-й, 4-й, и т.д. Для того чтобы узнать номер первого СД в столбце, который нужно развернуть я и использую Delta.
                                                     'В нашем случае номер первого СД=11, разворачиваем столбик с 11 по 20 светодиоды. 11 + 20 = 31.
                                                     'Это номер первого  СД следующего столбика который нужно развернуть. и т.д.
Const DeltaLast = Pieces - 1            'Разность между первым и последним светодиодами для разворота. Ну, это просто для упрощения дальнейшей программы. В цикле будет 9 шагов.
Const NumCol = Column \ 2            'Количество столбцов для разворота. Целое деление.
Вообще константы очень помогают при написании программ. Если в теле программы используются некоторые значения которые не меняются, то константы самое то. Не нужно переписывать значения по всему листингу а просто меняем значения в настройках и всё автоматически изменится. Да и ОЗУ они не кушают.

Отредактировано sva-don (2023-04-24 09:59:39)

0

116

sva-don
Каждый пиксель 3 байта R, G, B. Их последовательность при развороте не меняется, иначе будет каша из байтов.
Если брать сразу переменную в 24 бита, это 32 битный Long. Теперь представте себе массив из 256 Long-ов который нам местами нужно крутить, и чахлый МК(например мега328). Ко всему плюс такой же массив создает радуга для передачи в ленту. Получается, что то супер секретное.
Набивать массив радуги побайтно с переворотом, заблудился. По этому перевернул нужные строки в таблице.

0

117

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

Теперь представьте себе массив из 256 Long-ов который нам местами нужно крутить

Мне кажется, что вы полезли в какие то дебри, откуда нет выхода.
Какой Long? Какие 32 бита?
Ведь всё просто, как пареная репка.
Зададим 2 константы as Byte:
Const N = 100  Это будет количество светодиодов. 100 я поставил для примера.
Const Arr = N * 3  Это буфер для вывода в ленту.
Так как лента включена последовательно и все чётные столбцы нужно перевернуть для отображения рисунка снизу мы тупо разворачиваем значения в массиве и выдаём его в ленту.
Далее сформируем радугу без всякого разворота столбцов. Подпрограмма сама расставит всё на свои места.

Код:
Sub RainbowUp
   k = 1
   For j = 1 to 7                 'Зададим цвета радуги  К О Ж З Г С Ф
      Select Case j              'Тут зададим сам цвета. Байты могут отличаться, т.к. ленты разные. Нужно их подбирать.  
         Case 1 : Mr(1) = 255 : Mg(1) = 0 : Mb(1) = 0
         Case 2 : Mr(2) = 255 : Mg(2) = 100 : Mb(2) = 0
         Case 3 : Mr(3) = 210 : Mg(3) = 210 : Mb(3) = 0
         Case 4 : Mr(4) = 0 : Mg(4) = 255 : Mb(4) = 0
         Case 5 : Mr(5) = 60 : Mg(5) = 60 : Mb(5) = 255
         Case 6 : Mr(6) = 0 : Mg(6) = 0 : Mb(6) = 255
         Case 7 : Mr(7) = 80 : Mg(7) = 0 : Mb(7) = 100
      End Select
      For i = k to N Step 21   'Здесь запихиваем всё в массив для выдачи. Step=21 у меня. Это разность между номерами СД в столбце
         Arr(i) = Mr(j) : Arr(i + 1) = Mb(j) : Arr(i + 2) = Mg(j)
         Call Send                  'Выдаём в ленту
         Waitms 100
      Next i
      k = k + 3
      waitms 100
   Next j
   Wait 5
End Sub

и т.д. и т.п.

Отредактировано sva-don (2023-04-27 10:21:29)

+1

118

sva-don
Дебри созданы создателями.
Call Send                  'Выдаём в ленту
Это, что?
Из созданного массива, создаем второй массив для ленты?
Есть в Баском библиотека "Радуга".  Rb_send передать числовую последовательность в тему по своеобразной шине.
Библиотека работает у ардуинщиков. У нас одни дебри.
Нужно братьть саму библиотеку. У нее есть варианты работы с готовыми массивами.
Кто,выложил? Мож Вы. Там нашел два варианта работать, создавать массивы прямиком из таблицы.
RB_SETTABLECOLOR
Далее
RB_ROTATELEFT, или RB_ROTATERIGHT.
Зачем создавать созданное.

Отредактировано rom-i (2023-04-29 01:52:27)

0

119

По поводу Raibow. Это не библиотека, а несчастье. Мало того, что там практически нет ни одной нормальной функции кроме RB_Send так ещё и глюков море.
Случилось со мной такое несчастье. Начал её использовать и по мере нарастания объёма кода и достижения определенного размера компилятор просто отказывается компилировать программу.
При этом никакие настройки стеков ничего не дают.
В подпрограмме приведённой выше я просто показал пример работы с массивами, а так как я использовал WS2801, то подпрограмма вывода у меня своя и выглядит она совсем просто.
Sub Send
   Spiout A(1) , N     'Где N - размер массива.
End Sub
Если есть желание использовать Rainbow, то там есть массив, который непосредственно выводится в ленту Rainbow0_(i) так вот и используйте его напрямую для своих целей.
Всё остальное можно просто игнорировать.
Вот для примера
'Настройка параметров для библиотеки WS2812b
Config RAINBOW = 1 , RB0_LEN = 16 , RB0_PORT = PORTB , rb0_pin = 0
RB_SelectChannel 0
В данном случае создаётся массив Rainbow0_() размером 48 байт. 16 х 3 = 48
Загоняем в него всё что нужно и RB_Send.
Ещё один пример.
Делал вот такую вазу с подсветкой. Светодиоды - это кольцо с 16 штуками WS2812.
https://upforme.ru/uploads/0000/25/b8/819/t840225.jpg
Один из эффектов изменение цвета по кругу. Вот так реализован при помощи Rainbow.

Код:
'******************************** Цвет по кругу *****************************
Sub RingColor
   For j = 1 to 200                                         'Повтор 200 раз
      Delay_ = RND(150)                                'Скорость вращения случайна.  
      If Delay_ < 10 Then Delay_ = 10
      k = Rnd(3)                                            'Выбор направления вращения. Цвет меняет направление вращения случайным образом.
'Вращение по часовой
      If k <= 1 Then
         For i = 0 to NumPix -1 Step 3            'NumPix - это моё количество светодиодов.
            Call GenColor                                 'GenColor это моя подпрограмма генерации случайного цвета. HSV - RGB  
            Rainbow0_(i) = G : Rainbow0_(i + 1) = R : Rainbow0_(i + 2) = B          'Записываем случайный цвет в массив
            RB_Send                                                                                            'Выдаём. 
            Waitms Delay_
         Next i
      End If
'Вращение против часовой
      If k > 1 Then
         For i = NumPix -1 to 0 Step -3
            Call GenColor
            Rainbow0_(i) = G : Rainbow0_(i + 1) = R : Rainbow0_(i + 2) = B
            RB_Send
            Waitms Delay_
         Next i
      End If
   Next j
End Sub

Отредактировано sva-don (2023-04-29 12:19:01)

0

120

Позволю себе опять "встрять"... ;)

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

Больше создать массивов не реально. Сама библиотека радуги уже массив из 256х24 бита.

А EEPROM если задействовать ? ;)

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

Теперь представте себе массив из 256 Long-ов который нам местами нужно крутить, и чахлый МК(например мега328).

А если этот массив не "крутить местами", а "перекрутить" его адресацию ?

В EEPROM помещаем массив, содержащий адреса (индексы), уже расставленные, как надо:
Dim A(256) As ERAM Byte

Т.к. имеем матрицу 16х16, то соответственно с этой кратностью его и заполняем:
А(1) = 1 ..... А(16) = 16
А(17) = 32 .... А(32) = 17
... и так по этой же логике далее...

При подготовке массива "из 256 Long-ов" используем данные из массива в EEPROM как индекс:
For C = 1 To 256
      B(A(C)) = <значение RGB>
Next C

Получаем заполненный массив уже с нужными смещениями, причем эти "смещения" формируются один раз...

Но есть "жирный минус" - быстродействие при этом сильно пострадает, при каждом обращении к ROM используется почти в 10 раз больше тактов МК, чем при работе с RAM (50 против 4)...  :dontknow:

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

Ко всему плюс такой же массив создает радуга для передачи в ленту.

Память под него резервируется один раз при конфигурировании, а вот заполняться будет из вашего при выполнении команды Rb_send

0