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

11

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

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

tsiflana
источник

Ответы:

8

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

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

perilbrain
источник
5

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

Джон Л
источник
5

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

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

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

Supercat
источник
3

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

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

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

МОК также немного сложнее в использовании, даже помимо этого. Крайне важно прочитать порт незадолго до включения прерывания, и еще более важно ЧИТАТЬ ПОРТ внутри ISR! Если у вас медленный сигнал, и вы думаете, что можете установить флаг внутри ISR, а потом читать, вне ISR, подумайте еще раз! Считывание порта (или любого бита на порте, если я правильно помню) сбрасывает фиксатор на компараторе, который вызывает прерывание. Если вы не очистите его внутри ISR, он сразу же запустится при выходе из ISR. Если вы не забудете это сделать, все будет хорошо, но если вы забудете и решите, что сможете прочитать порт, когда дойдете до него, вы будете немного разочарованы, пока не вспомните, что читали в ISR.

Скотт Сейдман
источник