Calcolo tempi trasmissione seriale

Salve a tutti,
Volendo realizzare l'ennesimo dispositivo MIDI ho tentato di calcolare i tempi di latenza minimi che comporta la trasmissione seriale:
Partendo dal presupposto che 31250baud nel caso specifico corrispondono a 31250bps ho trattato il tasso di simbolo alla stregua di una frequenza, ne ho ricavato il periodo (1/31250) ed ottenuto il valore di 0,032ms. Interpreto questo valore come "il tempo necessario alla trasmissione di un singolo bit" e lo moltiplico per il payload da trasmettere (3 byte) arricchito da una coppia di bit di start/stop per ogni byte ed ottengo un tempo di trasmissione, per il singolo messaggio, di 0,96ms.
La verifica empirica, mediante controllo dei tempi di una tastiera MIDI, mi mostra un intervallo temporale fra un segnale e il seguente (per due tasti premuti contemporaneamente) di 189ns.
Dove ho sbagliato con i miei calcoli?
Grazie in anticipo :slight_smile:

E questa velocità di 31250 baud da dove l'hai pescata ??? :astonished:

I baud-rate standard sono : 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, o 115200 ...
... è una velocità particolare dell'interfaccia MIDI ??? :roll_eyes:

Guglielmo

gpb01:
E questa velocità di 31250 baud da dove l'hai pescata ??? :astonished:

Si, è la velocità del protocollo che "anima" lo standard MIDI

Luigi88:
La verifica empirica, mediante controllo dei tempi di una tastiera MIDI, mi mostra un intervallo temporale fra un segnale e il seguente (per due tasti premuti contemporaneamente) di 189ns.

... ok per il baud-rate fuori standard, passando quindi a questa tua frase ... cosa intendi con "intervallo temporale tra un segnale e il seguente" ??? Il tempo tra un carattere (10 bit) ed il successivo carattere (i seguenti 10 bit) ? O cosa ?

Guglielmo

gpb01:
"intervallo temporale tra un segnale e il seguente" ??? Il tempo tra un carattere (10 bit) ed il successivo carattere (i seguenti 10 bit) ? O cosa ?

Per verificare i miei calcoli ho usato un programma per OSX chiamato MIDIMonitor che permette di sniffare i dati in transifo su di una porta MIDI. Grazie a questo ho appurato che tra un messaggio MIDI e il seguente intercorrono 189ns.
Un messaggio MIDI è composto da 30 bit (3 byte più i due bit di start/stop), quindi ne deduco che il tempo d'invio di 30 bit è 189ns.

OK, quindi: primo_messaggio_30_bits <--- 189 nsec ---> secondo_messaggio_30_bits e tu vuoi sapere perché in mezzo c'è quell'intervallo di 189 nsec ???

Immagino serviranno al device che genera le due sequenze per elaborare gli eventi ... tu premi un tasto, deve essere letto, codificato e poi, infine, trasmesso ... non è che queste cose, per quanto veloce sia il processor che c'è dentro lo strumento , abbiano tempo zero ... :roll_eyes:

Guglielmo

gpb01:
OK, quindi: primo_messaggio_30_bits <--- 189 nsec ---> secondo_messaggio_30_bits e tu vuoi sapere perché in mezzo c'è quell'intervallo di 189 nsec ???

Immagino serviranno al device che genera le due sequenze per elaborare gli eventi ... tu premi un tasto, deve essere letto, codificato e poi, infine, trasmesso ... non è che queste cose, per quanto veloce sia il processor che c'è dentro lo strumento , abbiano tempo zero ... :roll_eyes:

Guglielmo

Questo è scontato... Ma non è ciò che chiedevo: Io voglio capire perché c'è un tempo di 189ns invece di quello di 0,96ms il cui calcolo ho esplicitato nel primo post... Mi sembra logico che il mio calcolo sia sbagliato, vorrei capire qual'è quello corretto... A prescindere dalla velocità della MCU a parità di tasso di simbolo dovrebbe volerci lo stesso tempo per trasmettere 30bit

Scusa, ma 0.96 msec sono il tempo di trasmissione dei TRE caratteri NON l'intervallo tra un blocco di tre ed il successivo (tue parole : "Grazie a questo ho appurato che tra un messaggio MIDI e il seguente intercorrono 189ns.") che, con la durata dei singoli bits e dei caratteri ... non ha nulla a che vedere ...

Continuo quindi a non capire cosa vuoi sapere esattamente ... :roll_eyes:

Guglielmo

Edit: In ogni caso queste misure sui tempi si fanno con un analizzatore HW e non con un SW di debug del protocollo ...

