чтобы выполнилось надо в main() эту функцию вызвать:у тебя никогда не выполнится
Код: Выделить всё
init();а ниже вы пишите что нужно различать 0 и 1, чтото логики нетуна вход МК поступают синхроимпульсы, 32 импульса по 1-му проводу (СИ) (всегда 1 с периодом 20 мкс, 32 шт.), по 2-му просто импульсы (ИМП) (тоже только 1,)
Посмотрев картинку кое что понятно. Чтобы оно работало вам надо использовать прерывание по переднему фронту, так проще всего.
Код: Выделить всё
глобальные переменные:
int dataready;
int x[32];
в обработчике пишем:
.....
{
int i;
dataready=0;
delay_us(4);
if (PINB.3 == 0) x[i]=0; //PINB.3 - допустим тут ваши информационные импульсы
else
x[i]=1;
i++;
if (i==32)
{
i=0;
dataready=1;
}
}
Чтобы выполнить твои условия
void analyse()
{
int j, tmp;
if (x[0] == 1 && x[7] == 1)
if (x[1] == 0 && x[2] == 0 && x[3] == 0 && x[4] == 0 && x[5] == 0 && x[6] == 0)
if (x[29] == 0 && x[30] == 0)
{
for (j=0; j<32; j++)
tmp +=x[j];
if ((tmp%2) != 0)
if (dataready)
transmit();
}
}
Функция передачи 15-28 импульса
void transmit()
{
int i;
for (i=14;i<28;i++)
{
PORTD.5 = 1; //синхроимпульс на выход, если он нужн
if (x[i] == 0) PORTD.4 = 0; // порт вывода данных
else
PORTD.4 = 1;
delay_us(10); // корректировать по времени исполнения кода
PORTD.5 = 0;
PORTD.4 = 0;
delay_us(10); // корректировать по времени исполнения кода
}
}
Как то так... Не проверял, но логика работы такая. Играйтесь


