[an error occurred while processing this directive] [an error occurred while processing this directive]
Я делаю так
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
[an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive]

Отправлено Voldemar 06 сентября 2001 г. 19:45
В ответ на: HiTech и константы отправлено Александр 06 сентября 2001 г. 18:07


Объявляю массив констант типа 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} };


в моем случае 8 каналов по 3 константы на каждый. Начальный адрес меня не интересует.

Вычисления с помощью констант выполняются обычным способом, например:


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]); // записываем в FLASH

while(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