Теперь осталось дело за малым, мне нужна помощь в схемотехнике для реализации тествого прототипа, и будет всем обладателям виэйтов счастье .
Код: Выделить всё
// автор: nikll@rambler.ru
// программа написанна на microC (http://www.mikroe.com/), тестировал на симуляторе PIC Simulator IDE (www.oshonsoft.com)
//
// на PORTA целпяем форсунки (с 1 по 4 контакты) и катушки (с 5 по 8 либо 5 и 6 в зависимости от выводов контроллера)
// с PORTB (1-4) идут сигналы на дублирующщие через 90градусов форсунки, и (5-8 или 4-6) сигналы на дублирующщие через 90градусов катушки
//
// необходимо сделать обвязку на микросхему и чертеж печатной платы для изготовления опытного образца.
unsigned long
OnTimeFors = 0, // время между открытиями форсунок
LastOnTimeFors = 0, // время до открытия дублирующщей форсунки
OffTimeFors = 0, // время между закрытиями форсунок
LastOffTimeFors = 0, // время до закрытия дублирующщей форсунки
OnTimeIng = 0, // время между открытиями форсунок
LastOnTimeIng = 0, // время до открытия дублирующщей форсунки
OffTimeIng = 0, // время между закрытиями форсунок
LastOffTimeIng = 0; // время до закрытия дублирующщей форсунки
char
lastfors=0, // предыдущщее состояние форсунок
diff, // изменение в состоянии форсунок
onfors, // включившиися форсунки
lastonfors=0, // предыдущщие включившиися форсунки
offors, // отключившиися форсунки
lastoffors=0, // предыдущщие отключившиися форсунки
outfors=0, // состояние дублирующщих форсунок
oning, // включившиися катушки
lastoning=0, // предыдущщие включившиися катушки
offing, // отключившиися катушки
lastoffing=0; // предыдущщие отключившиися катушки
void interrupt() {
if (INTCON.T0IF) {
TMR0 = 160;
diff = PORTA ^ lastfors; // получаем изменение в состоянии форсунок и катушек
onfors = diff & PORTA & 0x0F; // получаем список включившихся форсунок
offors = diff & lastfors & 0x0F; // получаем список отключившихся форсунок
oning = diff & PORTA & 0xF0; // получаем список включившихся катушек
offing = diff & lastfors & 0xF0; // получаем список отключившихся катушек
if (onfors>0) { // если есть открывшиеся форсунки то
lastonfors = onfors;
LastOnTimeFors = OnTimeFors; // сохраняем время между открытиями
OnTimeFors = 0; // и обнуляем счетчик.
} else OnTimeFors++; // иначе увелчиваем счетчик
if (oning>0) { // если есть сигнал на катушки то
lastoning = oning;
LastOnTimeIng = OnTimeIng; // сохраняем время между сигналами
OnTimeIng = 0; // и обнуляем счетчик.
} else OnTimeIng++; // иначе увелчиваем счетчик
if (LastOnTimeFors>1) { // если время еще не вышло то
LastOnTimeFors--; // отматываем таймер с двойной скоростью чтобы получить половиную задержку
LastOnTimeFors--;
} else outfors = outfors | lastonfors;
if (LastOnTimeIng>1) { // если время еще не вышло то
LastOnTimeIng--; // отматываем таймер с двойной скоростью чтобы получить половиную задержку
LastOnTimeIng--;
} else outfors = outfors | lastoning;
if (offors>0) { // если есть закрывшиеся форсунки то
lastoffors = offors;
LastOffTimeFors = OffTimeFors; // сохраняем время между закрытиями
OffTimeFors = 0; // и обнуляем счетчик.
} else OffTimeFors++; // иначе увелчиваем счетчик
if (offing>0) { // если нет сигнала на катушки то
lastoffing = offing;
LastOffTimeIng = OffTimeIng; // сохраняем время между пропаданиями сигнала
OffTimeIng = 0; // и обнуляем счетчик.
} else OffTimeIng++; // иначе увелчиваем счетчик
if (LastOffTimeFors>1) { // если время еще не вышло то
LastOffTimeFors--; // отматываем таймер с двойной скоростью чтобы получить половиную задержку
LastOffTimeFors--;
} else {
if (lastoffors.F0) outfors.F0=0;
if (lastoffors.F1) outfors.F1=0;
if (lastoffors.F2) outfors.F2=0;
if (lastoffors.F3) outfors.F3=0;
}
if (LastOffTimeIng>1) { // если время еще не вышло то
LastOffTimeIng--; // отматываем таймер с двойной скоростью чтобы получить половиную задержку
LastOffTimeIng--;
} else {
if (lastoffing.F4) outfors.F4=0;
if (lastoffing.F5) outfors.F5=0;
if (lastoffing.F6) outfors.F6=0;
if (lastoffing.F7) outfors.F7=0;
}
////////////////////////////////////////////////////////////////////
lastfors = PORTA; // сохраняем текущщее состояние
PORTB = outfors;
INTCON = 0x20; // Set T0IE, clear T0IF
}
}
void main() {
ANSEL = 0; // Configure AN pins as digital I/O
ANSELH = 0;
OPTION_REG = 0x80; // Assign prescaler to TMR0
PORTA = 0x00; // init PORTA
TRISA = 0xFF; // configure PORTA pins as input
PORTB = 0x00; // set PORTB to 0
TRISB = 0x00; // designate PORTB pins as output
PORTC = 0x00; // set PORTC to 0
TRISC = 0x00; // designate PORTC pins as output
PORTD = 0x00; // set PORTD to 0
TRISD = 0x00; // designate PORTD pins as output
TMR0 = 0xFE; // сразу уходим в прерывание
INTCON = 0xA0; // Enable TMRO interrupt
}