Цитата(GetSmart @ Jun 2 2006, 20:43)

Чё-то я ослеп. Речь как раз об AVR. Берёте Мегу8, она с захватом. Всё получится с точностью 1 мкс, если интервалы будут хотя бы 10 и более мкс. Это если писать на асме. Если на си, то раза в 3 большие интервалы.
Вроде бы правильно делаете. Может какая мелкая ошибка. Прикрепите исходник, я посмотрю. Кстати, когда обнуляете таймер, обнуляете ещё переменную?
Получится, но с одной оговоркой:
не всегда будет указанная точность.
Нельзя выйти на точность в 1мкс в случае когда прерывание таймера "по захвату" сработает одновременно с прерыванием таймера "по переполнению" либо по "сравнению" для увеличения старшей части 32-х битного счетчика времени.
Цитата
Можно подробнее чуточку? Какие старшие 16 бит? Подскажите, пожалуйста, как это можно сделать?
Пример, с учетом того, что Timer1 уже настроен на работу в режиме Input Capture с генерацией прерываний по CAPT и по OVF.
В таком виде как в примере - нельзя выполнять команды условного перехода и арифметические команды в основном цикле программы.
Код
.def AL = R24
.def Const0 = R8
.def Const1 = R9
....
ldi AL, 1
mov Const1, AL
clr Const0
...
; обработчик Input Capture:
TIM1_CAPT:
in R4, ICR1L
in R5, ICR1H
mov R6, R2
mov R7, R3
tst R5
brne _do_not_correct_result
in AL, TIFR
andi AL, (1 << TOV1)
breq _do_not_correct_result
add R6, Const1
adc R7, Const0
_do_not_correct_result:
; <-- 32-х битный результат в четверке регистров R7-R6-R5-R4 (MSB R7)
reti
; обработчик Timer Overflow:
TIM1_OVF:
add R2, Const1; Инкрементировать старшие 16 бит 32-х битного счетчика
adс R3, Const0; учет переноса.
reti