Differenze
Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.
software:devices:sercom [2019/08/29 17:01] – modifica esterna 127.0.0.1 | software:devices:sercom [2020/07/13 15:17] (versione attuale) – qem103 | ||
---|---|---|---|
Linea 1: | Linea 1: | ||
+ | ====== DEVICE SERCOM ====== | ||
+ | |||
+ | |||
+ | ====== - Introduzione ====== | ||
+ | |||
+ | Il device SERCOM è uno strumento residente allinterno della CPU che permette di ricevere e trasmettere dei dati tramite | ||
+ | delle porte di comunicazione seriali presenti sullhardware utilizzato. I dati ricevuti vengono immagazzinati in un buffer di | ||
+ | dimensione impostabile. Inoltre la ricezione può essere regolata in maniera automatica tramite lapplicazione del protocollo | ||
+ | XON-XOFF. Per trasmettere i dati invece si utilizza unarea di memoria fissa formata da 64 byte. Dato che i buffer i | ||
+ | ricezione e di trasmissione sono diversi, è possibile realizzare un collegamento sia di tipo Half-Duplex che di tipo Full- | ||
+ | Duplex.\\ | ||
+ | Utilizzando le funzionalità a basso livello di questo device sarà possibile implementare nel codice QCL il protocollo di comunicazione | ||
+ | a livello più alto rendendo possibile la comunicazione seriale con strumentazione diversa (es.: lettori codici a | ||
+ | barre, trasduttori di posizione con trasmissione del dato in seriale, piccole stampanti, ecc.). | ||
+ | |||
+ | |||
+ | ===== - Installazione ===== | ||
+ | |||
+ | ==== - Dichiarazione device nel file di configurazione (.CNF) ==== | ||
+ | |||
+ | Dichiarazione del device utilizzato (device interno): nome del device assegnato, SERCOM, tempo di campionamento, | ||
+ | porta seriale gestita, dimensione del buffer di ricezione. | ||
+ | <code QCL> | ||
+ | ; | ||
+ | ; | ||
+ | ; | ||
+ | INTDEVICE | ||
+ | ... | ||
+ | < | ||
+ | ... | ||
+ | </ | ||
+ | |||
+ | Dove: | ||
+ | |INTDEVICE|é la parola chiave che indica linizio della definizione di devices interni,| | ||
+ | |< | ||
+ | |SERCOM|é la parola chiave che identifica il device descritto in questo documento,| | ||
+ | |TCamp|é tempo di campionamento del device,| | ||
+ | |serial_port|è la definizione del tipo diporta seriale collegata (0 = Prog, 1 = User, il numero\\ identificativo di altre porte seriali presenti dipende dal tipo hardware e firmware dello strumento utilizzato).| | ||
+ | |dim_buffer_rx|è il numero di bytes da utilizzare per il buffer circolare di ricezione. Se il numero\\ viene omesso dal carattere X, oppure è inferiore al valore minimo di 48,\\ esso viene impostato al valore minimo. Il valore massimo ammesso è 32000.| | ||
+ | |||
+ | Per quanto riguarda la dichiarazione dellhardware utilizzato nella sezione BUS dellunità di configurazione si dovrà fare | ||
+ | riferimento al manuale firmware dellhardware stesso. | ||
+ | <code QCL> | ||
+ | Esempio | ||
+ | ; | ||
+ | ; | ||
+ | ; | ||
+ | INTDEVICE | ||
+ | ... | ||
+ | DevSer | ||
+ | ... | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== - Buffer di ricezione e di trasmissione ===== | ||
+ | |||
+ | I buffer di ricezione e trasmissione sono distinti, è quindi possibile effettuare un collegamento sia di tipo Half-Duplex che | ||
+ | Full-Duplex. | ||
+ | |||
+ | ==== - Buffer di ricezione ==== | ||
+ | |||
+ | Il buffer di ricezione è un memoria di tipo FIFO (First Input First Output). Il device mette a disposizione in un parametro ( | ||
+ | ibyte1 ), in seguito ad un comando ( RECEIVED ), il primo dato ricevuto. Inoltre esiste un parametro che contiene il numero | ||
+ | di dati ricevuti e presenti nel buffer ( nrx ). Con queste informazioni risulta semplice scrivere un programma in QCL | ||
+ | che possa svuotare il buffer man mano che arrivano i dati.\\ | ||
+ | Il buffer in realtà è circolare, | ||
+ | sovrascrivere quelli ricevuti precedentemente (se non si utilizza il XON-XOFF). Questultimo evento viene segnalato nel | ||
+ | parametro err.\\ | ||
+ | La dimensione del buffer di ricezione è impostabile nel file di configurazione al momento della dichiarazione del device. | ||
+ | E importante dimensionare correttamente il buffer di ricezione per evitare perdite di dati. Ad esempio, se uno strumento | ||
+ | normalmente trasmette una stringa di 100 caratteri ed il buffer ha una capacità di memorizzarne 50, o si ferma la trasmissione | ||
+ | della stringa o si perdono i dati, quindi la dimensione del buffer devessere ben calcolata. Se lo strumento trasmittente | ||
+ | gestisce il protocollo XON-XOFF il device interrompe la sua trasmissione inviando il carattere di XOFF, rattivandola | ||
+ | con il carattere di XON quando viene liberato spazio nel buffer. | ||
+ | |||
+ | ==== - Buffer di trasmissione ==== | ||
+ | |||
+ | Il buffer di trasmissione è di dimensione fissa. Esso è composto dalle variabili // | ||
+ | della trasmissione è possibile quindi scrivere ogni singolo byte in trasmissione. Con un singolo comando ( //SEND// ) sarà | ||
+ | poi possibile trasferire un messaggio composto da un numero //ntx// di byte (fino a 64 massimo). Se ciò non fosse sufficiente, | ||
+ | è sempre possibile trasmettere più pacchetti consecutivi in modo da completare il messaggio. Lutilizzo di una trasmissione | ||
+ | a pacchetti successivi richiede che nel sistema ricevente non siano abilitati i time-out sulla ricezione tra un carattere | ||
+ | e il successivo (vedere capitolo Limitazioni). | ||
+ | |||
+ | ==== - Controllo di flusso ==== | ||
+ | |||
+ | Il device utilizza un controllo di flusso software, formato dallinvio/ | ||
+ | di attivare o bloccare temporaneamente la trasmissione del dispositivo esterno verso il Qmove in modo da consentire | ||
+ | lelaborazione dei dati già ricevuti e lo svuotamento del buffer. Il controllo di flusso può essere abilitato come funzionalità | ||
+ | automatica in modo da evitare il riempimento del buffer di ricezione.\\ | ||
+ | La soglia di //XOn// e //XOff// sono fissate rispettivamente dai parametri: //xonlim// e // | ||
+ | |||
+ | |||
+ | ===== - Tabella comandi e parametri ===== | ||
+ | |||
+ | ==== - Simbologia adottata ==== | ||
+ | |||
+ | Il nome del parametro, stato o comando viene riportato alla sinistra della tabella. | ||
+ | |||
+ | **R**\\ | ||
+ | Indica se il relativo parametro o stato è ritentivo (al momento dellinizializzazione del device mantiene lo stato precedentemente definito), oppure lo stato che assume al momento dellinizializzazione del device.\\ Se il device non necessita di inizializzazione il campo R indica il valore che il parametro o stato assume allaccensione della scheda.\\ | ||
+ | R = Ritentivo\\ | ||
+ | 0 = Al momento dellinizializzazione del device il valore viene forzato a zero.\\ | ||
+ | 1 = Al momento dellinizializzazione del device il valore viene forzato a uno.\\ | ||
+ | - = Al momento dellinizializzazione del device viene presentato il valore significativo. | ||
+ | |||
+ | **D**\\ | ||
+ | Indica la dimensione del parametro.\\ | ||
+ | F = Flag\\ | ||
+ | B = Byte\\ | ||
+ | W = Word\\ | ||
+ | L = Long\\ | ||
+ | S = Single Float | ||
+ | |||
+ | === - Condizioni === | ||
+ | Vengono descritte tutte le condizioni necessarie affinché il parametro sia considerato corretto o perché il comando venga | ||
+ | accettato.\\ | ||
+ | In alcuni casi vengono specificati dei valori limite per laccettazione del parametro: se vengono introdotti dei valori esterni | ||
+ | ai limiti impostati, il dato viene comunque accettato; pertanto devono essere previsti opportuni controlli dellapplicativo tali | ||
+ | da garantire il corretto funzionamento.\\ | ||
+ | Per lesecuzione di un comando, tutte le relative condizioni devono necessariamente essere soddisfatte; | ||
+ | il comando non viene eseguito. | ||
+ | |||
+ | **A**\\ | ||
+ | Indica la modalità di accesso.\\ | ||
+ | R = Read (lettura).\\ | ||
+ | W = Write (scrittura).\\ | ||
+ | RW = Read / Write. | ||
+ | |||
+ | ==== - Comandi ==== | ||
+ | |||
+ | I comandi a disposizione per gestire il device sono elencati sotto l' | ||
+ | comandi ricevuti entro lo stesso tempo di campionamento iniziando da quello con la priorità maggiore. Per esempio se il | ||
+ | device riceve nello stesso tempo di campionamento i comandi CLOSECOM e OPENCOM, per primo esegue il comando | ||
+ | OPENCOM e poi quello di CLOSECOM lasciando perciò la porta di comunicazione chiusa. | ||
+ | |||
+ | ^Nome^D^R^A^Condizioni^Descrizione^ | ||
+ | |OPENCOM| | ||
+ | |CLOSECOM| | ||
+ | |SEND| | ||
+ | |RECEIVED| | ||
+ | |FLUSH| | ||
+ | |CLRWDATA| | ||
+ | |CLRWCMD| | ||
+ | |||
+ | ==== - Parametri ==== | ||
+ | |||
+ | ^Nome^D^R^A^Condizioni^Descrizione^ | ||
+ | |mode|B|R|RW| | ||
+ | |brate|L|R|RW| | ||
+ | |datab|B|R|RW| | ||
+ | |stopb|B|R|RW| | ||
+ | |par|B|R|RW| | ||
+ | |xonlim|W|R|RW| | ||
+ | |xofflim|W|R|RW| | ||
+ | |ntx|W|0|RW| | ||
+ | |nrx|W|0|R| | ||
+ | |ibyte1|B|0|R| | ||
+ | |obyte1÷64|B|0|RW| | ||
+ | |err| - | - | - | - |**Errors**\\ Indica se sono stati riscontrati errori nel protocollo.\\ **0** = nessun errore\\ **1** = overflow buffer ricezione; indica che sono stati ricevuti più caratteri rispetto alla capienza del buffer.| | ||
+ | |serr| | ||
+ | |st_sended|F|0|R| | ||
+ | |st_rxoff|F|0|R|mode = 1|**XOff on receive**\\ Se mode = 1 indica che il sistema è in XOff nella ricezione perché il numero di dati contenuti nel buffer di ricezione è sceso al di sotto della soglia di controllo.\\ Viene resettato automaticamente quando viene inviato il carattere di XOn dopo che il buffer di ricezione è stato " | ||
+ | |st_txoff|F|0|R| | ||
+ | |wdata|F|0|R| | ||
+ | |wcmd|F|0|R| | ||
+ | |st_opencom|F|0|R| | ||
+ | |||
+ | |||
+ | ===== - Limitazioni ===== | ||
+ | |||
+ | Di seguito vengono elencate alcune limitazioni sullutilizzo del device SERCOM: | ||
+ | * Non è possibile utilizzare il device con i sistemi che controllano i time-out tra caratteri, se la lunghezza del messaggio da trasmettere supera la dimensione del buffer di trasmissione; | ||
+ | * La velocità massima è di 57600 baud, la minima è 4800; | ||
+ | * Se il collegamento avviene verso sistemi che utilizzano controlli di flusso diversi da XOn/XOff, è necessario implementare il controllo stesso utilizzando il QCL. Se poi i sistemi utilizzano un controllo di flusso hardware, essi non sono collegabili; | ||
+ | * Se il collegamento avviene verso sistemi in una catena daisy-chain in cui ogni componente esegue lecho dei caratteri ricevuti, è necessario fare attenzione alle velocità di propagazione dei dati poiché la funzione di echo dovrà essere eseguita utilizzando il QCL. | ||
+ | * Non tutte le combinazioni di valori dei parametri DataBits, StopBits e ParityBit sono abilitate. Se si utilizza una combinazione di valori non abilitata, quando si tenta di aprire la porta seriale mediante il comando OPENCOM il device genera un warning command. | ||
+ | Di seguito uno schema delle combinazioni: | ||
+ | |||
+ | ^ ^DataBits^StopBits^ParityBit^ | ||
+ | |Combinazioni NON Funzionanti|7|1|0| | ||
+ | |:::|7|1|1| | ||
+ | |:::|7|1|2| | ||
+ | |:::|7|2|0| | ||
+ | |:::|7|2|1| | ||
+ | |:::|7|2|2| | ||
+ | |:::|8|2|0| | ||
+ | |:::|8|2|1| | ||
+ | |:::|8|2|2| | ||
+ | |||
+ | |||
+ | ===== - Esempio applicativo ===== | ||
+ | |||
+ | Di seguito si riportano alcuni esempi su come utilizzare il device.\\ | ||
+ | Negli esempi il nome del device sarà DevSer. | ||
+ | |||
+ | ==== - Trasmissione di una stringa ==== | ||
+ | |||
+ | Trasmissione di una stringa di controllo in formato ASCII verso uno strumento serie DIN HB237.04A. | ||
+ | |||
+ | La stringa da trasmettere è: **{13QL1234561000@** | ||
+ | |||
+ | Il codice da scrivere è il seguente: | ||
+ | <code QCL> | ||
+ | DevSer:mode = 0 | ||
+ | ... | ||
+ | address = 13 | ||
+ | quota = 123456 | ||
+ | ... | ||
+ | DevSer: | ||
+ | tmp = address | ||
+ | tmp1 = tmp / 10 | ||
+ | DevSer: | ||
+ | tmp = tmp - (tmp1 * 10) | ||
+ | DevSer: | ||
+ | DevSer: | ||
+ | DevSer: | ||
+ | tmp = quota | ||
+ | tmp1 = tmp / 100000 | ||
+ | DevSer: | ||
+ | tmp = tmp - (tmp1 * 100000) | ||
+ | tmp1 = tmp / 10000 | ||
+ | DevSer: | ||
+ | tmp = tmp - (tmp1 * 10000) | ||
+ | tmp1 = tmp / 1000 | ||
+ | DevSer: | ||
+ | tmp = tmp - (tmp1 * 1000) | ||
+ | tmp1 = tmp / 100 | ||
+ | DevSer: | ||
+ | tmp = tmp - (tmp1 * 100) | ||
+ | tmp1 = tmp / 10 | ||
+ | DevSer: | ||
+ | tmp = tmp - (tmp1 * 10) | ||
+ | DevSer: | ||
+ | DevSer: | ||
+ | DevSer: | ||
+ | DevSer: | ||
+ | DevSer: | ||
+ | DevSer: | ||
+ | |||
+ | DevSer:ntx = 16 ; imposta l' | ||
+ | |||
+ | SEND DevSer | ||
+ | WAIT DevSer: | ||
+ | </ | ||
+ | |||
+ | ==== - Ricezione di una stringa ==== | ||
+ | |||
+ | Ricezione di una stringa proveniente da uno strumento HB237.04A in formato ASCII e esecuzione delleco di ogni carattere | ||
+ | ricevuto. | ||
+ | |||
+ | La stringa da ricevere è: **[13RS123456123456@** | ||
+ | |||
+ | Il codice da scrivere è: | ||
+ | <code QCL> | ||
+ | DevSer:mode = 0 | ||
+ | sequenza = 0 | ||
+ | ... | ||
+ | WAIT DevSer: | ||
+ | RECEIVED DevSer | ||
+ | DevSer: | ||
+ | DevSer:ntx = 1 ; imposta l' | ||
+ | SEND DevSer | ||
+ | IF sequenza EQ 0 | ||
+ | IF DevSer: | ||
+ | indirizzo = 0 | ||
+ | sequenza = 1 | ||
+ | ENDIF | ||
+ | ENDIF | ||
+ | IF sequenza EQ 1 | ||
+ | indirizzo = DevSer: | ||
+ | sequenza = 2 | ||
+ | ENDIF | ||
+ | IF sequenza EQ 2 | ||
+ | indirizzo = indirizzo + DevSer: | ||
+ | IF indirizzo EQ 13 ; verifica valore indirizzo | ||
+ | sequenza = 3 | ||
+ | ELSE | ||
+ | sequenza = 0 | ||
+ | ENDIF | ||
+ | ENDIF | ||
+ | ... | ||
+ | WAIT DevSer: | ||
+ | </ | ||
+ | |||