увеличить количество аппаратных прерываний в ардуино

6 Янв 2020
122
-4
На плате Ардуино Мега 2560 имеется 6 входов аппаратных прерываний.
А нужно хотя бы 12.
Можно ли это организовать?
Ставить второй процессор с ещё 6-входами - это не вариант.
Буду рад любым идеям
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,706
474
@avan, т.е. лепить уродливые и непредсказуемые костыли? Такое грамотный разработчик делать не будет. Правильное решение - применить другой контроллер, с достаточным количеством прерываний.
 
Изменено:

Геннадий П

★★★★★★✩
14 Апр 2021
1,969
632
44
имеется 6 входов аппаратных прерываний.
А нужно хотя бы 12.
Вам ничего не говорит слово "аппаратных"?
Для чего вам столько?
Если нужно простое отслеживание изменения уровней входов, то расширитель портов на PCF8574 прекрасно справляется.
 

poty

★★★★★★✩
19 Фев 2020
3,230
940
@avan, уточните, что имеется в виду? В 2560 восемь входов аппаратных прерываний (INT0-INT7) + любой вход может генерировать прерывания "по изменению" (3 группы входов, PCINT0 - PCINT2) + можно использовать компараторы на любом аналоговом входе (ANALOG COMP). Вот и есть необходимые 12 входов. При необходимости и это можно увеличить.
Другое дело, что это вряд ли имеет практическую ценность: прерывания обрабатываются последовательно (имеют приоритет) и что-то осмысленное в них сделать вряд ли можно успеть, если они все включены (нужно ещё не забывать, что как минимум один таймер генерит прерывания для хода времени).
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,301
Москва
что-то осмысленное в них сделать вряд ли можно успеть
Можно успеть проверить на изменение вверх или вниз, а так же выставить нужный флаг.
Если это ручное управление чем то, то вполне достаточно (я обрабатывал нажатие 8 кнопок из одного регистра)
А если что то частое аппаратно, то надо рассматривать отдельно.
 

te238s

★★✩✩✩✩✩
14 Ноя 2021
374
97
Если это не ракета-носитель,то 12 аппаратных прерываний сложно оправдать. Да и там,уверен,столько прерываний нет.
Автор,откройте тайну,зачем?
 
6 Янв 2020
122
-4
+ любой вход может генерировать прерывания "по изменению"
если я правильно понял, если, например, я сконфигурирую D22...D28 как входы, то во время исполнения основной программы любой пришедший на эти входы импульс будет вызывать прерывание? Ой ли?

Если это не ракета-носитель,то 12 аппаратных прерываний сложно оправдать. Да и там,уверен,столько прерываний нет.
Автор, откройте тайну, зачем?
открою страшную тайну - это не вся ракета-носитель в целом, а всего лишь 6 моторчиков, управляющих поворотами её двигателей.
В каждом моторчике-механизме два датчика - один срабатывает при проходе вала через нулевое положение, служит для уточнения настройки,
другой срабатывает при провороте вала примерно на 1/300 оборота и служит для определения текущей фактической скорости вращения.
Механизмов шесть.
Процессор один - он должен собирать всю текущую информацию с 6 моторчиков, принимать сигналы из ЦУПа, пожелания из ЦК, следить за газетами, особенно буржуазными,
и выдавать правильные сигналы управления для правильного проворота на нужный угол каждого механизма, для обеспечения их согласованного положения в любой момент времени.

@avan, В 2560 восемь входов аппаратных прерываний (INT0-INT7)
Может, оно и так, но злые ардуино-разработчики платы Arduino_Mega_2560 вывели на входы платы только 6...
 
Изменено:

Геннадий П

★★★★★★✩
14 Апр 2021
1,969
632
44
На сколько понял, в меге примерно как и в стм32, на группу пинов работает только одно прерывание. Есть три группы пинов на которые можно включить прерывание, итого можно считывать до 24 пинов по трем прерываниям.
 
6 Янв 2020
122
-4
На сколько понял, в меге примерно как и в стм32, на группу пинов работает только одно прерывание. Есть три группы пинов на которые можно включить прерывание, итого можно считывать до 24 пинов по трем прерываниям.
Это интересно. Можно ли подробнее, какие прерывания - аппаратные? какие три группы пинов? Как на них повесить простые входы?
Если бы были нормальные подробные (полные) человеческие описания работы ардуинских плат - и вопросов бы не было....
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,969
632
44
@avan, На русском толкового мануала сразу не нашел, только на английском: Arduino Pin Change Interrupts – The Wandering Engineer

