Несколько кнопок на одно внешнее прерывание посредством логики.

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

Так и не хватило мозгов, как увеличить количество пинов внешнего прерывания, хотя учитался. Видимо, не дано вникнуть. Пришло в голову вот такое:

Скажем, 4 кнопки, подтянутые к лог. 1, подключаем к элементу 4И-НЕ.  Выход элемента - на пин прерывания. Входы элемента - на другие пины (без прерывания). По прерыванию определяем, на каком пине  появился лог. 0. И тем самым определяем, какая кнопка нажата. Обычно аналоговые входы используются редко, вот их и пустить на определение кнопки. На Меге их 16 штук. Две микросхемы К155ЛА1 решают вопрос с 16 кнопками на одном прерывании.

Понимаю, что это выход "с позором". Но, вроде, должно получиться. Или развенчайте.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

купи за 15р PCF8574  и не парь никому мосх

http://we.easyelectronics.ru/part/i2c-rasshiritel-portov-pcf8574.html

у ей прерывание есть по изменению уровня на 8 ногах

rkit
Offline
Зарегистрирован: 23.11.2016

Увеличить количество пинов внешнего прерывания можно купив контроллер с большим количеством пинов внешнего прерывания.

А если нужно просто прерывание по пину, то оно есть на всех пинах в AVR, и называется PCINT, и подробно разжевано в даташите.

nik182
Offline
Зарегистрирован: 04.05.2015

Все пины с прерыванием. Не на все пины можно реагировать средствами ардуины. Вывод простой, если работаете только ардуиной, то метод собирания на один int вполне. А если уже до регистров доросли, то можно и без логики на ноги навешать и поднять прерывание PCINT.   

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

Друзья, вот как раз для понимания PCINT и регистров у меня мозгов просто не хватает. Не вижу процесса. Стоит задача  использовать количество прерываний больше, чем таких пинов в "стандарте". Но так и не могу в это въехать. Понятно, что есть метод - попросить кого-то за деньги написать кусок скетча с этой целью. Но это для меня будет "черным ящиком". А я привык понимать, что делаю. На более глубокое изучение информатики просто нет времени, увы. Вот и изощряюсь.

nik182
Offline
Зарегистрирован: 04.05.2015

А сколько кнопок надо? И как загружен основной луп программы? Есть ли смысл делать именно через прерывание? 

rkit
Offline
Зарегистрирован: 23.11.2016

Изощряться со схемой есть время, прочитать даташит - нет. Ок. Зачем создана тема? Поделиться с миром этой информацией?

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

nik182 пишет:

А сколько кнопок надо? И как загружен основной луп программы? Есть ли смысл делать именно через прерывание? 

Кнопок надо именно 4. На меге (6 прерываний). Смысл использования прерываний - сажать на них 4 энкодера. Остаются 2 пина. Один пойдет на зерокросс, другой хочу использовать для кнопок "придуманным" способом. Иначе просто в лупе придется постоянно отслеживать и анализировать состояние 12 пинов. Как показала моя практика (понятно, ущербная), в этой ситуации энкодеры работают плохо и нечетко. Не сомневаюсь, что где-то я что-то делаю не очень правильно, потому и пришел к использованию прерываний. И скетч короче и удобнее.

 

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

rkit пишет:

Изощряться со схемой есть время, прочитать даташит - нет. Ок. Зачем создана тема? Поделиться с миром этой информацией?

Даташит надо не просто прочитать (с аглицким проблем нет). Надо еще суть понять. А вот на это уже моих способностей не хватает. То есть, надо садиться, и штудировать основы, начиная с "подошвы". Это уже время, и не малое.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

rkit пишет:
оно есть на всех пинах в AVR
В некоторых AVR девайсах. Так точнее будет.

b707
Offline
Зарегистрирован: 26.05.2017

Sonologist пишет:

Скажем, 4 кнопки, подтянутые к лог. 1, подключаем к элементу 4И-НЕ.  Выход элемента - на пин прерывания. Входы элемента - на другие пины (без прерывания). По прерыванию определяем, на каком пине  появился лог. 0. И тем самым определяем, какая кнопка нажата.

