Newsgroup: it.hobby.elettronica.digitale
Titolo: Protocollo per piccola rete RS485 [lunghetto]

Ciao, dovrei far dialogare un po di moduli su una piccola rete RS485
domestica...mi interessa comandare delle elettrovalvole per irrigazione,
devo muovere una webcam, gestire  qualche luce esterna, ecc.
Ho già passato un 4 coppie CAT5, una coppia per portare l'alimentazione, una
coppia per il bus RS485 (duplex), le altre due coppie per mettere in rete
LAN un pc.
Ora, vorrei realizzare un semplice protocollo (velocità 19.2 kbps),
architettura master-slave, quindi  nessuna gestione dei conflitti, ma un
semplice checksum per verificare la correttezza dei dati.
Avrei pensato ad una cosa del genere
http://www.piergm.com/elettronica/rs485/protocollo_rs485.htm
suggerimenti ?
P.S. ho scelto come header 255 255 per sincronizzare facilmente il
ricevitore, mai in nessun caso potranno esserci due bytes "255" consecutivi
in altre posizioni all'interno del pacchetto, essendo una half duplex nella
fase di risposta slave->master i nodi non interessati vedranno il pacchetto
ma ignoreranno i dati in quanto nella risposta non sarà presente l'header...
P.S n.2 : ciascun modulo avrà 31 registri accessibili in lettura-scrittura,
avrei pensato di usare, chessò, il numero 0 per identificare il tipo di
modulo ed in base al tipo di modulo gestire gli altri registri di
conseguenza (flags per lo stato di ingressi-uscite, eventuali letture
analogiche, ecc).
Ciao,
Pier.
www.piergm.com

 suggerimenti ?
non entro nel merito delle tue scelte, che mi sembrano ragionevoli, ma
potresti valutare un protocollo rodato come il Modbus/RTU. Si trovano
varie librerie in giro, per non reinventare la ruota.
Dal punto di vista hw, porta lo zero volt a tutti i nodi (se
l'alimentazione è in comune, si tratta del terminale negativo).
Inoltre, imponi terminatori e polarizzatori ad inizio e fine tratta e
proteggi tutti i nodi con una rete di clipping (leggi: zener)
opportuna.
[FIDOCAD]
MC 120 95 3 0 080
MC 120 75 3 0 080
MC 120 55 3 0 080
LI 120 85 120 75
LI 120 65 120 55
LI 120 45 120 35
MC 120 35 3 0 010
MC 45 80 2 0 000
MC 45 60 2 0 000
SA 120 60
SA 120 80
SA 120 100
LI 120 100 45 100
MC 45 100 2 0 000
TY 125 90 5 3 0 0 0 * 1.5k
TY 125 70 5 3 0 0 0 * 220
LI 120 60 125 60
LI 125 60 170 60
LI 120 80 125 80
LI 125 80 170 80
TY 40 50 5 3 0 0 0 * A
TY 40 70 5 3 0 0 0 * B
TY 40 90 5 3 0 0 0 * 0V
LI 120 95 120 100
TY 175 60 5 3 0 0 0 * RS485 transceiver
RV 170 50 230 90
LI 130 100 120 100
MC 150 105 1 0 230
MC 150 135 3 0 230
LI 150 60 150 105
LI 150 140 150 135
MC 160 105 1 0 230
MC 160 135 3 0 230
LI 160 80 160 105
LI 160 135 160 140
LI 160 140 150 140
LI 130 100 130 140
LI 130 140 150 140
SA 150 140
SA 150 60
SA 160 80
TY 170 110 5 3 0 0 0 * 5.1v
TY 130 25 5 3 0 0 0 * rete di polarizzazione
TY 130 30 5 3 0 0 0 * e terminazione solo nel primo
TY 130 35 5 3 0 0 0 * e nell'ultimo nodo
TY 105 30 5 3 0 0 0 * +5V
TY 125 50 5 3 0 0 0 * 1.5k
LI 45 60 75 60
LI 75 80 45 80
MC 75 80 0 0 080
LI 85 60 120 60
LI 120 80 85 80
MC 75 60 0 0 080
TY 75 50 5 3 0 0 0 * 4.7
TY 75 70 5 3 0 0 0 * 4.7
Saluti,
simone.bern

 opportuna.
Toh, quello che stavo giusto per disegnare...
Pensavo di mettere la resistenza a tra i due segnali un po' più alta (1K),
perché non ho dei trasmettitori veri e propri, ma solo i pin di un
controller che possono essere l'entrata di un comparatore analogico o,
chiaramente, delle uscite, e poi devo fare meno di due metri in totale.
Di conseguenza pensavo di mettere i pullup/down a 4,7 K e gli zener ad una
sola estremità (in realtà la mia rete è un cerchio, che inizia e finisce,
fisicamente, sulla stessa scheda, che funge anche da alimentatore).
Le resistenze all'ingresso sono da 4.7 ohm? In tal caso sarebbe forse
meglio indicarle come 4.7R (personalmente preferisco 4R7).
A cosa servono? Consigli di metterle in tutti i nodi o solo agli estremi?


Ti ringrazio...per il protocollo vorrei provare ad implementare il mio, per
l'hardware provvedero' ad inserire quel che manca, ovvero i diodi zener e le
resistenze in serie :)
Ciao,
Pier.
www.piergm.com