А узнать с какого пина группы пришло прерывание можно сравнивая с последним запомненным состоянием.

описания работы ардуинских плат
Ищите описание работы не "ардуинских плат", а самого микроконтроллера.
Например даташит на контроллер: ATmega640/1280/1281/2560/2561 datasheet (microchip.com)
 
Изменено:
6 Янв 2020
122
-4
@Геннадий П,
то-то и оно, что на английском. Как всегда, я оказался единственным человеком в стране, кому это нужно....
Лет 20 назад я, работая в одной фирме, делал полный перевод книги по PIC 18, на это ушло месяца полтора-два.
Крайне тягомотное занятие. Но тогда пик18 хоть был в новинку.
А теперь, после 10-летнего (ю)ёрзания всяких ардуин, этот "проект" так и остался пустышкой - разве что гирляндой поморгать по готовому "скретчу".
Никакой документации, никаких руководств.
 

vortigont

★★★★★★✩
24 Апр 2020
1,022
542
Saint-Petersburg, Russia
@avan,
может будет проще все датчики завести на сдвиговый регистр (вроде SN74HC165) и прериодически опрашивать по типу клавиатуры. Нужно будет всего 3 пина.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,301
Москва
Как всегда, я оказался единственным человеком в стране, кому это нужно.
Не надо себе льстить )
Там нет ничего сложного. Вот одна из старых попыток работать с энкодером по прерываниям. На 3 и 4 пинах. Обработчик isr на группу этих пинов и в setup указывается какие пины будут участвовать в прерываниях (что бы не все 8 ловить)
C++:
volatile int16_t enc_val = 0;
ISR (PCINT2_vect, ISR_BLOCK)
{
  static volatile uint32_t enc_ms = 0;
  static volatile uint8_t N = 0;
  static volatile uint8_t E = 0;
  if ((millis() - enc_ms) > 50)
  {
    N = 0;
    E = 0;
  }
  enc_ms = millis();
  byte A = (PIND & B11000) >> 3;
  E = (E << 2) + A;
  N++;
  if (N == 2)
  {       
    if (E == B11) enc_val++;
    if (E == B1001) enc_val--;
    E = 0;
    N = 0;
  }
}


void setup() {
  Serial.begin(115200);

  pinMode (3, INPUT_PULLUP);
  pinMode (4, INPUT_PULLUP);

  PCMSK2 |= bit (PCINT19);  // 3-ий пин
  PCMSK2 |= bit (PCINT20);  // 4-ый пини
  PCIFR  |= bit (PCIF2);   //
  PCICR  |= bit (PCIE2);   //
}

void loop() {
static int16_t old_enc_val = 0;
if (old_enc_val !=enc_val)
  {
    Serial.println(enc_val);
    old_enc_val =enc_val;
  }
}
 
6 Янв 2020
122
-4
@vortigont,
схемно-то оно, может, и проще, но по времени обработки всё умножается в разы.
Боюсь, в реальности это вообще не будет работать, а только висеть очередями.
В отличие от нормального человеческого ассемблера (который был на пиках) время выполнения всех ардуинско-сишных команд - тайна за семью печатями. а реальность непредсказуема.
что такое PCINT и как с ним работать - внятного описания не нашёл.
Прерывания нужны потому, что самому процессору в основное время тоже хватает основной работы,
а если его занять постоянным опросом входов - то работы ему не сделать.

Не надо себе льстить )
имелось ввиду, что за 10 лет так никому и не потребовалось описание на человеческом языке платы,
которая все эти 10 лет продаётся во всех магазинах для радиолюбителей...
**
А за программку спасибо - попробую её понять...
 

vortigont

