Фазовый компаратор на Ардуино
- Войдите на сайт для отправки комментариев
Втр, 24/08/2021 - 12:58
В принципе вопрос в заголовке темы, кто реализовывал программно, есть пример, в Гугл не нашёл.
В принципе вопрос в заголовке темы, кто реализовывал программно, есть пример, в Гугл не нашёл.
В лоб написать не судьба?
if (digitalRead(p1)) { res = 1; while(digitalRead(p1)); while(digitalRead(p2)); } else if (digitalRead(p2)) { res = -1; while(digitalRead(p2)); while(digitalRead(p1)); }так блокирующий жеж
Тебе на блинк без делея ссылку дать?
Тебе на блинк без делея ссылку дать?
не надо, подумалось может кто на PCINT делал...
Видимо как-то так!?
Плохо. На PCINT есть ограничения на частоту ну и фазу соответственно. Надо на два отдельных пина со своими прерываниями.
Плохо. На PCINT есть ограничения на частоту ну и фазу соответственно. Надо на два отдельных пина со своими прерываниями.
интересно какие (по частоте)
PCINT не различает ноги. После срабатывания прерывания надо ещё читать значения пинов и проанализировать, что бы понять какой из пинов сработал первым. Это требует времени. Собственно эти лишние затраты на чтение и анализ выливаются в довольно длинные процедуры, которые и ограничивают входную частоту, если ещё и фазу надо точнее получить.
весь обработчик в 19 строке, прочитать два бита порта и сделать с ними исключающее ИЛИ в кодах видимо небольшие затраты будут, но проще аппаратно конечно решить
Для таких приложений надо считать не строки а конечные машинные коды. В любом случае через INT0 и INT1 обработка существенно короче.
через INT0 и INT1 обработка существенно короче.
Если их делать _NAKED, иначе пасёравну.
через INT0 и INT1 обработка существенно короче.
Если их делать _NAKED, иначе пасёравну.
теперь на хоббийный переведи, пожалуйста...вот читал жеж, только уже ничего не запоминается:
Параметр ISR_NAKED
В некоторых случаях код, генерируемый компилятором для сохранения и восстановления значений регистров внутри обработчика, может быть не оптимальным. Например, приведенный выше обработчик для WDT не выполняет вообще никаких действий, тем не менее значения трех регистров сохраняются в стеке. Если нас не устраивает генерируемый компилятором код, то можно подавить его добавление в обработчик, указав во втором параметре макроса ISR значение ISR_NAKED. В этом случае в обработчик не будут добавлены ни код для сохранения регистров, ни даже команда возврата в основную программу reti, ответственность за корректную работу обработчика ложится на нас. Пример использования ISR_NAKED:
ISR(TIMER1_OVF_vect, ISR_NAKED) { PORTB |= _BV(0); reti(); }Вызов без сохранения/восстановления SREG.
Не только SREG, там для ускорения выполнения ни один регистр не сохраняется при входе, если какие-то регистры используются в подпрограмме, надо их сохранять/восстанавливать самому, врукопашную
Для таких приложений надо считать не строки а конечные машинные коды. В любом случае через INT0 и INT1 обработка существенно короче.
Кроме того, я что-то не припомню PCINT на ARM.
Другими словами, если уж ми пишем на форуме Ардуино и, кроме того, выносим "Ардуино" в заголовок темы, то и обсуждать следует именно Ардуино, а в Ардуино PCINT нет.
а в Ардуино PCINT нет.
О_О Чойта? Клапа запретил? А как у меня тогда счетчики воды работают на Uno? Пойду проверять срочно. :)))
в Ардуино PCINT нет.
выбираю ардуино нано, олд бутлоадер, компилирую, загружаю, работает, "...???... как нет, есть, но маленький" (из народного фольклора)
На AVR PCINT, не ARM.
Полагаю, что имелось в виду следующее: в некоторых МК оно есть, но это уже вне концепции платформы Arduino.
а в Ардуино PCINT нет.
О_О Чойта? Клапа запретил? А как у меня тогда счетчики воды работают на Uno? Пойду проверять срочно. :)))
Будешь проверять, проверь заодно на Due.