В чем разница между прерыванием при изменении и внешним прерыванием на PIC

В чем разница в функциях прерывания IOC и EXT на PIC? В настоящее время я использую PIC12F1822, и помимо дополнительного уровня проверки, который вы должны сделать с IOC (то есть, какой вывод вызвал прерывание), они идентичны.

В чем практическая разница, если она есть? Когда бы вы использовали тот или иной?

Ответы (5)

Посмотрите на этот документ , в котором говорится:

Прерывание при изменении
Эта функция аналогична функции внешнего прерывания , за исключением того, что прерывание по изменению порта будет вызвано любым изменением (а не только одним типом перехода) на любом из выводов, для которых оно разрешено. Это делает его более гибким (доступным на большем количестве выводов), но также и более трудным для правильной работы.

Вероятно, это сделано для упрощения архитектуры прерываний чипа за счет меньшего количества записей в таблице векторов прерываний. Прерывание при изменении может быть настроено на срабатывание при изменении регистра порта и может быть полезно для чего-то вроде матрицы клавиатуры, где вы не хотите писать процедуру обслуживания прерываний (ISR) для каждого отдельного контакта. Вы можете написать только один, который может проверять значение всего порта, что может быть тем, что вам действительно интересно, в зависимости от приложения.

Три самых больших различия между выводами прерывания при изменении и выводами внешнего прерывания:

  1. Внешние контакты прерывания позволяют программному обеспечению указать, должно ли прерывание запускаться по нарастающему фронту или по заднему фронту; если, например, на выводе низкий уровень, и вас интересуют только спадающие фронты, прерывание не будет инициировано до тех пор, пока вывод не поднимется, а затем не упадет. Используя прерывание по изменению, нужно было бы просыпаться при обоих событиях.
  2. Выводы внешних прерываний имеют отдельные биты состояния фиксации. Даже если входной импульс приходит и уходит до того, как программа успевает на него отреагировать, программа все равно может узнать, что это произошло, и отреагировать соответствующим образом.
  3. Чтение порта ввода-вывода, для которого разрешено прерывание смены контакта точно в то время, когда изменяется вход, может привести к тому, что прерывание смены контакта не сработает. Напротив, чтение порта ввода-вывода, подключенного к внешнему выводу прерывания, не влияет на прерывание.

Внешние прерывания PIC более универсальны и надежны, чем универсальные прерывания смены контакта. Я бы предложил использовать первый, когда это практично.

По сути, внешнее прерывание будет срабатывать по определенному (нарастающему или спадающему, определяемому пользователем) фронту, в то время как прерывание по изменению будет срабатывать по любому фронту (как нарастающему, так и спадающему).

По крайней мере, для PIC12F1822 , упомянутого OP, IOC также может быть настроен (определяется пользователем) для запуска по переднему фронту, заднему фронту или обоим (раздел 13). Поэтому мне кажется, что единственная разница заключается в том, что внешнее прерывание может быть настроено только на срабатывание любого из двух обнаружений фронта.

Прерывание при изменении обычно относится к половине байта ввода-вывода, тогда как внешние прерывания обычно относятся к отдельным битам. Как вы уже сказали, одна вещь, которую вам нужно сделать в IOC ISR, - это выяснить, какой бит (или биты) изменился.

IOC также немного сложнее в использовании, даже помимо этого. Крайне важно прочитать порт перед включением прерывания и, что еще более важно, прочитать порт внутри ISR! Если у вас медленно меняющийся сигнал, и вы думаете, что можете установить флаг внутри ISR и выполнить считывание позже, вне ISR, подумайте еще раз! Чтение порта (или любого бита в порту, если я правильно помню) сбрасывает защелку на компараторе, который запускает прерывание. Если вы не очистите его внутри ISR, он немедленно перезапустится при выходе из ISR. Если вы не забудете сделать это, все будет хорошо, но если вы забудете и думаете, что сможете прочитать порт, когда доберетесь до него, вы будете немного разочарованы, пока не вспомните о чтении в ISR.