Прошу направить на путь «истинный»
1. строка while((time_out>0) and (ACSR & 0x20)==0))-- time_out; // Wait for first impulse
Было под Мегу 8 while((--time_out)&&(!ACSR.5)); // Wait for first impulse
Тут вроде работает…
Далее дошел до строк
2. time_imp=TCNT1H; // Здесь заведомо не правильно
time_imp=TCNT1L; // Здесь заведомо не правильно
//Под Мегу8 было time_imp=TCNT1 но такой вариант у меня не прокатывает в CodeAVR
// анализ длительности
if ((time_imp>T0_MIN)&&(time_imp<T0_MAX>3250)
// time_out=65000;
// else
// time_out=IR_TIME_OUT*20; // IR_TIME_OUT=1600 -> 10 сек таймаут ожидания первого импульса
time_out=65000;
Вот тут изменил
while((time_out>0) and (ACSR & 0x20)==0))-- time_out; // Wait for first impulse
TCCR1B=0x01; // запуск таймера f=32768/1 Гц
if (!time_out)
{
TCCR1B=0x00; // останов таймера
return 1; // ошибка - timeout
};
// ждем окончания импульса или таймаута
time_out=IR_TIME_OUT;
while((time_out>0) and (ACSR & 0x20)==0))-- time_out; // Wait for first impulse
TCCR1B=0x00; // останов таймера
if (!time_out)
return 1; // ошибка - timeout
1 с этого места начинаются Проблемы
time_imp=TCNT1H;
time_imp=TCNT1L;
// анализ длительности
if ((time_imp>T0_MIN)&&(time_imp<T0_MAX>T1_MIN)&&(time_imp<T1_MAX))
read_byte=1;
else
return 2; // ошибка - не соотв. длительность импульса
}
//7 bit 7 bit 7 bit 7 bit 7 bit 7 bit 7 bit 7 bit 7 bit 7 bit
for(i=0;i<7>0) and (ACSR & 0x20)==0))-- time_out; // Wait for first impulse
TCCR1B=0x00; // останов таймера
if (!time_out)
return 1; // ошибка - timeout
time_imp=TCNT1H;
time_imp=TCNT1L;
read_byte<<1>T0_MIN)&&(time_imp<T0_MAX>T1_MIN)&&(time_imp<T1_MAX))
{
read_byte+=1;
}
else
return 2; // ошибка - не соотв. длительность импульса
}
}
ByteIR = read_byte;
return 0; // успех
}

