Я использовал PIC16F877
( datasheet ) для нескольких проектов. Для одного внешнего прерывания смены контакта вы можете использовать PORTB0
прерывание. Но теперь мне нужно поддерживать 8 независимых внешних прерываний смены контактов в одной цепи.
В таблице данных указано, что в 15 прерываний PIC16F877
, но я думаю, что они учитываются, включая прерывания переполнения таймера и т. Д., Которые в этом случае бесполезны.
Это то, что даташит говорит о INTCON
регистрации.
Могу ли я иметь 4 независимых прерывания, используя бит0, RBIF
? Он представляет собой изменение в PB7:PB4
. Как я могу определить, какой контакт изменился, прочитав значение порта в процедуре прерывания?
Даже если я получаю положительные ответы на вышеперечисленные вопросы, мне нужно 8 прерываний? конечно, я все еще могу использовать INTE
для PORTB0
изменения. Тогда 4 + 1 = 5
, а как насчет остальных 3? (Однако, поскольку все 8 событий прерывания имеют один и тот же тип, 4 + 1 + 3 = 8
это выглядит некрасиво, не так ли?)
От микроконтроллера не ожидается никаких других тяжелых задач, кроме контроля 8 контактов. (Говоря о других задачах, ему придется поддерживать набор отдельных переменных-счетчиков и часто последовательно передавать на ПК около 4 байтов)
Любые предложения приветствуются. Даже если речь идет о смене микроконтроллера на более подходящий (но эээ.. не говорите мне уйти от PIC
s).
Это псевдокод C для объяснения одной идеи. Он использует исключающее ИЛИ для определения того, какие выводы были изменены, и будет вызывать ваши разные обработчики в одном прерывании RBIE. В зависимости от того, насколько критично приложение, вы можете проверить, как PIC обрабатывает такие ситуации, как изменение порта во время выполнения прерывания, чтобы убедиться, что вы не пропустите ни одного события.
int old_port_b;
void isr_handler()
{
int new_port_b, changed_pins;
new_port_b = read_port_b();
changed_pins = new_port_b ^ old_port_b;
if (changed_pins | 1)
rb0_hander();
if (changed_pins | 2)
rb1_hander();
// ... etc
old_port_b = new_port_b;
}
int main()
{
old_port_b = read_port_b();
enable_interrupt();
}
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
ПК. Затем сбросьте соответствующее значение счетчика на ноль. Просто как тот. Я предполагаю, что вариант опроса пойдет нормально, верно?Вы можете использовать NAND с 8 входами, как указано @Brian Drummond, чтобы поднять прерывание через вывод INT, а также подключить источники прерывания к 8-битному регистру сдвига Parallel-In / Serial-Out, например «74HC165N», поэтому вам понадобится просто прочитать данные из этого регистра сдвига после возникновения прерывания, и это даст вам информацию о вашем фактическом источнике прерывания ... это может быть не самый быстрый способ, но его легко расширить, и он будет использовать не более 5 контактов, и если вы добавите систему управления адресами (MUX, LATCH,...), то вам понадобится только один контакт для уведомления о прерывании, а другие контакты могут быть повторно использованы в разное время для разных ресурсов;)
Анубис
Питер Джей
Кодовое название СК
Кодовое название СК
пользователь_1818839
Кенни
Олин Латроп
Кодовое название СК
Пранджал Саксена