Sonologist - вы удивитесь, но ИМЕННО ТАК PCINT И РАБОТАЕТ в атмеге :) Несклолько ног замкнуты на одно прерывание, при замыкании любой ноги по прерыванию проверяете все пины и видите, на каком сработало. Все просто.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Sonologist пишет:

Понятно, что есть метод - попросить кого-то за деньги написать кусок скетча с этой целью.

Есть и другой - скачать готовую библиотеку PCINT коих 100500  и разобраться.

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

b707 пишет:

ИМЕННО ТАК PCINT И РАБОТАЕТ в атмеге :)

Удивился :). Не скажу, что вопрос прояснился окончательно, но уже теплее.

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

ЕвгенийП пишет:

Есть и другой - скачать готовую библиотеку PCINT коих 100500  и разобраться.

Спасибо, поищу.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Неплохая (как всегда у этого автора) статья про енто дело - https://gammon.com.au/interrupts

-NMi-
Offline
Зарегистрирован: 20.08.2018

Каквсихда вопросы от ентого ТС задаются через опу и звучат как дичь...

Опиши задачу, сколько кнопок надо и каких. Какие условия опроса, например, по одной кнопке или отслеживать две или несколько нажатых кнопок одновременно........

Да, теперь интимное - а прерывания то тут зачем? Приоткрой занавес тайны.

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

ЕвгенийП пишет:

Неплохая (как всегда у этого автора) статья про енто дело - https://gammon.com.au/interrupts

Взглянул. Пока краем глаза, но уже видно, что много почерпну. Вечером ознакомлюсь. Спасибо.

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

-NMi- пишет:

Каквсихда вопросы от ентого ТС задаются через опу и звучат как дичь...

Опиши задачу, сколько кнопок надо и каких. Какие условия опроса, например, по одной кнопке или отслеживать две или несколько нажатых кнопок одновременно........

Да, теперь интимное - а прерывания то тут зачем? Приоткрой занавес тайны.

Ну еще бы не дичь, с моей-то квалификацией! :)

Не совсем понятно, чем поможет углубление в задачу? Вопрос же я задал совершенно конкреный: проканает или нет. Что касается детализации. Мега2560. 4 энкодера с кнопками, каждый настраивает свою группу параметров. Кнопки энкодеров - перемещение по параметрам внутри группы типа меню. Несколько кнопок нажиматься одновремернно не будут (достаточно разнесены, да и нет нужды), отслеживается нажатие одной из них.

Интимная завеса тайны: когда я делал предыдущую версию устройства, то все энкодеры и кнопки сначала отслеживал в лупе. Постоянное считывание состояния 12 контактов в моем случае привело к некорректной и неустойчивой работе энкодеров. Часть из них перевел на прерывания - все заработало четко и без сбоев. Скетч укоротился, стал более читаемым (мне это важно). Хочу перевести на прерывания все контакты. От того и задумался как.

-NMi-
Offline
Зарегистрирован: 20.08.2018

Вот смотри: для того чтобы решить задачу, задачу нужно поставить. А чтобы задача была понятнее - её нужно как можно полнее и конкретнее описать. Эл. схема для задачи и желаемая логика работы обязательны!!! Ну и плюсом будут всякие хотелки типа прерываний и тд...

Ты-ж в PR гамить могёшь, ну дык наваяй схему-та, там ведь фича клёвая есть - симуляцция.

Давай, кароче, ваяй свои энкодеры в PR , будем разбирацца, чо-да-как.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Sonologist пишет:

Не совсем понятно, чем поможет углубление в задачу? 

Это Вы напрасно. Почему все, кто не знает как решить задачу считают, что они знают что для решения нужно, а что - нет?

Вот прямо сразу и "например",

Sonologist пишет:

Мега2560

Опаньки! Где ж Вы раньше были? У неё-то PCINT ДАЛЕКО не на всех пинах, как Вам тут опрометчиво подсказывали. Так что, смотрите там, чтобы не тратить время на попытки получить "молоко от козла"

Kakmyc
Offline
Зарегистрирован: 15.01.2018

ТС, вся суть прерываний на PCINT заключается в том, что , если в прерываний INT0/INT1, ты настраиваемо (CHANGE,FALLING,RISING)следишь за состоянием каждого из этих пинов отдельно, то PCINT, следишь за всеми портами регистра разом, и если меняется состояние(только CHANGE) любого из указанных пинов, то тогда вызывается обработчик прерывания.
Т.е. Нужно просто включить прерывание, указать пины и написать обработчик (вызываемую функцию внутри которой, будет происходить вычисление того, какой пин вызвал прерывание и что с этим делать).

