Прямой путь
Вы всегда можете просто опросить уровень вывода GPIO, используя команду пропуска одного цикла, если бит установлен/очистить в соответствующем регистре и бите PORT.
Но, как вы упомянули, опрос сжигает циклы, поэтому я не уверен, что именно вы здесь хотите — либо опрос (который сжигает циклы, но имеет низкую задержку), либо прерывание (которое имеет более высокую задержку, но позволяет продолжать обработку до тех пор, пока не будет выполнено условие). истинный).
Обратите внимание, что если все становится действительно сложно, и вы ищете, скажем, экономию энергии, засыпая между переходами тактового сигнала, тогда вы можете делать трюки, такие как наличие ISR, который никогда не возвращается (сохранение циклов IRET), но это требует некоторого тщательного кодирования, возможно, с чем-то как государственная машина.
INTFLAG способ
В качестве альтернативы, если вы хотите использовать внутреннюю логику конечного автомата вывода и можете жить без прерываний, вы можете использовать флаги INTFLAGS
для проверки изменения вывода, настроенного в битах ISC
регистра PINxCTRL
. Пока глобальные прерывания не разрешены в SREG
, вы можете запустить опрос соответствующего бита INTFLAG
, чтобы проверить/ждать желаемое условие, а затем записать 1
в этот бит, чтобы очистить флаг.
![введите здесь описание изображения](https://i.stack.imgur.com/zHpBX.png)
Обратите внимание, что если вы хотите сделать это быстро, вы, вероятно, захотите отобразить соответствующий PORT
на VPORT
, поскольку регистры VPORT
находятся в памяти ввода-вывода. Это позволяет вам использовать SBIS
для проверки бита INTFLAG
за один цикл и SBI
для очистки бита за один цикл (эти инструкции работают только с памятью ввода-вывода, а обычные регистры PORT
не находятся в памяти ввода-вывода).
![введите здесь описание изображения](https://i.stack.imgur.com/2lkeF.png)
Наконец, еще одно осложнение, если вам нужно оставить прерывания включенными при этом, вероятно, это возможно, взломав регистры приоритета прерывания. Вы бы установили смену контакта на уровень 0, а затем удостоверились, что интересующие вас прерывания имеют уровень 1 или выше, а затем обманули контроллер прерываний, заставив его думать, что уровень 0 уже запущен, поэтому эти прерывания на самом деле не работают. Пожар. У этой стратегии есть и другие ограничения, поэтому по возможности избегайте ее.
Программируемый логический путь
Если вы хотите получить действительно эзотерическое значение, вполне возможно, что вы могли бы направить входное значение вывода на настраиваемую пользовательскую логическую LUT в чипе, а затем направить вывод этого модуля на бит, который вы тестируете, используя 1-цикл. битовый тест (возможно, неиспользуемый вывод ввода-вывода). Чтобы сделать это, вы должны вернуть выход LUT обратно на один из его входов, а затем использовать LUT для создания строба на краю, который вы ищете. Это очень сложно, а также, поскольку строб не имеет подтверждения, что если сигнал изменится, когда вы его не ищете (в прокрутке), то он будет потерян, и вам придется ждать следующего фронта (вероятно фатального в ваше приложение).
person
bigjosh
schedule
03.10.2020