Боюсь Ваш метод мне не подойдет.
Объясню:
время необходимо измерять довольно точно. Ввиду этого я буду использовать 16-ти битный таймер, источником для счета выберу System clock. Таким образом получу переполнение таймера за 4095,9375 мкс. А если длительность импульса будет больше указанной величины?
Я планирую сделать так:
По переполнению таймера генерировать прерывание, в обработчике которого некая величина cycles будет инкрементироваться.
А контроллировать измеряемый импульс я буду внешним прерыванием. По спаду имульса на входе INT0 будет генерироваться прерывание, в обработчике которого будет производиться операция (cycles*65535+состояние счетчика на данны момент) / 16 - получаем длительность импульса в микросекундах при частоте кварца 16 МГц. После чего счетчик сбрасывается, переменная cycles обнуляется.
Уточню - мне нужно не время импульса, а время от фронта до следущего фронта. То есть период. Кроме того, использоваться бедт не только INT0, но и INT1, INT2, импульсы на которые будут приходить поочередно, а обработчк будет один и тот же.
Если предложенный мной алгоритм с использованием не только счетчика но и внешнего прерывания слишком сложен и объясняется незнанием мной всех возможностей счетчика, укажите мне на это.
В таймерах/счетчиках я полный ноль, заглянул в руководство - там 50 страниц с дикими 5-6-ти буквенными похожими друг на друга труднозапоминаемыми аббревиатурами. Господа, я знаю, что разбираться с этим буду недели две, а что конечный результат инициализации строк таймера займет 5-6 строк.
Будьте добры, помогите с примером кода, а я изменяя его и экспериментирую, как-нибудь дальше разберусь.
Вот мой код:
Код
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
lcd_setxy(2,15);
lcd_str_fl("timer is overflow",f8x14,green);//ñòðîêà èç flash
cycle++;
}
void main(void)
{
TCCR1A=0x00;
TCCR1B=0x01;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
........
.........
for (;;)
{
lcd_setxy(32,50);
lcd_str_ram(cycle, f8x8,textcolor);//ñòðîêà èç ram
}
}
Если таймер хотя бы один раз переполнится, на экран должна вылезти надпись "timer is oferflow". А если он переполняется неоднократно, то постоянно будет обновляться значение переменной cycle.
На экране же "0". Таймер не запущен? Генерировал код при помощи CodeVision Wizard.