Обработка несколько пинов в разных портах.
- Войдите на сайт для отправки комментариев
Пнд, 05/11/2018 - 20:06
Добрый день, уважаемые форумчане!
Прошу у Вас совета, кто знает, подскажите. Имеется 26 кнопок, которые подключены напрямую к ножкам МК Мега 2560. Вся проблема в том, что эти ножки расположены в разных портах.
PA0,PA4,PC1,PC4,PC5,PC6,PC7,PD4,PD5,PE2,PE3,PF7,PG1, PG2,PH2,PJ2,PJ3,PJ5,PK0,PK1,PK2,PK3,PK4,PK5,PK6,PL7
Существует ли какой-нибдуь красивый способ обработать такую конфигурацию кнопок? Если бы было матричное подключению, то проблем, собственно, бы и не было. Но как красиво обработать такой комплект? Может существуют какие-то макросы, которые позволят компактно вызвать процедуру опроса для каждого пина? Или создать свою таблицу (массив) соответствия пинов элементам таблицы (массива) и таким образом в цикле прогонять?
Заранее, спасибо!
С уважением.
Я перефразирую вопрос.
Существует ли способ, грамотно пробежать по данным пинам, находящимся в разных группах, в цикле и вызвать для каждого функцию опроса?
Например в таком виде:
Заранее, спасибо!
Способ с массивом пинов вполне нормальный, если ищется генерализованное решение.
Спасибо за ответ! Я только-только начал изучать программирование МК, поэтому не судите строго. Решил реализовать при помощи макросов (никогда до этого их не использовал):
В результате компилятор выдает ошибку:
Ну, вы с козырей-то не заходите. Поищите картинку с распиновкой Arduino Mega2560. Там увидите соответствие выводов МК сквозной нумерации Arduino. Вот эти номера в массив сгружайте и потом уже pinMode(pins[i], INPUT) / digitalRead(pins[i])... Если этого не хватит, то уже к регистрам можно перейти. Например - хранить в массиве структур указатель на порт и битовую маску для доступа к конкретному выводу (в сущности Arduino так и делает).
А компилятор правильно ругается. ## - это не для рантайма, а для препроцессинга. Сначала решеточками строки в исходнике слепляются, а потом только уже начинается непосредственно компиляция. Ну и, естественно, что там слеплено - как функция/переменная не объявлено.
Shaman_2010, насколько я знаю, в Ардуино ИДЕ пины Мега обозначены целыми числами, типа 42 или 50. Почему бы просто не создать массив целых типа int или byte, без всяких PA1 и PB4?
Ну, вы с козырей-то не заходите. Поищите картинку с распиновкой Arduino Mega2560. Там увидите соответствие выводов МК сквозной нумерации Arduino. Вот эти номера в массив сгружайте и потом уже pinMode(pins[i], INPUT) / digitalRead(pins[i])... Если этого не хватит, то уже к регистрам можно перейти. Например - хранить в массиве структур указатель на порт и битовую маску для доступа к конкретному выводу (в сущности Arduino так и делает).
А компилятор правильно ругается. ## - это не для рантайма, а для препроцессинга. Сначала решеточками строки в исходнике слепляются, а потом только уже начинается непосредственно компиляция. Ну и, естественно, что там слеплено - как функция/переменная не объявлено.
Спасибо за ответ! Да, в том то и дело, что, по моему, не все пины, которые я привел выше, имеют сквозную нумерацию, поэтому я сразу перешел к работе с регистрами... И по макросам, да, я уже понял, что дал маху с ними, спасибо! )
Shaman_2010, насколько я знаю, в Ардуино ИДЕ пины Мега обозначены целыми числами, типа 42 или 50. Почему бы просто не создать массив целых типа int или byte, без всяких PA1 и PB4?
Дело в том, что не все пины имеют сквозную нумерацию Arduino. По моему...
Решил задачу следующим образом:
Громоздко выглядит, конечно, но работает. Надо будет и правда подумать на счет структур. Если есть советы по улучшению - буду признателен!
Заранее спасибо!