Interrupt si blocca

Salve a tutto il forum. E' la prima volta che scrivo anche se seguo da un po.
Non non riesco a uscire da questo loop. =(
Se eseguo questo codice l'interrupt non funziona più(almeno mi sembra così);dove sto sbagliando?
Ringrazio fin d'ora l'anima buona che vorrà aiutarmi

....
void setup()   {
//......
    //.....
attachInterrupt(0, interr_0, RISING );
   }

void interr_0() { 
   leggi=!leggi;
    //...
   //...
   leggi_evento();    }

void leggi_evento(){  
   while(leggi ==true){   //fai qualcosa     }
 }
....

Perchè la while dentro a leggi_evento ? Devi usare un semplice if
In quel while scrivi dopo // fai qualcosa.
Non è che dentro quel pezzo di codice se "leggi" diventa false allora il ciclo si interrompe.
Il ciclo si interrompe solo se tutto il codice del while finisce e ritornando al test ora "leggi" è false. Se dentro a quel codice c'e' un bel delay() si blocca per un bel pò.

Non metti il resto del codice, ma io la vedrei meglio sfruttando il fatto che la loop() è un ciclo infinito continuo, così:

....
void setup()   
{  //.....
  attachInterrupt(0, interr_0, RISING );
}

void loop()
{ if(leggi ==true)
  { leggi_evento(); 
  }
}

void interr_0() 
{  leggi = ! leggi;
}

void leggi_evento(){  
    //fai qualcosa    
 }

Comunque se dentro a leggi_evento() hai un bel pò di codice, anche bloccante con delay(), quel codice non si interrompe immediatamente se "leggi" diventa false

OK .
quello che non mi è chiaro è, se sono dentro leggi_evento:
interrupt_0() non viene più eseguito
millis() è bloccato
Arduino non è bloccato perché rpm1 viene incrementato, e se alzo pin_evento, esce dal wile

 void leggi_evento(){  
                  while(leggi ==true){
                    lcd.setCursor(0, 1); lcd.print(millis()); lcd.print(" ");lcd.print(rpm1++);
                    if (millis()-timeout >5000)break;                  
                    if (analogRead(pin_evento)>512){my_flash_2(); 
                        break; }}}

leggi è dichiarata volatile?

ho provato a dichiarala volatile e non.
.. e il comportamento è lo stesso

Se il ciclo è interno alla chiamata è normale che sembri che non funzioni.
La chiamata successiva viene messa in coda dal processore ed eseguita solo quando termina la precedente.
E' per questo che il codice dentro un interrupt deve essere il più piccolo e veloce possibile.
Segui l'esempio di Nid.

Grazie