CRGB в PROGMEM

_rmb_

✩✩✩✩✩✩✩
16 Ноя 2023
5
0
Доброго времени суток. Дано:макрица w2812 и библиотека FastLED. Задача разместить "картинку" в PROGMEM.
Главная проблема - это не понимание как работает FastLED.
скудным умом понимаю что CRGB это структура в которой массив 3 байта, по байту на каждый цвет.
самое простое, что пришло в голову это сварганить вот такое:
const byte PROGMEM pic[]={CRGB::Red,CRGB::Green,CRGB::Blue};
и оно компилируется, но что там реально попадает в progmem и как - большой вопрос. в идеале хочется увидеть(в данном случае) 9байт, но на счет этого большие сомнения. отсутствие самого простого дебагера меня просто ставит в ступор.
начинаю играть в угадайку и бороться с синтаксисом.
тупой вариант:
const byte PROGMEM pic[]={255,0,0, 0,255,0, 0,0,255}
худо/бедно работает, но почему то путаются цвета.

даже определив массив в RAM вот таким образом CRGB pic[]={CRGB::Red,CRGB::Green,CRGB::Blue} пройтись указателем с шагом 1(чтобы посмотреть байты), выводится непонятно что. чую, что то делаю не так, но понять не могу
 

rkit

★★★✩✩✩✩
5 Фев 2021
508
127
А можно было бы взять rp2040 за те же деньги, и иметь и дебаггер, и не страдать с progmem в принципе.
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,969
632
44
Фирменный stm дороже и периферия скуднее.
RP2040 только для самоделок. На проде где нужно закрыть как минимум чтение по дабаг-порту, либо защитить прошивку например шифрованием он этого уже не умеет, поэтому как минимум STM.
 

_rmb_

✩✩✩✩✩✩✩
16 Ноя 2023
5
0
@Сотнег,
мало того, что это не удобный способ забиваиня массива, не ломает ли он функцию библиотеки по (как минимум) установке яркости ленты, вопрос.

C++:
#define clrRed   0xff,0x00,0x00
#define clrGreen 0x00,0xff,0x00
#define clrBlue 0x00,0x00,0xff
#define cRed   0xff0000
#define cGreen 0x00ff00
#define cBlue 0x0000ff
const byte pTEST[] PROGMEM = {clrRed,clrGreen,clrBlue};
      byte rTEST[]        = {clrRed,clrGreen,clrBlue};
const byte pTEST2[] PROGMEM = {cRed,cGreen,cBlue};
      byte rTEST2[]        = {cRed,cGreen,cBlue};
const byte pTEST3[] PROGMEM = {CRGB::Red,CRGB::CRGB::Green,CRGB::Blue};
      byte rTEST3[]        = {CRGB::Red,CRGB::CRGB::Green,CRGB::Blue};
----clrRed,clrGreen,clrBlue--------
FF 0 0 0 FF 0 0 0 FF
FF 0 0 0 FF 0 0 0 FF
--------cRed,cGreen,cBlue---------
0 0 FF FF 0 0 0 FF 0
0 0 FF FF 0 0 0 FF 0

--------CRGB::Red,CRGB::Green,CRGB::Blue---------
0 0 FF 0 0 FF FF 0 0
0 0 FF 0 0 FF FF 0 0

1й вариант
-как бы все ок
2й вариант
тут получается спутан порядок(но это не точно, всего лишь догадка) вместо RGB - BRG
Если предположить, что байты укладываются младшим вперед, то тоже порядок спутанный RBG
3й вариант
Вообще нет соображений
 

Сотнег

★★★★★★★
15 Янв 2020
4,365
1,494
@_rmb_,
не ломает.
А вы забивание данных в массив из картинки собирались вручную делать?!

Вам никто не обещал, что в трёхбайтовой структуре байты будут храниться именно в порядке RGB.
Можете без PROGMEM посмотреть, что там uint32_t(CRGB::Green).
 
Изменено:

_rmb_

✩✩✩✩✩✩✩
16 Ноя 2023
5
0
@Сотнег,
  • ну не совсем руками. там массив не большой и сделать это надо, можно сказать, разово. если подробнее, то в Exell рисую матрицу и макросом vbа делаю нужный текстовый массив.
  • Вот я инициализировал progmem разными способами. во всех инициализировалось по-разному. Прогмем то я буду читать по-байтово и собирать в RGB. как мне собрать, когда не понятно что читается?
  • Если CRGB в Progmem лежит в виде 4 байт, то вывод из поста выше это опровергает
 

Сотнег

★★★★★★★
15 Янв 2020
4,365
1,494
@_rmb_,
откуда взялось про "в виде 4 байт"?!

Если вы макросом делаете текстовый массив, в чём проблема сделать его побайтовым?
 

_rmb_

✩✩✩✩✩✩✩
16 Ноя 2023
5
0
-нет, проблем представить массив в нужном виде нет. проблема это сделать правильно
-если вот так вытягивать из прогмем'а, то получается лажа
C++:
CRGB led[3];
led[0].r=pgm_read_byte(&pTEST3[0]);
led[0].g=pgm_read_byte(&pTEST3[1]);
led[0].b=pgm_read_byte(&pTEST3[2]);
 

Сотнег

★★★★★★★
15 Янв 2020
4,365
1,494
@_rmb_,
как положите, так и вытяните.
C-like:
static const uint8_t pTEST3[3] PROGMEM =
   {0x01, 0x02, 0x03};
 

_rmb_

✩✩✩✩✩✩✩
16 Ноя 2023
5
0
C++:
static const uint8_t pTEST3[] PROGMEM =
   {
    0x00, 0x00, 0x00, //w
    0xff, 0x00, 0x00, //r
    0x00, 0xff, 0x00, //g
    0x00, 0x00, 0xff, //b
    0xff, 0xff, 0x00, //y
    0x00, 0xff, 0xff, //c
    0xff, 0x00, 0xff  //m
   };
CRGB led[1];
void setup() {
  Serial.begin(9600);
  FastLED.addLeds <WS2812, 12, GRB>(led,1).setCorrection(TypicalLEDStrip);
  FastLED.setBrightness(255);
  for (byte i=0;i<7;i++){
    led[0].r=pgm_read_byte(&pTEST3[i*3]);
    led[0].g=pgm_read_byte(&pTEST3[i*3+1]);
    led[0].b=pgm_read_byte(&pTEST3[i*3+2]);
    FastLED.show();
    Serial.println("loop");
    delay(1000);
  }
а вот так работает (y)
спасибо огромное.
честно я так и недопонял в чем прикол. static?
 

Сотнег

★★★★★★★
15 Янв 2020
4,365
1,494
@_rmb_,
просто так.
Оставляет локальную переменную неудаляемой после окончания работы функции.