Nella Quattordicesima Parte della Guida si Parlerà del Protocollo di Comunicazione USART/UART…
INTRO
La sigla UART significa Universal Asynchronous Receiver-Trasmitter ovvero comunicazione universale senza segnale di sincronismo duplex, ovvero con linea dedicata per la trasmissione e linea dedicata per la ricezione. Converte un dato parallelo in un dato seriale asincrono o viceversa in ricezione.
L’evoluzione dell’UART è l’USART ovvero Universal Synchronous-Asynchronous Receiver-Trasmitter che permette una comunicazione sia con che senza segnale di sincronismo, solo che se è usata con segnale di sincronismo è half-duplex ovvero può trasmettere o ricevere non contemporaneamente.
Il protocollo USART gestisce la comunicazione della porta seriale RS-232, quindi questo protocollo può essere usato per comunicare con i personal computer. Inoltre questo protocollo può essere usato per trasmissioni con altri integrati come microcontrollori, convertitori A/D e D/A o memorie.
Per connettere un PC con il protocollo RS-232 si usa la seguente porta così connessa:
Ovviamente il livello di tensione del PIC è al massimo di 5V mentre la porta RS-232 utilizza una logica negata ovvero una tensione negativa per 1 logico mentre una tensione positiva per lo 0 logico, in particolare +12 e -12V, quindi serve un adattatore di livello.
Il PIC dispone solitamente di una struttura Hardware per realizzare la comunicazione USART e questo è il caso dei PIC18 e di alcuni PIC16. MIKROC permette inoltre di realizzare questo protocollo in modo software permettendo a tutti i PIC di realizzare questa comunicazione.
Nella modalità asincrona usa un formato di codifica NRZ ovvero non return to zero con un bit di start, 8 bit di dato e uno di stop. Il dato viene inviato a partire dal bit meno significativo. I moduli ricevente e trasmittente devono essere inizializzati con la stessa velocità di trasmissione detta BAUD RATE. Il BAUD RATE è tabellato nel datasheet del microcontrollore che si sta usando e dipende dalla frequenza di clock usata nel microcontrollore.
Ad esempio con una frequenza di 4MHz si possono avere BAUD RATE di 0.3Kbps, 1.2Kbps, 2.4Kbps, 9.6Kbps, 19.2Kbps e 76.8Kbps utilizzando un PIC18F252.
Quindi in questa guida verrà illustrata la libreria hardware per configurare questa comunicazione con un breve sguardo alla libreria software e poi verrà illustrato il codice e lo schema per realizzare una comunicazione con un PC provvisto di porta seriale RS-232.
LIBRERIA MIKROC
La libreria MIKROC permette di realizzare solo la comunicazione UART, ovvero asincrona full duplex. Le routine della libreria sono le seguenti:
UART1_Init(9600); Inizializza il modulo UART con un BAUD RATE indicato tra le parentesi tonde in bit al secondo, quindi con 9600 si indicano 9.6Kbps.
UART1_Tx_Idle() Questa funzione restituisce un bit 1 o 0 e in particolare restituisce 1 se il buffer di trasmissione è ancora occupato dall’invio di un dato precedente mentre restituisce 0 se il buffer di trasmissione è libero.
UART1_Data_Ready() Questa funzione restituisce un bit 1 o 0 e in particolare restituisce 1 se vi è un dato ricevuto nel buffer di lettura, se invece ritorna uno 0 logico allora il dato non è stato ricevuto o non è stato completamente ricevuto.
Receive = UART1_Read(); Una volta verificato che il dato è stato ricevuto con la seguente funzione si va a leggere il dato ricevuto e si inserisce nella variabile “Receive”
UART1_Read_Text(output, “OK”, 10); Questa funzione si usa quando i dati ricevuti sono stringhe di testo, “output” è il dato ricevuto, “OK” è la stringa di testo che delimita la fine della stringa ricevuta mentre “10” è il limite massimo in cui si troverà la stringa di fine. Ad esempio la stringa di testo è: “aa bb cc dd ee ff gg hh ii OK” nel quale “OK” è presente ed è contenuto nelle prime 10 stringe. Se si usa 255 al posto di 10 la rutine continuerà a cercare la stringa OK finche non la trova. Se la stringa “OK” non è nei primi 10 allora dopo 10 sequenze di caratteri la subroutine uscirà dal suo flusso e “output” sarà vuoto.
UART1_Write(data); La seguente routine scrive la variabile “data” sul bus trasmittente del modulo UART.
UART1_Write_Text(output); Questa funzione è uguale alla precedente solo che questa volta “output” non è un dato ad 8bit ma sarà una stringa di caratteri.
Se il microcontrollore usato non dispone del modulo UART/USART, MIKROC permette di creare una comunicazione con questo protocollo in modo software, senza sfruttare moduli appositi, inoltre scegliendo i pin che si vogliono dove collegare il BUS dati. La libreria dispone delle seguenti routine:
error = Soft_UART_Init(&PORTC, 7, 6, 14400, 0); Questa Routine inizializza il software per la comunicazione UART, e in particolare serve una variabile char chiamata “error” nella quale la routine inserisce un valore 0, 1 o 2. 0 se l’inizializzazione è andata a buon fine, 1 se il BAUD RATE scelto è troppo alto, mentre 2 se invece il BAUD RATE è troppo basso. Nelle parentesi si indica prima di tutto dove è connesso il BUS e in particolare si avrà RX al pin PORTC.B7 mentre RX al pin PORTC.B6, poi si indica il BAUD RATE di 14.4Kbps, e infine si indica se si vuole invertire o meno il bit di flag. Tutti questi valore possono essere cambiati.
data = Soft_UART_Read(&error); Questa routine inserisce nella variabile “data” il dato ricevuto e inoltre “error” avrà valore 1 se vi è un errore di ricezione mentre 0 se non vi è errore.
Soft_UART_Write(dato); Questa routine viene usata per inviare il dato “dato” sul bus di trasmissione.
Soft_UART_Break(); Potrebbe succedere che la comunicazione non vada a buon fine e continui a restituire errore. Per bloccare l’esecuzione delle routine sopra citate, si usa la routine di “Break”.
CODICE E SCHEMA DI ESEMPIO
Proviamo a scrivere un semplice codice per trasmettere la temperatura rilevata da un sensore ad un computer quando riceve un dato che indica il sensore. Il codice è il seguente:
char DATO_rx, _Temp; //Inizializza variabili
void main() { //Programma principale
ADC_Init(); //Inizializza ADC
UART1_Init(9600); //Inizializza UART con BAUD RATE 9.6Kbps
Delay_ms(100); //Aspetta che il modulo si stabilizza
UART1_Write_Text("NE555.IT"); //Invia una stringa di partenza
UART1_Write(10); //Invia ASCII di a capo
UART1_Write(13);
while (1) { //Ciclo infinito
if (UART1_Data_Ready()) { //Se ricevo un dato
DATO_rx = UART1_Read(); //Lo leggo
if(DATO_rx==1){ //Se il dato è 00000001..
UART1_Write_Text("Temperatura 1"); //Mostra Temperatura 1
_Temp = ADC_Get_Sample(1); //Leggi il dato del sensore 1
UART1_Write(_Temp); //Trasmetti il valore della temp
}
if(DATO_rx==2){ //Se il dato è 00000010..
UART1_Write_Text("Temperatura 2"); //Mostra Temperatura 2
_Temp = ADC_Get_Sample(2); //Leggi il dato del sensore 2
UART1_Write(_Temp); //Trasmetti il valore della temp
}
}
}
}
Prima di tutto si inizializzano due variabili, una per il dato ricevuto, una per la temperatura. Nel codice principale viene inizializzato l’ADC e l’UART con un BAUD RATE di 9.6kbps. Dopo una attesa di 100mS per stabilizzare il modulo USART viene inviata la stringa di benvenuto “NE555.IT” e poi un carattere asci per andare a capo.
Nel ciclo infinito si va a vedere se si è ricevuto un dato, in caso affermativo si va a vedere se il dato ricevuto è 1 o 2 e in base ad asse si va a leggere uno dei due sensori. Se il dato ricevuto è 1 allora si restituisce la stringa che indica quale sensore si sta andando a leggere, si va a convertire il valore del sensore e infine si invia il valore binario della temperatura. Stessa cosa accade per l’altro sensore quando si riceve il valore 2 del dato.
Lo schema è il seguente:
Il PIC18F252 è alimentato da 5V continui e l’oscillatore è fatto con un quarzo da 4MHz e due condensatori da 22pF. R1 mantiene il PIC in funzione. I due sensori sono alimentati anch’essi con tensione continua di 5V. L’integrato MAX232 è usato come traslatore di livello, è alimentato con tensione di 5V ma grazie ai condensatori da 10uF riesce a traslare i livelli logici 0/5V in livelli logici -12/12V in modo tale da essere idonei per la porta seriale del computer. Sia il TX che RX vengono convertiti e connessi tramite porta seriale al computer.
DOWNLOAD
Potete scaricare la simulazione del circuito con PROTEUS al seguente LINK!!!