Trasmissione seriale asincrona

PIC18 e UART: connessione USB

L'interfaccia seriale asincrona è un "protocollo antico", ma ancora utilizzato sebbene in un contesto ben diverso da quello di 50 anni fa. In questa pagina vedremo come utilizzarla per trasmettere dati da un PIC18 ad un PC o ad un telefonino attraverso le interfacce USB oppure Bluetooth.

Il segnale seriale asincrono

Innanzitutto esaminiamo la "forma" del segnale che il PIC dovrà trasmettere:

Quando è necessario trasmettere e ricevere, vengono utilizzati due fili separati: Tx (trasmissione) e Rx (ricezione), ma l'esempio mostrato si limita ad una comunicazione simplex.

Esercizio

Negli esercizi qui sotto proposti trasmettitore e ricevitore si sono accordati per trasmettere secondo i seguenti parametri (nota 3):

Dato il seguente segnale, codificato con i dati sopra riportati, riconoscere il byte trasmesso.

Trasmissione seriale asincrona: 0x35

[Risposta: 0x35 - 0011 0101]

Esercizio (complesso)

Dato il seguente segnale, codificato con gli stessi dati sopra riportati, riconoscere i byte trasmessi. Notare il cambiamento nella base dei tempi rispetto al diagramma temporale precedente.

Esercizio

Il circuito

Il circuito è particolarmente semplice in quanto verranno utilizzati (in alternativa) due moduli già assemblati, facilmente reperibili in commercio per pochi euro:

Entrambi gli adattatori sono disponibili con connettori facili da inserire in una breadboard, come quello visibile nella fotografia di apertura; il secondo è anche uno dei moduli opzionali già presenti su PICdemo R2.

Il collegamento tra PIC e modulo è estremamente semplice:

Il codice

Il primo programma mostrato trasmette continuamente, circa 10 volte al secondo, ad un terminale USB oppure Bluetooth un saluto costituito da "Hi" seguito da un a capo (i due caratteri ASCII CR e LF).

Il nucleo del codice che trovate a fondo pagina è costituito da due subroutine:

  1. configura_uart. Questa subroutine deve essere richiamata all'inizio del programma, una sola volta, e permette di impostare correttamente il funzionamento della periferica EUSART interna al PIC18. In particolare:
  1. invia_byte Questa subroutine trasmette al modulo Bluetooth oppure USB il byte contenuto in WREG, attendendo la fine della trasmissione. Questa funzione va richiamata ad ogni trasmissione di un singolo byte, dopo aver caricato in WREG il byte da trasmettere. In particolare:

Non è necessario comprendere nel dettaglio il funzionamento di queste due subroutine, piuttosto tecniche in quanto modificano molti bit in molti registri. E' invece necessario avere chiare le funzioni svolte ed essere in grado di utilizzarle.

RCSTA

Tabella 18.3

Generatore di clock

Tabella 9.4

A fondo pagina è presente anche un secondo codice nel quale viene mostrato come trasmettere una stringa. In esso sono presenti anche tecniche non elementari, quali l'uso di stringhe e di variabili inizializzate.

Un limite del codice mostrato è legato al fatto che, all'interno della subroutine invia_byte, è presente un ciclo che attende la trasmissione del byte inserito nel registro TXREG, perdendo tempo che potrebbe essere utilizzato per attività più utili. Per valutare questo aspetto potrebbe essere utile considerare che, nell'esempio mostrato:

Tale comportamento viene a volte indicato come codice bloccante in quanto blocca l'esecuzione del codice in attesa di un evento esterno determinato, in questo caso il termine della trasmissione di un byte. Per una possibile soluzione, si veda l'esercizio 1.

Configurare il PC o il telefono per ricevere

Prima di collegare un PC è bene collegare un oscilloscopio per osservare il segnale trasmesso dal PIC18. Se il segnale è corretto possiamo proseguire sapendo che il lato trasmissione funziona correttamente.

USB (Linux)

Innanzitutto è necessario collegare il modulo USB al PC. Appena collegato, anche a PIC spento, dovrebbe apparire il device /dev/ttyUSB0 (o qualcosa dal nome simile), per esempio;

vv@vv-inspiron:~$ ls -l /dev/tty*
crw-rw-rw- 1 root tty 5, 0 ago 10 10:20 /dev/tty
crw--w---- 1 root tty 4, 0 ago 10 10:20 /dev/tty0
...
crw-rw---- 1 root dialout 188, 0 ago 10 10:20 /dev/ttyUSB0

Verificare inoltre che l'utente appartenga al gruppo dialout (oppure tty):

vv@vv-inspiron:~$ groups
vv dialout cdrom floppy audio dip video plugdev netdev bluetooth pico

Per leggere i caratteri inviati dal PIC occorre usare (o scrivere) un programma per visualizzare quanto ricevuto. Per esempio di seguito la configurazione e l'uso di PuTTY.

Configurazione PuTTY PuTTY

USB (Windows)

La procedura sopra descritta dovrebbe funzionare anche con MS Windows (non testato). L'interfaccia seriale in genere è identificata come COMxx

Bruetooth (Android)

Occorre preliminarmente installare una App per gestire terminali Bluetooth, per esempio Bluetooth Terminal. Quindi si procede all pairing tra telefono e modulo Bluetooth HC-06 / HC-04 usando i normali strumenti Android. Se richiesto, il codice di default è 1234. Prima del pairing il LED sul modulo Bluetooth dovrebbe lampeggiare lentamente, dopo dovrebbe rimanere acceso fisso.

Infine di avvia l'App, e si seleziona il modulo

 

Il codice

Esercizi

  1. Scrivere la subroutine invia_byte_no_block in cui l'esecuzione del return segue immediatamente la scrittura del byte in TXREG. Ovviamente è comunque necessario un controllo del fatto che il registro di trasmissione sia vuoto prima di trasmettere un nuovo byte

Note

  1. Il modulo USB è alimentato direttamente dal PC e quindi non necessita di essere alimentato dal PIC. E' possibile anche collegare le due alimentazioni e NON alimentare separatamente il PIC, per esempio disattivando il flag presente nella configurazione del PICkit
  2. In questa pagina non viene affrontata la trasmissione da PC/telefonino a PIC
  3. Ovviamente è solo un esempio (anche se questi parametri sono ampiamente usati nel mondo reale)

 

Data di creazione di questa pagina: marzo 2017
Ultima modifica: 18 aprile 2018


Licenza Creative Commons Attribuzione 4.0 Internazionale


Pagina principaleAccessibilitàNote legaliPosta elettronicaXHTML 1.0 StrictCSS 3

Vai in cima