Опять PROGMEM

Ivanii
Offline
Зарегистрирован: 11.10.2015

Не работает(вместо таблицы обрабатывает мусор) скетч при попытке использовать PROGMEM для хранения массива 1800 байт(а хотелось 25 КБ).

const PROGMEM uint8_t ddd[1800]  = {60, 160, 13, 57, 21, 95, 60, 66,...

uint32_t time_2 = 200;
uint32_t mks = 0;
uint8_t shag = 0;
uint32_t vrem = 0;


void setup() {
....
}

void loop() {
....
vrem = long(ddd[shag]);
mks = micros() + (time_2 * vrem);
....
}

БЕЗ PROGMEM работает и в уппрощенном варианте без переменной vrem и явного преобразования типа.

const uint8_t ddd[]  = {60, 160, 13, 57, 21, 95, 60, 66,...
...
mks = micros() + (time_2 * ddd[shag]);

Подскажите пожалуйста что я делаю не так и как сделать правильно

sadman41
Онлайн
Зарегистрирован: 19.10.2016

https://www.arduino.cc/reference/en/language/variables/utilities/progmem/

Ищем: 

// read back a 2-byte int 

Смотрим на код ниже ремарки, сравниваем со своим.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Ivanii пишет:

Не работает(вместо таблицы обрабатывает мусор) 

Наоборот, работает, вместо таблицы обрабатывает мусор.  Как и просили

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

почему, кста, в массиве нельзя сразу long хранить?  Почему надо массив именно uint8_t? 

Ivanii
Offline
Зарегистрирован: 11.10.2015

Спасибо, помогло, работает

  mks = micros() + (time_2 * pgm_read_byte_near(ddd+shag));

Лонги память сожрут.

В 1 посте ошибка, должно быть

uint16_t shag = 0;

 

b707
Offline
Зарегистрирован: 26.05.2017

Ivanii пишет:

Спасибо, помогло, работает

  mks = micros() + (time_2 * pgm_read_byte_near(ddd+shag));

если мой хрустальный шар не врет - следующей после вычисления mks должна быть строчка что-то типа

if (micros() > mks) 

так?

 

Ivanii
Offline
Зарегистрирован: 11.10.2015

Хуже

 while (mks   > micros()) {
  }

 

b707
Offline
Зарегистрирован: 26.05.2017

Ivanii пишет:

Хуже

 while (mks   > micros()) {
  }

 

это то же самое :)

Почитайте в Песочнице тему про переполнение millis() - вы неправильно работаете с временными интервалами. К micros() это относится даже в большей мере

Ivanii
Offline
Зарегистрирован: 11.10.2015

Это трещалка и при переполнении просто очередной такт станет короче.

b707
Offline
Зарегистрирован: 26.05.2017

Ivanii пишет:

Это трещалка и при переполнении просто очередной такт станет короче.

не оправдывайтесь.

Привыкните всегда работать со счетчиками правильно - и в нужный момент не ошибетесь. Изменить код, чтобы он не сбивался при переполнении - дело пары секунд.