#1 Програмування Arduino » Незрозуміла поведінка масиву » 2022-05-07 11:14:13

skeef
відповідей: 5

Добрый день!
Пишу отладочный код для 24С256.
Наткнулся на непонятное поведение записи чтения массива

void setup()
{
  Serial.begin(9600);
  Serial.println("Hello!");

  uint8_t dat[10];
  Serial.println(F("Writing random "));
  for (uint8_t i = 0; i < 10; i++) {
    dat[i] = random(0,254);
    Serial.print(dat[i]);
    Serial.print(' ');
  }
  Serial.println();
  Serial.println();

  Serial.println(F("Check: "));
  for (uint8_t i = 0; i < 10; i++) {
    Serial.print(dat[i]);
    Serial.print(' ');
  }
}

Получаю после прошивки (Nano, PlatformIO):

Hello!
Writing random
43 71 29 238 220 122 60 98 43 169

Check:
184 184 184 184 184 184 184 184 184 184

Что я делаю не так?

PS
Вынес объявление массива до setup() - все заработало верно. Но ведь при объявлении массива внутри setup() он же находится в зоне видимости.

Почему не работает?

#2 Re: Програмування Arduino » Так як же в неї писати, блін! Arduino Uno FT24C256A » 2021-10-03 23:31:49

Так, вірно. Але біда ще в іншому. Wire () має буфер 32 байта але разом з адресою. Так можна відправляти 30байт даних + 2 байта адреси. Ось цей код спрацював

byte dataA[] = {  1, 2, 3, 4, 5, 6, 7, 8,
                 9,10,11,12,13,14,15,16,
                17,18,19,20,21,22,23,24
              },
    dataB[] = {
                25,26,27,28,29,30,31,32,
                33,34,35,36,37,38,39,40,
                41,42,43,44,45,46,47,48
              },
    dataC[] = {
                49,50,51,52,53,54,55,56,
                57,58,59,60,61,62,63,64,
                65,66,67,68,69,70,71,72
              },
    dataD[] = { 73,74,75,76,77,78,79,80,
                81,82,83,84,85,86,87,88,
                89,90,91,92,93,94,95,96
              };


Serial.println("Memory written from: " + String(addr) + " dataA");

eMem.i2c_eeprom_write_page(EEPROM_I2C_ADDRESS, addr, (byte *)dataA, 24); 

delay(200);
addr +=24;
Serial.println("Memory written from: " + String(addr) + " dataB");
eMem.i2c_eeprom_write_page(EEPROM_I2C_ADDRESS, addr, (byte *)dataB, 24); 

delay(200);
addr +=24;
Serial.println("Memory written from: " + String(addr) + " dataC");
eMem.i2c_eeprom_write_page(EEPROM_I2C_ADDRESS, addr, (byte *)dataC, 24); 

delay(200);
addr +=24;
Serial.println("Memory written from: " + String(addr) + " dataD");
eMem.i2c_eeprom_write_page(EEPROM_I2C_ADDRESS, addr, (byte *)dataD, 24); 

Але, з'явилася нова біда в перших 8 адресах:

  0: 41   1: 42   2: 43   3: 44   4: 45   5: 46   6: 47   7: 48
 8: 9    9: A    A: B    B: C    C: D    D: E    E: F    F: 10
10: 11  11: 12  12: 13  13: 14  14: 15  15: 16  16: 17  17: 18
18: 19  19: 1A  1A: 1B  1B: 1C  1C: 1D  1D: 1E  1E: 1F  1F: 20
. . .
4F: 50  50: 51  51: 52  52: 53  53: 54  54: 55  55: 56  56: 57
57: 58  58: 59  59: 5A  5A: 5B  5B: 5C  5C: 5D  5D: 5E  5E: 5F
5F: 60  60: FF

Якимось чином додається 0x40. Спробував записати в них побайтово - все нормально. Виходить баг з посторінковим записом.
Шукаю бібліотеку "правильну"
Дякую за допомогу smile

