Собрал устройство определения угла поворота сельсина. Принцип основан на измерении разности фаз между образцовым сигналом и сигналом с датчика (якорная обмотка). На ПЛИС из этих сигналов формируется пачка импульсов, число которых зависит от разности фаз (угла поворота), по окончанию "периода измерения" ПЛИС формирует одиночный импульс.
Алгоритм работы AVR (ATmega8) такой:
1. Режим ТС1 - подсчет импульсов на входе Т1 (PD5);
2. По приходу одиночного импульса на ICP1 (PB0) происходит "захват" ТС1 и в прерывании по "захвату" - запоминание захваченного значения, обнуление ТС1;
3. Запомненное значение передается по UART'ту. По запросу от РС.
При работе младший байт ТС1 считает только до 127 (0х7F). При этом старший байт инкриминируется правильно, то есть, как если бы младший считал до 255.
При этом ошибка проявляется не сразу, а через несколько часов (8...20) после обесточивания схемы.
Для устранения ошибки делал следующее:
- менял способ (внешний, внутренний) и частоту (2...16МГц) тактирования AVR;
- заменил сам кристалл (ATmega);
- программу написанную на Си переписал на ASM'e....
....результата нет. На Си программа передачи данных по UART была написана с применением "printf" - все работало... На следубщий вечер - ошибка. Переписал через "UDR=.." - все пошло... На следующий вечер - опять ошибка... Перепаял AVR, прошил - норма (и с "UDR=..", и с "printf")... На следующий вечер - снова ошибка.... Переписал программу на ASM - нормально, но опять прошел день и ошибка появилась...
Частота следования счетных импульсов 500 кГц, менял на 1МГц - ошибка оставалась.
На ASM (AlgBlb) программа обработки прерывания по захвату такая:
Нажмите для просмотра прикрепленного файла
Подскажите в чем проблема?