Interrupt routine eseguita 2 volte

Ciao Ragazzi,
sto eseguendo questo codice su un arduino uno:

boolean intCalled = false;

void setup(){

        attachInterrupt(1,IntHandling,RISING);

	Serial.begin(115200);
	delay(100);
	Serial.println("DevDuino Start");
	delay(1000);
}

void IntHandling(){
    intCalled = true;
}

void loop(){

	if(intCalled)
		{
                        intCalled = false;
  			Serial.println("Interrupt Call");
			while (digitalRead(3)==HIGH);
			Serial.println("Button Released");
		}
		
}

Con questo codice uso un pulsante con resistenza di Pull Down, quindi il pin 3 di Arduino è mantenuto a massa da una resistenza da 10K, e quando premo il pulsante il pin 3 va a VCC.

Mi succede che il codice nel loop dentro all'if, viene eseguito 2 volte a ogni pressione del pulsante, e non riesco a capire il perchè.

Grazie mille per l'eventuale aiuto.

Marco

Probabilmente è la mancanza del debounce, quindi la pressione del pulsante provoca qualche rimbalzo che viene interpretato come un'ulteriore pressione del tasto, quindi inserisci un controllo del debounce e risolvi, a mio parere.
Mi sembra un po' strana, ma è mia ignoranza, la posizione della void tra setup e loop, in genere le vedo in fondo, dopo il loop, o prima del setup.

La sequenza delle funzioni non ha importanza.

Il senso di mettere le funzioni in un certo ordine é unicamente per facilitare la comprensione quando si legge lo sketch.

Ciao Uwe

Mi sembra un po' strana, ma è mia ignoranza, la posizione della void tra setup e loop, in genere le vedo in fondo, dopo il loop, o prima del setup.

Il preprocessore di Arduino IDE quando mette tutto dentro un file, in testa a questo ci mette i prototipi delle funzioni che trova in tutti i file .ino. Quindi con Arduino la posizione delle funzioni non è fondamentale e come dice uwe è solo una questione di ordine.

In C/C++ se non metti i prototipi la posizione delle funzioni può compromettere o meno la compilazione.

OK, ho specificato che sono ignorante, ma ora aiutiamo il nostro amico. Siete d'accordo sul fatto che il problema sia la mancanza del debounce?

Al 1000%. Non si dovrebbe mai mettere un interrupt agganciato ad un pulsante.
Se proprio deve, che metta un contatore all'interno della ISR in modo che se non legge almeno una decina di pressioni entro un certo lasso di tempo, non esegua il codice della ISR.

Resistenza da 100 ohm e condensatore da 100n, e risolvi il problema dei rimbalzi alla radice :stuck_out_tongue: :smiley:

Etem esistono anche gli ic antirimbalzo :grin: ma si risolve con due righe di firmware

Michele: lo so, ma io sono "vecchio" ... e poi l'antirimbalzo hardware libera spazio per il codice (anche se poco) e non si blocca ne si brucia (piu facile che si bruci un chip antirimbalzo che un condensatorino ;))

Ciao Etemenanki,
come li colleghi? io ho il piedino con una resistenza di PullDown da 10K, e quando premo il pulsante, il pin3 viene portato a VCC.

Grazie