#3 Програмування Arduino » Так як же в неї писати, блін! Arduino Uno FT24C256A » 2021-10-03 18:52:43

skeef
відповідей: 3

Вітаю шановне панство!
Сабж
Использую библиотеку

#include <Arduino.h>
#include <Wire.h>
#include <EEEPROM.h>

#define EEPROM_I2C_ADDRESS  0x50

EEEPROM eMem;

bool saveData = false;
int addr=0;

void setup() {
  Wire.begin();
  Serial.begin(9600);

  onMem();

if(saveData) {
  byte dataA[] = {  1, 2, 3, 4, 5, 6, 7, 8,
                   9,10,11,12,13,14,15,16,
                  17,18,19,20,21,22,23,24,
                  25,26,27,28,29,30,31,32
                },
      dataB[] = { 33,34,35,36,37,38,39,40,
                  41,42,43,44,45,46,47,48,
                  49,50,51,52,53,54,55,56,
                  57,58,59,60,61,62,63,64
                },
      dataC[] = { 65,66,67,68,69,70,71,72,
                  73,74,75,76,77,78,79,80,
                  81,82,83,84,85,86,87,88,
                  89,90,91,92,93,94,95,96
                };

Serial.println("Memory written from: " + String(addr) + " dataA");

  eMem.i2c_eeprom_write_page(EEPROM_I2C_ADDRESS, addr, (byte *)dataA, 32); // write to EEPROM
  delay(200);
  addr +=31;
  Serial.println("Memory written from: " + String(addr) + " dataB");
  eMem.i2c_eeprom_write_page(EEPROM_I2C_ADDRESS, addr, (byte *)dataB, 32); // write to EEPROM
  delay(200);
  addr +=31;
  Serial.println("Memory written from: " + String(addr) + " dataC");
  eMem.i2c_eeprom_write_page(EEPROM_I2C_ADDRESS, addr, (byte *)dataC, 32); // write to EEPROM

    delay(100);
  Serial.println("Memory written");
}
else {  
  Serial.println("READ ONLY");
}
  addr = 0;

  while (addr < 100)
  {
        Serial.print(addr, HEX);
        Serial.print(": ");
        Serial.println(eMem.i2c_eeprom_read_byte(EEPROM_I2C_ADDRESS, addr), HEX);     
        addr++; 
  }

}
void loop() {
}

Отримую (трохи згрупувв шоб місце менш займало) :

 0: 43    1: 44    2: 45     3: 46    4: 47    5: 48    6: 49    7: 4A
 8: 4B    9: 4C    A: 4D     B: 4E    C: 4F    D: 50    E: 51    F: 52
10: 53   11: 54   12: 55    13: 56   14: 57   15: 58   16: 59   17: 5A
18: 5B   19: 5C   1A: 5D    1B: 5E   1C: 1D   1D: 1E   1E: FF   1F: 21
20: 22   21: 23   22: 24    23: 25   24: 26   25: 27   26: 28   27: 29
28: 2A   29: 2B   2A: 2C    2B: 2D   2C: 2E   2D: 2F   2E: 30   2F: 31
30: 32   31: 33   32: 34    33: 35   34: 36   35: 37   36: 38   37: 39 
38: 3A   39: 3B   3A: 3C    3B: 3D   3C: 3E   3D: 3D   3E: 41   3F: 42
40: FF   41: FF   42: 41    43: 42   44: 43   45: 44   46: 45   47: 46 
48: 47   49: 48   4A: 49    4B: 4A   4C: 4B   4D: 4C   4E: 4D   4F: 4E
50: 4F   51: 50   52: 51    53: 52   54: 53   55: 54   56: 55   57: 56
58: 57   59: 58   5A: 59    5B: 5A   5C: 5B   5D: 5C   5E: 5D   5F: 5E
60: FF   61: FF   62: FF    63: FF

Ша я не так роблю?
Дякую всім

Підвал форуму