Problema con i2C e slave con 4 seriali attive

Ho un problema con un sistema di 4 arduino (1 master e tre slave) di cui uno con 4 seriali attive. Il master passa tutti gli slave con delle richieste write quindi richiede i dati tramite request. Il problema è che quando aggiungo lo slave con le seriali questo si freeza come pure il serial print dei dati sul master, come mai?

è possibile impedire che si avvii la procedura di request o receive quando la seriale è attiva? basta usare lo stesso comando che si usa per interrompere gli interrupt?

piú informazioni, molto piú informazioni.

Quali modelli di Arduino usi? Dacci il sketch.

Alla ceca dirrei che stai usando troppa RAM e Arduino si blocca perché sovvrascrive la RAM.

Ciao Uwe

Sono arduino mega 1280, allego i due file master e lo slave che da problemi
Come posso scoprire se è la ram?

master2_2.ino (9.53 KB)

test_encoder_doppio_elmo_XY_iniziata_modifica.ino (28.7 KB)

Ho trovato la soluzione da me... l'i2c interferisce con i di lettura buffer della seriale, se l'interrupt on request parte durante la scrittura si blocca, basta impedirlo con la funzione nointerrupt nei punti critici badando a mettere un ritardo di 100ms dopo la riattivazione con il comando interrupt

Ricordati che la gestione dei dati in arrivo sull'I2C viene segnalata al core mediante un interrupt. Però anche la seriale lavora con interrupt, sia in ricezione che in trasmissione (almeno sull'IDE 1.0, sulle vecchie 002x la TX non era pilotata tramite interrupt). Sicuramente si danno noia, lo dimostra il fatto che ha risolto disattivando gli interrupt.

Sapresti mica dirmi se un interrupt non inoltrato per via del comando nointerrupt partirà poi quando da il comando interrupt? Nel senso..rimane in memoria o semplicemente questa occorrenza viene persa?

Non va perso, resta segnato perché gli interrupt hanno dei registri in cui vengono settati i bit per far vedere al micro che ci sono delle ISR da eseguire. Casomai potresti perdere gli eventi successivi nel senso che, essendoci solo 1 bit, è possibile sapere se si è sollevato un interrupt ma non quanti interrupt si sono verificati. Esempio: hai un interrupt agganciato ad un pin. Disattivi gli interrupt e subito dopo arrivano 2 impulsi su quel bit. Riattivando gli interrupt, la relativa routine verrà eseguita solo 1 volta.

Perfetto :D mi basta e avanza!