Добрый день! Прошу подсказать. Мне нужно измерить длительность импульса на микроконтроллере PIC16F877 (подключить к аксселерометру). К сожалению оба порта PWM/компаратор заняты. Порт прерывания - свободен, но он только один, а у аксселерометра 2 выхода на 2 оси. Подскажите способ измерить длинну импульса, используя обычные порты контроллера? Например прерывание по таймеру.
Ждем фронта импульса, включаем таймер, ждем спада импульса, выключаем таймер. Нужно быть уверенным, что таймер не переполнится, иначе считать число переполнений таймера. Чем меньше предделитель - тем выше точность счета.
Возможно входы модуля захвата сравнения свободны? Тогда их надо использовать. Русская документация по микроконтроллерам PIC есть на страничке http://proavr.narod.ru/09.htm в ней есть примеры кода для разных задач.
1.Входы модуля захвата у меня заняты. Мне на ROBPICA надо подключить, а там прямо на плате к этим выводам драйвер моторов подключен. 2. Наверное попробую - ждать единицу и по ней таймер запускать. Но получится, что контроллер ничем другим уже не сможет заниматься. Видимо нужен еще один контроллер.
Если есть вход внешнего прерывания - вешаем это дело на него. Проц может заниматься своими делами. А вообще обычно сперва распределяют ноги и ресурсы проца по задачам, а не наоборот.
NorthStar писал(а):2. Наверное попробую - ждать единицу и по ней таймер запускать. Но получится, что контроллер ничем другим уже не сможет заниматься. Видимо нужен еще один контроллер.
Ну у меня на последовательном порту Bluetooth модуль а на прерывании пульт ДУ. Пульт можно снять, но мне-то для подключения аксселерометра 2 входа нужно, одним прерыванием много не сделаешь.
Новую тему не стал открывать, т.к. мне нужно то же самое почти. Нужно измерить длительность импульсов от 900 до 2100 мкс примерно (стандартные сигналы управления сервами и другими подобными устройствами, в т.ч. аклелерометрами). Внешние прерывания свободны (3 шт), но 3 канала маловато, хотелось бы 8. Обычные порты тоже свободны. Вопросов собственно 2. 1) Если использовать внешние прерывания (по на 3 канала), то насколько будет нагружен мк? Он из прерываний вылезать не будет почти. Прерывания будут происходить 2(подъем и спад сигнала)*50(период импульсов)*3(канала) = 300 раз в секунду примерно. Это конечно не очень много, но боюсь на основную работу времени останется мало. мк атмега32-16 2) Хотелось бы использовать 1 внешнее прерывание, а 8 каналов подать на какой-то порт. Чтоб прерывание происходило при изменении уровня любого из 8-им каналов. Тогда все бы делалось в 1м обработчике, который бы считывал все 8 каналов с 1 порта. Это бы сильно прооптимизировало вычисления и освободило бы входы внешних прерываний. Такое возможно и как? Без использования 2-го контроллера хотелось бы.
проц какой? импульсы идут по очереди или вразнобой?
Добавлено спустя 3 минуты 9 секунд: Если речь об AVR-ках, и импульсы идут по очереди, то берите проц с прерыванием на pin-change на весь порт и радуйтесь. Точность будет порядка трех-четырех тактов проца.
мега32, а не 16, но не суть, они почти одинаковые. Точность в 3-4 такта меня бы устроила, но там действительно нет прерывания по изменению всего порта. Или я не нашел. Может какой то внешней простенькой микросхемкой можно отслеживать изменение любого из 8-ми битов? а уже с нее завести на внешнее прерывание контроллера. Только вот есть ли такая штука?
А атмега32 это принципиально? Может взять какую-нибудь, у которой есть прерывание по изменению порта? Ну и с самим прерыванием нужно аккуратнее, там будут проблемы когда фронты на разных линиях подойдут близко друг к другу - такое может происходить, если девайс управляется от цифрового контроллера, который валит или все импульсы разом (общее начало - разный конец). Вообще если возможно наложение фронтов - точность в 2-3 цикла ИМХО нереальна. Потому что если фронты идут с разхождением в несколько тактов - прога первый фронт поймает, начнет выполнение обработчика, и только когда его полностью выполнит - начнет обработку следующего фронта, опоздание будет равно времени выполнения обработчика. А - еще есть простенькая внешняя микросхемка! Называется atmega48A, около бакса стоит Пускай она все ноги обмеряет и по любому удобному цифровому каналу (spi,uart,i2c) шлет готовые цифры. Запускать без кварца, тактировать от генератора основной меги. А можно и атмегу8, обработку вообще без прерываний делать, шустрым главным циклом, средняя погрешность немного возрастет (до пары мкс может), зато максимальная может и уменьшиться. Работу с передатчиком только надо аккуратно из такого цикла делать, максимально короткими действиями.
HarryStar писал(а):Может какой то внешней простенькой микросхемкой можно отслеживать изменение любого из 8-ми битов? а уже с нее завести на внешнее прерывание контроллера. Только вот есть ли такая штука?
Вы не ответили на вопрос - импульсы идут по очереди или вразнобой? Микросхемок есть много разных...