Programmazione di MPLAB Xpress Board: quinto esempio: ADC e Porta Seriale

Con questo quinto esempio vediamo ancora che si può imparare a programmare facilmente un microcontrollore Microchip, il PIC16F18855 contenuto all'interno della MPLAB Xpress Evaluation Board della Microchip (DM164140)

Leggere questo articolo dopo il primo e dopo il quarto .

Si deve far riferimento alla seconda pagina dello schema elettrico.

Lo scopo di questo quinto esempio è di testare il modulo ADCC integrato, ossia il modulo del convertitore analogico digitale. Si usa un sensore di temperatura TMP36, lo stesso che si trova anche nel kit di Arduino, e si configura la porta seriale per vedere su una finestra del PC con il programma PuTTY il valore letto dall'ADC, il valore in tensione, il valore in gradi centigradi e il valore in gradi Fahreneit. In alternativa si puo' usare il programma Coolterm. Su linux si puo' usare anche il comando

$cat /dev/ttyACM0 

Per la caratteristica del sensore, si può vedere qui.

A seconda del valore della tensione letto dal sensore, essendo un ADC a 10 bit il valore convertito è compreso tra 0 e 1023.

 

Non si vuole usare MCC Code Configurator. Non si ha nulla in contrario ad usarlo, anzi il codice che esso produce viene preso come "punto di partenza" per creare un codice più snello e semplificato.

 

Si usa MPLAB Xpress IDE in cloud, creando un nuovo progetto.

New Project --> Microchip Embedded ---> Standalone Project

Family: Mid Range 8-bit MCUs (PIC 10/12/16)

Device: PIC16F18855

eppoi si sceglie il nome significativo al progetto: PIC16F18855_Temperature_TMP36

Si comincia inserendo il programma principale main.c:

Ecco il codice:

/*
 * File:   main.c
 * Author: mariani.fausto
 * 
 * Created on 2/13/2018 2:39:45 PM UTC
 * "Created in MPLAB Xpress"
 */



#include "adcc.h"  // to include adcc header
#include "eusart.h"  // to include eusart header
#include "config.h"  // custom edited config file.
#include <xc.h>


void main(void)
{
    // initialize the device
    SYSTEM_Initialize();

    uint16_t raw;
    while (1)
    {
        /*delivers a number of 0 to 1023, defined by 
        (Vref / 1024) = step size in volts */   
        
        raw = ADCC_GetSingleConversion(tempsense);
        
        float voltage = ( (raw / 1024.0) * 3.3 ) - 0.5;
        
        //converts the ADCC value to degrees celcius using scale equation
        float temp_celsius = voltage * 100;   
        
        //converts the Celsius value to Fahrenheit   
        float ftemp = (temp_celsius * (1.8)) + 32;     
        
        //prints a string to the computer terminal   
        printf("ADCC valore letto: %i - Tensione in V %2.2f - Temperatura in Celsius: %2.2f - Fahrenheit Value: %2.2f \n\r", raw, voltage, temp_celsius, ftemp); 

        __delay_ms(300);
    }
}

Non si riporta anche il codice di configurazione config.h che conviene prendere da uno dei tanti esempi preesistenti, oppure si può prendere quello del primo articolo.

Nel progetto ci saranno altri due file eusart.c e eusart.h, la prima volta conviene vedere un esempio su Internet. Qui non vengono riportati, consultare gli esempi della Microchip.

Inoltre nel progetto è conveniente che ci siano altri due file adcc.h e adcc.c, il primo nella parte Header files e il secondo nella parte.

Fare solo estrema attenzione alla frequenza di comunicazione della porta seriale, il valore di alcuni registri la determina a partire dal clock. È necessario per questa parte l'uso di MCC oppure la lettura approfondita del datasheet per le pagine del modolo USART.

 

Chiaramente per comprendere nei dettagli il funzionamento è conveniente consultare il datasheet.

 

La struttura del progetto è

TMP36-Pic

 

Per quel che riguarda i collegamenti elettrici, alla breadboard vanno collegate la massa e l'alimentazione a 3,3V proventi dalla MPLAB Xpress evaluation board. Inoltre l'uscita del sensore TMP36 va collegata a RC7 della PORTC.

 

Ecco una foto del funzionamento, in cui si vede che toccando con la mano il sensore, lentamente la temperatura rilevata si alza.

 

 

 

Risultati dal sensore