Salve a tutti, ho bisogno del vostro aiuto.
Ho necessità di utilizzare l'interrupts di arduino Nano con un pulsante collegato all'ingresso int0 di arduino (pin2)
Nella routine di interrupt, disattivo gli interrupt, eseguo il mio codice, e poi riattivo l'interrupt, il problema è che la routine viene eseguita in pochi millisecondi, con la conseguenza che quando è conclusa il pulsante è ancora premuto, e quindi l'interrupt scatta nuovamente.
In pratica tale routine viene eseguita più volte
Vorrei mettere un delay in modo da far passare qualche secondo, dare il tempo a chi preme il pulsante di rilasciare il pulsante, ma all'interno dell'interrupt i delay non funzionano.
Il fatto che sia ancora premuto NON c'entra nulla, se l'interrupt è programmato sul fronte di discesa (FALLING), scatta solo al passaggio da HIGH a LOW ... poi può rimanere LOW quanto vuole e non scatta più.
Sono convinto che quello che ti sta accadendo è un 'altra cosa ... tu probabilmente NON stai facendo nessun "debouncing" e quindi, alla pressione del bottone, hai un'infinità di HIGH - LOW - HIGH - LOW ...
Un pulsante "reale" NON si comporta come un pulsante "ideale" ... un pulsante "reale", quando o premi, ha questo comportamento:
... e quindi il tuo interrupt scatta un'infinità di volte.
Guglielmo
P.S: NON devi essere TU a disattivare e riattivare l'interrupt ... lo fa già da sola la MCU! Quando entra in una ISR disattiva gli interrupt ed all'uscita li riattiva.
Intanto grazie per la risposta,
L'interrupt è programmato su rising, in quanto il pulsante quando premuto porta a +5V il pin, quindi non catturo un fronte di discesa, ma attivo l'interrupt quando int0 va a 5V
Il discorso comunque non cambia, perchè come hai giustamente detto, il pulsante quando premuto, ha la brutta abitudine di generare quella sequenza in on-off prima di stabilizzarsi completamente su on, quindi anche catturando il fronte di discesa avrei comunque lo stesso problema.
Quando utilizzavo i pic, ho sempre utilizzato un timer impostato a 50ms per risolvere il problema, cioè eseguo le mie istruzioni, poi attendo un 50ms per far stabilizzare il pulsante, e a quel punto sono pronto per riattivare l'interrupt.
A questo punto però non ho ancora capito come procedere,oltre ad un antirimbalzo hardware, esiste una un altra soluzione?
La cosa strana è che l'Atmega328, processore utilizzato sulla scheda arduino, è in grado di gestire i timer anche dentro la isr, e in esempi trovati in rete di interrupt con arduino, viene prorpio utilizzata la funzione delay(10) come antirimblazo per il pulsante.
Il fatto che devo aggiungere resistenze e condensatori sui pulsanti collegati ad un processore, che potrebbe tranquillamente filtrare il tutto con una riga di codice, mi lascia molto perplesso.
Be', intanto, volendo avere risposte rapide (che credo sia quello che ti serve, altrimenti non avrebbe senso usare l'interrupt), aggiungerci dei delay, che sono "bloccanti", non e' proprio il massimo ... dovresti gestire il debounce software con millis, il che non ti consente di usare una sola riga di codice ... in piu, prova a pensare di doverlo fare con parecchi ingressi tutti indipendenti, e ti rendi conto che qualche resistenza e qualche condensatore eliminano parecchie righe di programma e un buon numero di possibili mal di testa da sketch malfunzionanti
Inoltre, non ti sei mai chiesto, se e' vero che il debounce software e' cosi "comodo" come dici, per quale motivo il 100% delle apparecchiature industriali e civili di buona qualita' che hanno ingressi con interruttori, microswitch e pulsanti, usano solamente debounce hardware ? ... in qualche cinesata economica a volte ci trovi quelli software, ma se appena appena vuoi un'apparecchio progettato correttamente e sicuramente funzionante, se ci sono contatti meccanici, ci sono sempre debounce e filtri hardware (unica eccezione gli oggetti che usano pulsanti fatti di gomma conduttiva, che non generano rimbalzi, e quindi dove il debounce proprio non serve)
GianlucaB:
...e in esempi trovati in rete di interrupt con arduino, viene prorpio utilizzata la funzione delay(10) come antirimblazo per il pulsante.
La "qualità" degli esempi trovabili in rete è notoria ...
... il 90% sono un emerita schifezza, scritti da incompetenti, che meglio non hanno da fare che scrivere idiozie su internet.
Naturalmente poi facendo cose NON come si deve, si riesce a fare tutto ... ma i casini che si rischia di creare spesso sono direttamente proporzionali.