Go Down

Topic: intterupt in arduino (Read 1 time) previous topic - next topic

Standardoil

È differente da quello che hai detto la prima volta
Comunque è facile
Dopo le 5 ti spiego
Prima legge di Nelson (che sono io): Non scambiare il fine con il mezzo: ricorda "cosa" devi fare, non "come" devi farlo

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

fra9962

#16
Apr 23, 2018, 04:33 pm Last Edit: Apr 23, 2018, 04:34 pm by fra9962
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 )
}

docdoc

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....
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

Standardoil

#18
Apr 23, 2018, 06:30 pm Last Edit: Apr 23, 2018, 06:32 pm by Standardoil
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
Prima legge di Nelson (che sono io): Non scambiare il fine con il mezzo: ricorda "cosa" devi fare, non "come" devi farlo

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

Standardoil

Rimane da risolvere il "voglio che durante questa fase se collego all'improvviso......"
Questa pure è  semplice, basta che ripensi alla sequenza di operazioni
Prima legge di Nelson (che sono io): Non scambiare il fine con il mezzo: ricorda "cosa" devi fare, non "come" devi farlo

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

doppiozero

#20
Apr 23, 2018, 06:38 pm Last Edit: Apr 23, 2018, 06:55 pm by doppiozero
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
Runtime Clock Manager -- https://github.com/duezero/RCM---Runtime-Clock-Manager
GPX datalogger -- https://github.com/duezero/GPX-datalogger
AVR HV Rescue Board -- https://www.youtube.com/watch?v=EErKo0aTEio

Standardoil

Anche, giusto, così  si evita che la parecchio collegato debba comandare esplicitamente la trasmissione, ma presuppone che l'apparecchio collegato sia sempre pronto
Prima legge di Nelson (che sono io): Non scambiare il fine con il mezzo: ricorda "cosa" devi fare, non "come" devi farlo

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

Standardoil

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)
Prima legge di Nelson (che sono io): Non scambiare il fine con il mezzo: ricorda "cosa" devi fare, non "come" devi farlo

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

doppiozero

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
Runtime Clock Manager -- https://github.com/duezero/RCM---Runtime-Clock-Manager
GPX datalogger -- https://github.com/duezero/GPX-datalogger
AVR HV Rescue Board -- https://www.youtube.com/watch?v=EErKo0aTEio

docdoc

#24
Apr 24, 2018, 09:51 am Last Edit: Apr 24, 2018, 09:53 am by docdoc
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

Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

gpb01

#25
Apr 24, 2018, 10:30 am Last Edit: Apr 24, 2018, 10:30 am by gpb01
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
Search is Your friend ... or I am Your enemy !

docdoc

#26
Apr 24, 2018, 10:40 am Last Edit: Apr 24, 2018, 10:40 am by docdoc
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... ;)
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

gpb01

#27
Apr 24, 2018, 10:46 am Last Edit: Apr 24, 2018, 10:47 am by gpb01
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
Search is Your friend ... or I am Your enemy !

doppiozero

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 

Runtime Clock Manager -- https://github.com/duezero/RCM---Runtime-Clock-Manager
GPX datalogger -- https://github.com/duezero/GPX-datalogger
AVR HV Rescue Board -- https://www.youtube.com/watch?v=EErKo0aTEio

docdoc

#29
Apr 24, 2018, 01:55 pm Last Edit: Apr 24, 2018, 01:58 pm by docdoc
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

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.
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

Go Up