Инфы о том как настроить PCINT в интернете куча

-NMi-
Offline
Зарегистрирован: 20.08.2018

Блин, на 2560 можно "чорталысого" наваять запросто. Там ресурсов завались просто. Мой "самоплясник" сделан на 328 и ито пины вроде не все используются, вроде. А уж на 2560 я просто незнаю, чо можно навертеть... минизавод со скадой и визуализацией всего техпроцесса + вебморду + управление с тилипона +...+...

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

Я понял свои ошибки в смысле задавания вопросов. Давайте так: по ходу буду задавать их, как возникнут. Иначе пипец, запутаюсь. Всем спасибо за ссылки и рекомендации. Приступаю к ваянию. Держитесь, друзья, будет вам нескучно. :)

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

-NMi- пишет:

Ты-ж в PR гамить могёшь, ну дык наваяй схему-та, там ведь фича клёвая есть - симуляцция.

Могю. Правда, пользуюсь варезом. Отсюда, как я понимаю и проблемы. Примитивный усилитель еще протеус тянет, а чуть посложнее - куку. Там есть приколы, чтоб оживить (снизить таймрейт и т.д.), но чаще не помогает. Симуляция Ардуины там - вааще полный.... Жуткий тормоз, подвис, вылет... Причем, у меня комп вполне пристойный, во всяком случае, проекты Sonar и Cubase (с гигабайтными VST) тащит в реале как нечего делать. 

-NMi-
Offline
Зарегистрирован: 20.08.2018

Sonologist пишет:

Отсюда, как я понимаю и проблемы.

Нет дядЪко, проблемы нашего народа одни и те-же на протяжении столетий - дураки и дороги.

Перенося в парадигму PR проблема не меняет окраски - дурак и недостаточное количество знаний.

PS - в PR всё прекрасно симулируется. Даже STM32 ща туда добавили, изучаю патихоньку!

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

-NMi- пишет:

Нет дядЪко, проблемы нашего народа одни и те-же на протяжении столетий - дураки и дороги.

Перенося в парадигму PR проблема не меняет окраски - дурак и недостаточное количество знаний.

PS - в PR всё прекрасно симулируется. Даже STM32 ща туда добавили, изучаю патихоньку!

:) Надо будет добавить в мой ник слово "Дурак".

Тем не менее, добил, таки... Добрые люди подсказали еще, как написать красиво. Получилось, вот что, работает:

//Назначение прерываний на пины 50-53 Меги 2560

int pins[] = {A0,A1,A2,A3};
volatile int button;
volatile int encoder_a;
volatile int encoder_b;
volatile int free_pin;

void setup() 
{
  Serial.begin(115200);
  DDRF   = _BV(PF0) | _BV(PF1) | _BV(PF2) | _BV(PF3); 
  PCICR  = _BV(PCIE0);
  PCMSK0 = _BV(PCINT0) | _BV(PCINT1) | _BV(PCINT2) | _BV(PCINT3); 
}

void loop() 
{
  delay (333);
  Serial.print ("Кнопка энкодера 53 ");
  Serial.print (button);
  Serial.print (" - ");
  Serial.print ("Вывод энкодера А 50 ");
  Serial.print (encoder_a);
  Serial.print (" - ");
  Serial.print ("Вывод энкодера В 51 ");
  Serial.print (encoder_b);
  Serial.print (" - ");
  Serial.print ("Пустой пин 52 ");
  Serial.println (free_pin);
}

ISR(PCINT0_vect) 
{
  button=digitalRead (53);
  encoder_a=digitalRead (50);
  encoder_b=digitalRead (51);
  free_pin=digitalRead (52);
}

Спасибо всем за подсказки и науку!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

-NMi- пишет:
дураки и дороги.
И ещё переполнение миллис.

sadman41
Offline
Зарегистрирован: 19.10.2016

Sonologist пишет:

Спасибо всем за подсказки и науку!

За время нескольких digitalRead() состояние входов может измениться....

-NMi-
Offline
Зарегистрирован: 20.08.2018

