Protocollo di comunicazione seriale DPM
(Dilbertian Protocol Modified)
Nota sul nome del protocollo
Il nome “Dilbertiano” proviene dalla prima versione di questo protocollo, che chiamammo “IDP Inverted Dilbertian Protocol” (2010), nella quale gli zeri erano rappresentati con una cella “stretta” e gli uni con una cella “larga” (“0” magro e “1” grasso – come da vignetta seguente tratta da “Dilbert” di Scott Adams – www.dilbert.com).
Perché un nuovo protocollo ?
Il sistema Theremino si propone di fornire un sistema di Input-Output per PC semplice, poco costoso e facile da usare. Per renderlo facile da usare sono necessari l’auto-numerazione dei dispositivi e il riconoscimento dei loro tipi, per semplificare e ridurre al minimo il costo dei collegamenti è necessaria la comunicazione su un filo solo.
Non esistendo un protocollo simile abbiamo dovuto scriverlo. La versione attuale raccoglie il meglio di molti anni di sperimentazioni e ricerche.
Download di questa documentazione in formato PDF:
DPM_Protocol_2015_ENG.pdf
DPM_Protocol_2015_ITA.pdf
Caratteristiche
- Comunicazione seriale bidirezionale su un solo filo.
- Auto-configurazione.
- Auto-riconoscimento dei dispositivi collegati.
- Numero di dispositivi variabile da 1 a 200.
- Numero di byte trasmessi e ricevuti variabile a seconda del tipo di dispositivo.
- Velocità di trasmissione fino a 4 MegaBit/sec per trasmettere molti dati con cavi corti.
- Velocità di trasmissione fino a 100 KiloBit/sec per cavi molto lunghi (fino a 10 Km).
- Alta efficienza di comunicazione (da 10 a 20 volte maggiore rispetto al CAN).
Aspetti elettrici
La trasmissione avviene su un solo filo, ma è necessaria una massa di riferimento e una tensione di alimentazione, per cui i fili sono normalmente tre.
Ogni dispositivo che supporta il protocollo DPM deve avere un connettore di ingresso (verso il Master) e uno di uscita verso i dispositivi a valle (Slaves)
I connettori normalmente usati sono da 3 poli, con spaziatura di 2.54 mm.
Sulla catena di comunicazione deve essere presente un Master (che fornisce sincronismo e alimentazione) e un certo numero di dispositivi collegati in cascata (chiamati Slave).
La tensione che il Master fornisce sulla linea è di 5 V, con la stessa tolleranza e con la stessa corrente massima dei 5 V che si prelevano dal connettore USB.
La corrente massima che il Master può fornire rappresenta un limite al numero e al tipo di dispositivi collegabili. Questa corrente, è normalmente 250 mA, e potrebbe essere aumentata fino a 500 mA. Andando oltre si supererebbe la capacità dell’USB e si imporrebbero caratteristiche inusuali ai connettori.
Il numero massimo di dispositivi collegabili è limitato dai fattori seguenti:
– La corrente massima che il “Master” può fornire.
– Il numero massimo di byte che la linea sopporta in tempo di ciclo di rice-trasmissione.
Sia il “Master” che gli “Slave” sono collegati alla linea con un resistore di smorzamento, che agisce anche come passa basso, contro i disturbi radio e come protezione contro le sovratensioni. Il valore di questo resistore è normalmente da 33 a 330 ohm
Formato di trasmissione
Si usa un formato Non-Return-to-Zero (NRZ) standard.
Default format = 8, N, 1
– 1 start bit
– 8 data bits
– no-parity
– 1 stop bit
Livelli della linea dati “Com.Line”
La linea a riposo è a livello alto (3.3 V)
Il segnale “1” è indicato con 3.3 V
Il segnale “0” è indicato con 0 V
Tempi di ripetizione e velocità di trasmissione
Velocità di trasmissione
Si usano velocità basse quando la lunghezza, e quindi la capacità dei cavi di collegamento, sono alte. Quando invece le distanze sono brevi si possono usare velocità alte e comunicare con un gran numero di dispositivi (o comunicare con dispositivi che richiedono un gran numero di byte) Sono stabilite le velocità denominate da “1” (1 k bit/Sec) fino a “12” (4 mega bit/Sec)
Numero massimo di byte
A seconda della velocità di trasmissione il numero massimo di byte che si possono trasmettere è elencato nella tabella seguente.
Tempi, distanze e numero di byte
Speed
|
bit time
|
bit
per
second
|
Bytes
every 15mS |
Bytes every
30mS |
Max distance
|
Max capacity
|
Slaves
max
number
|
1
|
1 mS
|
1K
|
1
|
3
|
10 Km
|
1 uF
|
3
|
2
|
500 uS
|
2K
|
3
|
6
|
5 Km
|
500 nF
|
6
|
3
|
200 uS
|
5K
|
4
|
8
|
2 Km
|
200 nF
|
15
|
4
|
100 uS
|
10K
|
15
|
30
|
1 Km
|
100 nF
|
30
|
5
|
50 uS
|
20K
|
30
|
60
|
500 m
|
50 nF
|
60
|
6
|
20 uS
|
50K
|
40
|
80
|
200 m
|
20 nF
|
150
|
7
|
10 uS
|
100K
|
150
|
300
|
100 m
|
10 nF
|
160
|
8
|
5 uS
|
200K
|
300
|
600
|
50 m
|
5 nF
|
80
|
9
|
2 uS
|
500K
|
400
|
800
|
20 m
|
2 nF
|
32
|
10
|
1 uS
|
1M
|
1500
|
3000
|
10 m
|
1 nF
|
16
|
11
|
500 nS
|
2M
|
3000
|
6000
|
5 m
|
500 pF
|
8
|
12
|
250_nS
|
4M
|
6000
|
12000
|
2.5 m
|
250 pF
|
4
|
Tutti i dispositivi devono implementare per lo meno la velocità “7” che è considerata la velocità di default. Se si desidera impostare una velocità diversa dalla “7” tutti i dispositivi della catena devono supportarla.
La “massima distanza” dipende dalle caratteristiche dei cavi, i valori della tabella sono calcolati per un cavo schermato RG58 da 50 ohm con capacità di 100pF per metro.
Alle velocità basse il numero di “slaves” è limitato dal numero massimo di byte che si possono trasmettere in 30 millisecondi. (ogni slave usa almeno un byte e si pretende una ripetizione abbastanza veloce da rendere i movimenti fluidi)
Alle velocità alte il numero di “slaves” è limitato dalla capacità massima, ogni “slave” aggiunge una capacità di circa 40..60 pF e riduce la massima distanza di circa 50 cm.
La capacità è stata calcolata sulla base di 30pF per ogni “slave” cui si aggiungono altri 20pF per un cavo di collegamento da 20 centimetri e altri 10pF per tenere conto della resistenza aggiuntiva provocata dal “bilateral switch” (totale: 60pF)
Massima lunghezza del cavo di comunicazione rispetto alla corrente di alimentazione e alla resistenza per metro
Cable type —>
Maximum current
( peak current )
|
H1500/H1000/ H500/H155/RG11
20 milli ohm
or less
per meter
|
RG58/RG59U/ H155/
net cables
about
50 milli ohm
per meter
|
RG59/RG6/phone twisted wire/
net cables
about
100 milli ohm
per meter
|
10 mA | 1 Km | 400 m | 200 m |
20 mA | 500 m | 200 m | 100 m |
50 mA | 200 m | 80 m | 40 m |
80 mA | 125 m | 50 m | 25 m |
100 mA | 100 m | 40 m | 20 m |
200 mA | 50 m | 20 m | 10 m |
400 mA | 25 m | 10 m | 5 m |
500 mA | 20 m | 8 m | 4 m |
800 mA | 12.5 m | 5 m | 2.5 m |
1 A | 10 m | 4 m | 2 m |
Nel calcolo della distanza si tiene conto che la caduta di tensione sul polo di massa, non superi i 200 mV. La caduta di tensione sul filo di alimentazione, non provocando errori di trasmissione, può essere anche molto maggiore (i 5 V possono scendere fino a 3.3 V senza creare problemi) In caso di cavi schermati il polo di massa è lo schermo, che normalmente ha una resistenza minore di quella dichiarata, quindi la distanza sarà maggiore.
Capacità dei cavi di collegamento
I valori di “massima lunghezza” indicati nella tabella precedente sono validi solo per cavi di collegamento con capacità di circa 100 pF per metro. La tabella seguente mostra le correzioni da applicare per i cavi di uso più comune.
Cable
|
External
diameter
( mm )
|
Impedance
( ohm )
|
Capacity
(pF/mt.)
|
Resistance
(milliohm
/ meter)
|
Max length corrector
|
H1500
|
15
|
50
|
80
|
4
|
x 1.25
|
H1000
|
10.3
|
50
|
80
|
11
|
x 1.25
|
RG213
|
10.3
|
50
|
100
|
|
–
|
H500
|
9.8
|
50
|
82
|
15
|
x 1.22
|
H155
|
5.8
|
50
|
82
|
32
|
x 1.22
|
RG8
|
10
|
52
|
90
|
|
–
|
RG11 (TV)
|
10.3
|
75
|
60
|
21
|
x 1.7
|
RG59 (TV)
|
6.15
|
75
|
67
|
159
|
x 1.5
|
RG6_(TVsat)
|
6.8
|
75
|
51
|
100
|
x 2.0
|
RG56/U_(TV)
|
6.9
|
75
|
53
|
|
x 2.0
|
RG59/U_(TV)
|
4.5
|
75
|
53
|
45
|
x 2.0
|
RG58
|
5.2
|
50
|
100
|
53
|
–
|
RG142
|
4.95
|
50
|
96
|
|
–
|
RG174
|
2.8
|
50
|
100
|
|
–
|
RG178
|
1.85
|
50
|
95
|
|
–
|
RG179
|
2.55
|
75
|
64
|
|
x 1.5
|
RG187
|
2.7
|
75
|
65
|
|
x 1.5
|
RG188
|
2.7
|
50
|
95
|
|
–
|
RG196
|
1.9
|
50
|
93
|
|
–
|
RG316
|
2.5
|
50
|
95
|
|
–
|
Net cable
|
|
|
min 50
max 130
|
min 60
max 200
|
x 2.0
x 0.7
|
PC Audio cable
|
|
|
min 120
max 300
|
min 500
max 3000
|
x 0.8
x 0.5
|
Microphonic
cable
|
|
|
min 60
max 300
|
|
x 1.7
x 0.3
|
Telephone twisted wire
|
|
|
50
|
100
|
x 2.0
|
Esistono anche cavi a bassa capacità (poco usati e difficilmente reperibili):
- RG62 – 93 ohm – 44 pF/mt
- RG71 – 93 ohm – 44 pF/mt
- RG210 – 93 ohm – 44 pF/mt
- RG63 – 125 ohm – 33pF/mt
- RG114 – 185 ohm – 27pF/mt
Misurare la capacità di un cavo sconosciuto:
- Preparare il cavo schermato spellandolo e mantenendo isolato il filo centrale.
- Misurare tra centrale e schermatura esterna con un tester o capacimetro.
- Per migliorare la precisione di misura, usare cinque o dieci metri di cavo.
- Dividere il valore di PicoFarad misurato per il numero di metri di cavo.
Tipi di dispositivi
I dispositivi sono identificati con un numero da 0 a 199 che identifica il suo “Type”.
Nella fase di riconoscimento e numerazione ogni dispositivo si identifica con questo “Type”.
Attualmente sono definiti i dispositivi seguenti:
Device Type
|
Speed
min
|
Speed max
|
In out Pins
|
Power
|
Name
|
0
|
Special “custom” type
|
||||
1
|
1
|
12
|
1
|
12 mA
|
Capacitive Sensor
Hi Quality
|
2
|
1
|
12
|
10
|
InOut Servo
|
|
3
|
1
|
12
|
12
|
InOut Generic
|
|
4
|
1
|
12
|
12
|
InOut
|
|
5
|
6
|
Virtual Master Pins
(first version) |
|||
8
|
10
|
Virtual Master Pins – V2
|
|||
9 | 12 | Virtual Master Pins – V4 | |||
255 | Unknown |
Numero massimo di dispositivi
Il numero massimo di dispositivi collegabili è limitato da:
– il numero massimo di byte che possono essere trasmessi a seconda della velocità selezionata.
– la corrente massima che il “master” può fornire (normalmente 500 mA)
– il massimo numero di dispositivi supportato dal protocollo che è 200 (da 0 a 199)
Tipi di pin
I pin sono identificati con un numero da 0 a 255 che identifica il suo “PinType”.
OUTPUT Pin Types
Output Pin
Type
|
Name
|
Master to Slave
bytes
|
Slave to Master
bytes
|
0
|
UNUSED
|
0
|
0
|
1
|
DIG_OUT
|
1
|
0
|
2
|
PWM_8
|
1
|
0
|
3
|
PWM_16
|
2
|
0
|
4
|
SERVO_8
|
1
|
0
|
5
|
SERVO_16
|
2
|
0
|
6 | STEPPER | 4 | 0 |
7 | PWM_FAST | 5 | 0 |
INPUT Pin Types
Input Pin
Type
|
Name
|
Master to Slave
bytes
|
Slave to Master
bytes
|
129
|
DIG_IN
|
0
|
1
|
130
|
DIG_IN_PU
|
0
|
1
|
131
|
ADC_8
|
0
|
1
|
132
|
ADC_16
|
0
|
2
|
133
|
CAP_8
|
0
|
1
|
134
|
CAP_16
|
0
|
2
|
135
|
RES_8
|
0
|
1
|
136
|
RES_16
|
0
|
2
|
140
|
COUNTER
|
0
|
2
|
141
|
COUNTER_PU
|
0
|
2
|
142
|
FAST_COUNTER
|
0
|
2
|
143
|
FAST_COUNTER_PU
|
0
|
2
|
144
|
PERIOD
|
0
|
4
|
145
|
PERIOD_PU
|
0
|
4
|
146
|
SLOW_PERIOD
|
0
|
4
|
147
|
SLOW_PERIOD_PU
|
0
|
4
|
150
|
USOUND_SENSOR
|
0
|
2
|
160
|
CAP_SENSOR
|
0
|
3
|
165
|
STEPPER_DIR
|
0
|
4
|
180
|
ENCODER_A
|
0
|
2
|
181
|
ENCODER_A_PU
|
0
|
2
|
182
|
ENCODER_B
|
0
|
0
|
183
|
ENCODER_B_PU
|
0
|
0
|
175
|
ADC_24
|
0
|
1
|
176
|
ADC_24_DIN
|
0
|
0
|
177
|
ADC_24_DOUT
|
0
|
0
|
Comunicazioni tra Master e Slaves (linea seriale)
Primo byte | Tipo di trasmissione | Trasmissione | Ricezione |
255 (*4) | Comando speciale esteso (per future espansioni) |
1 byte (estensione) >>>>> vedere la tabella dei comandi estesi <<<<< |
— |
254 (*1) | RecogStart Inizio riconoscimento e numerazione |
1 byte (numero byte dati = 0) 1 byte (CRC di Cmd / 0) |
— |
253 (*2) | Recog Invio numero progressivo e richiesta del tipo |
1 byte (numero byte dati = 1) 1 byte (da 0 a 199) 1 byte (CRC di Cmd/Nbytes/Type) |
1 byte ( tipo ) 1 byte ( CRC ) |
251 (*3) | FastDataExchange Scambio di dati veloce. |
1 byte (numero byte dati = 0) 1 byte (CRC di Cmd/0) da 0 a 60 byte di dati |
Da 0 a 63 byte di dati |
249 (*4) | SetupSlavePins Invio delle impostazioni per i pin di uno “slave” |
1 byte (slave index) 1 byte (numero di byte dati) nn byte (PinTypes: 1 byte per pin) 1 byte (CRC di Cmd/SlaveId/ etc..) |
1 byte (slave index) 1 byte (CRC sul byte precedente) |
248 (*4) | SetMasterName Invio del nome del “master” |
nn byte (caratteri del nome terminati con zero) | — |
247 (*4) | GetMasterName Lettura del nome del “master” |
— | nn byte (caratteri del nome terminati con zero) |
246 (*4) | SendValuesToSlave Invio di “n” bytes a slave “m” (max 56 byte) |
1 byte (slave index) 1 byte (numero di byte) byte 1 . . . byte n 1 byte (CRC di Cmd/SlaveId/nBytes/n) |
1 byte (slave index) 1 byte (CRC sul byte precedente) |
245 (*4) | GetValuesFromSlave Richiesta di “n” bytes da slave “m” (max 56 byte) |
1 byte (slave index) 1 byte (numero di byte) 1 byte (CRC di Cmd/SlaveId/nBytes) |
byte1 . . byte n 1 byte (slave index) 1 byte (CRC sugli n + 1 byte precedenti) |
244 (*4) | SendBytesToSlave Invio di “n” bytes a slave “m” (max 56 byte) |
1 byte (slave index) 1 byte (numero di byte) byte 1 . . . byte n 1 byte (CRC di Cmd/SlaveId/nBytes/n) |
1 byte ( slave index ) 1 byte ( CRC ) sul byte precedente |
243 (*4) | GetBytesFromSlave Richiesta di “n” bytes da slave “m” (max 56 byte) |
1 byte (slave index) 1 byte (numero di byte) 1 byte (CRC di Cmd/SlaveId/nBytes) |
byte 1 . . . byte n 1 byte (slave index) 1 byte ( CRC ) sugli n + 1 byte precedenti |
199 (*5) | SetSpeed | 1 byte (Comm. Speed) 1 byte (CRC su Cmd/Comm.Speed) |
— |
0 | Nessuna azione |
(*1) Comandi di servizio.
(*2) Il comando Recog viene usato solo dal master e dagli slaves durante il riconoscimento.
(*3) Comunicazione veloce – il master scambia i valori con tutti gli slaves usando un solo scambio USB
(*4) Comandi di comunicazione sicura verso il singolo slave
(*5) Comandi speciali
SendValuesToSlave invia i valori ai Pin di Output di uno slave (virtuale sul Master o Fisico nei moduli Slaves)
GetValuesFromSlave legge i valori dai Pin di Input di uno slave (virtuale sul Master o Fisico nei moduli Slaves)
SendBytesToSlave invia byte generici (ad esempio di configurazione), verso uno slave (virtuale sul Master o Fisico nei moduli Slaves)
GetBytesFromSlave legge byte generici (ad esempio di stato), da uno slave (virtuale sul Master o Fisico nei moduli Slaves)
Tutti i comandi hanno codici da 200 a 255, per evitare che, in caso di errori, gli ID e i tipi degli slave (da 0 a 199) possano venir interpretati come comando. (SetSpeed non conta perché non viene mai inviato lungo la linea seriale ma solo dall’HAL, verso il Master, via USB)
Comunicazioni tra Host computer e Master (USB)
Comandi da “Host” verso “Master”
Command name | ID USB_TxData[0] |
PARAMETERS USB_TxData[1 to n] |
RecogStart | CommandID, | Nbytes |
FastDataExchange | CommandID, | From 0 to 60 data bytes |
SetupSlavePins | CommandID, | SlaveId, Nbytes |
SetMasterName | CommandID, | MasterName (zero terminated) |
GetMasterName | CommandID, | – |
SendValuesToSlave | CommandID, | SlaveId, Nbytes, Byte1….ByteN |
GetValuesFromSlave | CommandID, | SlaveId, Nbytes |
SendBytesToSlave | CommandID, | SlaveId, Nbytes, Byte1….ByteN |
GetBytesFromSlave | CommandID, | SlaveId, Nbytes |
SetSpeed | CommandID, | CommSpeed |
Risposte da “Master” verso “Host”
Command name | RESPONSE USB_RxData[0] |
RETURN VALUES USB_RxData[1 to n] |
RecogStart | 0 = OK | Nslaves, Slave Type1 … Slave Type N |
FastDataExchange | 0 = OK | From 0 to 63 data bytes |
SetupSlavePins | 0 = OK | – |
SetMasterName | 0 = OK | – |
GetMasterName | 0 = OK | Master Name (zero terminated) |
SendValuesToSlave | 0 = OK | – |
GetValuesFromSlave | 0 = OK | Byte 1 … Byte N |
SendBytesToSlave | 0 = OK | – |
GetBytesFromSlave | 0 = OK | Byte 1 … Byte N |
SetSpeed | 0 = OK | – |
La posizione zero del Buffer USB indica se il comando è stato eseguito dal “Master” con successo.
Calcolo dei CRC
Tutti i CRC usati sono calcolati su un certo numero di byte consecutivi e il CRC risultante è un byte. Per il calcolo del CRC si usa un algoritmo basato sul “Longitudinal redundancy check”.
Longitudinal redundancy check
Dim CRC as Byte
CRC = 0
For each byte b
CRC = CRC Xor b
Next
Per evitare “collisioni” tra sequenze banali ( ad esempio 0000 = 1111 o 123 = 321 ) e sequenze semplici che producono CRC validi ( ad esempio 0000 con CRC = 0 ) il metodo precedente viene modificato con una permutazione.
Il calcolo del CRC risultante è efficiente ed estremamente semplice.
Calcolo del CRC usato in questo protocollo
Dim CRC as Byte
CRC = 0
For each byte b
CRC = CRC Xor b
CRC = CRC + 1
Next
Impostazione della velocità di trasmissione
Se si decide di usare una velocità di trasmissione diversa da quella di default, allora il “master” deve comunicare a tutti i dispositivi della catena la nuova velocità da usare.
Questa impostazione deve essere possibile anche prima di aver effettuato un ciclo di riconoscimento dei dispositivi e deve essere possibile anche con linee di trasmissione molto lunghe. Pertanto esiste il comando speciale che viene ora illustrato.
1 – Il Master mantiene la linea alta per 50 mS
2 – Tutti gli Slave sono sicuramente posizionati in attesa di un carattere
3 – Il Master genera un BREAK (linea a livello basso per 12 bit alla minima velocità
4 – Il Master emette un carattere 55h (01010101) al baud rate desiderato
5 – Tutti gli Slave deducono il baud rate da questo byte (auto-baud)
6 – Il Master invia un byte che specifica la “Speed” (da 1 a 12)
7 – Il Master invia un byte di CRC calcolato su due byte (cmd/speed)
8 – Se lo Slave riscontra un errore non cambia la sua velocità
Verifica della velocità di trasmissione
Se imposta una velocità troppo alta per la linea di trasmissione in uso è possibile che alcuni dispositivi della catena non siano in grado di sostenere la velocità impostata e che si verifichino errori durante la trasmissione dei dati.
Se gli errori di trasmissione sono pari a zero o minori dello 0.1% allora la velocità impostata è valida.
Riconoscimento e numerazione
1 – Il Master emette verso gli Slave tutta la sequenza di impostazione “Speed” per assicurarsi che tutti comunichino alla stessa velocità.
2 – Il Master non trasmette comandi per 50 millisecondi.
3 – A questo punto tutti gli Slave dovrebbero essere in attesa di un comando.
4 – Il Master emette un codice “254″ (RecogStart).
5 – Tutti gli Slave mettono il weak-pull-up (100-400 uA) sul filo di input-output e aprono il collegamento di uscita verso i dispositivi a valle. Inoltre essi non rispondono più a nessun comando tranne il “253″ (Recog).
6 – Il Master” emette un codice “253″ (richiesta del tipo) e poi un byte con il numero “0″, il primo dispositivo della catena risponde un byte con il suo tipo, toglie il pull-up, collega l’uscita verso gli Slave a valle e non risponde più a nessun comando.
7 – Il Master emette un codice “253″ (richiesta del tipo) e poi un byte con il numero “1″, il secondo dispositivo della catena risponde un byte con il suo tipo, toglie il pull-up, collega l’uscita verso gli Slave a valle e non risponde più a nessun comando.
8 – Il Master emette un codice “253″ (richiesta del tipo) e poi un byte con il numero “2″,
9 – Il Master emette verso gli Slave tutta la sequenza di impostazione “Speed”, che riporta tutti gli Slave nella modalità di normale comunicazione.
10 – Il Master comunica all’Host (PC) tramite USB il numero di Slave riconosciuti e il tipo di ciascuno di essi.
Roberto_Cena & Livio_Cicala (2010 – 2016)