[an error occurred while processing this directive]
УОЗ на Cygnal, не синхронизируется?
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

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

Отправлено Дима 25 ноября 2002 г. 08:22

получил ТЗ, разработал программу - снимает обороты от датчика и выставляет угол,-но проблема - нет синхронизации оборота и угла,
то биш "угол" (РСА) болтается, а должен стоять относительно "60-2"
ВМТ, устройство подает на две свечи, две искры -180 град и 360 град
разработал эмулятор движка "60-2"генератор прямоуг импульсов с 2 отсутствующими импульсами (он работает исправно -проверял по осциллографу от 250ГЦ-8КГЦ), и плата Cygnal c8051f010.
осциллограф двулучевой - луч от РСА болтается относительно оборотов,
Так как чайник полный и срок разработки прошел( мне интересно в чем проблема , для начинающего это важно понять - для дальнейшей работы , - прилагаю исходник, могу выслать имитатор "60-2".исходник,
Заранее спасибо!!!
С уважение Дима !!!


/********************************************/
/*ПРОГРАММА ОПЕРЕЖЕНИЯ УГЛА ЗАЖИГАНИЯ ДЛЯ */
/* ДВИГАТЕЛЯ ВНУТРЕННЕГО СГОРАНИЯ НА */
/* KIT ФИРМЫ CYGNAL C8051F010-TB */
/********************************************/

/************************ Headers Files *********************************/

#include
#include

data union
{
unsigned int w;
unsigned char b[2];
}
period; // период импульса

/********************************** таблица в ПЗУ ********************************/

unsigned int code x[10]={133,142,166,200,250,333,500,1000,2000,3333};
unsigned int code y[10]={3990,4260,4980,6000,7500,9990,15000,30000,60000,99990};
unsigned int code z[10]={7980,8520,9960,12000,15000,19980,30000,60000,120000,199980};

/********************************************************************************/


/********************************* Unions ****************************************/

data union
{
unsigned int w;
unsigned char b[2];
}
cvecha1; // свеча 1

data union
{
unsigned int w;
unsigned char b[2];
}
cvecha2; // свеча 1

data union
{
unsigned int w;
unsigned char b[2];
}
delay_cv; // длительность искры 100 мкс

data union

{
unsigned int w;
unsigned char b[2];

}
var_PCA0; // для хранения значения модуля PCA0

data union

{
unsigned int w;
unsigned char b[2];

}
var_PCA1;// для хранения значения модуля PCA1


/****************************** Variables and bits init ************************/

data bit Lg,flag_delay ; // вспомогательная переменная
unsigned char i; // переменная индекса массива
unsigned char mask ; // переменная для маскирования

/*********************** Port0 ******************/

sbit Fire1 = P0^1; // Fire : "1" = ON ;"0" = OFF
sbit Fire2 = P0^2;



/*********************** MAIN *********************/

void main (void)
{

delay_cv.w = 100; // длительность исркы
Fire1 = 0; // сброс порта P0.1
Fire2 = 0; // сброс порта P0.2

/******************* Timer 0 INIT *****************/

TMOD = 0x01;
TH0 = 0; TL0 = 0;
TR0 = 1; IT0 = 1;

/******************** WatchDog *************************/

WDTCN = 0xde; // watchdog disable
WDTCN = 0xad;

/************************** Crossbar and GPIO ******************************/

XBR1 = 0x04; // P0.0 input INT0 as Open-Drain Output/Input 17 pin on board
XBR2 = 0x40; // Enable crossbar and weak pull-ups
PRT0CF = 0x06; // enable P0.1 and P0.2 (Fire) as a push-pull output 18 pin and 15 pin on board

/****************** PCA init *********************/

PCA0CPM0 = 0x09; // PCA0 Software Timer Mode with generate an interrupt ECCF0
PCA0CPM1 = 0x09; // PCA0 Software Timer Mode with generate an interrupt ECCF1
PCA0CPH0 = 0; PCA0CPL0 = 0; //сброс регистров модуля сравнения 0
PCA0CPH1 = 0; PCA0CPL1 = 0;//сброс регистров модуля сравнения 1
PCA0CN = 0x00; // STOP PCA Counter/Timer Run Control
PCA0H = 0x00; //clear register PCA
PCA0L = 0x00; // clear register PCA
PCA0CN = 0x40; // PCA Counter/Timer Run Control
PCA0MD = 0x02; // System clock divided by 4


/****************** Oscillator Configuration *********************/

OSCXCN = 0x10; // Internal oscillator 16 МГц
OSCICN = 0x07; // External oscillator disable


/******************Interrupt init ****************/

EX0 = 1; ET0 = 1;
EIE1 = 0x08; // Enable Programmable Counter Array (PCA0) Interrupt
EA = 1;


/************************** Фоновая программа *********************/

while (1)
{
i = 0;

if (period.w < x[0] || period.w > x[9])
{
cvecha1.w = 0;
cvecha2.w = 0;


}
else
{
if(period.w >= x[0] && period.w <= x[9])
{
while ( period.w > x[i] )

i++;
cvecha1.w = y[i-1]+((period.w-x[i-1])*(y[i]-y[i-1]))/(x[i]-x[i-1]);
cvecha2.w = z[i-1]+((period.w-x[i-1])*(z[i]-z[i-1]))/(x[i]-x[i-1]);


}
}
}

}

/***************************************** Interrupts ************************************/

void int0 (void) interrupt 0 // INT0
{
IE0 = 0; EX0 = 0;
TR0 = 0;

period.b[1] = TH0;
period.b[0] = TL0;

if (Lg == 0)
{
if (period.w > 2 * x[i])
{
Lg=1;
PCA0CN = 0x00;
PCA0L = 0x00;
PCA0H = 0x00;
PCA0CN = 0x40; //вкл PCA
var_PCA0.b[1] = PCA0CPL0 = cvecha1.b[1]; // считали значения модуля Capture/Compare 0 в переменную, и
var_PCA0.b[0] = PCA0CPH0 = cvecha1.b[0]; // присвоили модулу 0 значения переменной свечи 1
var_PCA1.b[1] = PCA0CPL1 = cvecha2.b[1]; // считали значения модуля Capture/Compare 1 в переменнeую, и
var_PCA1.b[0] = PCA0CPH1 = cvecha2.b[0]; // присвоили модулу 1 значения переменной свечи 1


}

}

TH0 = TL0 = 0;
TR0 = 1; EX0 = 1;

}


void timer0 (void) interrupt 1 // T1 Overflow
{
TF0 = 0; TR0 = 0;
TH0 = TL0 = 0;

}


void PCA0 (void) interrupt 9 // PCA0 interrupt source
{
/******************************************* Module 0 *****************************************/
mask = PCA0CN;
if (mask && 0x01)
{

CCF0 = 0;
if (flag_delay == 0)
{
Fire1 = 1; // установка порта P0.0 в 1
var_PCA0.w += delay_cv.w; // прибавили к регистрам модуля PCA0 Software timer Mode 100 мкс
flag_delay = 1;
}

if (flag_delay == 1)
{
Fire1 = 0 ; // сброс порта P0.0 в 0
flag_delay = 0 ;
}
}

/******************************************** Module 1 ***************************************/

mask = PCA0CN;
if (mask && 0x02)
{
CCF1 = 0;
if (flag_delay == 0)
{
Fire2 = 1; // установка порта P0.1 в 1
var_PCA0.w += delay_cv.w; // прибавили к регистрам модуля PCA0 Software timer Mode 100 мкс
flag_delay = 1;
}

if (flag_delay == 1)
{
Fire2 = 0 ; // сброс порта P0.1 в 0
PCA0CN = 0x00; // STOP PCA Counter/Timer Run Control
PCA0H = 0x00;
PCA0L = 0x00;
flag_delay = 0 ;
Lg = 0; // сброс бита для разрешения начала отсчета "60-2"

}

}
}

/************************************ End of Interrupts ***************************************/



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

Ответы



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

E-mail: info@telesys.ru