suggerimenti ?
Ti consiglierei almeno di usare dei caratteri standard per gli header.
Il protocollo  RS485 dovrebbe usare gli standard STX(02h) per iniziare
e  ETX(03h) per finire la stringa,e al centro solo caratteri ASCII>20H
Per sicurezza è meglio inserire un checksum o BCC (può essere lo xor
di tutte le parole della stringa o gli otto bits bassi della somma, a
seconda selle scuole).
La stringa diventa: 02h..addr...dati....03h BCC
Per esempio, per trasmettere "ABC" all'indirizzo 01 diventa:
02 30 31 34 31 34 32 34 33 03 +1byte di BCC
Se BCC<20h allora BCC=BCC+20h per non confonderli coi comandi
Poi dovresti implementare anche i Nak e Ack per sapere se la
comunicazione è andata a buon fine (BCC verificato) o se devi
rimandare la stringa.
;STANDARD DI COMUNICAZIONE SECONDO DIN 66019
STX = 02H       ;INIZIO TRASMISSIONE
ETX = 03H       ;FINE TESTO
EOT = 04H       ;FINE TRASMISSIONE
ENQ = 05H       ;RICHIESTA COLLEGAMENTO AL TERMINALE
ACK = 06H       ;DATO RICEVUTO CORRETTAMENTE RISPOSTA "OK"
NAK = 15H       ;RISPOSTA "NON COMPRESO, RIPETERE" 
--
ciao
  Stefano

 A cosa servono? Consigli di metterle in tutti i nodi o solo agli estremi?
Su tutti i nodi, alzano un po' la resistenza serie dei diodi in caso
di loro intervento. Aggiungendo un condensatore (piccolo) tra i
segnali A e B, a valle delle resistenze, si riduce l'impedenza nei
nodi non terminati. Per un bus di questo tipo, può essere un modo per
controllare l'impedenza di linea alle alte frequenze.
Chiedo venia per il dimensionamento spannometrico, si tratta di
tradurre caso per caso i valori indicativi in quelli corretti.
Saluti,
Simone.bern

 tradurre caso per caso i valori indicativi in quelli corretti.
Grazie moltissime.

 Condensatore da 10 nF?
Perchè no ? Noi usiamo 470pF, abbiamo in genere qualche decina di nodi
e per quel tipo di topologia è risultata la scelta giusta.
Saluti,
simone.bern

 e per quel tipo di topologia è risultata la scelta giusta.
Quindi mi sa che, con i miei valori delle resistenze, per me sia meglio
mettere 100 pF
Grazie ancora.


Ciao,
Pier.
www.piergm.com