Todas tus preguntas son faciles de responder. xD
yo pregunto ni siquira delayMicroseconds()?
NO, el delay es NO bueno ( dirian los gringos ), nunca un delay es bueno, y menos en una interrupcion
Por que? creo que esto lo hacia con micros FREESCALE hace 5 años.
Simple... Todo depende de la arquitectura. Algunos micros no poseen "prioridades" en las interrupciones. Entonces cuando estan en una interrupcion se desactiva la entrada a cualquier otra interrupcion.
Supongamos que entro a la interrupcion del timer, desactiva las interrupciones, en medio de la interrupcion del timer llego un dato, entonces espera que termine la interrupcion del timer y vuelve activar las interrupciones, cuando se activan, se observa que esta la interrupcion del dato y se ejecuta. Una ves dentro al igual que pasa cuando estuvo el timer, las interrupciones estan desactivadas.
Distinto es si tenes un micro con prioridades, en estos se suele entrar a una interrupcion, y las interrupciones quedan activas. Si ocurre una interrupcion con menor prioridad/la misma solo queda como "pendiente" es decir sigue la interrupcion en curso, si ocurre una de mayor prioridad, entonces salta a la nueva interrupcion, termina esa, vuelve a la anterior, termina esa y ejecuta las demas con prioridades menores. Como una interrupcion dentro de una interrupcion.
Ahora partiendo de esto.. Tenes que comprender el por que no debe durar mucho, es decir, no deberia haber funciones que ocupen demasiado tiempo, LCD, UART, SPI, etc en el que se manden muchos datos y tenga que esperar el micro para poder meter mas en el buffer, tampoco delays, por que si vos haces eso, estas evitando que otras interrupciones se puedan ejecutar.
¿Cómo se usa detachInterrupt()?
Con respecto a attachInterrupt y detachInterrupt para mi es un hook ( es decir un pedazo de codigo) el cual mantiene los punteros a las funciones, esto permite podes cambiar las funciones de las interrupciones sin tener que grabar nuevamente la flash. Es decir dinamicamente
Syntax
detachInterrupt(interrupt)
detachInterrupt(digitalPinToInterrupt(pin));
detachInterrupt(pin) (Arduino Due, Zero only)
De tu ejemplo (codigo 1er pagina):
detachInterrupt(digitalPinToInterrupt(INTERRUPTION0_PIN));