gpb01:
Scusa, ma 0.96 msec sono il tempo di trasmissione dei TRE caratteri NON l'intervallo tra un blocco di tre ed il successivo (tue parole : "Grazie a questo ho appurato che tra un messaggio MIDI e il seguente intercorrono 189ns.") che, con la durata dei singoli bits e dei caratteri ... non ha nulla a che vedere ...

Il mio ragionamento è: se premo due tasti della tastiera contemporaneamente la sua MCU invierà due messaggi. La differenza fra i tempi d'arrivo del primo e del secondo sarà pari al tempo del'elaborazione (necessario a comporre il messaggio) e il tempo necessario per l'invio dei bit. Non è corretto?
La domanda originale, comunque, resta:
Posto un protocollo seriale con velocità pari a 31250bps e volendo calcolare il tempo totale necessario ad inviare un messaggio di 30 bit, posso trattare il tasso di simbolo alla stregua di una frequenza, ricavando il periodo (1/31250) e moltiplicando il risultato per la mole di dati da trasmettere?

Luigi88:
Il mio ragionamento è: se premo due tasti della tastiera contemporaneamente la sua MCU invierà due messaggi. La differenza fra i tempi d'arrivo del primo e del secondo sarà pari al tempo del'elaborazione (necessario a comporre il messaggio) e il tempo necessario per l'invio dei bit. Non è corretto?

Scusa, tu premi un tasto, la tastiera lo acquisisce, va a prendere in una look-up table il carattere da trasmettere prepara il messaggio e ... tutto questo ha impiegato i 189 nsec. ... poi trasmette effettivamente i 3 char (che impiegano 0.96 msec.) e il ciclo si ripete per il prossimo tasto ...

<tempo elaborazione (189 nsec)> ... ... ... ...

Luigi88:
La domanda originale, comunque, resta:
Posto un protocollo seriale con velocità pari a 31250bps e volendo calcolare il tempo totale necessario ad inviare un messaggio di 30 bit, posso trattare il tasso di simbolo alla stregua di una frequenza, ricavando il periodo (1/31250) e moltiplicando il risultato per la mole di dati da trasmettere?

Si, se il tutto è bufferizzato e non ci sono tempi morti, il calcolo è esatto.

Guglielmo

gpb01:
Scusa, tu premi un tasto, la tastiera lo acquisisce, va a prendere in una look-up table il carattere da trasmettere prepara il messaggio e ... tutto questo ha impiegato i 189 nsec. ... poi trasmette effettivamente i 3 char (che impiegano 0.96 msec.) e il ciclo si ripete per il prossimo tasto ...

<tempo elaborazione (189 nsec)> ... ... ... ...

Ma durante l'invio seriale il programma non si ferma?
<tempo elaborazione (189 nsec)> ... <invio seriale dei char(0,96ms)>...[Il computer riceve il primo messaggio] ...<tempo elaborazione (189 nsec)> ... <invio seriale dei char(0,96ms)> ...[Il computer riceve il secondo messaggio]...

Il punto indicato da [Il computer riceve il secondo messaggio] dovrebbe essere ad (almeno) 189ns+0,96ms da [Il computer riceve il primo messaggio] poiché se la seriale è impegnata a trasmette i primi 3 char deve aspettare di aver terminato prima di inviare i successivi tre, no? :s

EDIT: Ho fatto la contro-prova con il programma d'esempio MIDI Out contenuto nell'IDE... Lo stesso sniffer mi da 1ms fra un messaggio e l'altro, confermando il calcolo.

gpb01:
Si, se il tutto è bufferizzato e non ci sono tempi morti, il calcolo è esatto.

Grazie mille, mi spiace di non esser stato così diretto dal principio, pensavo che il quesito fosse più chiaro

Luigi88:
Ma durante l'invio seriale il programma non si ferma?

No perché l'RX/TX sono pilotati via interrupt per cui il tuo programma continua a girare mentre i dati vengono trasmessi o ricevuti.

In realtà non è del tutto vero che il programma non si ferma perché gli interrupt effettivamente interrompono (da qui il loro nome) il programma principale ma sono eventi del tutto trasparenti al codice dell'utente e discretamente brevi per cui possiamo approssimare dicendo che il programma non si ferma.

leo72:

Luigi88:
Ma durante l'invio seriale il programma non si ferma?

No perché l'RX/TX sono pilotati via interrupt per cui il tuo programma continua a girare mentre i dati vengono trasmessi o ricevuti.

In realtà non è del tutto vero che il programma non si ferma perché gli interrupt effettivamente interrompono (da qui il loro nome) il programma principale ma sono eventi del tutto trasparenti al codice dell'utente e discretamente brevi per cui possiamo approssimare dicendo che il programma non si ferma.

Tutto chiaro, grazie mille!

Se dovesse servire, l'ultima versione della libreria MIDI la trovi qui --> GitHub - FortySevenEffects/arduino_midi_library: MIDI for Arduino