В чем разница в функциях прерывания IOC и EXT на PIC? В настоящее время я использую PIC12F1822, и помимо дополнительного уровня проверки, который вы должны сделать с IOC (то есть, какой вывод вызвал прерывание), они идентичны.
В чем практическая разница, если она есть? Когда бы вы использовали тот или иной?
Посмотрите на этот документ , в котором говорится:
Прерывание при изменении
Эта функция аналогична функции внешнего прерывания , за исключением того, что прерывание по изменению порта будет вызвано любым изменением (а не только одним типом перехода) на любом из выводов, для которых оно разрешено. Это делает его более гибким (доступным на большем количестве выводов), но также и более трудным для правильной работы.
Вероятно, это сделано для упрощения архитектуры прерываний чипа за счет меньшего количества записей в таблице векторов прерываний. Прерывание при изменении может быть настроено на срабатывание при изменении регистра порта и может быть полезно для чего-то вроде матрицы клавиатуры, где вы не хотите писать процедуру обслуживания прерываний (ISR) для каждого отдельного контакта. Вы можете написать только один, который может проверять значение всего порта, что может быть тем, что вам действительно интересно, в зависимости от приложения.
Три самых больших различия между выводами прерывания при изменении и выводами внешнего прерывания:
Внешние прерывания PIC более универсальны и надежны, чем универсальные прерывания смены контакта. Я бы предложил использовать первый, когда это практично.
По сути, внешнее прерывание будет срабатывать по определенному (нарастающему или спадающему, определяемому пользователем) фронту, в то время как прерывание по изменению будет срабатывать по любому фронту (как нарастающему, так и спадающему).
Прерывание при изменении обычно относится к половине байта ввода-вывода, тогда как внешние прерывания обычно относятся к отдельным битам. Как вы уже сказали, одна вещь, которую вам нужно сделать в IOC ISR, - это выяснить, какой бит (или биты) изменился.
IOC также немного сложнее в использовании, даже помимо этого. Крайне важно прочитать порт перед включением прерывания и, что еще более важно, прочитать порт внутри ISR! Если у вас медленно меняющийся сигнал, и вы думаете, что можете установить флаг внутри ISR и выполнить считывание позже, вне ISR, подумайте еще раз! Чтение порта (или любого бита в порту, если я правильно помню) сбрасывает защелку на компараторе, который запускает прерывание. Если вы не очистите его внутри ISR, он немедленно перезапустится при выходе из ISR. Если вы не забудете сделать это, все будет хорошо, но если вы забудете и думаете, что сможете прочитать порт, когда доберетесь до него, вы будете немного разочарованы, пока не вспомните о чтении в ISR.
ПетПаулсен