Salta al contenuto principale

Con questo articolo si mostra come si può imparare a programmare facilmente un microcontrollore Microchip, il PIC16F18875 contenuto all'interno della Microchip Curiosity HPC Development Board (DM164136), dal costo davvero contenuto.

Al momento in cui scrivo questo articolo il costo della Board, che include anche altri utili componenti, è di circa 43 euro. Costava 28 euro qualche anno fa.

La programmazione viene fatta con il linguaggio C e il compilatore XC8 della Microchip. L'ambiente di sviluppo che usiamo è MPLAB Xpress IDE, in cloud.

Parliamo prima dell'Hardware della Board.

La Microchip Curiosity HPC Development Board può essere alimentata con un cavo USB dal proprio computer.

Nel seguente datasheet dal sito ufficiale si può vedere lo schematico della Board.

La seconda pagina dello schematico è relativa all'hardware del programmatore, con interfaccia USB verso il computer. In esso è presente il PIC24FJ256GB106 che gestisce la comunicazione via USB e i pin che servono a programmare il PIC16F18875 fornito con la Curiosity Board a 40 pin e indicato nello schema elettrico con "Target PIC 40P DIP".

Il processo di programmazione del PIC16F18875 è dunque "trasparente". Non ce ne dobbiamo occupare, perché lo ha pensato e fatto funzionare la Microchip.

La prima pagina del datasheet è più interessante. Si vede il Target PIC 40P DIP che nel mio caso è il PIC16F18875.

Il Pin RA0 è collegato ad un potenziometro di valore nominale 10kΩ.

Il Pin RA4 è collegato al diodo Led SMD D2, il Pin RA5 è collegato al diodo Led SMD D3, il Pin RA6 è collegato al diodo Led SMD D4, il Pin RA7 è collegato al diodo Led SMD D5.

Sono visibili due pulsanti normalmente aperti, denominati S1 e s2 e collegati agli ingressi RB4 e RC5 rispettivamente, tramite resistenze di Pull-Up.

Sono presenti due file di Header femmina doppi per un totale di 40 pin (20 per lato) che possono essere utili per il collegamento con Breadboard o con PCB personalizzati.

 

Sono inoltre presenti degli header o pin header con uscita femmina, per le connessioni con i dispositivi della Mikroelettronica con MikroBus e con il mondo esterno sensori ed attuatori.

Come si vede dallo schema elettrico c'è un oscillatore al quarzo esterno che viene usato quando si decide di non usare quello integrato all'interno del PIC.

La prima volta che la si collega al PC, prima ancora di sovrascrivere il comportamento originale preprogrammato dalla Microchip, si nota che il led D2 è acceso. Girando il potenziometro si accende anche il led D3 tramite un "fading". Quindi è preprogrammata una lettura analogica del potenziometro. Se è tutto girato in senso orario D3 è spento, girandolo in senso antiorario inizia ad accendersi e la sua intensità è sempre più visibile quanto più si gira il potenziometro.

Se si tiene premuto il pulsante S1 si accende il diodo D5, se si tiene premuto invece il pulsante S2 si accende il diodo D4.

 

 

 

Lo scopo di questo primo esempio è di fare lampeggiare il solo led D5 con intervallo di mezzo secondo.

L'inserimento di questo piccolo programma sovrascrive il programma fornito nativamente da Microchip.

Non si vuole usare MCC Code Configurator.

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: PIC16F18875

eppoi si sceglie il nome significativo al progetto: PIC16F18875_Curiosity_Blink_D5

Si comincia inserendo il programma principale main.c:

Ecco il codice:

/*
 * File:   main.c
 * Author: mariani.fausto
 *
 * Created on 11/14/2017 1:31:17 PM UTC
 * "Created in MPLAB Xpress"
 */


#include "config.h"  // custom edited config file.
#include <xc.h>

#define _XTAL_FREQ  500000

void main(void) {
    SYSTEM_Initialize();
    TRISA = 0b00000000; // we set RA7 as Output
    PORTA = 0x00;
    while(1) {
        LATAbits.LATA7 = 1;
        __delay_ms(500);
        LATAbits.LATA7 = 0;
        __delay_ms(500);
    }
    return;
}

Per completezza si riporta anche il codice di configurazione config.h e config.c che conviene prendere da uno dei tanti esempi preesistenti.

/* 
 * File:   config.h
 * Author: mariani.fausto
 *
 * Created on 11/14/2017 1:33:47 PM UTC
 * "Created in MPLAB Xpress"
 */

#ifndef CONFIG_H
#define	CONFIG_H

#include <xc.h>
#include <stdint.h>
#include <stdbool.h>

/**
 * @Param
    none
 * @Returns
    none
 * @Description
    Initializes the device to the default states configured in the
 *                  MCC GUI
 * @Example
    SYSTEM_Initialize(void);
 */