★★★★★★✩
24 Апр 2020
1,022
542
Saint-Petersburg, Russia
схемно-то оно, может, и проще, но по времени обработки всё умножается в разы.
ну без детального ТЗ тут можно только фантазировать, но я бы поспорил. Напр если вам нужно обрабатывать ситуацию "залипания" концевиков, или остановки вала в 0й точке, то одними прерываниями тут не обойтись и вам все равно придется периодически опрашивать входы. Тоже самое касается дребезга. Опрос не такой уж и затратный процесс если не загонять его в бесконечный цикл. Схемотехничсеки можно скомбинировать, все датчики через ИЛИ подаются на 1 пин с прерыванием, по прерыванию читаем данные из регистра и обрабатываем. Можно опрашивать на какой-нибудь отдельной атини и слать данные в основной контроллер через сериал/и2ц. Можно входы завести на шифратор 16в4 и обрабатывать 4 ноги если не допускать ситуации когда 2 датчика сработают одновременно (правда с прерываниями тогда тоже еще вопрос что делать в такой ситуации). Много чего еще придумать можно )
 
  • Лойс +1
Реакции: te238s
6 Янв 2020
122
-4
@vortigont,
в отношении ТЗ - смотрите моё сообщение №9.
КОНЕЧНО, всё происходит в бесконечном цикле.
Постоянно крутятся моторчики, выдавая импульсы, вызывающие прерывания (штук 300 за один полный оборот), по ним определяется и реальная скорость каждого моторчика, и его реальный угол поворота в данный момент времени,
Реже, но тоже постоянно приходят прерывания от других датчиков, сигнализирующих о проходе вала моторчика через нулевую точку, по ним обнуляются счётчики текущего положения вала.
Кроме этого, процессор должен постоянно (периодически, 40 раз в секунду) принимать извне текущую информацию о том, в каком положении каждый моторчик ДОЛЖЕН быть, и устранять разницу в его реальном положении, если она есть.
Если бы речь была об управлении "от концевиков" или устранении дребезга - то и процессор на 16 мГц ни к чему....
 

poty

★★★★★★✩
19 Фев 2020
3,230
940
@avan, каждой задаче - свои средства для её решения. Если настолько крут, что взялся решать такую задачу, то применение плат Ардуино - просто смешно. Потому и не находишь готовой информации. Плата полностью описана, есть схема, IDE для программирования, библиотеки и потом примеры, но это всё не для продакшн явно.
К выводам можно подпаятся, но вообще - используй собственную плату - гораздо эффективнее. И выведешь всё, что нужно.
Ассемблер на этих МП полностью описан в документации, есть мануал по программированию с примерами. И он вполне нормален.
А все протоколы работы с PCINT, как уже сказано @Геннадий П, , ищи в datasheet на микросхему.
Кстати, 16МГц - это не так и много. Просто посчитай расходы времени на обработку. Прерывания также будут задерживаться на время обработки прерываний с бОльшим приоритетом и давать погрешность. Я уже не говорю о поддержке параллельного получения данных...
 

vortigont

★★★★★★✩
24 Апр 2020
1,022
542
Saint-Petersburg, Russia
в отношении ТЗ - смотрите моё сообщение №9.
КОНЕЧНО, всё происходит в бесконечном цикле.
ну это не ТЗ, это некий абстрактный набросок, я вам накидал таких же абстрактных идей просто напоболтать. Из вышесказанного абсолютно непонятно почему вы решили что читать данные из регистра сдвига будет слишком затратно, а обрабатывать прерывания с 12 ног (считаем что это гипотетически возможно) на загруженном другими задачами в цикле ЦПУ вполне нормально. Сколько оборотов в секунду делает мотор, 1, 100, 10000? Мотор обычный или шаговый, вал может проскакивать? Сколько длится дребезг контактов от датчиков и чем он давится? Тоже программно? Если мотор шаговый то прерывания, вероятно, вообще неверный подход. Если не шаговый, то не оч понятно в чем смысл информации о положении вала - это для управления фазой вращения или частотой? Какова инерция вала? Ну и т.д... и вероятно выяснится что ардуина с бесконечным и непредсказуемым циклом вам в итоге не оч подойдет независимо от того можно на ней на 12 ног отдельные прерывания повесить или нет.
 
  • Лойс +1
