Arduino Forum

International => Italiano => Software => Topic started by: fra9962 on Apr 20, 2018, 09:47 pm

Title: intterupt in arduino
Post by: fra9962 on Apr 20, 2018, 09:47 pm
Salve,
devo svolgere un progetto per l' università con arduino :D volevo sapere se era possibile realizzare un interrupt per la comunicazione seriale .
Mi spiego meglio, il mio arduino salverà dei dati nella propria memoria a lungo periodo e nel caso in cui venga collegato tramite connessione seriale deve interrompere subito quello che sta facendo e inviare i dati salvati prima al seriale.

Qualcuno potrebbe aiutarmi ? :) 

Grazie in anticipo a tutti ;)
Title: Re: intterupt in arduino
Post by: Silente on Apr 20, 2018, 10:55 pm
La seriale nel momento in cui viene attaccata resetta Arduino. Quindi puoi mettere la parte che invia su seriale nella setup()
Title: Re: intterupt in arduino
Post by: uwefed on Apr 21, 2018, 07:15 am
La seriale nel momento in cui viene attaccata resetta Arduino. Quindi puoi mettere la parte che invia su seriale nella setup()
No; il terminale dell' IDE quando viene aperto resetta l'arduino connesso.
Ciao Uwe
Title: Re: intterupt in arduino
Post by: torn24 on Apr 21, 2018, 08:23 am
Non credo sia possibile ma credo che non sia necessario.

Se ad esempio abbiamo connessione, una comunicazione via software, all'avvio del software possiamo trasmettere un carattere di comando, che ricevuto da arduino fa si che si avvii una funzione di trasmissione dati.

Se invece vogliamo che la comunicazioni inizi dopo un collegamento hardware "collegamento di un cavo", possiamo in vari modi agire su un pin arduino, e in base al valore del pin iniziare la trasmissione sulla seriale.


Per cui sia per una connessione software, sia per una connessione hardware, ci sono soluzioni alternative.
Title: Re: intterupt in arduino
Post by: Standardoil on Apr 21, 2018, 08:40 am
l'idea non è nianche mica male: la connessione seriale resetta arduino, questo è positivo (certo)
parimenti certo è che la setup viene eseguita immediatamete diopo il reset
attacco il cavo usb e comincio aricevere dalla setup, sembra una cosa possibile....
UWE perchè secondo te non va? non capisco
Title: Re: intterupt in arduino
Post by: Claudio_FF on Apr 21, 2018, 09:05 am
Quote from: Standardoil
UWE perchè secondo te non va? non capisco
Perché magari con l'autoreset brutale non può riprendere/continuare quello che stava facendo.

Ma basta inibire l'autoreset con il solito accrocco (leggasi condensatore o resistenza a seconda della board).

Il fatto è che di per sè la seriale non dice in alcun modo "ehi qualcuno mi ha collegato".

Il programma su Arduino dovrà leggere periodicamente la seriale (basta un Serial.available) per capire se qualcuno da fuori richiede attenzione. Per lo meno usando le funzioni standard delle librerie.
Title: Re: intterupt in arduino
Post by: Standardoil on Apr 21, 2018, 10:06 am
ma infatti non vuole riprendere, vuole un interruzzione esterna, che cominci una trasmissione che nn centra nulla col lavoro precedente
meglio che quello...
semmai il problema è al ermine della trasmissione, riprendere il lavoro dal punto brutalmente interrotto
ma siccome è una specifica cogente (cito: "deve interrompere subito quello che sta facendo")
il problema ci sarebbe qualunque metodo di interuzzione si usi, quindi tantovale...
Title: Re: intterupt in arduino
Post by: Patrick_M on Apr 21, 2018, 10:18 am
se ho capito giusto non si resetta attaccando il cavo seriale ma
si resetta aprendo la finestra della seriale dall'ide
Title: Re: intterupt in arduino
Post by: Standardoil on Apr 21, 2018, 11:34 am
Hai capito giusto, mi sembra che sia legato all'intervento della linea DTR, o qualche altra legata all'handshaking hardware
ma comunque sempre legata alla comunicazione seriale, attaccare, aprire, cominciare una comunicazione seriale
Title: Re: intterupt in arduino
Post by: SukkoPera on Apr 21, 2018, 05:31 pm
Si resetta all'apertura della connessione, quando il "client" (che si chiama DTE in questo contesto) tira su DTR (Data Terminal Ready o qualcosa di simile).
Title: Re: intterupt in arduino
Post by: Standardoil on Apr 21, 2018, 06:11 pm
Secondo me è una strada da esplorare, semplice semplice e garantisce il risultato
Title: Re: intterupt in arduino
Post by: fra9962 on Apr 23, 2018, 03:52 pm
Grazie a tutti dell' informazione :) avevo letto che qualcuno parlava di utilizzare un pin per far ciò ... in che senso ??

