Как я могу предотвратить недопустимую конфигурацию Microsoft.SPOT.Аппаратное обеспечение.Порт прерывания?

#c# #.net #msdn #.net-micro-framework #interrupt

#c# #.net #msdn #.net-микро-платформа #прерывание

Вопрос:

Я пытаюсь использовать Microsoft.SPOT.Hardware.InterruptPort класс .NET Micro Framework. Однако документация ставит меня в тупик:

Возможно перевести InterruptPort объект в недопустимое состояние. В таких случаях ваша программа может не генерировать исключение, пока она фактически не использует InterruptPort объект. Например, предположим, вы создаете InterruptPort объект с установленным для него режимом резистора Port.ResistorMode.PullUp , режимом прерывания, установленным на Port.InterruptMode.InterruptEdgeLevelHigh , и фильтром сбоев, установленным на true . Эта конфигурация не генерирует исключение при создании экземпляра InterruptPort объекта. Если затем добавить обработчик прерываний, платформа .NET Micro Framework выдает исключение.

(курсив мой)

В нем не указано, какие конфигурации вызывают эти недопустимые состояния, оставляя мне только один произвольный пример того, чего не следует делать.

Есть ли какая-либо документация, которую я пропускаю?
Есть ли важная часть знаний в области электроники, которую я упустил из виду?
Или MSDN просто бесполезен в документации?

Комментарии:

1. Да, MSDN бесполезен, если вы ожидаете, что это будет учебное пособие. Это ссылка, вы должны понимать аппаратное обеспечение, чтобы заставить прерывания работать должным образом. Есть только один способ сделать это правильно, много способов сделать это неправильно. Это не произвольно, оно должно соответствовать оборудованию.

Ответ №1:

На самом деле, я столкнулся с такой же? / аналогичной проблемой. Ханс прав, что это зависит от оборудования — если вы используете линейку устройств GHI FEZ, то (я узнал об этом от производителя только после того, как несколько дней рвал на себе волосы), они не поддерживают прерывания уровня, поэтому любая конфигурация с использованием InterruptMode.InterruptEdgeLevelHigh или InterruptMode.InterruptEdgeLevelLow завершится ошибкой, как только вы попытаетесь подключить обработчик прерываний. Документация по MSDN довольно скудна, в первую очередь потому, что микропрограмма с открытым исходным кодом, предоставленная сообществом. Те же (коммерческие) стандарты качества, применяемые к другим версиям .Боюсь, NET Framework от Microsoft не применяется. Если производителем вашей платы не является GHI, уточните у них, поддерживаются ли прерывания уровня в первую очередь.

Ответ №2:

У меня была та же проблема, но мое решение было другим. Да, оба параметра InterruptEdgeLevelHigh и Low были недопустимыми. Однако я обнаружил, что проблема для меня заключалась в том, что устройство не было подключено к соединению, способному прерывать. Даже когда это было, код немного отличался.

Обычно вы можете подключить кнопку, подобную этой.

 InputPort yourButton = new InputPort((Cpu.Pin)FEZ_Pin.Digital.LDR, false,
Port.ResistorMode.PullUp);
  

Для использования порта прерывания код выглядит следующим образом.

 InterruptPort yourButton =
new InterruptPort((Cpu.Pin)FEZ_Pin.Interrupt.LDR, true,
Port.ResistorMode.PullUp,
Port.InterruptMode.InterruptEdgeBoth);
  

Итак, при условии, что устройство подключено к порту с поддержкой прерывания, и вы создали свои устройства ввода из InterruptPort, а не из InputPort, вы должны иметь возможность создать обработчик событий прерывания.