Реакции: te238s
6 Янв 2020
122
-4
@poty, всё это правильно и понятно.
Но я не научно-исследовательский институт с многими отделами и бесконечным бюджетным финансированием.
Взялся решать такую задачу не потому, что крут настолько или нет, а потому, что такая задача поставлена, и решать её надо тем или иным образом.
Я в курсе, что для серийного производства лучше разработать свою плату, на которой будет содержимое трёх ардуинских плат, и ещё что-то (в частности, разъёмы нужных конфигурации и количества), и не будет ничего лишнего.
Но это ЕСЛИ такая система потребуется ещё кому-то. К сожалению (не буду о политике) - это непредсказуемо, но вероятнее, что нет.
Поэтому я беру кусочек пластика нужного размера, чтобы влез в нужную коробочку как панель, ставлю на него три платы и все разъёмы, соединяю всё максимально аккуратно и начинаю долбить гранит программы, которая пока тёмный лес, и к тому же на иностранном языке.
Особенно плохо, что за 10 или 20 лет существования процессоров Атмел никто не удосужился нормально перевести их на нормальный язык, и все занимаются кустарщиной в этом плане, кусочками и бессистемно.
Просто посчитай расходы времени на обработку
А вот это как раз и есть главная тайна за семью печатями.
Это в ассемблере ПИКа можно было посчитать команды по тактам, а здесь эти "сретчи" совершенно непонятной длительности, которая непонятным образом зависит еще и от библиотек, и от транслятора (проскальзывали фразы, что в каком-то другом всё в три раза короче).
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
473
134
@avan,
Вы можете установить IDE от микрочип или Atmel Studio, и посмотреть в симуляторе все по тактам.
Ассемблерный листинг можно получить и в Ардуино IDE.
Описание ассемблера на русский врятли кто переводил. По AVR процессорам я на начальном этапе, иногда смотрел книгу А-В-Евстифеев Микроконтроллеры AVR семейств Tiny и Mega.pdf Там старые модели, но принцип часто тот же. Но детали все таки потом надо уточнить в даташите на конкретный процессор.
 
  • Лойс +1
Реакции: avan и te238s
6 Янв 2020
122
-4
Это уже самый серьёзный ответ, кто спорит, что лучше быть богатым и здоровым.
Но исходить придётся из имеющегося.
Дребезг контактов не рассматривается, т.к. нет самих контактов. Датчики будут сначала Холла, если не впишусь (т.е. заставить работать как надо не удастся) - придётся ставить оптический (перекрытие шторкой). Любое прямое действие (в том числе по прерыванию) - это команда на канал, а всяческие действия через сдвиговые регистры умножают эту музыку во времени на количество каналов, поэтому сдвиги туда-сюда я с ходу не рассматриваю.
Мотор - БКД, с редуктором 100:1, на выходе порядка одного оборота в секунду, за оборот один датчик даёт один импульс (прерывание) при прохождении через нулевое положение механизма, другой датчик - порядка 300 (когда всё соберу и подключу осцил, может выясниться, что и 150, и 900) импульсов (прерываний) за оборот, эти импульсы позволяют точно определять скорость и положение вала в любой момент времени.
Механизмов с мотор-редукторами и датчиками - 6, все должны работать согласованно или с нужными (поступаемыми извне) рассогласованиями.
Вал проскакивать не может, это не шаговый (как их можно вообще использовать, или даже производить - одной этой причины достаточно, чтобы про них забыть навсегда), но тем не менее первый датчик на каждом обороте производит сверку - обнуление начального положения.
 

poty

★★★★★★✩
19 Фев 2020
3,230
940
@avan, за счёт наших китайских братьев изготовление платы сейчас - почти копейки. Другое дело - её нужно создать для производства.
Я не очень понимаю, что значит "нормальный язык"? Переводы datasheet есть на русский язык, но любые руководства приходится читать "с кровью", слишком много всяких "штучек", что можно настроить. Описания конкретных фич, включая PCINT, имеются на просторах Интернет в гигантском количестве и на любой вкус.
@Bruzzer уже ответил по поводу подсчёта быстродействия. Количество тактов на ассемлерную команду приведено в datasheet, но если опыта пока мало - воспользуйтесь одним из топиков @Старик Похабыч на этом форуме. Искать с телефона сейчас облом, так что поищите сами, пожалуйста. Экспериментально это делается довольно просто.
 
6 Янв 2020
122
-4
@poty,
понятно, буду искать ещё, но пока что на русском языке ничего внятного не попадалось, кроме бесчисленных сайтов с перечнем ножек у плат и рисунками со слабым разрешением, где не все буквы различимы. И уроков о том, как поморгать светодиодом.
Просто я думал, что кто-то с 2560 работает, и русское руководство у него имеется.