[an error occurred while processing this directive]
[an error occurred while processing this directive]
|
Объявляю массив констант типа double (32 bit)
const double R_CF[8][3] = {{0.0, 0.0, 0.0},
{0.0, 0.0, 0.0},
{0.0, 0.0, 0.0},
{0.0, 0.0, 0.0},
{0.0, 0.0, 0.0},
{0.0, 0.0, 0.0},
{0.0, 0.0, 0.0},
{0.0, 0.0, 0.0} };
Вычисления с помощью констант выполняются обычным способом, например:
unsigned char chan; //номер канала
double P[8]; // массив параметров
long int CD; //код АЦПP[chan] = (R_CF[chan][0]*CD+R_CF[chan][1])*CD + R_CF[chan][2];
константы записываются не программатором, а программой в ПИКе, которая по командам от РС получает константу в виде четырех байт, номер канала и номер константы (столбец массива)
Проседура записи выглядит так:
unsigned int adcf; //адрес константы
unsigned char cc[4]; // константа в виде четырех байт
unsigned char chan,ncf; // номер канала, номер константыadcf =(unsigned int)&R_CF; // адрес массива
adcf += ((chan<<2+chan+ ncf[2])<<2); //прибавляем смещение,
// умножение на 3 заменяется сдвигом и сложениеfor(i=0; i<4; i++)
WR_FLASH(adf+i,сс[i]); // записываем в FLASHwhile(WR){}; EEPGD = 0;
Функция записи в FLASH-память переделана из стандартного макроса записи в EEPROM
void WR_FLASH(unsigned int ad, uchar b)
{
while(WR) {};
EEADR = ad & 0xFF;
EEADRH = (ad >> 8);
EEDATH = 0x34; // Код команды retlw;
EEDATA = b;
EEPGD = 1; // программируем Program Memory
CARRY = 0; while(GIE){GIE=0;CARRY = 1;}
WREN = 1;
EECON2 = 0x55; EECON2 = 0xAA; // Спец. последовательность
WR = 1;
asm(" nop");
asm(" nop");
WREN = 0;
if(CARRY) GIE = 1;
}
HI-Tech C для доступа к константам из программной памяти использует команду RETLW xx поэтому каждый байт записиывается в виде 14-разрядного слова в котором старшие 6 бит = 0х34 - код команды RETLW.
E-mail: info@telesys.ru