Чо я просил? Схему. Где она?

и.и.и. я-б читал в обработчике весь порт сразу ауш патом...

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

-NMi- пишет:

Чо я просил? Схему. Где она?

и.и.и. я-б читал в обработчике весь порт сразу ауш патом...

Схема только вечером: на работе хренов Линукс не позволяет вставлять картинки. По поводу чтения порта - правильно ли я понял, что то, что в лупе перенести в функцию прерывания?

sadman41
Offline
Зарегистрирован: 19.10.2016

Неправильно. Читать весь порт, потом кромсать:

ISR(...) {
...
portValue = PINF;
button = portValue & 0x01;
encoder_a = portValue & 0x02;
encoder_b = portValue & 0x05 ;
free_pin = portValue & 0x07;
...
}

 

-NMi-
Offline
Зарегистрирован: 20.08.2018

Sonologist пишет:

на работе хренов Линукс не позволяет вставлять картинки.

Рука-лицо. Абзац. Пипец!

Линукс - это лучшее, что изобрёл человек для интернета.

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

sadman41 пишет:

Неправильно. Читать весь порт, потом кромсать:

ISR(...) {
...
portValue = PINF;
button = portValue & 0x01;
encoder_a = portValue & 0x02;
encoder_b = portValue & 0x05 ;
free_pin = portValue & 0x07;
...
}

 

Ага, усёк. Спасибо большое!

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

-NMi- пишет:

Линукс - это лучшее, что изобрёл человек для интернета.

Я в курсе. Только на работе он обрезан по самое не могу. Доступ к настройкам заблокирован. Скачивание файлов заблокировано. Картинку вставить нельзя: при попытке найти нужный файл "Коммондиалог" отсутствует. Единственная возможность - положить картинку (только с флэшки!)  куда-то на файлообменник и написть путь к ней. Графичских редакторов нет. Так что.....

Кстати, я не очень понял какую схему-то представить? Обвес энкодера и его кнопки? Или на какие пины какие ноги энкодеров-кнопок заведены?

Да! И ещё вопрос: "Нормальный" INT реагирует на RISING, FALLING и CHANGE. Инициированный PCINT - только на CHANGE. А ченджей при нажатии и отпускании кнопки, естественно, два. Как бы поизящнее игнорировать отпускание кнопки (второй CHANGE)? Заранее спасибо!

-NMi-
Offline
Зарегистрирован: 20.08.2018

Какой_ты_нафик_танкист... ичо, сломать не могёшь???  ))))))))))))

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

-NMi- пишет:

Какой_ты_нафик_танкист... ичо, сломать не могёшь???  ))))))))))))

То, что один человек сделал, второй завсегда сломать может. :) ЕМИАС - система глюкавая как не знаю что, но айтишники исправлять баги не хотят. Зато за доступом следят пристально - каждый день чек  системы (не дай Бог кто-то что-то установил или изменил).

-NMi-
Offline
Зарегистрирован: 20.08.2018

Sonologist пишет:

Кстати, я не очень понял какую схему-то представить?

Да! И ещё вопрос: "Нормальный" INT реагирует на RISING, FALLING и CHANGE. Инициированный PCINT - только на CHANGE. А ченджей при нажатии и отпускании кнопки, естественно, два. Как бы поизящнее игнорировать отпускание кнопки (второй CHANGE)? Заранее спасибо!

Вот сколько раз я тебе говорил, что дом строят с фундамента а устройство со схемы. Но видать недошло.

На "нормальных" интах ещё Zero есть, но это пока мимо кассы.  А "поизящнее" уже будет у тебя в коде обработчика. Тебе нужно будет создать несколько счётчиков состояний кнопок в обработчике и анализировать их состояние. Желательно оформить всё это дело в "конечный автомат". Вот здесь-то и проявляется искусство программиста и его талантливость. Посмотрим как у тебя с "этим"  :))

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

-NMi-]</p> <p>[quote=Sonologist пишет:

Вот сколько раз я тебе говорил, что дом строят с фундамента а устройство со схемы. Но видать недошло.

На "нормальных" интах ещё Zero есть, но это пока мимо кассы.  А "поизящнее" уже будет у тебя в коде обработчика. Тебе нужно будет создать несколько счётчиков состояний кнопок в обработчике и анализировать их состояние. Желательно оформить всё это дело в "конечный автомат". Вот здесь-то и проявляется искусство программиста и его талантливость. Посмотрим как у тебя с "этим"  :))

