ADUC814 управляет АЦП AD7793 и передает по RS232 данные на другой МК AT89C51.
Раньше я оперировал только 3-мя байтами, принимал их и передавал таким образом:
union
{
unsigned long uD;
unsigned char uData[4];
} uDataUnion;
char i = 0;
uDataUnion.uData[0] = uDataUnion.uData[1] =
uDataUnion.uData[2] = uDataUnion.uData[3] = 0x00;
for (i = 1; i <= 3; ++i)
{
SPIDAT = 0x00;
while (!ISPI);
uDataUnion.uData[i] = SPIDAT; // запоминает принятый от AD7793 очередн. байт
ISPI = 0;
}
for (i = 3; i >= 0; --i)
{
Putc(kGainUnion.kGainArr[i]);
}
Экспериментальным путем я выяснил, что корректно "склеиваются" данные только, когда мы в объединении обнуляем нулевой элемент массива, а байты записываем с 1-ого по 3-ий, т.е. фактически для 3-ех байтного числа я использовал 4-ех байтное.
Теперь к вопросу.
На данном этапе мне понадобилось осуществить предварительную обработку кодов АЦП перед отправкой:
union
{
unsigned long int kGain;
unsigned char kGainArr[4];
} kGainUnion;
kGainUnion.kGain = ((2147483648 - pow(2, (31-gain))) + (uDataUnion.uD * pow(2, (7-gain))));
результат данной операции занимает 4 байта, соответственно для его корректной "склейки" мне необходим 5-ый байт, равный 0х00.
KEIL C51 не может оперировать данными более 4 байт, соответственно возникает проблема передачи. Как мне все это провернуть по проще? и Почему UNION некорректно работает, т.е. приходится