Чтение 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 и т. д..
@Ryan Rife, 👍-2
Обсуждение1 ответ
▲ 2
Мне нужно было либо удалить PROGMEM из массива, либо использовать pgm_read_byte для чтения массива.
,
@Ryan Rife
Смотрите также:
- Использование программной памяти в ESP8266 по сравнению с AVR, а также как обрабатывать большие динамические строки
- Как функция/метод может определить, является ли передаваемый массив const PROGMEM (flash) или нет (RAM)?
- В чем разница/связь между Arduino и AVR?
- Записать во флэш-память с помощью PROGMEM
- Как преобразовать скетч примера Arduino в полный проект C++?
- Не удается записать загрузчик через Arduino Nano clone ISP в atmega328p
- Поскольку double и float представляют один и тот же тип данных (обычно), что предпочтительнее?
- Как создать задержки на языке ассемблера AVR
удалите PROGMEM для проверки. вы не используете функцию pgm_read для чтения PROGMEM, @Juraj
какова цель первых двух команд
Wire.write
? .... я думаю, что они оба пишут ноль ... чего-то не хватает в этих двух строках?, @jsotolaЮрай, вы правы, но в моем реальном коде массив довольно большой, поэтому он должен быть в PROGMEM, я что-то упустил в этой области памяти?, @Ryan Rife
Это было так, это работает., @Ryan Rife
Вы научились устранять неполадки. в следующий раз создайте минимальный скетч. теперь, пожалуйста, удалите вопрос., @Juraj
Чтобы получить размер вашего массива, вы можете использовать
sizeof test / sizeof test[0]
. Это работает с любым типом данных элементов массива., @the busybee