Hardware debounce in pull-down

Ho un piccolo hardware debounce… ma lavora in pull-up.
Quindi tutto il codice deve essere scritto al contrario. Ok funziona ma la cosa mi infastidisce un pelino :slight_smile:
Visto che tanto devo fare ancora un paio di pcb, già che ci sono vorrei rifare anche questo.
Lo schema allegato può funzionare in pull-down? se si come lo sistemo?

Grazie!

Ciao, cercando info su debounce relativamente ad interrupt, son incappato in questo: http://www.jeremyblum.com/2011/03/07/arduino-tutorial-10-interrupts-and-hardware-debouncing/

Sostanzialmente, per realizzare un debounce hardware che rispecchi la logica del pulsante premuto (scusate la semplificazione), devi aggiungere al circuito un invertitore Schmitt. Cmq nel link sopra postato, trovi sia video di spiegazione (fatto molto bene, ho capito pure io), che sch.

Ciao, cercando info su debounce relativamente ad interrupt, son incappato in questo:

Pensiero partorito al momento:

Visto che Daniela deve fare una board, se c'è spazio per http://www.google.it/url?sa=t&rct=j&q=40106&source=web&cd=1&ved=0CCcQFjAA&url=http%3A%2F%2Fwww.nxp.com%2Fdocuments%2Fdata_sheet%2FHEF40106B.pdf&ei=4PMST8SoKuHg4QTD_5nsAw&usg=AFQjCNG_GQ5qS67-sMZkgUxaWskuWKab3Q&cad=rja in unione ad una porta AND si può usare una tastiera senza la necessità di fare continuamente il controllo delle porte (poling).

Il 40106 contiene 6 trigger schmitt invertenti, questi già da soli realizzano un debounce per tasti. La porta AND invece deve essere con X ingressi tanti quanti sono i tasti, le uscite dei trigger entrano nella porta AND così qualuque tasto viene premuto la AND cambia stato. Il cambiamento di stato della AND viene rilevato da un pin del micro abilitando gli interupt PINCHANGED che interrompe l'esecuzione e salta alla routine dove esegui i controlli sulle porte in cui ci sono collegati i pulsanti (in realta ci sono le uscite dei trigger).

Questo però complica un po la gestione che dovrebbe essere bufferizzata nella routine di interrupt PINCHANGED.

Comunque è solo una idea, io utilizzo solo tastiere analogiche ed il debounce lo faccio via software, quindi mai provato.

Lasciando tutta la gestione in poling si realizza il debounce hardware con il 40106 e si evita totalmente di fare quel minimo via software semplificando il codice.

Ciao.

@pitusso Capito, grazie. All'inizio credevo che fosse in pull-up perché avevo sbagliato io a scegliere quello schema, ora mi pare di capire che senza invertitore si può fare solo in pull-up, quindi me lo tengo così :)

@mauro grazie :* però al momento non ho ne invertitore ne 40106 e non ho voglia di comprarli per due pulsantini in croce, quindi considerato che funziona me lo tengo così. Cmq ho dovuto mettere anche un debounce software perché il circuito RC, come mi ha spiegato astro, riduce i saltelli ma non li elimina del tutto. La prova che eventualmente farò (lo so avrei dovuto farla prima) è vedere se basta il solo debounce software senza l'RC, proverò nella breadboard e nel caso andrò con quello così avrò i bottoni in pull-down:)

Anyway, grazie ad entrambi :)

Ma perché non usi il debounce software? A quel punto fai quello che vuoi. Se colleghi i pulsanti agli interrupt te la cavi con un banalissimo delay; ma forse non stai usando un micro...

EDIT: ho letto ora che l'hai già fatta la prova, posso confermarti che è solo una questione di tempi, poi dipende da come puoi gestirli; nel mio sketch sui nanetti, avendo collegato il sensore meccanico rotante (un bordello di impulsi spurii) direttamente su un pin di interrupt, con un delay() ho risolto tutto.

La prova che eventualmente farò (lo so avrei dovuto farla prima) è vedere se basta il solo debounce software senza l'RC

