Pages: [1] 2   Go Down
Author Topic: problema con pulseIn  (Read 759 times)
0 Members and 1 Guest are viewing this topic.
Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 5
Posts: 953
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley
Logged

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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 5
Posts: 953
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley ma mi era rimasto il dubbio per il pulseIn con i tiny e visto che devo ancora comprarli volevo essere sicuro prima...
Logged

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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 5
Posts: 953
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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...
Logged

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

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 249
Posts: 21183
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 5
Posts: 953
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ok grazie provo smiley
Logged

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

Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 5
Posts: 953
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

si confermo che mettendo il timeout funziona bene smiley
grazie!
Logged

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

Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 5
Posts: 953
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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! smiley-wink
Logged

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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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)
Logged


Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 5
Posts: 953
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-wink
Logged

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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged


Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 5
Posts: 953
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

avevo postato proprio la settimana scorsa una domanda sugli interrupt smiley non li ho mai provati fino ad adesso...
Logged

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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 5
Posts: 953
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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'è  smiley-confuse sembra il codice che di solito si vede nelle librerie, io non sono ancora a quel livello da capirne il significato  smiley-red
Logged

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

Pages: [1] 2   Go Up
Jump to: