Я использовал PIC16F877
( таблица данных ) для нескольких проектов. Для прерывания смены одного внешнего вывода вы можете использовать PORTB0
прерывание. Но теперь мне нужно поддерживать 8 независимых внешних прерываний смены контактов в одной цепи.
В таблице указано, что в ней 15 прерываний PIC16F877
, но я думаю, что они учитываются, включая прерывания по переполнению таймера и т. Д., Которые в этом случае бесполезны.
Это то, что технические данные говорят о INTCON
регистрации.
Могу ли я иметь 4 независимых прерываний с помощью Bit0, RBIF
? Это представляет изменение в PB7:PB4
. Как я могу определить, какой контакт изменился, читая значение порта в процедуре прерывания?
Даже если я получу положительные ответы на выше, мне нужно 8 прерываний? конечно, я все еще могу использовать INTE
, для PORTB0
изменения. Тогда 4 + 1 = 5
, а как насчет других 3? (Однако, учитывая, что все 8 событий прерывания относятся к одному и тому же типу, 4 + 1 + 3 = 8
все выглядит ужасно, не правда ли?)
Никаких других тяжелых задач от микроконтроллера не ожидается, кроме мониторинга 8 контактов. (Говоря о других задачах, он должен будет поддерживать набор отдельных переменных счетчика и часто передавать около 4 байтов на ПК последовательно)
Любые предложения приветствуются. Даже если речь идет о замене микроконтроллера на более подходящий (но ... не говорите мне уходить от PIC
s).
источник
Ответы:
Это псевдокод C для объяснения одной идеи. Он использует исключительное ИЛИ для определения, какие контакты были изменены, и будет вызывать ваши разные обработчики в пределах одного прерывания RBIE. В зависимости от того, насколько критичным является приложение, вы можете проверить, как PIC обрабатывает такие ситуации, как изменение порта во время выполнения прерывания, чтобы убедиться, что вы не пропустите ни одного события.
источник
RB7:RB4
только 4 контакта. Но я прошу способ контролировать 8 контактов. любое предложение?and four interrupts for the RB0:RB3
? PIC16F877 не поддерживает прерыванияRB1:RB3
, а?Эта часть имеет только 4 прерывания смены контактов и еще несколько, которые вы можете установить на выбранных ребрах. Одной из стратегий будет внешнее обнаружение изменения 8-битного значения, а затем прерывание при несовпадении. Это становится грязным в оборудовании, но будет именно то, что вы хотите.
Важные параметры, которые вы не указали, это то, как быстро вам нужно реагировать на смену булавки, и какое минимальное время будет сохраняться для смены булавки, чтобы она действовала. В зависимости от ответов, вы можете опросить на основе регулярного прерывания в прошивке. 16F877 может работать с частотой команд 5 МГц, и проверка изменений займет всего несколько инструкций. Допустим, вы устанавливаете прерывание каждые 50 инструкций. Это оставило бы большую часть процессорного времени на переднем плане кода. Частота прерывания будет 100 кГц, а период 10 мкс. Конечно, передний план должен все еще видеть флаг изменения и что-то с ним делать, поэтому время отклика будет больше 10 мкс, но вы ничего не сказали о том, что вам нужно делать, когда обнаруживается изменение. Если это просто нужно ответить в человеческое время,
источник
once per second
будет достаточно. При обнаружении изменения пина (только одно ребро, скажем, повышение) счетчик (переменная) должен быть увеличен. В главном цикле он должен контролировать значения счетчика, и когда один становится выше определенного значения, четыре байта должны быть переданы черезUSART
ПК. Затем сбросьте значение соответствующего счетчика до нуля. Просто как тот. Я думаю, что вариант опроса пойдет хорошо, верно?Вы можете использовать 8-входной вентиль NAND, как упомянуто @Brian Drummond, для нарастания прерывания через вывод INT, а также для подключения источников прерываний к 8-битному регистру сдвига с параллельным входом / последовательным выходом, таким как «74HC165N», так что тогда вам потребуется просто читать данные из этого регистра сдвига после возникновения прерывания, и это даст вам информацию о вашем фактическом источнике прерывания ... это может быть не самый быстрый способ, но его легко расширить и использовать не более 5 контактов, и если вы добавите систему управления адресами (MUX, LATCH, ...), то вам потребуется только одна шина для уведомления о прерывании, и другие булавки могут быть повторно использованы в разное время для разных ресурсов;)
источник