capacità di lettura segnali

ciao
ho 6 segnali della frequenza di circa 25Hz sfalsati tra loro i modo casuale, mi interessa leggere la durata LOW di questi 6, secondo voi arduino ci riesce o perdo troppo durante l’esecuzione dello sketch? allego la forma d’onda tipo

int i;
unsigned long durata[6];  //vettore per i valori di durata
int elemento[6];          //vettore i pin di connessione

void setup() 
{
  for (i=4;i<10;i++)      //inizziazione dei vettori
{
pinMode(elemento[i],INPUT);
durata[i-4]=0;
}
  Serial.begin(9600);
}

void loop()
{
for (i=4;i<8;i++)
{
  durata[i-4]=pulseIn(elemento[i],LOW);  //lettura dei valori di durata
  
if (durata[i-4]>30000)  //verifica e azione da intraprendere
{
 Serial.print(i);
 Serial.println(" attenzione");
}
}
}

grazie
stefano

20120202-0001.pdf (172 KB)

Ciao

il problema è che la funzione pulseIn() è bloccante:

quindi nella lettura del primo segnale aspetta fino a quando questo cambia stato: se durante questa "attesa" un segnale successivo cambia non lo vedresti.

Devi usare un diverso approccio, ad es. legando al cambio di stato l'esecuzione di un interrupt e trovando le durate di questi cambi di stato con la funzione millis()... Solo che non hai a disposizione 6 pin a cui puoi legare l'interrupt su Arduino Uno, ti serve il Mega o -forse- il nuovo Leonardo visto che il chip usato (Atmega32u4) dovrebbe consentire 13 external interrupts:

stefa24:
ho 6 segnali della frequenza di circa 25Hz sfalsati tra loro i modo casuale, mi interessa leggere la durata LOW di questi 6, secondo voi arduino ci riesce o perdo troppo durante l'esecuzione dello sketch? allego la forma d'onda tipo

E' fattibile con Arduino, però dipende molto dalla risoluzione che desideri e dall'errore massimo che ritieni ammissibile, a seconda del caso potrebbe essere necessario gestire il tutto in C ANSI accedendo direttamente ai registri piuttosto che passare dalle funzioni standard di Arduino.

lucadentella:
o -forse- il nuovo Leonardo visto che il chip usato (Atmega32u4) dovrebbe consentire 13 external interrupts:
http://www.atmel.com/dyn/products/product_parameters.asp?category_id=163&family_id=607&subfamily_id=760&part_id=4317&ListAllAttributes=1

L’ATmega 328 ha complessivamente 14 external interrupts, quel parametro è riferito alla possibilità di collegare un input ad un interrupt (PCINT0-13), però sono disponibili solo tre vettori di interrupt per tutti quanti, mentre INT0 e INT1 (PD2 e PD3) dispongono di un vettore dedicato ciascuno e maggiori funzionalità.
Oltretutto il micro della Leonardo deve gestire anche l’USB integrata il che porta ad un ulteriore degrado delle prestazioni rispetto alla UNO, anche usando la MEGA2560 non cambierebbe nulla visto che il core del micro ha le stesse prestazioni di quello del 328 e il clock è lo stesso, il vantaggio è solo nel maggior numero di GPIO, quantità di flash/ram e periferiche disponibili.

Ciao Astro,

grazie del chiarimento... ma capisco male io oppure con il Mega hai 6 pin a cui puoi agganciare un interrupt indipendente?

External Interrupts: 2 (interrupt 0), 3 (interrupt 1), 18 (interrupt 5), 19 (interrupt 4), 20 (interrupt 3), and 21 (interrupt 2). These pins can be configured to trigger an interrupt on a low value, a rising or falling edge, or a change in value. See the attachInterrupt() function for details.

ciao
grazie per le risposte

@lucadentella so del timeout di 1 sec di default, però facendo prove con un generatore di segnali, ho notato che è si un tempo di attesa, ma i segnali vengono processati a prescindere, quando ci sono,

@astro non ho grosse esigenze di precisione e qualcosa posso anche perdere, su 25Hz anche 5 impulsi posso anche perderli

stefano

stefa24:
@lucadentella so del timeout di 1 sec di default, però facendo prove con un generatore di segnali, ho notato che è si un tempo di attesa, ma i segnali vengono processati a prescindere, quando ci sono,

Il timeout è preimpostabile da 10 microsecondi a 3 minuti , anche se pare che la funzione pulseIn sia buggata per cui ci sia da correggerla a mano affinché funzioni correttamente. QUalche giorno fa si è discusso di questa cosa e astro (mi pare) aveva postato la modifica da fare: cerca nelle vecchie discussioni.

ciao
non ho letto quella, avevo letto di un possibile bug nella funzione, io uso la 0022, usando un generatore di funzione ho ottenuto risultati sufficientemente corretti, nella misura di HIGH che LOW

stefano

Il bug colpisce il tempo di timeout che non viene rispettato. Non ho mai usato la pulseIn perché non mi è mai servita, quindi non so che versioni possono soffrire di questo problema.

I dettagli del bug che affligge la pulsein sono in questo topic, è presente nella 0022, 0023 e anche la recente 1.0.
Francamente sono abbastanza stupito del fatto che un errore così grossolano sia ancora presente nella 1.0 nonostante questa faccenda sia stata riesumata più volte.

ciao
@astrobeed grazie ho letto faccio prove modificando dove indicato

stefano

lucadentella:
o -forse- il nuovo Leonardo …

E’ già in vendita?