non userò l ide di arduino bensì un programma c scritto da me.

L' arduino salverà dei dati nella memoria a lungo termine all interno del loop , se io uso la funzione per disabilitare gli interrupt durante tale operazione non dovrebbero esserci problemi no?
Title: Re: intterupt in arduino
Post by: docdoc on Apr 23, 2018, 04:06 pm
Posso confessare che non ho ben capito né l'esigenza né i consigli che gli state dando?

Per prima cosa dice "nel caso in cui venga collegato tramite connessione seriale": cosa intende con "venga collegato"? Diciamo che Arduino ha (in qualche modo, lasciamo stare tutte le considerazioni sui reset vari) un connettore seriale: la "connessione" è quindi fisica? Ossia qualcuno a manella collega questa seriale ad Arduino? Ma una cosa del genere può indurre segnali spuri sulla seriale, che quindi risulterebbe "sporca" di caratteracci random...

Poi per "memoria a lungo periodo" cosa intende, la EEPROM interna? O una schedina SD? Questo non influenza il resto del discorso, ma la modalità di gestione si, ad esempio la EEPROM ha una "vita" di un certo numero di scritture, così come la SD, ma soprattutto se arriva l'interrupt (o peggio il reset) mentre sta scrivendo byte sulla EEPROM il rischio è di avere dati ancora più "sporchi").

E questa interruzione non potrebbe avvenire semplicemente con un apposito interrupt (es. un pin che va HIGH) che quindi gestisce in modo "smooth" la cosa, invece di pensare a resettare tutto Arduino?

Insomma, prima di parlare di possibili implementazioni o soluzioni, non conviene prima capire e delineare meglio qual è l'ESIGENZA?

