Comment initialiser et utiliser un capteur numérique en langage C ?

Dans ce cours on va voir comment récupérer la valeur d’un capteur numérique avec un programme en langage C. On part du principe que vous savez déjà utiliser maplab.

Si ce n’est pas le cas nous avons fait plusieurs cours afin de vous aider : 

  • Cours comment prendre en main maplab
  • Cours sur une carte Microchip 18F57Q43

Dans ce cours on va voir comment récupérer la valeur d’un bouton poussoir. Le bouton poussoir est des composants les plus simples à utiliser et très commun dans beaucoup de projets.

Détection d'un bouton poussoir

On va maintenant comment détecter le bouton poussoir sur MPLAB.

Voici le schéma du circuit :

#include "system.h"

unsigned short bouton_poussoir_variable;

int main(void) {
    // Bouton poussoir
    #define Bouton_poussoir PORTDbits.RD3  
    ANSELDbits.ANSELD3=0; // Sortie numérique 
    TRISDbits.TRISD3=1; // On déclare le bouton poussoir comme une entree
    WPUDbits.WPUD3=1; //On met la resistance de pull up
    
     /* Initialisation de l'interruption*/
    INT0PPSbits.PORT= 0b001;
    INT0PPSbits.PIN= 0b100;
    INTCON0bits.INT0EDG =0;
    PIR1bits.INT0IF =0;
    PIE1bits.INT0IE =1;
    
    while(1) {
       bouton_poussoir_variable =Bouton_poussoir;
    }    
}

On va maintenant expliquer le programme :

Registre ANSEL

Le registre ANSEL permet d’indiquer la carte Microchip si notre broche sera une entrée ou une sortie. Pour cela on doit choisir notre broche. Si on notre bouton poussoir est sur la broche RD3, on écrira : ANSELDbits.ANSELD3. Ensuite comme on veut déclarer notre broche comme numérique, on met :

ANSELDbits.ANSELD3=0;

Cette instruction doit être mise dans le main.

Registre TRIS

Le registre TRIS permet de définir si votre broche est une entrée ou une sortie. Pour savoir si vous devez déclarer cette broche en entrée ou en sortie, vous devez vous demander si votre composant va envoyer une information à la carte (bouton poussoir, potentiomètre, interrupteur) ou bien c’est la carte qui va envoyer une information pour contrôler votre composant (led, moteur…).

  • Si votre composant envoie une information, alors on place la broche comme une entrée pour qu’elle puisse laisser entrer l’information donc on mettra : TRISDbits.TRISD3=1
  • Si votre composant reçoit une information, alors on place la broche comme une sortie pour qu’elle puisse laisser entrer l’information donc on mettra : TRISDbits.TRISD3=0

Cette instruction doit être mise dans le mainavant le while (1).

La fonction de Pull-UP

En utilisant un bouton poussoir, on doit activer la résistance de tirage interne de la carte ou résistance de pull up afin de notre signal soit bien comprit comme un 1 ou 0 selon si le bouton poussoir est appuyé et ne pas avoir d’état Z. Vous pouvez lire notre cours sur les GPIO pour plus d’explication.

Pour cela on écrit :

 

WPUDbits.WPUD3=1; 

Cette instruction doit être mise dans le mainavant le while (1).

Initialisation des interruptions

On intialise les interruptions pour que le bouton poussoir soit considéré comme tel et que l’on puisse récupérere sa valeur :

 /* Initialisation de l'interruption*/
    INT0PPSbits.PORT= 0b001;
    INT0PPSbits.PIN= 0b100;
    INTCON0bits.INT0EDG =0;
    PIR1bits.INT0IF =0;
    PIE1bits.INT0IE =1;

Cette instruction doit être mise dans le main,  avant le while (1).

Récupérer la valeur du bouton poussoir

Pour pouvoir récupérer la valeur denotre bouton poussoir, il faut le déclarer dans le main, avant le while :

#define Contacteur_fin_course PORTDbits.RD3

On va maintenant utiliser le watches pour voir la valeur de notre bouton poussoir.

Le Watches

Pour pouvoir voir notre variable changer, on va regarder dans les watches. Ce sont une sorte de moniteur qui va afficher seulement la valeur de vos variables. 

Le watches s’utilise souvent avec le debugger de MPLAB. 

 

Voici comment afficher les watches :

Le watches s’utilise souvent avec le debugger de MPLAB. 

Point d'interrogation

Comment fonctionne le debugger de MPLAB ? 

Un debugger va vous permettre de dérouler votre programme pas à pas avec un point d’arrêt ou le programme s’arrêtera. Normalement vous devez placer votre point d’arret juste en dessous de l’instruction ou vous voulez voir l’état des variables de façon a ce que le debugger s’arrête juste dessus. 

Une fois que vous avez choisit votre point d’arrêt, vous avez plus qu’à cliquer sur le bouton debug project pour que le programme se lance jusqu’au point d’arrêt : 

Si vous voulez relancer le programme, vous avez plusieurs boutons :

  • Le bouton violet est un bouton reset

 

  • Le bouton vert est un bouton play

 

  • Tout les autres boutons sont pour passer à la ligne en dessous du point d’arrêt ou au dessus de façon à faire défiler votre programme pas à pas

Maintenant que vous savez utiliser le debugger, on va pouvoir l’utiliser pour les watches. 

Point d'exclamation

Attention !

Pour pouvoir voir la valeur de votre variable, il faut que celle ci soit globale, c’est à dire initialisé en dehors du main. 

 

 

 

 

Une fois le programme lance avec les watches, il nous reste plus qu’à taper le nom de notre variable ou l’on récupère la valeur de notre bouton poussoir afin de regarder sa valeur :

Voici le valeur de notre bouton poussoir une fois celui-ci appuyé :

Allumer une led avec un bouton poussoir

On va maintenant voir comment allumer une led avec un bouton poussoir. Ceci permet de voir directement si votre bouton poussoir fonctionne plutôt que de regarder dans les watches.

Dans notre circuit le bouton poussoir est branché sur la pin RD5  de la carte et la led est branchée sur la pin RD1 de la carte :

#include "mcc_generated_files/system/system.h"

unsigned short bouton_poussoir_variable;

int main(void) {
    // Bouton poussoir
    #define Bouton_poussoir PORTDbits.RD3  
    ANSELDbits.ANSELD3=0; // Sortie numérique 
    TRISDbits.TRISD3=1; // On déclare le bouton poussoir comme une entree
    WPUDbits.WPUD3=1; //On met la resistance de pull up
    
    // La led rouge 
    #define LED_ROUGE LATDbits.LATD1
    TRISDbits.TRISD1=0; // On déclare la led rouge en sortie
    
     /* Initialisation de l'interruption*/
    INT0PPSbits.PORT= 0b001;
    INT0PPSbits.PIN= 0b100;
    INTCON0bits.INT0EDG =0;
    PIR1bits.INT0IF =0;
    PIE1bits.INT0IE =1;
    
    while(1) {
        bouton_poussoir_variable =Bouton_poussoir; // On recupere la valeur du bouton poussoir
        if (bouton_poussoir_variable==0){ // si le bouton poussoir est appuye
            LED_ROUGE=1; // On allume la led
        }
        else {
            LED_ROUGE=0; // sinon on eteint la led
        }
    }    
}