Conflitto (credo) Arduino mega I2C e interrupt

Salve,
sono nuovo (l'account) del forum, ma vi seguo da tempo ho iniziato con il primo arduino 7-8 anni fa.
Cercherò di essere "breve" e chiaro, se doveste avere bisogno di altre info per il mio problema provvederò.
Sto utilizzando un arduino Mega per un progetto, un controllore di flussi/temperature/pressione, di un collettore dell'acqua, per la precisione
6 flussi
7 temperature
7 pressioni
1 RTC per l'orario
1 display
1 shield ethernet
1 slot integrato nella shield per l'sd
innumerevoli Led

il precedente progetto funzionava perfettamente, ma era con 3 flussi 4 pressioni e 4 temperature:
controllo cadenzato di flussi temperature e pressioni, con stampa dei valori su display, stampa dei valori ogni minuto su memoria SD, controllo ogni minuto della connessione alla rete, e stampa su pagina Web HTML dei valori, con lucine di allarme nel caso i flussi uscissero dal range previsto.

Adesso ho avuto bisogno di ampliare il progetto, rifacendolo da 0 (in realtà ho 4 "box base con 3 flussi etc e ho ricreato 2 box avanzati con 6 flussi etc)

veniamo a noi:
per i 6 flussi utilizzo tutti e 6 i pin dell'arduino mega adibiti ai comandi con gli interrupt, il controllo dei flussi ha la precedenza su tutto, e per contare le pulsazioni del sensore ho dovuto utilizzare gli interrupt compresi però i pin 20 e 21 (che avevo lasciato liberi nella versione a 4 flussi) , che mi trovo costretto ad utilizzare anche per il modulo RTC dell'orario (attualmente non per il display, uso la configurazione base a 14 pin).

Bene, ho aggiornato il software, ho ricreato il nuovo hardware, e fatto decine di prove, ma quando vado a collegare i fili che vanno ai flussi del collettore, dopo 4-5 minuti di funzionamento perfetto, l'arduino si congela completamente, non fa più nulla, resta acceso e freezzato al momento del blocco.
scollegando i cavi dei flussi (sono tutti in 3 d-sub flussi-temperature-pressioni) l'arduino dopo una notte intera non si è bloccato, quindi mi immagino sia quello il problema, una specie di conflitto fra l'utilizzo dei pin SDA/SCL per il modulo RTC e l'utilizzo dei pin 20/21 (che sono praticamente la stessa cosa, ma se non sbaglio mirrorati sul controllore) come interrupt per la lettura dei flussi.

Info:
-l'RTC è a circa 40 centimetri dai pin sda scl dentro un box
-ho inserito le resistenze di pull up 4K7 da SDA a 5+ e SCL a 5V (i 5V sono di un alim esterno con gnd in comune ad arduino)
-sensori di flusso temperature e pressioni sono tutti a 4-5m di cavo di distanza
-non ho ancora messo alcun condensatore nel mio box, leggevo che sarebbe meglio metterne a cavallo dell'alim dell'RTC, del display sull'enable (e resistenza da 10k).

Altri problemi "marginali" sono:

  1. l'impazzimento del display ad intervalli casuali ( dopo ore), ma l'arduino continua a funzionare, cercando in rete proverò a mettere condensatore e resistenza sull'enable del display

Spero che possiate aiutarmi con il mio problema, ci sto veramente impazzando, non ho trovato niente in rete, leggendo decine di forum italiani, e alcuni inglesi (ma se si scende troppo nel linguaggio tecnico in inglese mi perdo)
Vi ringrazio in anticipo, LUCA

Ti segnalo che, nella sezione in lingua Inglese, si può scrivere SOLO in Inglese ... quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post; questa volta esso è stato spostato, da un moderatore della sezione di lingua Inglese, nella sezione di lingua Italiana ... la prossima volta potrebbe venire direttamente eliminato ::slight_smile:

Guglielmo

Per la lettura dei sensori di flusso è meglio che usi una tecnica a polling sotto un unico interrupt periodico generato da un timer,1msec dovrebbe essere sufficiente se la durata massima dell'impulso è inferiore a 1msec al massimo flusso , nella risposta all'Interrupt fai il polling di tutti e 6 gli ingressi

Ciao, allora non ho idea di cosa sia la tecnica a polling ammetto, proverò a documentarmi
io utilizzo per i 6 flussi, 6 interrupt che per 1 secondo leggono le pulsazioni ricevute dal sensore di flusso, e rielaborano i dati per convertirle in "litri/minuto"
I sensori sono questi:

(posso mettere un link ad amazon?)

Spulciando il forum inglese, PS (scusate ma non avevo proprio visto di aver postato in quello inglese) alcuni utenti hanno dichiarato con fermezza l'impossibilità di utilizzare i pin 20-21 di arduino mega, sia come interrupt che come modulo di conversazione SDA SCL, quindi per ora ho risolto scollegando il mio modulo RTC e reimpostando il programma in modo che l'orario fosse preso dalla scheda ethernet tramite NTP.

Non capisco comunque la scelta progettuale di infilare 2 dei 6 interrupt preciamente nei pin SDA e SCL :o

Per quanto riguarda l'inserimento di un qualcosa volto a stabilizzare il display e i suoi geroglifici che ognitanto mi costringono a riavviare l'arduino, sapete darmi qualche consiglio?
anche perchè in futuro dovrò implementare dei moduli relè, e sicuramente la situazione con i loro disturbi non migliorerà

Grazie,
Luca

aerospazioluca:
... alcuni utenti hanno dichiarato con fermezza l'impossibilità di utilizzare i pin 20-21 di arduino mega, sia come interrupt...

... Non capisco comunque la scelta progettuale di infilare 2 dei 6 interrupt preciamente nei pin SDA e SCL :o

Se ti studi il datasheet del ATmega2560 vedi che NON è una scelta di Arduino, ma è una scelta di Atmel (ora Microchip) quando hanno disegnato il chip ... quei due pin o sono configurati come bus I2C o sono utilizzati cone interrupt hardware.

Però, forse ti sfugge, che sulla Mega molti altri pin digitali possono essere usato come "pin change interrupt" (PCINTx) e quindi attivare una ISR.

Guglielmo

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.