Che deve fare Arduino? I dati che raccoglie ogni quanto li deve aggiornare? E perché attendere una connessione "fisica" di una seriale? Che deve farci la controparte? Ci sono strade diverse dalla seriale?
Title: Re: intterupt in arduino
Post by: Standardoil on Apr 23, 2018, 04:18 pm
Si, certamente, ma siccome quello che lo OP chiede arduino già lo fa, basta mettere una serial.print nella setup...
Almeno per cominciare non serve pensare ad altro
Poi quando avrà qualcosa di funzionante può sempre migliorarlo
Per il momento io mi concentrerei sulla raccolta dati, più che sullinterrupt da seriale
Title: Re: intterupt in arduino
Post by: fra9962 on Apr 23, 2018, 04:21 pm
Allora... cercherò di spiegarmi meglio.
La memoria utilizzata per salvare i dati sarà la eeprom.
Lo sketch verrà caricato in un primo momento tramite pc e poi arduino verrà collegato a una batteria per lavorare in autonomia.
Voglio che mentre lavora salva i dati acquisiti e quando viene connesso utilizzando la porta seriale, lui capisce che vi è stato collegato un dispositivo e deve iniziare a inviargli tutti i dati raccolti (ciò può avvenire anche dopo che ha letto i dati, se li sta leggendo in quell' istante altrimenti deve interrompere quello che sta facendo e inviare immediatamente i dati)

come faccio a far cambiare valore a un pin con un interrupt se non esiste una funzione che dice al pin quando un dispositivo viene collegato ? il problema quindi rimane...

Purtroppo devo usare la seriale vista la mancanza di un modulo per la connessione a internet.

Le specifiche per questo "incarico" sono volute dal mio prof ... se avete altre idee diverse dal seriale sparate pure .

Title: Re: intterupt in arduino
Post by: Standardoil on Apr 23, 2018, 04:28 pm
È differente da quello che hai detto la prima volta
Comunque è facile
Dopo le 5 ti spiego
Title: Re: intterupt in arduino
Post by: fra9962 on Apr 23, 2018, 04:33 pm
magari questa struttura vi può chiarire le idee :D

Code: [Select]

setup(){

}



loop(){

//parte di acquisizione dati<------- voglio che durante questa fase se collego  all' improvviso arduino al pc,arduino invia immediatamente i dati salvati su EEPROM( e dopo ricominci il loop acquisendo nuovamente i dati)

//parte di salvataggio dei dati

//possibili operazioni sui dati salvati

//invio dei dati tramite seriale (questa fase avviene solo se arduino è già connesso )
}
Title: Re: intterupt in arduino
Post by: docdoc on Apr 23, 2018, 04:56 pm
come faccio a far cambiare valore a un pin con un interrupt se non esiste una funzione che dice al pin quando un dispositivo viene collegato ? il problema quindi rimane...
Se sai come è fatto un connettore seriale RS-232 (ad esempio un normale DB9) puoi trovarlo da solo come fare... ;)  Ti dò una indicazione: non ci sono mica solo TX ed RX... Qualcosa che la "controparte" alza quando aspetta dei dati....
Title: Re: intterupt in arduino
Post by: Standardoil on Apr 23, 2018, 06:30 pm
Alcune domande:
Per seriale intendi la usb?
Oppure una seriale  in più?
Interrupt  ti serve proprio? Io non lo vedo necessario.
Che arduino? Una UNO?
È  contrario al forum, e nemmeno etico Se ti do dritta la soluzione, che è  semplice!
Se intendi usare la usb devi tenere conto che avviare la comunicazione resetta immediatamente arduino, lo devi evitare, se cerchi trovi come, è  banale
Se invece una seriale in piu  devi usare una softwareserial oppure una scheda più  grande, una MEGA
In tutti i casi, la soluzione è semplice:
Ti limiti a sorvegliare con una available () se c'è  o no una trasmissione sulla seriale,
Se si vedi di riconoscere il comando di richiesta dati.
Se  e quando arriva il comando effettui la trasmissione e poi torni alla loop
Naturalmente lo fai nella fase 4 del tuo scheletro di programma: invio dei dati
Non serve passare da interrupt, che anzi è deleterio, rischi che un interrupt tronchi una scrittura, pregiudicando l'integrità  dei dati
Dai, prova che è facile, e siamo qui per aiutarti
Title: Re: intterupt in arduino
Post by: Standardoil on Apr 23, 2018, 06:36 pm
Rimane da risolvere il "voglio che durante questa fase se collego all'improvviso......"
Questa pure è  semplice, basta che ripensi alla sequenza di operazioni
Title: Re: intterupt in arduino
Post by: doppiozero on Apr 23, 2018, 06:38 pm
Usa un convertitore USB seriale esterno. Il pin su cui metti il DTR lo attacchi ad un interrupt (se proprio ti serve, oppure lo tieni monitorato), quando colleghi il convertitore al pc e apri la comunicazione il DTR va LOW e il gioco è fatto.

Senza resettare nulla ovviamente

EDIT: va low quando apri il monitor seriale di Arduino, non so come si comporta con in altri ambiti, parola agli esperti  :D
Title: Re: intterupt in arduino
Post by: Standardoil on Apr 23, 2018, 06:41 pm
Anche, giusto, così  si evita che la parecchio collegato debba comandare esplicitamente la trasmissione, ma presuppone che l'apparecchio collegato sia sempre pronto
Title: Re: intterupt in arduino
Post by: Standardoil on Apr 23, 2018, 07:16 pm
EDIT: va low quando apri il monitor seriale di Arduino, non so come si comporta con in altri ambiti, parola agli esperti  :D
anche con moserial (linux)
Title: Re: intterupt in arduino
Post by: doppiozero on Apr 23, 2018, 10:37 pm
Usa un convertitore USB seriale esterno. Il pin su cui metti il DTR lo attacchi ad un interrupt (se proprio ti serve, oppure lo tieni monitorato), quando colleghi il convertitore al pc e apri la comunicazione il DTR va LOW e il gioco è fatto.

