problema con pulseIn

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 :slight_smile:

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.

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

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.

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

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

ok grazie provo :slight_smile:

si confermo che mettendo il timeout funziona bene :slight_smile:
grazie!

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! :wink:

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)

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 :wink:

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

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

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.

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 :blush:

Sì, quella è una libreria. Devi salvarti il file e poi richiamarla nel tuo progetto. Oppure puoi semplicemente ricopiarla in una nuova tab nell'editor: ci penserà poi l'IDE a fondere insieme i 2 file in un unico sketch.

nel primo caso potrai riusarla in tutti i tuoi progetti, nel secondo solo nello sketch in cui l'hai inclusa.

ahn ok grazie :wink:
dove dovrei salvare questo codice? nella cartella delle librerie? e come dovrei salvarlo? come un .pde o come un .cpp o come un .h o in che altro formato?
ma non c'è già la libreria PinChangeInterrupt? o è un'altra cosa?

questa funziona indifferentemente con tutti i modelli di arduino?
si riesce a usarlo anche sui tiny? :slight_smile:
(io uso la versione 0022 e ho tutte le tue librerie per i tiny :wink: )

grazie ancora! :wink:

La libreria che hai tu, che si chiama PinChangeInterrupt, fa parte del core Tiny e funziona solo sui micro Attiny appunto. Questa è per l'Arduino.

Ti posto anche questa, è già sotto forma di libreria, dovrebbe essere identica all'altra.

PinChangeInt.zip (4.54 KB)

ahn si è vero adesso mi ricordo, quella li l'avevo scarcicata per i tiny :sweat_smile:

comunque, quello è il codice della libreria per l'arduino, come e dove dovrei salvarlo?

grazie :slight_smile:

Essendo una libreria, salvala nella cartella delle... librerie, :stuck_out_tongue:
A parte gli scherzi, se hai già quelle lib per il core Tiny, avrai la cartella /libraries dentro /sketchbook. Salvala lì.