Быстродействие Ардуино

Добрых времен всем!
Имеется скейч(с)

собственно он
uint16_t var = 0x136;
uint16_t var_s[3] = { 0x185, 0x185, 0x185 };
int cnt = 0;
bool bb = false;
uint8_t counter = 0;
bool isr_dir = false;
uint8_t arr_cnt = 0;
uint8_t d_cnt = 0;
uint16_t arr[5] {0};
bool in_clck = false;
bool in_dta = false;
bool mode_BT = false;
uint8_t isr_cnt = 0;
//_reply_ reply_(var, 6, 6);
void listen();
void repeat();
///------------------------------------>>>

void gener() {
  PORTH &= ~(1 << 6);
  if (var & 0x200) PORTH |= (1 << 6);
  TCCR5B = 0b00001010;
  TCCR5A = 0b00000000;
  TIMSK5 = 0b00000010;
  OCR5AL = 24;
}
ISR(TIMER5_COMPA_vect) {
  ///выводим var на выв 15 (11 ардуино)
  // if (var & (0x200 >> isr_cnt))  PORTB |= (1 << 5);
  // else PORTB &= ~(1 << 5);
  PORTB ^= (1 << 6);
  // ++isr_cnt;
  // //генерируем тактовый импульс на выв 16 (12 ардуино)
  // (!isr_dir) ? PORTB |= (1 << 6) : PORTB &= ~(1 << 6);
  // isr_dir = !isr_dir;
  // if (isr_cnt >= 10)isr_cnt = 0;
}
void reply(bool start);

/*ISR(PCINT0_vect, ISR_BLOCK) {
  // if (PINB&(1<<5))
  if ( PINB & (1 << 6)) // читаем 12 ногу
  { PORTH|=(1<<5); }//Нога 8(ард.) в 1
   else { PORTH&=~(1<<5); }//Нога 8(ард.) в 0
}
*/
ISR(PCINT0_vect, ISR_BLOCK) {
  // if (PINB&(1<<5))
  PORTH^=(1<<5);//Нога 8инверсия
}

void setup() {
  Serial.begin(115200);
  String file = String(__FILE__);
  String str = file.substring((file.lastIndexOf(92) + 1));
  Serial.println(str);

  PCICR |= (1 << 0);
  PCMSK0 |= (1 << 6);
  PCMSK0 |= 0b01000000;
  //PCINT прервыания-----------------
  DDRB |= (1 << 6);
  PORTB &= ~(1 << 6);
  //Нога 11  как выход
  DDRB |= (1 << 5);
  PORTB &= ~(1 << 5);
  
  DDRH |= (1 << 5);//Нога 8 на вывод
  //PORTH |= (1 << 6);

  DDRH &= ~(1 << 6);
  PORTH |= (1 << 6);
  DDRH |= (1 << 6);
  //нога 17(D8-ardino) на вывод-->>>>
  DDRH |= (1 << 5);
  PORTH |= (1 << 5);
  PORTH &= ~(1 << 5);
}


void loop() {
  if (!bb) {
    gener();
    //reply_.reply(true);

    bb = true;
  }
  
}

(извините много мусора)он попрерыванию совпадения регистра А счетчика 5 (на меге 2560), дергает ногу 12 (строка 28), к этой же ноге привязано прерывание pcint, которое дергает соответсвенно ногу 8 (строка 48).
На логик аналайзер имеем такую картину:

Эпюры на логик аналайзер

Видим задержку между фронтов импульсов 3,2 мксек, как мне кажется очень большая. Есть ли возможность уменьшить задержку?

Надо использовать запись 1 в нужный бит PIN… так называемый режим toggle…
И вход-выход в прерывание это не быстро … но и не 56 тактов …

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

На эпюрах видно что фронт на выводе 8 отстает от фронта на выводе 12 на 3,2 мксек, т.е. обработка прерывания занимает 3 мксек, хочется ее уменьшить да вот как не знаю

Если правильно настроить таймер, то он сам будет переключать состояние выходов по совпадению …
без прерываний !

Если в прерывании только дернуть бит, то прочитайте про ISR_NAKED, можно уменьшить (наверное) до 1 мксек. Но чтобы задержка была гарантированна, все остальные прерывания должны быть запрещены. Или уверенность, что импульс не придет во время обработки другого прерывания.
Если надо просто дернуть ногой в ответ на импульс, то можно настроить таймер на внешние тактирование, и тогда можно настроить, чтобы он он аппаратно дергал ногу, а потом программно обрабатывать доп условия.
Если есть запас микросхем - тригеров, то может проще сделать на внешнем мригере.

А еще лучше опишите глобальную задачу и может кто то подскажет как сделать ОПТИМАЛЬНО …

Ну в общем глобальная задача была устроить задержки на несколько микросекунд с помощью таймера типа загрузка числа в регистр сравнения, по совпадению -прерывание и выполнение кода, меньше 8 микросекунд не получалось, давай копать - если обработка прерываний занимает 4-3 мксек дело-швак, дергать ногой по таймеру не выход-нужно выполнять другие инструкции. А скейч (с) написал ради эксперимента проверить задержки

Вы не правильно используете таймер для точных интервалов !

Если расскажете как правильно буду благодарен

Пиши без прерываний, блокируй проц в while(!(PORT & PIN)). Будет гораздо быстрее.

Если не трудно, то пож. подробнее и с примерами

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

rkit

Зацикливать в ожидании ТС не хочет

Тогда уж проще в первом прерывании задержку “nop”-ами сделать, или пустым циклом,. а pcint тогда и не нужно.

Я не умею “…найди то - не знаю что…” обдумывать несуществующую идею !
Конкретизируйте вопрос … Даже на новом форуме уже были решения вопросов с импульсами силами только таймеров - то есть происходит настройка таймера(ов) и он(и) уже сам(и) работает без отвлечения МК от других задач …

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

У вас таймер в CTC режиме может сам переключать выводы OCnA,OCnB:

“…For generating a waveform output in CTC mode, the OCnA output can be set to toggle its logical level on each
compare match by setting the Compare Output mode bits to toggle mode (COMnA1:0 = 1). The OCnA value will
not be visible on the port pin unless the data direction for the pin is set to output (DDR_OCnA = 1)…”

То есть от одного прерывания можно отказаться совсем, но выводы придётся поменять !

Я вчера ещё тему видел. ТС - коллега, что его гонять?
Алексей, напиши, что именно должно произойти при изменении сигнального пина, того что ты прераванием слушаешь.
Я тебе точно скажу, какие задержки реакций получатся на 16 МГц AVR

В общем я предполагал ( возможно наивно), что задержки при обработке прерываний приблизительно одинаковые что PCINT, что по совпадению таймера, поэтому этот скейч(с) и написал что бы оценить задержку в общем дрыгание ногой это не самоцель, а сигнал на анализатор что бы видеть реакцию. Переформулируя общий вопрос темы: Это я где-то накоячил с прерываниями или это ограничение самой системы ?