Senza resettare nulla ovviamente

EDIT: va low quando apri il monitor seriale di Arduino, non so come si comporta con in altri ambiti, parola agli esperti  :D
mi autoquoto.. in realtà dire "il gioco è fatto" è un po una cavolata perchè bisogna vedere cosa succede al DTR quando il convertitore seriale viene acceso (collegato al pc). Potrebbe triggerare interrupt non voluti.

Comunque alla fine penso che basti disattivare l'autoreset come qualcuno ha già suggerito e monitorare la seriale.

@fra9962 quando dici
Quote
caso in cui venga collegato tramite connessione seriale deve interrompere subito quello che sta facendo
cosa intendi con subito? pochi millisecondi, centinaia di millisecondi, qualche secondo? perchè fa differenza
Title: Re: intterupt in arduino
Post by: docdoc on Apr 24, 2018, 09:51 am
Usa un convertitore USB seriale esterno. Il pin su cui metti il DTR lo attacchi ad un interrupt (se proprio ti serve, oppure lo tieni monitorato), quando colleghi il convertitore al pc e apri la comunicazione il DTR va LOW e il gioco è fatto. Senza resettare nulla ovviamente
Ehm, scusa ma in realtà questo è (più o meno) quello a cui volevo farlo arrivare da solo (vedi mio post #17...), così hai spoilerato! :D Se deve usare le seriali (qui parlo di quelle fisiche) deve anche studiare come funzionano e come si gestiscono non ti pare? ;)

Quote
va low quando apri il monitor seriale di Arduino, non so come si comporta con in altri ambiti, parola agli esperti
Per la seriale "minimale" bastano RX, TX e GND ma per il verso di questi e degli altri pin come DTR dipende delle controparti: qual è DTE e quale DCE? E se poi la seriale è con o senza handshake hardware (o con handshake software).

In questo caso direi che Arduino potrebbe essere un DCE (diciamo come un modem per intenderci) mentre la controparte un DTE (il computer che "usa" il modem). Quindi il DTR lo alza il computer/DTE, e se il pin DTR lo porta in un pin di Arduino poi può farci quello che vuole (anche io consiglierei di non usare gli interrupt ma dipende dal resto del codice cosa fa). Ovviamente se la controparte (sempre DTE) ha abilitato un handshake hardware (CTS/RTS) le cose potrebbero complicarsi, ma spero non sia un requisito. In ogni caso è l'OP che deve definire/capire come si gestisce la seriale.

Per ulteriori info:
https://en.wikipedia.org/wiki/RS-232#Data_and_control_signals (https://en.wikipedia.org/wiki/RS-232#Data_and_control_signals)

Title: Re: intterupt in arduino
Post by: gpb01 on Apr 24, 2018, 10:30 am
Mi intrometto solo per segnalare che TUTTI gli adattatori USB <--> Seriale, fatti per le varie schede Arduino (quindi dai migliori basati su FTDI a quelli più economici basati su CH34x), essendo pensati per il caricamento del codice (sui vari Arduino minimalisti, senza USB), gestiscono il segnale di DTR che serve, normalmente, a dare il "reset" alla scheda, quindi ... basta usare uno di quelli ed utilizzare i segnali che già mette a disposizione ... ;)

Guglielmo
Title: Re: intterupt in arduino
Post by: docdoc on Apr 24, 2018, 10:40 am
Si, Guglielmo, ma tutto dipende da cosa vuole in realtà fare l'OP e quali sono le modalità d'uso che prevede.

Comunque sia, forzare il reset di Arduino quando si collega la seriale, costringendo a salvataggi su EEPROM dei dati acquisiti con tutte le incognite correlate, a me personalmente non piace per niente.

