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 è 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 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:
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:
Per leggere il byte ricevuto è sufficiente accedere al registro RCREG. Questa operazione automaticamente azzera il flag RCIF.
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.
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:
Data di creazione di questa pagina: aprile 2018
Ultima modifica: 18 aprile 2018
Assembly PIC18 - Versione 0.5 - aprile 2018
Copyright 2016-2018, Vincenzo Villa (https://www.vincenzov.net)
Assembly PIC18 di Vincenzo Villa è distribuito con Licenza Creative Commons Attribuzione 4.0 Internazionale