[an error occurred while processing this directive]
Проблемы с PCA :E,;-(((()((
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Дима 06 июня 2003 г. 07:14

Пишу программу для зажигания снегохода задача элементарная - выбрать из массива два смежных элемента матрицы соответсвенно периоду оборотов двигателя и с помощью интерполяции высчитать угол (КОМПАРАТОРОМ ВЫЛАВЛИВАЮ СПАД ФРОНТА - АЛЬФУ НАДО ДАВАТЬ ПО СПАДУ) , после подать 100 мкс на открытия тиристора -,так эти 100 мкс я заложил в модуль 0 "1" и 1 "0" PCA. Таймер PCA считает период отлично - частота 11,059МГц такт - 1,085 мкс, период 5000 мкс (6000 оборотов в минуту)
считает верно - 4666. Но как загружаю в модули 100 мкс при 100 Гц (
я проверяю с помощью генератора синусоидальных сигналов ) работает нормально ,НО КАК 200ГЦ - НАЧИНАЕТСЯ ТАКОЕ - ТО ИНВЕРТИРУЕТСЯ ИМПУЛЬС (100 МКС),БОЛЬШАЯ АМПЛИТУДА, ПЕРЕДЕЛЫВАЮ ПРОГРАММУ - С ЧАСТОТОЙ УВЕЛИЧИВАЕТСЯ ИМПУЛЬС -100 МКС, T.Е. ЕСЛИ 100ГЦ -ИМПУЛЬС 100 МКС,ЕСЛИ 200ГЦ ИМПУЛЬС 200МКС В ЧЕМ ДЕЛО,? ГДЕ ОШИБКА,? ДВА ДНЯ ДОЛБЛЮ - НЕ ВИЖУ ,,,
ПОДСКАЖИТЕ В ЧЕМ ТУТ ДЕЛО? И ПРИМЕР СМОТРЕЛ И INTEL PCA И CYGNAL -
ВСЕ ОДНО ОЧЕНЬ НУЖДАЮСЬ В СОВЕТЕ ИЛИ ПРИМЕРЕ,,,

Менял и флаги и переставлял прерывания и что только не делал - видно от безисходности - все четно ,,,, ЧТО ЖЕ ВСЕ ЖЕ С МАТРИЦЕЙ ВЕДЬ ОНА СТАНДАРТНАЯ - INTELовская?
ЗАРАНЕЕ СПАСИБО !!!!
С ГЛУБОКИМ УВАЖЕНИЕМ ДИМА!!!

#include
#include


/****************************** Array in ROM **************************************/

unsigned int code x[9]={4000,4291,5000,5980,7518,10000,15000,30000,62500};
unsigned int code y[9]={468,418,540,567,915,1127,1494,2505,3330};


data union {
unsigned int w;
unsigned char b[2];
}period;

data union {
unsigned int w;
unsigned char b[2];
}vlue_apprchd;

unsigned char i;
int_external0 (void) interrupt 0 {

IE0 = 0;
EX0 = 0;
CR = 0;

period.b[1] = PCA0L;
period.b[0] = PCA0H;

if (period.w >= 4000 && period.w<= 62500)
{
i = 0;
while ( x[i] <= period.w )
i++;
vlue_apprchd.w = y[i-1] + ((period.w - x[i-1]) * (y[i]-y[i-1])) / (x[i] - x[i-1]);
}

PCA0CPL0 = vlue_apprchd.b[1];
PCA0CPL0 = vlue_apprchd.b[0];
PCA0CPM0 = 0x49;




PCA0H = 0;
PCA0L = 0;
CR = 1;
EX0 = 1;

}

sbit OutPtr = P0^2;
void PCA0 (void) interrupt 9 {

if (CCF0)
{
CCF0 = 0;
OutPtr = 1;
PCA0CPL1= vlue_apprchd.b[1] + 100;
PCA0CPH1= vlue_apprchd.b[0] + 0;

PCA0CPM1 =0x49;
PCA0CPM0 = 0;

}

if (CCF1)
{
CCF1 = 0;
PCA0CPM1 = 0;
OutPtr = 0;
}
}

unsigned char k;
unsigned int n;

void main (void)
{

WDTCN = 0xDE; // Disable WDT
WDTCN = 0xAD;

XBR0 = 0x80;
XBR1 = 0x04; // XBAR1: Initial Reset Value
XBR2 = 0x40; // XBAR2: Initial Reset Value
PRT0CF = 0x05;
// Oscillator Configuration

OSCXCN = 0x67; // EXTERNAL Oscillator Control Register
for (n = 0; n < 255; n++) ; // wait for osc to start
while ( (OSCXCN & 0x80) == 0 ); // wait for xtal to stabilize

OSCICN = 0x08; // Internal Oscillator Control Register Disable CPT0CN = 0x80; // Comparator 0 Control Register
for(;k<10;++k);
CPT0CN &= 0xCF; //clear interrupt pending flags
CPT0CN &= ~0x30;
CPT0CN = 0xB0;
ЭТО ТАЙМЕР МАТРИЦЫ F/12
PCA0MD = 0x00;


EX0 = 1;
IT0 = 1;

EIE1 = 0x08;
EIP1 = 0x08;
EA = 1;
ЭТО ЗАПУСК ТАЙМЕРА СЧЕТЧИКА МАТРИЦЫ
CR = 1;




while (1)
{
continue ;
}

}


Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru