Интересная программа.
Ну вот например -
Код:
|
//Таймер переполняем примерно 500к раз в секунду
//Главное тут избыточность тиков чтобы четко выявить длину значимого бита.
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
TCNT0=0x01;
... |
И
Цитата:
|
Чип к примеру тинька 2313 на 4мгц
|
Чтоб получить 500000! прерываний за секунду 4МГц явно недостаточно. 8 тактов - это вход и выход в/из прерывания. Без сохранения SREG и осмысленных действий.
Кроме того TCNT0=0x01; - значит следующее прерывание будет через 255 тактов. Реально еще больше, ведь на момент входа в прерывание TCNT0 уже до какого то значения досчитает. Так что делать 32-х битный счетчик unsigned long int IR_Clock=0 нет необходимости - при 15000 прерываний в секунду и 16 битная переменная переполнится только через 4 секунды. Перед замером длительности импульса неплохо обеспечить гарантированно измерение с начала, т.е. неплохо подождать стартового перепада. Иначе результат может быть далеким от ожидаемого.
ЗЫ. Что за компилятор? Он точно не требует volatile для переменных изменяемых в прерывании и контролируемых в основном цикле? И вообще доступ к таким переменным в основном цикле должен быть из критической секции, иначе возможны странные глюки - считали половину переменной,прерывание с ее изменением, считали вторую половину. Что считано? Да и алгоритм стоит переработать - упрощения не видно, а загрузка процессора на время приема 100%.