Сообщение от Saadov
|
N_Sensrs (15 - это кол-во байт в памяти отведенных на 1 датчик?
|
Нет, это количество датчиков в строке таблицы (
или в одной зоне, в Ваших терминах). Если размер одного элемента данных принять за K, то в первой строке смещения пятнадцати элементов матрицы (относительно начального адреса матрицы) будут:
0*K, 1*K, 2*K, 3*K, 4*K, ... 13*K, 14*K,
смещения адресов элементов во второй строке окажутся на размер одной строки (15*K) дальше:
(15 + 0)*K, (15 + 1)*K, (15 + 2)*K, (15 + 3)*K, (15 + 4)*K, ... (15 + 13)*K, (15 + 14)*K,
в третьей:
(15*2 + 0)*K, (15*2 + 1)*K, (15*2 + 2)*K, (15*2 + 3)*K, (15*2 + 4)*K, ... (15*2 + 13)*K, (15*2 + 14)*K,
и, наконец, в последней:
(15*14 + 0)*K, (15*14 + 1)*K, (15*14 + 2)*K, (15*14 + 3)*K, (15*14 + 4)*K, ... (15*14 + 13)*K, (15*14 + 14)*K
То есть, в общем виде, формула смещения адреса для i-го элемента j-ой строки:
‹число элементов в строке›*‹номер строки - 1›*‹размер в байтах одного элемента› +
‹номер элемента в строке - 1›*‹размер в байтах одного элемента›
или, после сокращения:
(‹число элементов в строке›*‹номер строки - 1› + ‹номер элемента в строке - 1›)*‹размер в байтах одного элемента›
Если изобразить это в Си-коде, то следует помнить, что элементы массивов нумеруются уже с нуля, то есть эти "минус единицы" (‹...›-1) не нужны:
Код:
|
#define N_Zones 15
#define N_Sensrs 15
uint8 uiZone, // номер зоны
uiSens; // номер датчика
SensorDataType sdValue;
for (uiZone = 0; uiZone ‹ N_Zones; ++uiZone)
for (uiSens = 0; uiSens ‹ N_Sensrs; ++uiSens)
{
sdValue = ReadSensor(uiZone,uiSens);
address = base_addr + ( (uiZone)*N_Sensrs + uiSens )*sizeof( SensorDataType );
SpiMemWrite(sdValue, address);
} |
______________________
Сообщение от asket76
|
завести упорядоченную таблицу ID ‹-› адрес FRAM.
|
Здесь другая ситуация - нет "пользователей" с меняющимися ID, есть матрица из 15 зон с 15-ю датчиками в каждой. Проще сразу вычислять адрес, чем сканировать таблицу в поисках совпадения.