Tanto per curiosità ho un progetto aperto su wokwi e ho potuto copiare il tuo codice con la ISR e prologo ed epilogo sono pesanti per la cpu. Vedi push all'inizio per salvare SREG e poi pop alla fine, push spinge i dati nello stack e pop li tira su, in modo che alla fine della ISR i registri r0÷r31 abbiano lo stesso valore che avevano prima che venisse eseguita la ISR.
ISR(TIMER1_OVF_vect) {
78c: 1f 92 push r1
78e: 0f 92 push r0
790: 0f b6 in r0, 0x3f ; 63
792: 0f 92 push r0
794: 11 24 eor r1, r1
796: 2f 93 push r18
798: 3f 93 push r19
79a: 4f 93 push r20
79c: 5f 93 push r21
79e: 6f 93 push r22
7a0: 7f 93 push r23
7a2: 8f 93 push r24
7a4: 9f 93 push r25
7a6: af 93 push r26
7a8: bf 93 push r27
7aa: cf 93 push r28
7ac: df 93 push r29
7ae: ef 93 push r30
7b0: ff 93 push r31
TCNT1 = 0xFF60; //Imposto circa 10 uS
7b2: 80 e6 ldi r24, 0x60 ; 96
7b4: 9f ef ldi r25, 0xFF ; 255
7b6: 90 93 85 00 sts 0x0085, r25 ; 0x800085 <__DATA_REGION_ORIGIN__+0x25>
7ba: 80 93 84 00 sts 0x0084, r24 ; 0x800084 <__DATA_REGION_ORIGIN__+0x24>
if ((count_1 - t_1) > knob_1) {
7be: c0 91 72 02 lds r28, 0x0272 ; 0x800272 <count_1>
7c2: d0 91 73 02 lds r29, 0x0273 ; 0x800273 <count_1+0x1>
7c6: 80 91 70 02 lds r24, 0x0270 ; 0x800270 <__data_end>
7ca: 90 91 71 02 lds r25, 0x0271 ; 0x800271 <__data_end+0x1>
7ce: 9e 01 movw r18, r28
7d0: 28 1b sub r18, r24
7d2: 39 0b sbc r19, r25
7d4: 80 91 36 03 lds r24, 0x0336 ; 0x800336 <knob_1>
7d8: 90 91 37 03 lds r25, 0x0337 ; 0x800337 <knob_1+0x1>
7dc: 82 17 cp r24, r18
7de: 93 07 cpc r25, r19
7e0: 60 f4 brcc .+24 ; 0x7fa <__vector_13+0x6e>
digitalWrite(13, HIGH);
7e2: 61 e0 ldi r22, 0x01 ; 1
7e4: 8d e0 ldi r24, 0x0D ; 13
7e6: 0e 94 de 00 call 0x1bc ; 0x1bc <digitalWrite>
digitalWrite(13, LOW); //Impulso da 3uS
7ea: 60 e0 ldi r22, 0x00 ; 0
7ec: 8d e0 ldi r24, 0x0D ; 13
7ee: 0e 94 de 00 call 0x1bc ; 0x1bc <digitalWrite>
t_1 = count_1; //Ricarico il Timer
7f2: d0 93 71 02 sts 0x0271, r29 ; 0x800271 <__data_end+0x1>
7f6: c0 93 70 02 sts 0x0270, r28 ; 0x800270 <__data_end>
}
count_1++;
7fa: 21 96 adiw r28, 0x01 ; 1
7fc: d0 93 73 02 sts 0x0273, r29 ; 0x800273 <count_1+0x1>
800: c0 93 72 02 sts 0x0272, r28 ; 0x800272 <count_1>
}
804: ff 91 pop r31
806: ef 91 pop r30
808: df 91 pop r29
80a: cf 91 pop r28
80c: bf 91 pop r27
80e: af 91 pop r26
810: 9f 91 pop r25
812: 8f 91 pop r24
814: 7f 91 pop r23
816: 6f 91 pop r22
818: 5f 91 pop r21
81a: 4f 91 pop r20
81c: 3f 91 pop r19
81e: 2f 91 pop r18
820: 0f 90 pop r0
822: 0f be out 0x3f, r0 ; 63
824: 0f 90 pop r0
826: 1f 90 pop r1
828: 18 95 reti
Non considerando il peso di due digitalWrite(), solo prologo ed epilogo cosumano 32 x 2 clock = 64 x 2 = 128 clock 62.5 x 128 = 8000ns (8us).
Sempre se non sbaglio i calcoli, che però mi sembrano confermati dalla simulazione che consuma tanti cicli e segna 8%, contro soliti 28% con il mio vecchio PC 4 core. Segno che non fa a tempo ad eseguire la ISR che al termine deve rientrarci.
Nel manuale del 328 in fondo trovi il set di istruzioni mnemoniche e il loro consumo di clock.
Prego, sempre interessante parlare di queste cose con qualcuno che le capisce.
PS: (iw9ayt mio papà deceduto nel 95). Fu uno dei fondatori di una associazione radio amatori riconosciuta dalla protezione civile. Facevamo simulazioni di catastrofe, dove grazie a postazioni radio fisse e mobili aggiravamo la montagne, permettendo all'informazione di viaggiare rapidamente.
Ciao.