Ciao Forum,
Sto lavorando al mio primo progettino che usa la scheda Mega, uno shield a 4 relè, una scheda a 16 relè (la "classica" SainSmart e simili), la scheda ethernet ENC28J60, il comune display 4x20 con connessione I2C, e infine un RTC DS1307.
Dopo un po' di minuti si blocca tutto e cerca che ti cerca, anche grazie alla rete, ho trovato che il blocco avviene di volta in volta sul RTC o sul display, quando vengono invocate le chiamate alla libreria per il bus I2C. Non ho dubbi su questo perché ho inserito istruzioni di stampa nei dintorni di ogni chiamata.
Ho trovato che esiste una versione non bloccante di Wire e ho tentato di installarla. Mi riferisco a questa pagina qui, a circa 2/3 si trova il link: Gammon Forum : Electronics : Microprocessors : I2C - Two-Wire Peripheral Interface - for Arduino .
Il problema è che se pure sono riuscito a usare il RTC senza le chiamate alla libreria Wire, il display ne fa uso. Le due librerie paiono poter convivere ma è inutile: basta che uno solo dei dispositivi debba utilizzare la versione bloccante e il problema si ripresenta. Cercando un po' ho trovato che alcuni hanno modificato il codice della libreria wire per renderla non bloccante. Ora vi chiedo come potrei secondo voi procedere. Vedo solo queste due strade:
-
Metto mano al codice della libreria wire e così posso farla direttamente utilizzare dal RTC e dal display, e dai futuri sensori e dispositivi che volessi aggiungere.
-
Metto mano al codice della libreria a supporto del LCD in modo che non chiami più i metodi di Wire.
Entrambe le soluzioni mi paiono una cosa un po' delicata e fuori portata da uno sciacquino della programmazione qual sono, a meno che qualcuno non mi possa dare una mano a provarci. Ovviamente mi basterebbe qualche link a portata di dilettante e in cui sia spiegato passo passo come fare.
Se ci sono alternative meno invasive ovviamente sarei lieto di poterle usare.
Altra questione: ho avuto cattive esperienze per aver messo mano (in ambiente desktop, intendo) a librerie molto utilizzate; nel caso non abbia altra scelta che mettere mano al codice delle librerie, vorrei conservare le due versioni, magari rinominando quella modificata. Pensate si possa fare o esistono soluzioni più pulite? Vorrei avere il massimo dell'ordine possibile perché purtroppo tendo a confondermi facilmente.
Infine una mia perplessità, che non deve essere letta come una critica (poco) velata. Non credo di essere il solo ad aver provato a usare più di un dispositivo su I2C con un supporto software di base che provoca un problema tanto grave, tanto che ho trovato in rete che non sono il primo e non è nemmeno una cosa recente. Cosa ha impedito agli sviluppatori di rendere la libreria non bloccante dopo un po' che si è manifestato il problema? Potrebbe esistere qualche valida ragione e prima di muovermi a fare modifiche che non sono state fatte da persone molto più in gamba di me vorrei sentire - se verranno - le vostre opinioni. Naturalmente se il problema è stato già risolto e sono stato io a non aver trovato niente con google, come non detto tutto quanto scritto in quest'ultimo paragrafo.
grazie a chi mi darà una mano.
Apx