#include // ******* Программа управления зажиганием CDI. V 4.0 ******* // ******* Лашманов А. (alash) 07.2004-07.2005. ******* // // Глобальные переменные // // P1 - порт входной // P3 - порт выходной // Часторта счетчика- таймера = 1 мГц (такстовая частота контроллера 12 мГц) unsigned int oldTime; unsigned int rtcbw; unsigned int CompTime; unsigned int m; signed long delta; unsigned long CompTimeLong; char TimeOver; char vInpC; unsigned char k; //**************************************************************** void main(void) //********************* Main program body ************************ { //*********** Начальная установка переменных ******** TimeOver = 1; vInpC = 0; CompTime = 0; oldTime = 0xff00; //*********** Начальная установка режимоа таймера "0" ******** TMOD = 0x11; TCON = 0x10; P3 = 0; //*********** Бесконечный цикл, период около 100 мкс ******** while(1) { // Секция проверки входного сигнала, если 4 раза подряд = 1 // то сигнал принят. if ((P1&0x80) == 0x80) { vInpC ++; if (vInpC > 4) vInpC = 5; } else vInpC = 0; //===================== // Секция считывания счетчика-таймера (мл. и ст. байт) в переменную rtcbw rtcbw = 0; k = TL0; rtcbw += TH0; rtcbw <<= 8; rtcbw += k; //===================== // Секция сравнения данных таймера с заданным значением. // Включение и выключение выходного сигнала. // Контроль переполнения таймера ((rtcbw > 0xff00). "Частота // входного сигнала ниже 15 Гц (900 об/мин). if (rtcbw >= CompTime) if (CompTime |= 0) if (TimeOver == 0) { P3 |= 0x01; } if ( rtcbw > 500 ) if (rtcbw < 2000 ) { P3 &= 0xfc; } if (rtcbw > 0xff00) TimeOver = 1; //===================== // Секция вспомогательного (контрольного) выхода P3.7 if ((TH0 & 0x80) == 0x80) P3 |= 0x80; else P3 &= 0x7f; //===================== // Секция операций при обнаружении сигнала входного датчика. // Вычисление и коррекция времени опережения зажигания. if (vInpC == 4) { TL0 = 0x00; TH0 = 0x00; P3 |= 0x03; if (TimeOver == 0) { // Секция арифметико-логического предсказания и коррекции delta = 0; delta += rtcbw; delta -= oldTime; oldTime = rtcbw; CompTimeLong = rtcbw; if (delta > 0) CompTimeLong += delta; m = P1; m = ~m; m &= 0x003c; m <<= 5; CompTimeLong -= m; //======================================================== if (CompTimeLong > 0x8000) // Переполнение, обороты двиг. низки. (менее 1800 об/мин) { CompTime = 0; } else { CompTime =(int) CompTimeLong; } } else { CompTime = 0; oldTime = 0xff00; } TimeOver = 0; } // После вычислений CompTime несет значение времени до очередного // импульса зажигания. Если CompTime = 0, значит, обороты двигателя // ниже 1800 об/мин и импульсов опережения зажигания не вырабатывается, // зажигание будет синхронно с входным сигналом. } //*** end while *** } //************ End of file **************