DerMeister писал(а):То есть Вы настаиваете, что без внешних ИЛИ и внешних прерываний с этой бедой не справиться?
Всё зависит от...
Коту утром (после ночи) полагается пожрать и спать, поэтому разевающаяся в зевке пасть не даёт толком прочесть тему.
Поэтому попробую свести в одну кучу всё, что я понял.
- Есть толпа датчиков, которые срабатывают «кучно». Максимальная протяжённость кучи между первым и последним импульсом, в приницпе, ивестна и она меньше 10-милисекундного периода пачек.
- Датчики могут сработать вообще «одновременно».
- Каждый датчик в сработавшем состоянии находится 1.5-2мкс.
- Используется AVR
- Выбрана тактовая 8 МГц.
У многих AVR есть pin change interrupt -- вот оно и «или», лишь бы хватило ножек, поддерживающих PCINT. У меги48 их 23, но UART украдёт кое-что.
Но.
3 такта подсинхронизация входов в системе pin change interrupt.
1…4 такта завершение предыдущей команды (ну хорошо, 1…3, если без MUL и обращения к EEPROM, 1…2 если без вызовов подпрограмм)
3 такта собственно «вызов» прерывания
2 такта rjmp из векторов на обработчик
Итого 9…12 -- это ещё без сохранения регистров (а на С уж без этого никак).
На 8 МГц имеем 8*(1.5…2) = 12…16 тактов за время нахождения датчика в сработавшем состоянии… Туго… Первый датчик может быть пропущен.
Дальше, как уже писали, можно не выходя из прерывания просто в цикле делать ИЛИ портов и собирать всё до достижения времени, когда уже все должны были закончить (как тут
http://radiokot.ru/forum/viewtopic.php? ... 4#p1366934)
Варианты
- Написать прпрывание на асме.
- Поднять тактовую, всё отладить, потом думать, нужно ли снижать.
- Обойтись без прерываний.
Пункт 3
Прерывания PCINT в PCICR запрещаем, но нужные ножки в PCMSK разрешаем.
Вот мы знаем, что должна прийти пачка импульсов.
Зачитываем все порты (чтобы проинициализировать триггера сравнения системы PCINT). Сбрасываем флаги в PCIFR.
Зануляем буферные переменные, куда будем «наиливать» состояние портов.
Инициализируем защитный таймер (который остановит нашу работу, когда уже все импульсы должны были прийти) или счётчик циклов «наиливания», рассчитанный из времени выполнения команд цикла и максимальной длительности пачки
В цикле читаем PCIFR до пока он не станет не равным 0.
От этого момента в цикле собираем по ИЛИ маски сработавших датчиков.
Всё должно успеть, если аккуратно.
А в конце просто посылаем эти три маски.
Например, текстом в 16-ричном коде с переводом строки, это 7…8 байт (CR…CR/LF)
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.