boez » 10 фев 2010, 20:54
Для четкого определения интервала вне зависимости от того, чем там занята прога (небось и индикация предполагается?) я бы использовал Input Capture. Таймер молотит с определенной частотой (1 или 8 МГц) непрерывно, а датчик висит на входе compare (у меги8 это ICP0, он же PB0), по которому также настроено прерывание. По приходу прерывания смотрим переменую статус, если там false - переписываем ICR1 в переменную time1 (типа uint_16) и ставим status=true. Если уже true - достаем ICR1, вычитаем из него time1 и получаем время пролета пули в тиках, дальше делаем с ним что хотим. За счет 16-разрядного вычитания переполнение учтется автоматом. Ну и где-то отдельно можно повесить отдельный таймер - если status сильно долго висит в true - снести его в false и индицировать ошибку, это значит один импульс потерялся.