Programmation du PIC16F877A - 1e partie

La famille des microcontrôleurs PIC de la société Microchip est très vaste et étendue. Ce point de départ sur la programmation des microcontrôleurs utilisera le PIC16F877A. De façon basique, on se propose de faire fonctionner uniquement deux broches d'un port d’E/S numériques du PIC16F877A. Un des ports est configuré en entrée et l’autre en sortie. Le port en entrée, sera connecté un interrupteur, et le port en sortie à une diode LED, munie de sa résistance de protection.  

Fonctionnement: La LED s'allumera quand l’interrupteur sera appuyé.

Le langage de programmation sera le C, sous l’environnement de développement MPLAB X.

 

Présentation du PIC16F877A

Le PIC16F877A est un microcontrôleur 8 bits,  fabriqué en technologie CMOS. Il est cadencé par une horloge allant de 0 à 20 MHz ; et son alimentation varie entre 2 V et 5,5 V ; il possède 5 ports, dont 3 à 8 broches, 1 à 6 broches, et 1 à 3 broches ; soit 33 E/S en tout pour dialoguer ou pour piloter des dispositifs externes. 

Ces ports sont nommés A, B, C, D et E.  Et chacune des broches est notée RXX (Par exemple pour la broche 0 du port A, portera la notation RA0 ; ou encore pour la broche 1 du port A, sera RA1). 

La figure ci-après représente la structure interne de l'une des broches du port B :

schemaportintropic16f877a1

Comme on peut le voir, ce sont des ports d’E/S bidirectionnels dont le sens est déterminé par un registre interne du composant appelé TRISB, à 8 bits dont chaque bit est associé à une broche d'E/S du port. Par exemple TRISB7 sera associé à RB7, et ce sera le cas pour les autres broches. Lorsqu’un bit du registre TRISB vaut 1, la broche correspondante devient une entrée ; et lorsqu’il vaut 0, la broche est une sortie.

On ne parlera pas des autres fonctionnalités des broches de ce port ici, ni des autres ports d'entrées/sorties de ce composant. On veut juste utiliser les deux broches du port B comme de simples E/S numériques.

 

A quoi ressemble le montage?

Il se résume  principalement à quelques liaisons entre le microcontrôleur, un interrupteur connecté à une résistance de 100KΩ afin de forcer l’entrée RB1 à 0 lorsque le bouton n’est pas appuyé.  Une LED  reliée à la sortie RB0 via une résistance de protection.

A l’aide de Proteus, on a créé le schéma ci-après :

schemaintropic1

Le programme

Comme cela a été mentionné précédemment, le programme sera développé sous MPLAB X.  Une fois MPLAB lancé, on commence par créer un projet :

Dans le menu  File, cliquer sur New Project, pour créer un nouveau projet. On peut aussi utiliser le raccourci  Ctrl + Shift + N, ou cliquer directement sur : pictopic16f877a1

Dans la nouvelle fenêtre qui s’ouvre,  dans la zone Projects, choisir  Standalone Project.  Puis cliquer sur Next.

L'étape qui suit consiste à choisir le type de microcontrôleur qui sera utilisé dans le projet; dans fenêtre Select Device, aller dans Family puis  Mid-Range 8-bits MCUs(PIC10/12/16/MCP) , puis prendre PIC16F877A. Cliquer sur Next.

Dans la fenêtre Select Tool  qui  s’ouvre on peut sélectionner un programmateur, un simulateur ou d’autres types de sortie.  On préfère  ne rien sélectionner pour l’instant. Cliquer sur Next.

Puis dans Select Compiler, sélectionner XC8 puis cliquer sur Next.   Enfin, dans la fenêtre qui suit, donner un nom à votre projet, puis cliquer sur Finish.

On peut maintenant créer le fichier source ; dans l’explorateur de projets, faire un clic droit sur Source Files, puis choisir le type de fichier, puis nommer le.

Ouvrir le nouveau fichier, puis commencer d’abord par ajouter le fichier entête  « xc.h », en début de programme à l’aide de la directive « include ».

Ensuite il faut changer l’état des bits de configuration du microcontrôleur. Ce type de bits doit être modifié au moment de la programmation du composant. On peut utiliser l’outil graphique proposé par l’environnement MPLAB.

Si on choisit l'outil graphique pour les bits de configuration, il suffit de cliquer sur menu Production, puis sur Set Configuration Bits. Dans la fenêtre qui s’ouvre on peut choisir l’état des différents bits avec le menu déroulant qui est proposé.  Une fois les bits configurés, il suffit de cliquer sur  le bouton  Generate Source Code to Output. Le fichier obtenu peut être collé à un des fichiers d'entêtes du projet au besoin.

Pour plus d’information sur la procédure de changement d'état de ces bits de configuration, il faut se reporter ici.

 

Par la suite on va déclarer les variables LED et Bouton_p.  Puis la valeur de la fréquence d’horloge (20MHz choisie ici est la fréquence du quartz que nous avions à disposition).

Le programme se résume au test de l’état de la variable Bouton_p, puis positionne LED à 1 ou à 0, dans une boucle infinie.

/*

 * File:   projet01.c
 * Author: bidj
 *
 * Created on 16 juin 2019, 18:45
 */
#include "xc.h"
// CONFIG
#pragma config FOSC = HS        // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON       // Power-up Timer Enable bit (PWRT enabled)
#pragma config BOREN = ON       // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF        // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF        // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)
// Define LED and button pin
#define LED RB0
#define Bouton_p RB1
#define _XTAL_FREQ 20000000

void main(void) {

                  TRISB0 = 0; //output
                  TRISB1 = 1; //input
                  LED = 0;

           while(1){

                  if(Bouton_p)
                       LED = 1;
                  else
                       LED = 0;

                    }

    return;

}

 

Configuration du matériel

Cette étape n’a pas été faite auparavant.  Placer le pointeur de la souris sur le dossier du projet, puis faire un clic droit, ensuite  Properties,  dans fenêtre Project Properties :  Catégories --- > Conf :[Default] cliquer sur Proteus VSM Viewer, puis dans Design Filename, choisir le projet en cours, dans Hardware Tool choisir Proteus VSM Viewer, et dans Compiler Toolchain, choisir xc8, puis cliquer sur OK.

 

Simulation à l’aide de Proteus

Pour effectuer la simulation d’un programme MPLAB dans Proteus, il faudra d’abord installer le plugin :  Proteus VSM Viewer pour MPLAB.

Cliquer sur **photo**

pour compiler le projet, puis créer les fichiers nécessaires pour la simulation. Si tout est correct, MPLAB devra lancer automatiquement Proteus.

connexionmplabproteus

Puis le montage réalisé s’ouvre en mode animation.

On peut simuler le fonctionnement, voici à quoi ressemble le montage au repos:

mplabproteusproj01 1

Et lorsqu’on appui sur le bouton (un clic de la souris dessus), on peut constater que la LED s’allume :

mplabproteusproj01 2

Réalisation pratique

Pour ce montage tout simple, on effectue un câblage sur plaque à essai pour tester le fonctionnement.

Au repos, l’interrupteur n’est pas appuyé, la LED est éteinte :

pic16f877projet01test1

Pour éviter de cacher l’interrupteur avec le doigt, on a utilisé une pointe de sonde, pour actionner l’interrupteur. On constate que la LED s’allume lorsque l’interrupteur est appuyé.

pic16f877projet01test2

Ce tutorial nous a permi de découvrir comment créer une application à base de microcontrôleurs. Dans les présentations qui suivent nous allons réaliser des programmes mettant en oeuvre d’autres périphériques du PIC16F877A.