Problema con MAX485 e DE/RE

Ciao ragazzi... sto provando degli adattatori uart/RS485, che già includono tutta la circuiteria che serve per mettere su un sistema del genere, mettendo in collegamento due Arduino con due di questi adattatori.

Innanzitutto ho provato a mettere in atto una configurazione "statica", cioè solo Trasmitter/Receiver e non intercambiabile, mettendo dalla parte del trasmettitore 5v sul pin DE e dalla parte del ricevitore 0v su RE. Lascio per scontato tutto il resto della circuiteria, anche perchè tutto ha funzionato.

Avendo intenzione di realizzare un sistema Master/Slave, ho fatto delle modifiche al circuito cortocircuitando RE e DE per entrambi gli adattatori, e collegato a questi jumper un filo per ognuno... in pratica i due fili con cui dovrei riuscire a settare le modalità Receiver/Trasmitter dai rispettivi pin delle due Arduino.... ho rifatto il circuito un sacco di volte, ma niente da fare. Non vuole funzionare. La trasmissione dei dati è "disturbata" in qualche modo, i dati trasmessi non sono gli stessi di quelli ricevuti...e quando tento di invertire di modalità, i dati non vengono per niente trasmessi.... avrò dimenticato di aggiungere qualcosa nel circuito?

Spiega meglio come hai cortocircuitato DE ed RE.

Di solito si cortocircuita DE insieme a RE, in modo da disattivare la ricezione mentre si trasmette, e viceversa.

psoftware: Ciao ragazzi... sto provando degli adattatori uart/RS485, che già includono tutta la circuiteria che serve per mettere su un sistema del genere, mettendo in collegamento due Arduino con due di questi adattatori.

Ossia? Com'è che hai realizzato il circuito?

L’immagine che hai postato mostra dispositivi in grado di stabilire connessioni anche in Full-Duplex… i miei no, solo in half perchè dispongono solo delle uscite A e B. Ho postato un’immagine realizzata velocemente del circuito, la allego…

I rispettivi pin 2 li utilizzo per settare i MAX485 in ricezione o trasmissione…

Che distanza c'è tra i due transceiver? Hai messo le R di terminazione?

BaBBuino:
Devi collegare A con B e B con A.

Ma assolutamente no, A con A e B con B, è una linea differenziale e non una linea Tx->RX.

astrobeed:

BaBBuino: Devi collegare A con B e B con A.

Ma assolutamente no, A con A e B con B, è una linea differenziale e non una linea Tx->RX.

Si, ho cancellato. Ho visto veloce il disegno e mi sono confuso. Hai quotato troppo in fretta! :D

BaBBuino: Si, ho cancellato. Ho visto veloce il disegno e mi sono confuso. Hai quotato troppo in fretta! :D

Che ci vuoi fare, ho il quoting più veloce di tutto il West :D

Significa anche che non hai un czz da fare... Fila a lavorare! :grin:

BaBBuino: Significa anche che non hai un czz da fare... Fila a lavorare! :grin:

Mi sono licenziato fino all'anno prossimo, poi mi riassumo :grin:

Un elettronico ha sempre qualcosa da aggeggiare anche quando è licenziato! :)

Ti sei dimenticato delle R di terminazione? Devi inserire fra A e B, per ognuno dei 2 chip ai capi del bus, una R da 100/120 ohm. Mettile il più vicino possibile ai pin dei 2 chip.

Leo se la distanza è contenuta sotto i 20 metri, le resistenze non sono un problema. Lo diventano quando le linee cominciano ad avvicinarsi, e superare, i cento metri.

Boh, non parlava di quali distanze stesse gestendo.
Comunque mi sono accorto di una cosa per un progetto in cui ho usato la RS485.
Invertendo la modalità di trasmissione, un Atmega in standalone ho avuto un sacco di problemi.
In pratica ho risolto attendendo che i buffer hardware del chip si svuotassero prima di switchare da una modalità all’altra.
Attenzione!! Parlo di buffer hardware, il registro del chip, non il buffer software.

Ti passo il codice che usavo per switchare il chip transceiver:

//passaggio da TX a RX
while (!(UCSR0A & (1 << TXC0))); //attendo che il buffer TX si svuoti
while (Serial.available()) {
  byte temp = Serial.read();
}
digitalWrite(RXTX_RS485, RS485RX); //qui faccio il passaggio a RX

Mentre per l’inverso:

//passaggio da RX a TX
UCSR0A |= (1 << TXC0); //imposto il buffer TX come vuoto (1-->resetta il bit)
 digitalWrite(RXTX_RS485, RS485TX);

Non so se può servirti. Io ci sono diventato matto dei giorni interi.

Che registro è L’UCSR0A?

E' un registro di stato della seriale. Datasheet 20.11.2

Il bit TXC0 viene modificato quando termina la trasmissione dei dati presenti in uscita.

Uhm... il circuito è montato interamente su breadboard, quindi la distanza fra i due adattatori è pressochè nulla xD Il problema sta nel fatto che, impostando un adattatore in trasmissione e l'altro in ricezione, a destinazione giungono dati che non corrispondono a quelli inviati. Per far si che arrivino integri, sono costretto a prendere il filo collegato al pin 2 del max che dovrebbe trasmettere, e STACCARLO, senza metterlo a massa o in tensione. Per assicurarmi che tutti i dati vengano trasmessi, uso flush(). Continuo a non capire!

Potrebbe essere anche un problema nella parte software... potete linkarmi degli esempi funzionanti per confrontarli col mio codice e vedere cosa c'è che non va?

PS: Buon natale a tutti! :D

A partire dall'IDE 1.0 flush() non svuota più il buffer. E comunque, come detto più sopra, si tratta sempre di svuotamento del buffer software, non di quello hardware. Per esser certi di effettuare lo switch da TX a RX e viceversa dopo che materialmente l'ultimo byte è uscito dalla seriale devi usare quella porzione di codice che ti ho messo.

Si, ci ho provato, ma senza esiti positivi. Mi sono accorto che poi, provando ad invertire i sorgenti caricati su i due arduino, i risultati erano completamente differenti.... uno dei due adattatori sarà partito u.u

Le solite cinesate... me ne stanno per arrivare altri due, proverò anche con quelli per vedere se c'è lo stesso problema!