void SYSTEM_Initialize(void);

/**
 * @Param
    none
 * @Returns
    none
 * @Description
    Initializes the oscillator to the default states configured in the
 *                  MCC GUI
 * @Example
    OSCILLATOR_Initialize(void);
 */
void OSCILLATOR_Initialize(void);

void PIN_MANAGER_Initialize(void);
#endif	/* CONFIG_H */

ed infine 

/*
 * File:   config.c
 * Author: mariani.fausto
 *
 * Created on 11/14/2017 1:35:19 PM UTC
 * "Created in MPLAB Xpress"
 */
/**
  @Generated MPLAB(c) Code Configurator Source File

  @Company:
    Microchip Technology Inc.

  @File Name:
    mcc.c

  @Summary:
    This is the mcc.c file generated using MPLAB(c) Code Configurator

  @Description:
    This header file provides implementations for driver APIs for all modules selected in the GUI.
    Generation Information :
        Product Revision  :  MPLAB(c) Code Configurator - 4.0
        Device            :  PIC16F18875
        Driver Version    :  1.02
    The generated drivers are tested against the following:
        Compiler          :  XC8 1.35
        MPLAB             :  MPLAB X 3.40
*/

/*
    (c) 2016 Microchip Technology Inc. and its subsidiaries. You may use this
    software and any derivatives exclusively with Microchip products.

    THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER
    EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED
    WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A
    PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION
    WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION.

    IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,
    INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND
    WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS
    BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE
    FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN
    ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
    THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.

    MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE
    TERMS.
*/

// Configuration bits: selected in the GUI

// CONFIG1
#pragma config FEXTOSC = OFF    // External Oscillator mode selection bits->Oscillator not enabled
#pragma config RSTOSC = HFINT1    // Power-up default value for COSC bits->HFINTOSC
#pragma config CLKOUTEN = OFF    // Clock Out Enable bit->CLKOUT function is disabled; i/o or oscillator function on OSC2
#pragma config CSWEN = ON    // Clock Switch Enable bit->Writing to NOSC and NDIV is allowed
#pragma config FCMEN = ON    // Fail-Safe Clock Monitor Enable bit->FSCM timer enabled

// CONFIG2
#pragma config MCLRE = ON    // Master Clear Enable bit->MCLR pin is Master Clear function
#pragma config PWRTE = OFF    // Power-up Timer Enable bit->PWRT disabled
#pragma config LPBOREN = OFF    // Low-Power BOR enable bit->ULPBOR disabled
#pragma config BOREN = ON    // Brown-out reset enable bits->Brown-out Reset Enabled, SBOREN bit is ignored
#pragma config BORV = LO    // Brown-out Reset Voltage Selection->Brown-out Reset Voltage (VBOR) set to 1.9V on LF, and 2.45V on F Devices
#if (__XC8_VERSION < 1360)
#pragma config ZCDDIS = ON    // Zero-cross detect disable->Zero-cross detect circuit is always enabled
#else // __XC8_VERSION
#pragma config ZCD = ON    // Zero-cross detect disable->Zero-cross detect circuit is always enabled
#endif // __XC8_VERSION
#pragma config PPS1WAY = OFF    // Peripheral Pin Select one-way control->The PPSLOCK bit can be set and cleared repeatedly by software
#pragma config STVREN = ON    // Stack Overflow/Underflow Reset Enable bit->Stack Overflow or Underflow will cause a reset

// CONFIG3
#pragma config WDTCPS = WDTCPS_12    // WDT Period Select bits->Divider ratio 1:131072
#pragma config WDTE = SWDTEN    // WDT operating mode->WDT enabled/disabled by SWDTEN bit in WDTCON0
#pragma config WDTCWS = WDTCWS_7    // WDT Window Select bits->window always open (100%); software control; keyed access not required
#pragma config WDTCCS = HFINTOSC    // WDT input clock selector->WDT reference clock is the 31.25 kHz HFINTOSC

// CONFIG4
#pragma config WRT = OFF    // UserNVM self-write protection bits->Write protection off
#pragma config SCANE = available    // Scanner Enable bit->Scanner module is available for use
#pragma config LVP = ON    // Low Voltage Programming Enable bit->Low Voltage programming enabled. MCLR/Vpp pin function is MCLR.

// CONFIG5
#pragma config CP = OFF    // UserNVM Program memory code protection bit->UserNVM code protection disabled
#pragma config CPD = OFF    // DataNVM code protection bit->DataNVM code protection disabled

#include "config.h"

void SYSTEM_Initialize(void)
{
    PIN_MANAGER_Initialize();
    OSCILLATOR_Initialize();
}

