Con il simulatore PICSimLab che abbiamo appena installato proviamo un programma che permetta ad un display a led a 7 segmenti di mostrare i numeri da 0 a 9 se non viene premuto alcun pulsante e di contare alla rovescia se viene premuto quel pulsante. Vogliamo usare il PIC 16F84A come microcontrollore.
Il nostro scopo è quello di programmarlo in C ed usare il compilatore XC8 per microcontrollori PIC a 8 bit e l'ambiente di sviluppo in cloud MPLAB Xpress IDE.
Per disegnare lo schema elettrico conviene usare KiCad, come più volte spiegato in questo sito che stai leggendo.
Ecco lo schema elettrico:
Nello schema elettrico si nota il Led collegato a RA4, il pulsante con resistenza di pull-down R2 collegato a RA0: se non è premuto vale 0, quando lo si preme vale lo stato logico 1.
Invece con il PIC16F84A si scrive il seguente programma,
a) conviene che il programma si suddiviso in più parti
main.c (il programma principale, che parte all'avvio e ad ogni reset)
config.h (configurazione del microcontrollore)
display7s.c (libreria per la gestione del display a 7 segmenti)
diplay7s.h (header per la libreria display 7 segmenti)
b) conviene che le varie funzioni siano il più possibili riutilizzabili anche in altri programmi.
Eccoli:
main.c
#include <xc.h>
#include"config.h"
#include "display7s.h"
#define _XTAL_FREQ 4000000
void main()
{
short int tmp = 0;
TRISB=0x00; // we set the PORTB as output
TRISA=0b00000001; // we set RA4 as output and RA0 as input
while (1){
PORTB=display7s(tmp);
if (PORTAbits.RA0 == 0) {
tmp = tmp + 1;
}
else {
tmp = tmp - 1;
}
if (tmp==10) {
tmp = tmp -1;
}
else if (tmp==-1) {
tmp = tmp + 1;
}
PORTAbits.RA4=1;
__delay_ms(400);
PORTAbits.RA4=0;
__delay_ms(400);
}
}
display7s.h
unsigned char display7s(short int v);
display7s.c
unsigned char display7s(short int v)
{
switch(v)
{
case 0:
return 0x3F;
case 1:
return 0x06;
case 2:
return 0x5B;
case 3:
return 0x4F;
case 4:
return 0x66;
case 5:
return 0x6D;
case 6:
return 0x7D;
case 7:
return 0x07;
case 8:
return 0x7F;
case 9:
return 0x6F;
case 10:
return 0x77;
case 11:
return 0x7c;
case 12:
return 0x58;
case 13:
return 0x5E;
case 14:
return 0x79;
case 15:
return 0x71;
default:
return 0;
}
}
config.h è un file di configurazione dei cosiddetti "configuration bits" che dipende fortemente dal microcontrollore scelto, cambiando microcontrollore cambia il contenuto del file. E' necessario se si vuole simulare e soprattuttto se si vuole montare il circuito e provare il prototipo. Il fatto che "config.h" sia racchiuso tra doppi apici e non tra il simbolo di < e > indica che non è una libreria predefinita ma che deve essere costruita dal programmatore o presa da qualche parte su Internet per quello specifico compilatore e per quello specifico microcontrollore.
Microchip ha messo a disposizione sia in MPLAB X Ide sia in MPLAB Xpress IDE in cloud uno strumento per l'autocostruzione di questa parte di codice.
Per l'uso della versione in cloud è necessario registrarsi sul sito di microchip.com, gratuitamente.
A questo punto vado sulla macchina virtuale Debian 11, dove abbiamo installato il simulatore, con il browser creo il progetto e copio ed incollo il codice soprastante.
Nella famiglia di microcontrollori Mid-Range 8-bit MCUs scegliere come device PIC16F84A.
Scegliere un nome significativo del progetto (esempio SevenSegmentsUpDown) e cliccare su Finish.
Dopo qualche minuto il progetto viene creato. Controllare che il MCU sia PIC16F84A e che il compilatore sia XC8.
Facendo tasto destro nella sezione Source Files, creare un nuovo file chiamato main.c
Provando a compilare il programma con il simbolo del martelletto Build... è normale che vada in errore perché il file config.h non è stato ancora creato ed associato al progetto, così come le altre librerie e header.
Come fare a creare questo file? Una conoscenza dettagliata del datasheet sarebbe necessaria. Si può utilizzare lo strumento Window / Target Memory Views / Configuration Bits per farsi suggerire i nomi dei registri oppure copiare ed incollare questo file valido per il PIC16F84A.
#ifndef CONFIG_H
#define CONFIG_H
#pragma config FOSC = XT
#pragma config WDTE = OFF //it is important disable Watch-Dog timer
#pragma config CP = OFF
#pragma config PWRTE = OFF
#endif
Allo stesso modo si creano gli altri files display7s.h e display7s.c .
A questo punto si compila e con il pulsante si puo' scaricare il file "eseguibile" con estensione .hex che può essere trasferito con un programmatore fisico ad un vero microcontrollore oppure passato al simulatore per come viene simulato il programma.
Apriamo PICSimLab, scegliamo Breadboard come board e PIC16F84A come microcontrollore.
Aggiungiamo Spare parts come "Modules" ed aggiungiamo un display a 7 segmenti e un push-button. Le resistenze in serie a ciascun segmento non vanno messe perché sono incluse automaticamente dal simulatore. In caso di realizzazione del prototipo invece andrebbero messe.
Si carica il file hex dopo aver collegato virtualmente display a 7 segmenti e il push-button. Fantastico!
![Simualazione](/sites/default/files/inline-images/7segmPIC16F84ASimulazione.jpg)
Il nostro programma ha funzionato bene. Enjoy!