TinyAVR 0-Series: Могу ли я использовать определение смены контакта без входа в обработчик прерываний?

Я оцениваю ATtiny806, работающий на частоте 20 МГц, для создания эмулятора микропроцессора Intel 4004 с точностью до цикла. (Я знаю, что это будет слишком медленно, но у AVR огромное сообщество.)

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

TinyAVR 0-й серии имеет очень удобную функцию прерывания по смене контакта, которую можно настроить так, чтобы она срабатывала только по переднему фронту. Но процедура прерывания туда-обратно составляет 8 циклов (3 входа, 5 выхода).

У меня вопрос: могу ли я использовать механизм обнаружения смены пин-кода, никогда не посещая ISR? (Другие семейства процессоров позволяют опрашивать условия прерывания, не разрешая прерывания от этого периферийного устройства). Можно ли выполнить опрос с помощью жесткого цикла с пропуском бита/обратным переходом, за которым следует инструкция установки бита?


person mcpublic    schedule 03.10.2020    source источник


Ответы (1)


Прямой путь

Вы всегда можете просто опросить уровень вывода GPIO, используя команду пропуска одного цикла, если бит установлен/очистить в соответствующем регистре и бите PORT.

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

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

INTFLAG способ

В качестве альтернативы, если вы хотите использовать внутреннюю логику конечного автомата вывода и можете жить без прерываний, вы можете использовать флаги INTFLAGS для проверки изменения вывода, настроенного в битах ISC регистра PINxCTRL. Пока глобальные прерывания не разрешены в SREG, вы можете запустить опрос соответствующего бита INTFLAG, чтобы проверить/ждать желаемое условие, а затем записать 1 в этот бит, чтобы очистить флаг.

введите здесь описание изображения

Обратите внимание, что если вы хотите сделать это быстро, вы, вероятно, захотите отобразить соответствующий PORT на VPORT, поскольку регистры VPORT находятся в памяти ввода-вывода. Это позволяет вам использовать SBIS для проверки бита INTFLAG за один цикл и SBI для очистки бита за один цикл (эти инструкции работают только с памятью ввода-вывода, а обычные регистры PORT не находятся в памяти ввода-вывода).

введите здесь описание изображения

Наконец, еще одно осложнение, если вам нужно оставить прерывания включенными при этом, вероятно, это возможно, взломав регистры приоритета прерывания. Вы бы установили смену контакта на уровень 0, а затем удостоверились, что интересующие вас прерывания имеют уровень 1 или выше, а затем обманули контроллер прерываний, заставив его думать, что уровень 0 уже запущен, поэтому эти прерывания на самом деле не работают. Пожар. У этой стратегии есть и другие ограничения, поэтому по возможности избегайте ее.

Программируемый логический путь

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

person bigjosh    schedule 03.10.2020
comment
Я пытаюсь сохранить 2 из четырех циклов ожидания вращения, ища только нарастающие фронты тактовых импульсов. - person mcpublic; 05.10.2020
comment
Ответ обновлен с общим обзором того, как вы можете проверить условия изменения контактов GPIO с помощью теста с одним циклом, но обратите внимание, что вы (1) оставляете прерывания отключенными и (2) сопоставляете свои порты с виртуальными портами. Сообщите, если вам нужно больше деталей. - person bigjosh; 06.10.2020
comment
Спасибо за дополнительные идеи. Я планирую отключить прерывания. Первоначально мое внимание привлек детектор границ CCL (LUT). Увы не хватает пинов, да и отсутствие импульсов было бы плохо. - person mcpublic; 07.10.2020