Помогите разобраться с назначением пинов Arduino Mega 2560 пинами прерываний.
- Войдите на сайт для отправки комментариев
Сб, 13/04/2019 - 14:52
Учитался про PCINT,но по причине малограмотности в голове все смешалось. Хочу попробовать пойти от обратного:
Задача такая: сделать на этой плате пины от 22 до 37 пинами прерывания (необходимо подключить 8 энкодеров и 8 их кнопок). Как работать с энкодерами и кнопками на прерываниях, я разобрался, а как сделать пины пинами прерывания - ну ни в какую. Друзья, набросайте, пожалуйста скетч для задачи, выделенной толстыми буквами. Ползая по нему, мне будет проще разобраться что к чему (особенно, если строки будут прокомментированы). Возможно (учитывая разные порты), удобнее взять другой ряд пинов (например, от 38 до 53). Понимаю, что наглею, но помогите.
Заранее спасибо!
ну раз с гуглами и поисковиками не дружите
кстати, ваши энкодеры с кнопками не обязательно вешать на прерывания.
они и без них нормально читаются....
Учитался про PCINT,но по причине мал...Понимаю, что наглею, но помогите.
Заранее спасибо!
У меня драйвера суровых станков на мегах, 8 прерываний сделаны на пинах К0-К7
Это значит все восемь пинов К.
У меня в С функция - обработчик прерываний
interrupt [PCINT2] void pin_change_isr2(void)
{}
в ардуине обработчик должен по другому называться, не помню сейчас.
Учитался про PCINT, ... пины от 22 до 37 пинами прерывания
А можно не поверить, что Вы что-то читали? На части из этих пинов просто нет PCIINT. Можно что-то не понять, но не увидеть что его там просто нет ... :(
[/quote]
А можно не поверить, что Вы что-то читали? На части из этих пинов просто нет PCIINT. Можно что-то не понять, но не увидеть что его там просто нет ... :(
[/quote]
Ну конечно, можно не верить. Понимаю, что из всех возможных родников истины не пил. Но вот тут:
http://arduinonsk.ru/blog/87-all-pins-interrupts
https://www.youtube.com/watch?v=hArPRYkx__0
https://ruvid.net/video/8-%D0%B1%D0%B8%D1%82-27-%D0%BF%D1%80%D0%B5%D1%80%D1%8B%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BD%D0%B0-%D0%BB%D1%8E%D0%B1%D0%BE%D0%BC-%D0%BF%D0%B8%D0%BD%D0%B5-arduino-hArPRYkx__0.html
https://ru-arduino.livejournal.com/
https://switch-case.ru/52706922
так и не нашел конкретных рекомендаций. Или не смог их найти. Поэтому и обратился в сообщество за помощью. Если есть возможность меня направить по правильной (неизвестной пока мне) ссылке - буду благодарен. Касательно "есть-нет" PCINT на каких-либо пинах - номера их я привел чисто формально, исключительно из соображений использования длинной двухрядной панели.
А банально набрать в Гугле "arduino mega pinout" и посмотреть, никак?
Спасибо, аналогичнная карта есть, но эта побольше, лучше читается.
И где там про пины от 22 до 37??? Нету там про это. А потому, что там написано про UNO. И по одной из ссылок об этом прямо говорится. А Вы вроде про Мегу тут талдычите?
Я же и говорю, что Вы ничего на самом деле не читали. Прочитали то, что попалось под руку, не относящееся к делу. Ну, почитайте ещё "Незнайку в Солнечном городе".
А банально набрать в Гугле "arduino mega pinout" и посмотреть, никак?
Ну, чего Вы к человеку лезете, он же и так уже
Учитался
Этот страшный человек ЕвгенийП имеет в виду, что на Uno и Mega стоят разные микроконтроллеры. Поэтому читать что-то про Uno и пытаться применить прочитанное на Mega - зачастую контрпродуктивно.
Приведенные ссылки читал не относительно конкретной платы, а чтобы понять принцип. Но, видимо, квалификации не хватает совсем: сути так и не уловил. Полночи пытался разобраться с Мегой (спасибо за большую картинку!) - тоже ум за разум. Видимо, рано мне такие задачи решать. Заход номер два (пока отказавшись от пинов прерывания): просто библиотека для энкодера, посаженного на обычные пины. В принципе все работает, но столкнулся вот с чем: если закомментировать блок работы с датчиками температуры и выведения температур на индикаторы, то реакция программы на поворот энкодера совершенно адекватная (переменная val нормально прописывается и в мониторе порта и на индикаторе). При выполнении же полного скетча эта переменная то меняется, то нет. Понимаю, что это связано с временем, которе требуется датчикам температуры для переваривания и выдачи данных в Ардуино (где-то 850 мсек). Вот как бы обойти этот момент: чтоб на фоне работы термометров энкодеры (а их будет несколько) действовали вне зависимости от задержки датчиков DS18b20? Скетч:
Ну, это Вы зря так. Ничего там страшного нет ни в UNO, ни в Меге.
Собственно там и разницы то особой нет, просто у UNO это есть практически на всех пинах, а в Меге только на части пинов. А так, принцип работы одинаковый.
Вы попробуйте без энкодера, а на простеньком, в несколько строк коде научиться оаботать с прерыванием как таковым. Выберите пин, на котором оно есть (если на UNO, то практически любой) и попрбойуте сделать просто ловлю прерывания на это пине.
Мы (ну, вот лично я) Вам с удовольствием поможем если чего.
Спасибо, Евгений, постепенно я, конечно, разберусь. Однако, не сразу: квалификации действительно катастрофически не хватает, многих вещей я не понимаю на базовом уровне, а времени на исправление этого недостатка тоже мало: все-таки, и работать надо и прочие дела :). Но не найдете ли возможности глянуть на приведенный выше скетч? Как задержку в работе ds18b20 обойти?
Sonologist, Вы странный человек.
Вот попытались реализовать один в принципе правильный вариант. Но с наскоку не удалось - не учли некоторые особенности.
Теперь пытаетесь подойти к задаче с другой стороны - в принципе с не совсем правильной. Из-за чего получаете некоторые негативные эффекты. Избавиться от них при этом подходе совершенно невозможно. Остается либо мириться, либо возвращаться к первому варианту.
И Евгений как раз пытается указать Вам на Ваши ошибки, чтобы облегчить возвращение к этому первому варианту. А Вы: "Спасибо, конечно, но как обойти проблемы присущие именно второму варианту?"
Ответ единственный - вернуться к варианту первому.
Нет, возможно, конечно, кое-какие косметические улучшения и во втором варианте. И даже, возможно, они Вас вполне удовлетворят, а если нет? Попробовать, конечно, можно, но Вы ведь сами жалуетесь на нехватку времени.
Да не странный я, а просто слабый в нашем деле :) Согласенс Вами во всем и полностью. И буду пытаться разобраться и с назначением прерываний и просто "читать" энкодер. Видимо, более правильный вариант - советуемый от Евгения. По крайней мере, с функцией attachInterrupt я более или менее разобрался. Буду добивать вопрос обязательно. Но тут я столкнулся с побочной проблемой. Как бы ни "читай" энкодеры (что через прерывания, что просто - как в представленном скетче) - все равно (насколько я понимаю) получится затыка с этой чортовой латенцией от датчиков температуры. Ее бы победить в первую очередь, а потом решить вопрос, как общаться с энкодерами. Кстати, насколько я сумел понять (возможно, снова ошибаюсь), исходя из приведенной выше коллегой большой картинки распиновки Меги, перенаправлению на прерывания подлежат пины, помеченные как "PCINTx". Например, №№ 50,51,52,53. С ними (и аналогичными) и надо экспериментировать. Так ли?
А падпишусь, ибо чую, что ждет и меня дальняя дорога с энкодером и прерываниями. Чет энкодерная библиотека с дисплеем 16х02 и неоптимизированным выводом, совсем работать не желает, с более-менее оптимизированным, тоже не очень нравиться. Пичалька.
Если энкодер один, то основная проблема только в правильном подключении - чтобы дребезга не допустить. В даташите от Alpine схема есть на четырех резисторах.
В даташите от Alpine схема есть на четырех резисторах.
Вот эта что ли?
Так вроде эти резисторы не про дребезг.
Хотя, здесь два резистора. А что там на четырёх?
основная проблема только в правильном подключении - чтобы дребезга не допустить.
Проблема дребезга не зависит от количества энкодером или кнопок. Если в схеме только резисторы - пожалте в танцы с бубном в борьбе со всплесками. Я их прибиваю , шунтируя контакт конденсатором 100 нф, а для пущей важности дальше ставлю триггер Шмидта. На выходе почти идеальный прямоугольник. Цепочка, конечно, усложняет устройство, но зато нет надобности беспокоиться о дребезге. Как-то так, если не смотреть на распиновку на Ардуино (у каждого своя). Фотки осциллограммы нет, но поверьте, на С1-94 картинка приятная (без бород и завалов фронтов).
Так вроде эти резисторы не про дребезг.
Хотя, здесь два резистора. А что там на четырёх?
https://www.alps.com/prod/info/E/HTML/Encoder/Incremental/EC11/EC11_common.html
Я эту схему видел и пробовал "в натуре". В зоне переднего фронта все равно остается "борода". Справедливости ради замечу, что заментно меньшая, нежели при просто двух резисторах-подтяжках, но остается. Убивается конденсаторами в 10 раз большей емкости. Но тот же эффект при конденсаторах 0.1 uF и двух резисторах. То есть, два резистора получаются лишними. И повторюсь, использование сигнала с выводов А и В через триггеры Шмидта устраняет все проблемы, хотя и чуть-чуть усложняют схему.
Да, я тоже пускал в одной конструкции через Шмидта. Всё хорошо, но работы (для меня) много ))
но работы (для меня) много ))
Ну не так уж и много, если честно. Зато душа спокойна и меандр идеальный.
Сейчас не помню конкретных деталей, но на многих контроллерах входы сами по себе снабжены триггерами Шмидта (по крайней мере, некоторые, какие именно - можно посмотреть в дэйташите).
Это на STM-ках, про которые пишут, что у них есть входы под квадратурные энкодеры?
Триггер шмитта есть во всех МК на всех цифровых выводах. Так что вешать перед входом ещё один - совершенно бесполезно :)
Триггер шмитта есть во всех МК на всех цифровых выводах. Так что вешать перед входом ещё один - совершенно бесполезно :)
все равно (насколько я понимаю) получится затыка с этой чортовой латенцией от датчиков температуры. Ее бы победить в первую очередь, а потом решить вопрос, как общаться с энкодерами.
Дать тебе маааленькую беззадержечную библиотеку для Далласа? Ну и для энкодера впридачу?
только я температуру в ей до целых мерю, мне достатошно
Ну и для энкодера впридачу?
Дида, мине. Дайте две.
Энкодер мне чуть переделать надо, он под очередь сообщений заточен, переделаю на callback и выложу. По крайней мере, у меня без всяких прерываний и дребезга 4 энкодера обрабатываются независимо.
и выложу.
Буду безмерно благодарен!!!!!! Особенно за Даллас без латенции!
[/quote]
Дать тебе маааленькую беззадержечную библиотеку для Далласа? Ну и для энкодера впридачу?
только я температуру в ей до целых мерю, мне достатошно
[/quote]
Да! Хочу! :) А более точно (до десятой градуса) можно с ней замутить?
И в придачу хочу, которая для энкодера!
Заранее спасибо!
Особенно за Даллас без латенции!
OneWire ))))). Тута, и с десятыми и с тысячными.
P/S Чет на далласы опять жор пошел. Давно не было.))))
Да! Хочу! :) А более точно (до десятой градуса) можно с ней замутить?
А нахуа?, как говорят французики. У него точность по даташиту полградуса.
[/quote]
А нахуа?, как говорят французики. У него точность по даташиту полградуса.
[/quote]
Спасибо, вечером качну (на работе обгрызанный Линукс без возможности скачивания). Относительно точности - да, полградуса. Но это означает, что конкретный экземпляр датчика может при кипении воды показывать и 99,5 и 100,5 градусов. В ректификации температуру используют не абсолютную, а в виде некоей дельты. Дельта может быть 0,1-0,5-1,0 градус. Вот здесь и нужны десятые доли.
тогда моя биб-ка не пададёть. Ну в сети полно других, разной степени тармознутости. я специально избавлялся от плавающей точки, чтоб она занимала как можно меньше места. Мне всё равно, -35 на улице или -34.9265
В ректификации температуру используют не абсолютную, а в виде некоей дельты. Дельта может быть 0,1-0,5-1,0 градус. Вот здесь и нужны десятые доли.
Ток не забывайте, минимальный возможный шаг == 0,0625гр. Итого, на 0,2гр коридора, всего три шага. Хотя у меня, уже года три работает, сперва думал поменять, но понял, что устраивает.
P/S А нахрена тогда мега2560, там и 328 за глаза, с бааааальшим запасом?
Я специально избавлялся от плавающей точки, чтоб она занимала как можно меньше места.
Во! А если эту плавающую точку выбросить и давать температуру просто в формате "888", что означает 88,8 градуса? Тут ведь тоже плавающая точке не нужна? Нет? Я в своих программах как раз для расчетов эту точку и выбрасываю, сразу умножая пришедшую температуру на 10.
В той теме, что я дал, изначально, вообще в далласовских попугаях из даташита. На 16.0 не делите и пользуйтесь двумя крайними битами.
[/quote]
Ток не забывайте, минимальный возможный шаг == 0,0625гр. Итого, на 0,2гр коридора, всего три шага. Хотя у меня, уже года три работает, сперва думал поменять, но понял, что устраивает.
P/S А нахрена тогда мега2560, там и 328 за глаза, с бааааальшим запасом?
[/quote]
Все правильно, минимальный шаг 0,0625.
А мега нужна затем, что хочу на нее возложить все функции автоматики. ПОэтому надо много входов в первую очередь.
Не, просто интересно, что может превысить имеющихся 20 входов, из них 18 выходов?
хочу на нее возложить все функции
Что, и потребление готовой продукции тоже?
Не, просто интересно, что может превысить имеющихся 20 входов, из них 18 выходов?
Щас посчитаем:
1. Четыре ds18b20 - 4 пина
2. Восемь энкодеров с кнопками - 24 пина
3. Индикаторы на мах7219 - 3 пина
4. Управление клапанами отбора - 2 пина
5. Входной пин (аналоговый) для стабилизатора мощности - 1 пин
6. Выходной пин (ШИМ или обычный - пока не решил, как регулировать мощность: фазово или по Брезенхейму ) для стабилизатора мощности - 1 пин
7. Детектор перехода через 0 - 1 пин
Вот уже 36 отростков :( И, наверняка еще что-то понадобится.
[/quote]
Что, и потребление готовой продукции тоже?
[/quote]
Не... это уже я сам смогу, без помощи Ардуино :)
Лана, по п.1 бесплатно сэкономлю Вам 3 пина, их все можно включить на один.
Но что будут делать восемь энкодеров?
С остальными, более-менее ясно.
Да уж. 8 энкодеров... Проще полноразмерную клаву на 2 пина повесить. Всё проще управлять будет. И экономии 22 пина.
Лана, по п.1 бесплатно сэкономлю Вам 3 пина, их все можно включить на один.
Но что будут делать восемь энкодеров?
С остальными, более-менее ясно.
Их экономить не надо: удобнее работать с 4 шинами. Не нужно каждый раз определять, какой датчик куда сунут, жив ли он и т.д. Значительно проще датчики промаркировать. Щитаем энкодеры:
1. Установка паспортной мощности ТЭНа
2. Установка подаваемой мощности в ТЭН+ кнопка включения-выключения режима разгона
3. Установка температуры отсечки для клапана отбора + кнопка "температура отсечки=температуре колонны" (для удобства)
4. Установка скважности "клапан открыт-закрыт" + кнопка "клапан закрыт"
5. Установка температуры для реакции на показатели еще трех датчиков температуры (3 энкодера + 3 кнопки)
Извини, просчитался: энкодеров будет 7.
Да уж. 8 энкодеров... Проще полноразмерную клаву на 2 пина повесить. Всё проще управлять будет. И экономии 22 пина.
Проще? Может быть. Но не функционально. Работа с кнопками "больше-меньше-вправо-влево" неудобна и визуально недемонстративна. У меня уже были устройства, которые настривались двумя-тремя кнопками. Так там алгоритм обычно такой, что пока до нужного пункта меню доберешься - палец намозолишь. А с крутилками - и логично и наглядно: индикатор с показателем, а рядом - настроечный энкодер.
Меню выбора регулируемой велечины - нет, не слышал!!!
Их экономить не надо: удобнее работать с 4 шинами. Не нужно каждый раз определять, какой датчик куда сунут, жив ли он и т.д. Значительно проще датчики промаркировать. Щитаем энкодеры:
1. Установка паспортной мощности ТЭНа
2. Установка подаваемой мощности в ТЭН+ кнопка включения-выключения режима разгона
3. Установка температуры отсечки для клапана отбора + кнопка "температура отсечки=температуре колонны" (для удобства)
4. Установка скважности "клапан открыт-закрыт" + кнопка "клапан закрыт"
5. Установка температуры для реакции на показатели еще трех датчиков температуры (3 энкодера + 3 кнопки)
Извини, просчитался: энкодеров будет 7.
Датчики вешаются на один шлейф и втыкаются в свои гнезда, по длине шлейфа. В сетапе проверить количество и все определилось.
Паспортная мощность тэна, они у Вас сменные?
Подаваемая мощность должна устанавливаться в зависимости от температуры куба и колонны. ИМХО.
Температуру отбора должен ограничивать МК, без Вашего вмешательства, иначе, нахрена он вообще нужен?
Установка скважности, я бы заставил это тоже МК делать.
Установка температур, возможно в меню, хотя это тоже дело МК. ИМХО.
Я Вас не отговариваю, дело Ваше. Но городить такую монструозную кострукцию там, где должна быть одна кнопка "Включить-выключить", извращение. Опять таки, ИМХО.