Laptimer Regolarità

Buongiorno a tutti,
faccio una breve introduzione al progetto che voglio realizzare, si tratta di una sorta di laptimer ma per gare di regolarità, dunque con l'utilizzo di pressostati (non sono altro che un interruttore NA che viene chiuso al passaggio della ruota sul tubo). Detto questo volevo chiedere come posso ritardare il segnale dello switch in maniera tale che non rilevi un doppio passaggio (perchè sul pressostato và rilevato il solo tempo delle ruote anteriori. Mi sarebbe piaciuto realizzare un menù come quello del numero di tempi intermedi con i secondi di ritardo, ma avendo usato un interrupt per la funzione che và a individuare la chiusura del contatto non saprei come far ignorare per un tempo t (definito nel menù) i successivi interrupt.
Allego il codice che agisce sul pin 2.

Grazie a tutti per l'aiuto
Lorenzo

Scusa ma:

  1. non hai ancora fatto la tua presentazione nel l'apposito topic come prevede il regolamento
  2. hai postato questa stessa richiesta in 2 forum (l'hai messa sia in Hardware sia in Software), ed il cross-posting è vietato dal regolamento.

Quando avrai risolto queste cose, allora si potrà iniziare a parlare.

>lorenzing: come ti è già stato segnalato, in conformità al REGOLAMENTO, punto 13, il cross-posting è proibito (anche tra lingue diverse) per cui, il tuo thread duplicato è stato cancellato.

Ti prego, per il futuro, di evitare di aprire più thread sullo stesso argomento in sezioni differenti del forum. Grazie.

Guglielmo

P.S.: ... ti consiglio un'attenta lettura di tutto il regolamento, così evitiamo qualsiasi problema. :slight_smile:

docdoc:
Scusa ma:

  1. non hai ancora fatto la tua presentazione nel l'apposito topic come prevede il regolamento
  2. hai postato questa stessa richiesta in 2 forum (l'hai messa sia in Hardware sia in Software), ed il cross-posting è vietato dal regolamento.

Quando avrai risolto queste cose, allora si potrà iniziare a parlare.

Chiedo scusa, ho provveduto subito alla presentazione, il post nella sezione hardware l'ho modificato, se non si può chiederei cortesemente di eliminarlo che non riesco.

Grazie mille

quando scatta un'interrupt, puoi vedere se è la prima o se è trascorso un tempo t dalla precedente.
Se è trascorso rilevi i tempi se non è trascorso esci senza fare nulla.

oppure fai la detachInterrupt finchè non passa il tempo e poi la riattivi.
Io, personalmente se possibile, eviterei il taca staca, ma è una opzione, ricorda che le ISR devono sempre essere minimal, cioè fare il minimo indispensabile per terminare il prima possibile.

Esatto eviterei di appesantire troppo la funzione RUN e pensavo di lavorare sulla chrono. Dove potrei contare il tempo tra un attivazione e l'altra e se la differenza non è superiore a Ndelay (che dovrò trasformare in float da intero) non vado a stampare a video e nella Eeprom il nuovo valore e passo al successivo. Così non sono sicuro funzioni ma posso provarci.

Contrario
la chrono è la ISR, cioè è la funzione chiamata dalla interrupt, giusto?
Quindi devi fargli fare 4 cose in croce.
Ti salvi solo le informazioni che rileva in un buffer (così magari riesci anche ad accodare più chiamate senza perdere nulla) e poi, fuori dalla chrono, con calma, le analizzi e le gestisci come meglio credi.
Dentro, al limite, accodi solo quelle sufficientemente distanti e scarti quelle troppo ravvicinate.
Ma tutte le operazioni potenzialmente lente, es.
EEPROM.write...
lcd.print...
sarebbe meglio farle fuori dalla ISR.

maubarzi:
...
Ma tutte le operazioni potenzialmente lente, es.
EEPROM.write...
lcd.print...
sarebbe meglio farle fuori dalla ISR.

NON sarebbe, è obbligatorio farle fuori da una ISR !!!

Le ISR devono essere le più veloci possibili, NON devono chiamare cose che usano altre ISR (es. la seriale, millis(), ecc. ecc.), né dovrebbero chiamare cose la cui esecuzione è intrisecamente lenta (EEPROM, ecc.).

La cosa migliore nelle ISR è, ove occorre, gestire contatori, alzare flag e cose di questa velocità, demandando poi il tutto fuori dalla ISR (alzo una flag che controllo nel loop() e li faccio quello che serve).

Guglielmo

C'è la possibilità che passino 2 veicoli contemporaneamente?

Se no usi il flag come ha detto Guglielmo e quando rilevi il cambiamento del flag, aspetti un po' e poi rimetti il flag a zero.