io utilizzo regolarmente il debounce sw con semplice pulsante (chiaramente + resistenza di pull down), ed è sufficiente.

menniti: Ma perché non usi il debounce software? A quel punto fai quello che vuoi. Se colleghi i pulsanti agli interrupt te la cavi con un banalissimo delay; ma forse non stai usando un micro...

La storia è lunga e contorta... se vuoi te la spiego :) Versione breve, sto usando anche un debounce software.

Versione lunga: volevo usare un debounce hardware perché non mi andava di pasticciare con il codice. Ero ingenuamente convinta che mettendo su un circuito RC (che come mi ha spiegato astro non è un vero debounce) avrei risolto tutti i miei problemi. Presa dal pathos del fare i pcb faccio il mio piccolo circuitino RC con i due pulsanti, lo metto su... ma comunque ottengo dei rimbalzi inaccettabili. Avendo un termostato il setting dei gradi andava a botte di 5 gradi alla volta. Quindi mi sono trovata costretta a mettere anche il debounce software per far funzionare tutto. Al momento ho un tastierino con circuito RC ed anche il debounce software nel codice.

L'errore è stato mio che non ho testato prima il circuito RC sulla breadboard, se l'avessi fatto... una volta presa coscienza degli scarsi risultati avrei optato per il solo debounce software. A mia discolpa dico che ho la breadboard piena e fin quando non la libero non posso testare altro :\

Resami conto di ciò, alla fine farò come suggerisce pitusso :)

Non si puó fare un software debouncing sul interrupt. Nel senso un debounce elimerebbe il senso del interrupt perché perdi tempo nel farlo e rischi di perdere delle chiamate interrupt. La soluzione con un RC non funziona sempre perché entrate normali degli integrati a fronte di tensioni che variano lentamente possono avere problemi. Per eliminare questi si usano dei Schmitt-Trigger.

Ci sono integrati apositi per fare il debounce di pulsanti come il: MC14490 http://pdf1.alldatasheet.com/datasheet-pdf/view/11972/ONSEMI/MC14490.html oppure i MAX6816/MAX6817 o MAX6818 http://pdfserv.maxim-ic.com/en/ds/MAX6816-MAX6818.pdf che proteggono anche l' entrata da disturbi derivanti da scariche elettrostatiche umane.

Ciao Uwe

Non si puó fare un software debouncing sul interrupt. Nel senso un debounce elimerebbe il senso del interrupt perché perdi tempo nel farlo e rischi di perdere delle chiamate interrupt.

io sono ancora a fare debouncing software su bottoni 'letti' tramite digitalRead, anche se ho letto in rete vari esempi di debounce sw su interrupt (anche sul forum Arduino).

Non si ottiene nessun miglioramento a passare ad interrupt + debounce sw, rispetto a un digitalRead in loop sempre con debouce sw? :roll_eyes:

Non si ottiene nessun miglioramento a passare ad interrupt + debounce sw, rispetto a un digitalRead in loop sempre con debouce sw? smiley-roll-blue

Detta come l'ho descritta io e menniti vuol dire poco, c'è da vedere come si realizza la cosa, e cosa si vuole ottenere. C'è anche il post di uwe che dice che ci sono degli integrati appositi per connetere i tasti.

Io ho 10 tasti su A0, e faccio uso dell'interupt fine acquisizione e mi trovo bene con la gestione, è un po incasinata ma è flessibile. Non devo mettere codice che viene eseguito sempre, e se mi serve chiamo una funzione che mi ritorna l'ultimo tasto premuto, ma poi devo fare il flush della struttura che mantiene informazioni riguardo al tasto premuto, posso gestire il repeat key che è comodo per entrare ed uscire dall'edit parametri o memorizzare ecc.

Per la gestione su pin digitali c'è da vedere quanti sono i pulsanti, per uno o due fai il pooling, per un numero maggiore comincia a diventare interessante l'uso di uno degli integrati di cui parlava uwe. Io non mi farei tanti problemi nello scegliere, se ti serve una gestione tramite interrupt te ne accorgerai mentre sviluppi il progetto, cioè ti ritroverai con la gestione dei tasti che ti mette il bastone fra le ruote e allora cercherai un'alternativa.