La soluzione "bare bones" ossia usare solo i due pin seriali (0/1 o quelli che vuole con SoftwareSerial) più un pin per rilevare la connessione di una seriale, oltre a non richiedere nessun circuito consente di far lavorare la MCU "come Cristo comanda" senza arzigogolamenti... ;)
Title: Re: intterupt in arduino
Post by: gpb01 on Apr 24, 2018, 10:46 am
La soluzione "bare bones" ossia usare solo i due pin seriali (0/1 o quelli che vuole con SoftwareSerial) più un pin per rilevare la connessione di una seriale, oltre a non richiedere nessun circuito consente di far lavorare la MCU "come Cristo comanda" senza arzigogolamenti... ;)
... leggi bene, ho detto che il DTR viene normalmente usato per fare il "reset", ma è più che ovvio che, in questo caso, NON vada assolutamnete usato in questo modo, ma, come dici tu, due pin per TX e RX ed un pin per il segnale che la seriale è stata aperta.

Che poi il segnale lo controlli in polling o lo controlli con un interrupt, poco cambia ;)

Guglielmo
Title: Re: intterupt in arduino
Post by: doppiozero on Apr 24, 2018, 01:29 pm
Ehm, scusa ma in realtà questo è (più o meno) quello a cui volevo farlo arrivare da solo (vedi mio post #17...), così hai spoilerato! :D Se deve usare le seriali (qui parlo di quelle fisiche) deve anche studiare come funzionano e come si gestiscono non ti pare? ;)
Uoops, scusa Doc  :D 

Title: Re: intterupt in arduino
Post by: docdoc on Apr 24, 2018, 01:55 pm
Uoops, scusa Doc  :D 
Nessun problema, doppiozero, ci mancherebbe! :)

come faccio a far cambiare valore a un pin con un interrupt se non esiste una funzione che dice al pin quando un dispositivo viene collegato ? il problema quindi rimane...
Ora più o meno potresti averlo chiaro. Ma se il requisito è usare la seriale, ripeto il mio consiglio, studia come funziona l'RS-232:
https://en.wikipedia.org/wiki/RS-232#Data_and_control_signals (https://en.wikipedia.org/wiki/RS-232#Data_and_control_signals)

Quote
Purtroppo devo usare la seriale vista la mancanza di un modulo per la connessione a internet.
Questa non l'ho capita... La seriale è quindi solo un "ripiego"? Se vuoi guarda che puoi collegare Arduino in rete, o con uno shield Etehernet o uno WiFi ossia un modulino ESP8266. O una WeMos D1 che è "quasi" un Arduino nel senso che lo programmi con lo stesso IDE ma con WiFi già integrato ossia ha un ESP8266 on board (ma io non ti ho detto niente, e questi non sono i droidi che state cercando...;)).

Insomma, se vuoi indicazioni magari più ponderate dovresti darci maggiori informazioni sul progetto, ossia l'ambito nel quale devi operare, altrimenti se restiamo alle tue specifiche, fai una connessione seriale con RX/TX/GND/DTR collegati da un DB9 ad Arduino e vai col SoftwareSerial.
Title: Re: intterupt in arduino
Post by: Standardoil on Apr 24, 2018, 02:13 pm
altrimenti se restiamo alle tue specifiche, fai una connessione seriale con RX/TX/GND/DTR collegati da un DB9 ad Arduino e vai col SoftwareSerial.

beh, magari un minimo per adattare i livelli...
Title: Re: intterupt in arduino
Post by: docdoc on Apr 24, 2018, 03:23 pm
beh, magari un minimo per adattare i livelli...
Si, ma torniamo daccapo che non sappiamo esattamente cosa ci sia dall'altra parte: l'RS-232 può essere anche a livelli TTL, a patto di traslare al range 0-5V, altrimenti è anche questo un aspetto da verificare.

Sempre se non sia praticabile qualche strada alternativa alla seriale...

Title: Re: intterupt in arduino
Post by: Standardoil on Apr 24, 2018, 03:31 pm
Beh, insomma, una qualsiasi db9 con rs232f avrà +-12v, è frigge arduino,
Title: Re: intterupt in arduino
Post by: docdoc on Apr 24, 2018, 04:29 pm
Beh, insomma, una qualsiasi db9 con rs232f avrà +-12v, è frigge arduino,
Si ma quale parte di "non sappiamo cosa ci sia dall'altra parte" non era chiara? :D :D

Inutile fare ormai altre supposizioni, o abbiamo dati certi, oppure possiamo vagare per l'infinito e oltre.