Как записать 16-битное целое число в SRAM через Arduino? - PullRequest
0 голосов
/ 21 сентября 2019

Суть проблемы: у меня есть Arduino Due, акселерометр MPU6050 и 23lcv512.MPU дает мне 16-битное целое число со знаком.Я хотел бы сохранить данные в SRAM и после измерения прочитать их обратно и через Serial отправить их на ПК.Отправка на ПК не является проблемой.Проблема в том, что этот SRAM имеет 128k 8-битный адрес.Мои цифры 16 бит.Я не могу написать их напрямую.Вот мой кодЯ проверил RAM с этим кодом:

`

void loop() {
  int i = 0;
  Serial.print("Write Byte: ");
  for (i = 0; i < 70000; i++) {
    //Serial.print("Write Byte: ");
    //Serial.print(i);
    //Serial.println();
    SRAM.writeByte(START_ADDRESS, i);
    START_ADDRESS = START_ADDRESS + 1;
  }
  Serial.print("Write End");
  i = 0;
  START_ADDRESS = 0;
  for (i = 0; i < 300; i++) {
    Serial.print("Read Byte:  ");
    Serial.print(SRAM.readByte(START_ADDRESS));
    Serial.println();
    Serial.println();
    START_ADDRESS = START_ADDRESS + 1;
    delay(100);
  }
}`

Я добавил библиотеку 23LC.Если он запускается, считывает числа из ОЗУ, но после 255 он снова начинает читать 0.Я знаю, почему это происходит.Но я не знаю, как решить проблему.

Я пытался использовать команду writeBlock, но она работает только для меня с переменными char.Переменная Char требует больше места, чем целые числа.У меня не так уж много.

Есть ли кто-нибудь, кто может написать пример кода, который может записать 16-разрядное целое число со знаком в sram?

1 Ответ

2 голосов
/ 22 сентября 2019

Ниже я прокомментировал наиболее очевидные проблемы в вашем исходном коде:

void loop() {
    int i = 0;
    Serial.print("Write Byte: ");
    for (i = 0; i < 70000; i++) {          // since i is a 16bit int, 70,000 is out of range.
        SRAM.writeByte(START_ADDRESS, i);  // cool you wrote 1 byte, where is the other write?
        START_ADDRESS = START_ADDRESS + 1; // try to keep all caps names for constants.
                                           // this will make your code easier to read, trust me!
    }
    Serial.print("Write End");
    i = 0;
    START_ADDRESS = 0;
    for (i = 0; i < 300; i++) {
        Serial.print("Read Byte:  ");
        Serial.print(SRAM.readByte(START_ADDRESS)); // you read 1 byte, you can't expect a 16 bit 
                                                    // value out of that.
        Serial.println();
        Serial.println();
        START_ADDRESS = START_ADDRESS + 1;
        delay(100);
    }
}

Вот более разумный подход, он хранит неподписанные целые, но их можно легко заменить на подписанные.

#define SRAM_SIZE (128UL << 10)  // we have 128K of SRAM available. 
                                 // The U and L make this value an unsigned long.
                                 // ALWAYS use unsigned values for addresses.

void loop()
{
    Serial.print(F("Writing sequential numbers into SRAM..."));  // _always_ store string constants in flash.
                                                                 // save your RAM for more interesting stuff.

    for (unsigned long i = 0; i < SRAM_SIZE; i += 2) // filling SRAM
    {
         // this is the (truncated from 0-65535) value we'll write.
         unsigned int value = static_cast<unsigned int>(i & 0xFFFF);

         SRAM.writeByte(i, value & 0xFF);                 // write lowest 8 bits
         SRAM.writeByte(i + 1, (value >> 8) & 0xFF);      // write next 8 bits.
    }
    Serial.println(F("done."));

    // read back
    Serial.println(F("SRAM contents (16-bits unsigned values):"));

    for (unsigned long i = 0; i < SRAM_SIZE; i += 2) // reading all SRAM in 16-bit chunks.
    {
        Serial.print(i, HEX);
        Serial.print(F(": "));

        // read two consecutive bytes and pack them into a 16-bit integer.
        unsigned int value = SRAM.readByte(i) + (static_cast<unsigned int>(SRAM.readByte(i+1)) << 8);   // the cast is necessary.
        Serial.println(value);
    }
    delay(100);
}
...