Go Down

Topic: problema con pulseIn (Read 834 times) previous topic - next topic

?R

sto usando la funzione pulseIn per vedere la durata degli impulsi a livello alto di un'onda quadra a duty cycle variabile, il mio problema è che se il duty cycle è al 100% la funzione conta all'infinito e non si ferma più rallentandomi tutto il resto del programma, c'è un modo per dire che dopo un tot la funzione pulseIn è iniziata finisca senza aspettare la fine dell'impulso??
(la funzione pulseIn potrei usarla anche sui ATtiny84 o no??)
grazie :)
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

leo72

Puoi usare un timeout:

http://www.arduino.cc/en/Reference/PulseIn

Dovresti poterla usare anche con i Tiny tramite il core Tiny, vedi a proposito la mia guida su come usare i Tiny85: va bene anche per i Tiny84. Dico "dovresti" perché personalmente non l'ho usata.

?R

eh appunto... è questo che non capisco, perchè dice:
"timeout (optional): the number of microseconds to wait for the pulse to start; default is one second (unsigned long)"
cioè che aspetta per partire giusto? ma dopo che è partito come posso fermarlo?

si la tua guida me l'avevi già linkata :) ma mi era rimasto il dubbio per il pulseIn con i tiny e visto che devo ancora comprarli volevo essere sicuro prima...
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

leo72

Non posso darti conferme al 100%, non ho mai usato la funzione.

Cmq leggo anche:
Returns
the length of the pulse (in microseconds) or 0 if no pulse started before the timeout (unsigned long)

Quindi se entro un tot di tempo non arriva nulla, la funzione esce per conto suo. Inoltre il max segnale che può misurare è 3 minuti, per cui anche se hai una tale frequenza, più di 3 minuti non duri. Per uscire prima dovresti modificare la funzione.

?R

si è che avrei bisogno di perdere il meno tempo possibile visto che che ho 8 segnali così da leggere e poi dovrei confrontarli tutti insieme...
comunque il segnale è a 1,2 kHz quindi potrei anche accontentarmi...
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

uwefed

Il Tuo segnal da 1,2kHz ha un periodo di 0,833 mSec.
usa durata = pulseIn(pin, HIGH, 1000);
Aspetta 1 milli-secondo e poi se non arriva nel fratempo un impulso restituisce un 0.
Ciao Uwe

?R

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

?R

si confermo che mettendo il timeout funziona bene :)
grazie!
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

?R

scusate ma c'è un modo per fare ciò che fa la funzione pulseIn ma senza bloccare il codice? cioè magari utilizzando millis() e vedere quando l'impulso inizia e quando finisce, ma ho paura che così facendo rischio di perdere in precisione... avete qualcosa da consigliarmi? qualche esempio?
grazie a tutti in anticipo! ;)
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

leo72

Se i tempi che devi misurare non sono troppo rapidi potresti provare un approccio "tutto codice".
Una cosa semplice:
1) leggo il pin
2) è cambiato lo stato?
3) No: vai al punto 1)
4) Sì: conteggio della durata
5) E' terminato l'impulso?
6) No: vai al punto 4)
7) Sì: stampo la durata e torno al punto 1)

?R

eh si dovrei fare così, è che ho 5 sensori su cui fare questo lavoro e in mezzo a questo codice volevo che l'arduino facesse dell'altro tipo leggere degli altri sensori, sperando di non arrivare "tardi" sul cambio di stato dell'impulso... usando degli interrupt potrei risolvere questo problema secondo voi?
grazie ;)
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

leo72

Sì ma a questo punto ti servono i PCINT, cioè gli interrupt sul cambio di stato di un pin, non puoi farlo con gli INT, perché sono solo 2.
http://www.arduino.cc/playground/Main/PcInt

?R

avevo postato proprio la settimana scorsa una domanda sugli interrupt :) non li ho mai provati fino ad adesso...
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

leo72

Vedili come programmi che girano in background, eseguendo i compiti a loro assegnati senza apparentemente interrompere il flusso del codice principale.
In realtà lo interrompono eccome, difatti si suggerisce sempre di inserire nella routine di gestione dell'interrupt un codice che blocchi il meno possibile il micro, però lo fanno in automatico per cui il tuo sketch ha la convinzione di avere la CPU a sua completa ed esclusiva disposizione.

?R

si si ho capito come funzionano grazie, devo capire un po' il codice per gestirli, tipo sto guardando la pagina del playground che mi hai linkato ma non capisco la parte iniziale non capisco cos'è  :~ sembra il codice che di solito si vede nelle librerie, io non sono ancora a quel livello da capirne il significato  :smiley-red:
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

Go Up