Да есть схемы-то. Надо - вечером скину. Но они примитивные, на дискутируемый вопрос никак не влияют.

Идею про счетчик понял, спасибо. Надо завести булеву переменную в значении "ложь". В прерывании, если она "ложь" - выполнять код, затем перевести ее в "истину". Если она "истина" (следующее событие) - ничего не делать, просто перевести ее в "ложь". Вижу так. Нет?

-NMi-
Offline
Зарегистрирован: 20.08.2018

Послушай, иногда и "местами" я не могу тебя понять... Именно ТЫ просишь помощи от сообщества и именно ТЕБЕ именно помощь-то и нужна. НО ты упрямо САМ СЕБЕ вставляешь палки в колёса "глупыми" ответами типа ладно, завтра и спасибо. Ведь под лежачего Деда коньяк не течёт... секи фишку, пока я добрый.

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

-NMi- пишет:

секи фишку, пока я добрый.

Всё, больше так не буду.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Sonologist пишет:

У тебя есть моя почта. Давай так:

Я тебе всё про прерывания, что тебе интересно. И про то, как твои энкодеры лучше подключить, а ты мне про УЗИ, и про то, стоит ли ветеринарный наладонник за 40 тыр купить (их полный ебей), или на нем вообще ничего не видно будет?

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

О! влад, привет! Щас в почту полезу.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

На самом деле прерывания по пинтам проверять можно просто и быстро(особенно если схему изначально под это проектировать) , но это объяснять очень долго.
Начни со сложно и долго. Примерно как сейчас.
Читай всё значения, и сравнивай их с теми, что были в предыдущем прерывании. Соответственно текущие нужно сохранять , что бы они потом стали предыдущими.

-NMi-
Offline
Зарегистрирован: 20.08.2018

Kakmyc пишет:

Читай всё значения, и сравнивай их с теми, что были в предыдущем прерывании. Соответственно текущие нужно сохранять , что бы они потом стали предыдущими.

Нафик ему чойто пейсать-сахранять? Напейши иму гатовый скречч и вазьми с ниго срецтва, типа бартер. фсё.

В качестве примера нам дай для посмотреть, может мы что-то для себя подчеркнём.

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

-NMi- пишет:

Нафик ему чойто пейсать-сахранять? Напейши иму гатовый скречч и вазьми с ниго срецтва, типа бартер. фсё.

Хорошая идея :) Если будет рабочий пример с подробными комментариями (важное условие для моего понимания), будет и бартер :)

-NMi-
Offline
Зарегистрирован: 20.08.2018

Отлично. Выставь цену строки в миллилитрах, например 1 строка = 10 мл. 10 строк = 100гр. 100 строк = литр. Деду должно панравицца.

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

-NMi- пишет:

Отлично. Выставь цену строки в миллилитрах, например 1 строка = 10 мл. 10 строк = 100гр. 100 строк = литр. Деду должно панравицца.

Прайз нармальный :)

Исторический анекдот: Дюма за вторую и третью часть "мушкетеров" получал от издателя построчно.  И оба романа (20- и 30 лет спустя) переполнил многочисленными длиннющими диалогами, но каждая фраза из 3-4 слов. :)

PS: Ничего личного, просто тут же вспомнилось.

-NMi-
Offline
Зарегистрирован: 20.08.2018

Дык можешь "регулировать" крепостью срецтва.

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

-NMi- пишет:

Дык можешь "регулировать" крепостью срецтва.

Ха! Тоже идея хорошая: чем больше "воды" в коде, тем больше ее в срецтве :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Получится хорошо прокомментированное срецтво? Так что ли?

-NMi-
Offline
Зарегистрирован: 20.08.2018

Нет, за комменты да ещё с подробностями это уже бонусы. Ну типа натурпрадукт, бурбончик или недовискарь + настоен на дубовых чипсах месяца три минимум.

Вааще нуно делать дополнительную ветку типа  =  меняю сало (рыбу, масо.....) на скетч. Чо, так антикризисно, и налогом не облагаеццо :)))