Чтение PROGMEM приводит к неправильному шестнадцатеричному значению

Я уверен, что делаю здесь какую-то глупость, но приведенный ниже код должен записывать тестовые шестнадцатеричные значения в EEPROM I2C, однако, когда я пытаюсь прочитать EEPROM, он имеет неправильные значения. Прямой вызов чего-то вроде Wire.write(0xab) запишет 0xab, как и ожидалось, поэтому я знаю, что EEPROM записывается правильно, просто что-то, кажется, теряется при переводе при написании test[counter++] .

#include <Wire.h>

const byte test[] PROGMEM = {
  0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80,
  0x7f, 0x7f, 0x81, 0x7f, 0x7e, 0x81, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x7e,
  0x7e, 0x81, 0x7e, 0x7c, 0x7f, 0x7f, 0x7d, 0x7c, 0x7f, 0x7f, 0x80, 0x7e
};

unsigned int test_len = 36;

#define EEPROM_ADR 0x50

void setup()
{
  Wire.begin();

  int counter = 0;

  Wire.beginTransmission(EEPROM_ADR);

  Wire.write((int)(0x0 >> 8)); // старший бит
  Wire.write((int)(0x0 & 0xFF)); //младший бит

  while (counter < test_len)
  {
    Wire.write(test[counter++]); //используем буферизацию страниц для записи всего массива
  }

  Wire.endTransmission();
}

Результаты выглядят примерно так: 0x00 0x00 0x08 0x00 0x00 0x00 0x01 и т. д..

, 👍-2

Обсуждение

удалите PROGMEM для проверки. вы не используете функцию pgm_read для чтения PROGMEM, @Juraj

какова цель первых двух команд Wire.write? .... я думаю, что они оба пишут ноль ... чего-то не хватает в этих двух строках?, @jsotola

Юрай, вы правы, но в моем реальном коде массив довольно большой, поэтому он должен быть в PROGMEM, я что-то упустил в этой области памяти?, @Ryan Rife

Это было так, это работает., @Ryan Rife

Вы научились устранять неполадки. в следующий раз создайте минимальный скетч. теперь, пожалуйста, удалите вопрос., @Juraj

Чтобы получить размер вашего массива, вы можете использовать sizeof test / sizeof test[0]. Это работает с любым типом данных элементов массива., @the busybee


1 ответ


2

Мне нужно было либо удалить PROGMEM из массива, либо использовать pgm_read_byte для чтения массива.

,