Вам ничего не говорит слово "аппаратных"?имеется 6 входов аппаратных прерываний.
А нужно хотя бы 12.
Можно успеть проверить на изменение вверх или вниз, а так же выставить нужный флаг.что-то осмысленное в них сделать вряд ли можно успеть
если я правильно понял, если, например, я сконфигурирую D22...D28 как входы, то во время исполнения основной программы любой пришедший на эти входы импульс будет вызывать прерывание? Ой ли?+ любой вход может генерировать прерывания "по изменению"
открою страшную тайну - это не вся ракета-носитель в целом, а всего лишь 6 моторчиков, управляющих поворотами её двигателей.Если это не ракета-носитель,то 12 аппаратных прерываний сложно оправдать. Да и там,уверен,столько прерываний нет.
Автор, откройте тайну, зачем?
Может, оно и так, но злые ардуино-разработчики платы Arduino_Mega_2560 вывели на входы платы только 6...@avan, В 2560 восемь входов аппаратных прерываний (INT0-INT7)
Это интересно. Можно ли подробнее, какие прерывания - аппаратные? какие три группы пинов? Как на них повесить простые входы?На сколько понял, в меге примерно как и в стм32, на группу пинов работает только одно прерывание. Есть три группы пинов на которые можно включить прерывание, итого можно считывать до 24 пинов по трем прерываниям.
Ищите описание работы не "ардуинских плат", а самого микроконтроллера.описания работы ардуинских плат
Не надо себе льстить )Как всегда, я оказался единственным человеком в стране, кому это нужно.
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;
}
}
имелось ввиду, что за 10 лет так никому и не потребовалось описание на человеческом языке платы,Не надо себе льстить )
ну без детального ТЗ тут можно только фантазировать, но я бы поспорил. Напр если вам нужно обрабатывать ситуацию "залипания" концевиков, или остановки вала в 0й точке, то одними прерываниями тут не обойтись и вам все равно придется периодически опрашивать входы. Тоже самое касается дребезга. Опрос не такой уж и затратный процесс если не загонять его в бесконечный цикл. Схемотехничсеки можно скомбинировать, все датчики через ИЛИ подаются на 1 пин с прерыванием, по прерыванию читаем данные из регистра и обрабатываем. Можно опрашивать на какой-нибудь отдельной атини и слать данные в основной контроллер через сериал/и2ц. Можно входы завести на шифратор 16в4 и обрабатывать 4 ноги если не допускать ситуации когда 2 датчика сработают одновременно (правда с прерываниями тогда тоже еще вопрос что делать в такой ситуации). Много чего еще придумать можно )схемно-то оно, может, и проще, но по времени обработки всё умножается в разы.
ну это не ТЗ, это некий абстрактный набросок, я вам накидал таких же абстрактных идей просто напоболтать. Из вышесказанного абсолютно непонятно почему вы решили что читать данные из регистра сдвига будет слишком затратно, а обрабатывать прерывания с 12 ног (считаем что это гипотетически возможно) на загруженном другими задачами в цикле ЦПУ вполне нормально. Сколько оборотов в секунду делает мотор, 1, 100, 10000? Мотор обычный или шаговый, вал может проскакивать? Сколько длится дребезг контактов от датчиков и чем он давится? Тоже программно? Если мотор шаговый то прерывания, вероятно, вообще неверный подход. Если не шаговый, то не оч понятно в чем смысл информации о положении вала - это для управления фазой вращения или частотой? Какова инерция вала? Ну и т.д... и вероятно выяснится что ардуина с бесконечным и непредсказуемым циклом вам в итоге не оч подойдет независимо от того можно на ней на 12 ног отдельные прерывания повесить или нет.в отношении ТЗ - смотрите моё сообщение №9.
КОНЕЧНО, всё происходит в бесконечном цикле.
А вот это как раз и есть главная тайна за семью печатями.Просто посчитай расходы времени на обработку
Это уже самый серьёзный ответ, кто спорит, что лучше быть богатым и здоровым.ну это не ТЗ