Quella di usare una solo pin su interrupt quando almeno uno dei pulsanti viene premuto ti permette di non occuparti della intercettazione dei tasti, ma leggi da un buffer o da una struttura cosa e stato premuto.

Sai che non riesco a decidere cosa è meglio. :roll_eyes:

Ciao.

uwefed: un debounce elimerebbe il senso dell'interrupt perché perdi tempo nel farlo e rischi di perdere delle chiamate interrupt.

Lesto, l'intervento di Uwe l'ho letto...

sì, era solo un modo per dire che sono d’accordo, essendo il debounce in funzione del tempo (abbastanza lungo), un interrupt (che da valori istantantei) non ha senso, anzi se attivato troppo spesso può sfalsare i timer

Dunque, io al posto di Uwe e di chi altro è d'accordo non sarei così assolutista. Qui si cercano e si trovano soluzioni per risolvere problemi, non si fa solo teoria pura basata su scienza; chiarisco che non voglio contestare ciò che affermate con:

un debounce elimerebbe il senso dell'interrupt perché perdi tempo nel farlo e rischi di perdere delle chiamate interrupt

Ma sui miei nanetti avevo provato a collegare il sensore meccanico ad un normale digital pin e poi a fare il debounce, con pessimi risultati; allora ho fatto ricorso ad un interrupt, ma chiaramente di tutti quei rimbalzi non ne perdevo uno, allora ho fatto ricorso ad un banale debounce PROPRIO per bloccare la lettura degli interrupt per il tempo che non mi serviva. Ora i miei nanetti funzionano a meraviglia, poi certamente ci sono metodi software più corretti, ma io non sono in grado di tirarli fuori, né mi serve cercare una soluzione alternativa se non altro perché sarei costretto a smontare 7 cassonetti per riprogrammarli :fearful: Quindi Voi avete ragione ma io pure ;)

non dico che non si possa fare, ma se usavi il debounce dell'interrupt direttamente sul pulsante..... XD

lesto: non dico che non si possa fare, ma se usavi il debounce dell'interrupt direttamente sul pulsante..... XD

Cioè? Io il mio [pulsante] l'ho collegato ad un pin di interrupt, che vuoi dire?

il problema non è collegarlo ad un pin interrupt, ma gestire il debounce tramite interrupt

lesto: il problema non è collegarlo ad un pin interrupt, ma gestire il debounce tramite interrupt

Vai troppo oltre le mie scarne conoscenze, mi incuriosisci ma se mi dai notizie al contagocce ovviamente non arrivo da nessuna parte; avresti una specie di esempio da prvare direttamente con un pulsante? tnx

menniti:

lesto: il problema non è collegarlo ad un pin interrupt, ma gestire il debounce tramite interrupt

Vai troppo oltre le mie scarne conoscenze, mi incuriosisci ma se mi dai notizie al contagocce ovviamente non arrivo da nessuna parte; avresti una specie di esempio da prvare direttamente con un pulsante? tnx

Parlando per l' utente medio che non si interessa delle problematiche interne del ATmega rimango sul: non ha senso fare un debuce via SW su un interrupt .

Le cose stanno diversamente se lo fa qualcuno che é consapevole cosa fa e che é sicuro che se una chiamata di interrupt dura 10mSec non da nessun problema al resto del programma.

Ciao Uwe

Sì, è chiaro, ma esistono quelle vie di mezzo in cui la problematica che dici non serve perché è sufficiente che l'interrupt funzioni una volta al secondo. Come detto io non devo leggere 2000 eventi al secondo ma 1, quindi usare un delay(200) per me significa stare ad 1/5 del mio limite massimo; se avessi usato un IN digitale il debounce classico mi avrebbe perso eventi che invece ora non perdo più, cioè, ripeto, il problema l'ho risolto. Questo non significa che non sono interessato a imparare le soluzioni nuove, ma lesto parla per te e non per me, quindi tra voi "godete" ed uno come me non fa mai un passo avanti.