Quesito su interrupt

Salve ho bisogno di utilizzare un segnale analogico come interrupt. Il segnale è un impulso che viene prodotto ogni tot msec. C’è un modo semplice? Io avevo pensato riceverlo sull’arduino mega su un pin analogico e farlo uscire da un pin digitale per poi farlo rientrare nel pin dell’interrupt. Posso realizzare tutto questo nel setup dello sketch(in questo modo l’uso dei pin rimarrebbe fisso per tutta la durata dell’esecuzione?)?

Io avevo pensato riceverlo sull'arduino mega su un pin analogico e farlo uscire da un pin digitale per poi farlo rientrare nel pin dell'interrupt.

No, cosí come descrivi non funziona. Che segnale é? Cosa lo produce? Devi condizinarlo con un Schmit Trigger oppure con un amplificatore operazionale. Ciao Uwe

Praticamente ho un sensore che produce un impulso e ne riceve gli echi, dalla scheda che mi permette di usare il sensore escono due segnali. Il primo è un impulso (che sarebbe l'impulso prodotto) il secondo rappresenta gli eco ricevuti. Vorrei creare un pacchetto fatto così IEEEIEEIEEEEEIEE, e quindi ho pensato di usare il primo come interrupt per capire quali eco corrispondono all'impulso precedente. Non deve per forza essere così, sono aperto a suggerimenti. Grazie

Non ho capito bene. Tu mandi un impulso al sensore, e lui ti risponde con degli eco, o meglio un treno di impulsi, giusto?

No, il sensore ha una scheda sua che si occupa di farlo funzionare. Questa scheda ha due uscite, nella prima ho un impulso ogni volta che il sensore lancia l'impulso, nella seconda ho il segnale analogico degli eco. Io vorrei usare la prima come interrupt per capire quando finisce il treno di eco relativo ad un impulso. Idee?

attachInterrupt()... vai a vedere nel reference come funziona

Parla solo di ingressi digitali.

Ma il tuo problema è leggere il treno di impulsi una volta partito?
Se è così, penso basti attaccare un interrupt al primo pin della scheda sensore, quello che avvisa dell’inizio della trasmissione. Una volta “letto” l’inizio della trasmissione tramite l’interrupt, metti nel codice di gestione dell’interrupt la lettura del treno di impulsi.
Immagino avrà una fine. E la fine sarà segnalata dalla caduta dell’impulso, immagino sempre. Quindi basta tenere una variabile di controllo ed impostare l’interrupt affinché si attivi ad ogni variazione di segnale sul pin.
Ogni volta che chiami l’interrupt, basta fare un controllo su questa variabile (basta un boolean) e vedere se devi iniziare la lettura oppure terminarla.

Io penso che così ce la dovresti fare.

Il mio problema è che sono entrambi segnali analogici e sulle reference si parla solo di interrupt digitali. E non ha una fine, il primo segnale manda un impulso ad ogni inizio ciclo e serve solo a quello. Come faccio? Altre idee oltre agli interrupt?

Se il valore analogico ti interessa, allora usi l’interrupt solo per sapere in quale lettura ti trovi. e nel loop ti metti in ascolto dei valori analogici.

Se non ti serve il valore analogico ma solo la sua “cadenza”, allora puoi usare tranquillamente l’interrupt

E come dico ad arduino quale pin prendere? Quelli sulla reference di attachinterrupt sono solo digitali? Hai un listato di esempio?

. Most Arduino boards have two external interrupts: numbers 0 (on digital pin 2) and 1 (on digital pin 3). The Arduino Mega has an additional four: numbers 2 (pin 21), 3 (pin 20), 4 (pin 19), and 5 (pin 18).

da http://arduino.cc/en/Reference/AttachInterrupt

Si questo lo avevo letto, ma non sono tutti pin digitali?

solo il 2 e il 3. Puoi usarli tutti ma solo in digitale. Per leggere l'analogico forse puoi intecettare il "ready" del dac, ma avviene sicuramente a intervalli regolari, se non si può fare direttamente lo puoi fare con un interrupt sul tempo. Ma ti serve pre forza una lettura analogica?

I segnali sono analogici e il primo segnale non ha una frequenza predefinita, varia automaticamente a seconda di alcuni parametri. Non vorrei dover realizzare un adc solo per questo impulso. Il secondo segnale va bene così com'è, tanto devo solo acquisirne il valore.

allora, se il segnale analogico che vuoi leggere è solo uno, puoi mettere una analogread nell'interrupt, però considera che rallenta molto. Se del segnale analogico non sei intenzionato a conoscere la sua ampiezza ma solo la sua frequenza allora non serve un'analog read ma ti basta un interrupt digitale

Aspè mi sa che mi sono spiegato male. Quello che voglio fare io è leggere il valore del secondo segnale analogico continuamente, e mettere un segno (un char ad esempio) quando dal primo segnale(sempre analogico) ricevo un impulso. Non voglio leggerlo nell'interrupt, nella funzione eseguita quando arriva l'interrupt ci sarebbe solo qualcosa tipo Serial.println("I"); è nel loop originario che voglio leggere i dati in arrivo dal secondo segnale.

Ciao siaco83

siaco83: E come dico ad arduino quale pin prendere? Quelli sulla reference di attachinterrupt sono solo digitali? Hai un listato di esempio?

Un interrupt lavora solo in digitale. Quando su un pin arriva un cambio da LOW a HIGH ( o viceversa a seconda della programazione) il microcontroller interompe l' esecuzione del programma e esegue un programma che hai scritto nella Tua funzione di interrupt. Una volta terminato quello continua il programma da dove era stato interotto. Il segnale che metti sul entrata di interrupt DEVE per forza essere DIGITALE.

Ritorando sul Tuo problema: Tu hai un sensore di distanza a ultrasuoni quello che devi misurare é il tempo tra l'impulso e l'eco dopo x fratzioni di secondo. Sei sicuro che le uscite della scediana non sono dei segnali digitali?

Mandaci per favore il modello del sensore e della schedina o se l' hai comprato in internet la pagina del negozio elettronico.

Nella funzione di interrupt non puoi mettere funzioni come Serial.print() perché sono troppo lenti; la funzione di interrupt deve essere corta per essere sicuri che a un altro inpulso interrupt sia terminata la chiamata precedente.

Ciao Uwe

non è una schedina che ho preso su internet. Il primo segnale è un impulso di circa 5 volt, il secondo sono tanti impulsi (tipo il grafico del battito del cuore per intenderci) di ampiezza da un minimo di circa 20 mv a meno di cinque v. Io voglio leggere i valori del secondo (segnando i tempi di ricezione), però devo essere in grado di distinguere i treni di eco. Nella funzione dell’interrupt non devo stampare, posso anche cambiare il valore di una variabile booleana. Ho pensato agli interrupt perchè mi è sembrata la cosa più semplice (se avessi potuto usare il segnale analogico). Ma non sono obbligato ad usare un interrupt. Sono aperto ad altre idee. Grazie

Allora una spiegazione delle basi. Un microcontrollere é un dispositivo digitale che conosce solo 2 livelli di tensione. il LOW e il HIGH. Nel microcontroller ceh usa Arduino hanno aggiunto un convertitore analogico-digitale con 6 Entrate che non ha nessun collegamento interno con la parte che gestisce gli interrupt.

Il Tuo sensore ( per favore dicci il modello) da come risposta il segnale che capta un microfono ultrasuoni riflesso da oggetti. Il segnale non é adatto per essere gestito col microcontroller. Devi elaborarlo amplificando e formandolo.

Senza ulteriori informazioni non so dirti di piú.

Ciao Uwe