GUIDA ALLA PROGRAMMAZIONE IN C DEL PIC, 14° PARTE

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!!!




 

[Voti Totali: 0 Media Voti: 0]
Segui la Nostra Pagina Facebook: Facebook

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *