Ricezione UART

Cirtcuito RTX UART

In fase di sviluppo Stesura preliminare In fase di sviluppo

In questa pagina viene mostrato come ricevere un byte usando UART. Prima di leggere questa pagina, si consiglia la lettura di Trasmissione seriale asincrona.

Il circuito

Il circuito è particolarmente semplice e simile a quanto già illustrato, pagina a cui si rimanda per i dettagli. L'unica differenza consiste nel collegare il pin RX (ricezione) del PIC (pin 18, RC7) al pin TX (ricezione) del modulo USB o Bluetooth. Se il modulo USB termina con fili, in genere TX è quello di colore verde (verificare!). Altrimenti è indicato in chiaro sulla serigrafia.

Ovviamente i due circuiti possono essere realizzati contemporaneamente, come mostrato nella fotografia di apertura in riferimento ad un modulo USB.

Il codice

Il primo programma esemplificativo permette di:

Per utilizzare questo programma è necessario utilizzare su PC o telefonino un terminale seriale (puTTY, CuteCom, Bluetooth Terminal...), una app come Bluetooth Electronics oppure scrivere un proprio programma.

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; è sostanzialmente uguale a quella di trasmissione e le differenze si riducono all'attivazione della ricezione in aggiunta alla trasmissione
  1. ricevi_byte. Riceve un singolo byte. In particolare:

La funzione ricevi_byte non è bloccante, nel senso che non attende l'arrivo di un byte, ma semplicemente lo legge se è già arrivato. Se veda il quesito 1.

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.

Molte impostazioni, in particolare il baud rate, sono già state descritte e quindi non vengono qui riprese. Si segnalano solo i due seguenti flag:

CREN

Il flag RCIF del registro PIR1

Per leggere il byte ricevuto è sufficiente accedere al registro RCREG. Questa operazione automaticamente azzera il flag RCIF.

Overrun

La lettura di un byte ricevuto deve avvenire prima della ricezione di un secondo byte (nota 1), pena un Overrun Error che blocca il ricevitore. Questo obiettivo non è facile da ottenere:

Nel caso di errore da overrun, per sbloccare il ricevitore è necessario agire sul flag CREN disattivando e successivamente riattivando il ricevitore. Se veda l'esercizio 2.

Uso di Interrupt

Per proseguire è opportuno leggere prima la pagina Interrupt in Compatibility mode

La ricezione di un byte è un tipico esempio in cui l'uso di un interrupt è particolarmente utile: l'arrivo di un byte interrompe l'esecuzione del programma principale e la ISR provvede immediatamente a gestire il byte arrivato.

Un codice di esempio è disponibile a fondo pagina.

La configurazione della periferica è sostanzialmente identica a quanto già mostrato, con le uniche modifiche relative alla generazione delle interruzioni (nota 3):

La Interrupt Service Routine è sostanzialmente identica alla subroutine già vista.

Occorre prestare attenzione al fatto che il codice all'interno della ISR deve essere il più veloce possibile in quanto eventuali nuovi byte ricevuti potrebbero essere persi: durante l'esecuzione di una ISR è infatti automaticamente disattivato il flag GIE (e ripristinato al termine). In particolare devono essere assolutamente assenti cicli di ritardo e codice bloccante (che invece potrebbero essere presenti all'interno del codice principale).

Il terzo esempio mostrato è più articolato:

Il codice

Note

  1. In realtà il ricevitore contiene un buffe FIFO Hardware  formato da due byte: quindi la lettura del byte ricevuto deve avvenire prima della ricezione di un terzo byte
  2. Questo rende anche problematico il debug, non potendo usare liberamente i breakpoint o l'esecuzione passo-passo
  3. L'esempio è relativo a Interrupt in Compatibility mode

Esercizi e quesiti

  1. Perché la subroutine di ricezione deve obbligatoriamente essere non bloccante?
  2. Modificare la subroutine di ricezione per identificare e rimuovere un eventuale Overrun Error. A questo proposito si legga il paragrafo 18.1.2.6 Receive Overrun Error dei fogli tecnici

 

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


Licenza Creative Commons Attribuzione 4.0 Internazionale


Pagina principaleAccessibilitàNote legaliPosta elettronicaXHTML 1.0 StrictCSS 3

Vai in cima