void PIN_MANAGER_Initialize(void)
{
    /**
    LATx registers
    */   
    LATE = 0x00;    
    LATD = 0x00;    
    LATA = 0x00;    
    LATB = 0x00;    
    LATC = 0x00;    

    /**
    TRISx registers
    */    
    TRISE = 0x07;
    TRISA = 0x0F;
    TRISB = 0xFF;
    TRISC = 0xFF;
    TRISD = 0xFF;

    /**
    ANSELx registers
    */   
    ANSELC = 0xF7;
    ANSELB = 0xCF;
    ANSELD = 0xFF;
    ANSELE = 0x07;
    ANSELA = 0x0F;

    /**
    WPUx registers
    */ 
    WPUD = 0x00;
    WPUE = 0x00;
    WPUB = 0x00;
    WPUA = 0x00;
    WPUC = 0x00;

    /**
    ODx registers
    */   
    ODCONE = 0x00;
    ODCONA = 0x00;
    ODCONB = 0x00;
    ODCONC = 0x00;
    ODCOND = 0x00;
    


   
    
    
    bool state = GIE;
    GIE = 0;
    PPSLOCK = 0x55;
    PPSLOCK = 0xAA;
    PPSLOCKbits.PPSLOCKED = 0x00; // unlock PPS

    T2AINPPSbits.T2AINPPS = 0x13;   //RC3->TMR2:T2IN;
    ADCACTPPS = 0x0D;   //RB5->ADCC:ADCACT;

    PPSLOCK = 0x55;
    PPSLOCK = 0xAA;
    PPSLOCKbits.PPSLOCKED = 0x01; // lock PPS

    GIE = state;
}       



void OSCILLATOR_Initialize(void)
{
    // NOSC HFINTOSC; NDIV 4; 
    OSCCON1 = 0x62;
    // CSWHOLD may proceed; SOSCPWR Low power; 
    OSCCON3 = 0x00;
    // MFOEN disabled; LFOEN disabled; ADOEN disabled; SOSCEN disabled; EXTOEN disabled; HFOEN disabled; 
    OSCEN = 0x00;
    // HFFRQ 2_MHz; 
    OSCFRQ = 0x01;
    // HFTUN 0; 
    OSCTUNE = 0x00;
    // Set the secondary oscillator
    
}

Una volta scritto il programma con l'IDE in Cloud MPLAB Xpress IDE, e verificato che il codice sia compilabile e si può fare il "Build Project"  , avendo già sul proprio PC la giusta versione del Java Runtime Environment (JRE) si può installare l'USB Bridge

 

 

.

Si deve cliccare su "Download USB Bridge Tool" ed infine aprirlo. E' un processo un pò lento, la prima volta impiega qualche decina di secondi.

Alla fine tutto si collega.

 

Senza chiudere questo USB Bridge ora si può finalmente trasferire il file con estensione .hex sul microcontrollore.

 

Per farlo bisogna prima dire a MPLAB Xpress IDE che non si sta usando MPLAB Xpress Board ma una Curiosity HPC Board. E' una proprietà del progetto.

Tasto destro sul nome del progetto, poi cliccare su "Project Properties".

Curiosity Project Properties

Si preme sulla toolbar il pulsante "Make and program Device", poco sotto e a destra della scritta Window.

Come farlo funzionare per programmare è scritto qui:

https://microchipdeveloper.com/xpress-mchp:working-with-hwtools

Il processo di programmazione sovrascrive il programma precedente ed è piuttosto lento. Vengono scritte diverse cose sulla "Debugger Console" ma alla fine tutto avviene con successo e il led D5 si mette a lampeggiare.

Launching
Connect to device
*****************************************************
Connecting to Starter Kit on Board...
Currently loaded firmware on Starter Kit on Board
Firmware Suite Version.....01.42.18 *
Firmware type..............Enhanced Midrange

Now Downloading new Firmware for target device: PIC16F18875
Downloading bootloader
Bootloader download complete
Programming download...
Downloading RS...
RS download complete
Programming download...
Downloading AP...
AP download complete
Programming download...
Currently loaded firmware on Starter Kit on Board
Firmware Suite Version.....01.50.04
Firmware type..............Enhanced Midrange

Target voltage detected
Target device PIC16F18875 found.
Device ID Revision = 2002
Device Erased...
Programming...
The following memory area(s) will be programmed:
program memory: start address = 0x0, end address = 0x7ff
configuration memory
Programming/Verify complete

Nelle immagini soprastanti era presente un valore _XTAL_FREQ troppo elevato.

In questo caso è meglio mettere nella file main.c :

#define _XTAL_FREQ  500000

altrimenti il LED lampeggia troppo lentamente.

 

Curiosity HPC Blink D5

 

 

In alternativa si puo' usare MPLAB X IDE

Come tool si deve selezionare

e premendo nella toolbar il pulsante di Make and Program Device il file .hex viene automaticamente trasferito al microcontrollore Target che deve essere a 28 oppure a 40 pin e deve essere compatibile ma è sostituibile con un altro.