Cette page et ses descendantes sont encore en cours de construction…

Les broches du PIC16F1509

Les microcontroleurs de la famille des PIC16F possèdent des broches spécifiques d’entrées/sorties regroupées dans des ports d’entrées/sorties. Ces ports sont nommés PORTx (où x est remplacé par une lettre allant de A à F). Ces ports peuvent regrouper jusqu’à 8 entrées/sorties numérotées de 0 à 7. Par exemple, la broche 5 du port C (noté PORTC) portera le nom de RC5.

Toutes les broches peuvent être utilisées en entrée ou en sortie numérique.

Certaines d’entre ces broches ont des usages spécifiques :

  • les broches notées ANx peuvent être reliées en interne à un convertisseur analogique/numériques (voir tutoriel Convertisseur analogique / numériqueConvertisseur Analogique-Numérique)
  • les broches notées IOC peuvent déclencher des interruptions du programme (voir tutoriel Interruptions externes)
  • les broches notées PWMx peuvent générer des impulsions rectangulaires à largeur variable / PWM (voir tutoriel Sorties modulées)

Nous allons voir dans la suite comment utiliser les broches en entrées ou sorties numériques.

Entrées / Sorties Numériques

Chacune des broches présentes sur les PIC16F peuvent être utilisées comme entrées ou sorties numériques.
Elles sont configurables individuellement en entrée ou sortie par l’utilisation de divers registres spécifiques appelés PORTx, TRISx et ANSELx (où x est remplacé par une lettre allant de A à F selon le port à configurer sur le microcontroleur).

Dans l’exemple précédent, nous nous intéressons au port A. Il est associé aux registres :

  • TRISA : correpondant à la direction de chacune des broches, soit en entrée (‘1’), soit en sortie (‘0’)
  • ANSELA : permettant de définir si l’entrée est numérique (‘0’) ou reliée au convertisseur analogique-numérique (‘1’ – voir tutoriel Convertisseur analogique / numériqueConvertisseur Analogique-Numérique)
  • PORTA : correspondant à la valeur présente sur la broche associée du port

Dans tous les cas, la phase de configuration des broches doit se faire avant tout calcul (avant la boucle infinie) et une seule fois.

Sorties Numériques

Configuration

Pour initialiser la broche RA5 en sortie numérique, on peut utiliser les lignes suivantes :

ANSELAbits.ANSA5 = 0;
TRISAbits.TRISA5 = 0;

La première ligne permet de spécifier que la broche sera utilisée en mode numérique (‘0’). La seconde ligne permet de spécifier que la broche sera utilisée en sortie (‘0’).

N.B. On pourra également trouver des instructions qui permettent de configurer le port complet :

ANSELA = 0;
TRISA = 0;

Ces deux lignes permettent de mettre l’ensemble du port A en sortie numérique.

Utilisation

Par la suite, on peut alors utiliser la broche RA5 comme sortie de la façon suivante pour imposer un ‘0’ (ou 0V) sur la broche RA5 :

PORTAbits.RA5 = 0;

ou de la façon suivante pour imposer un ‘1’ (ou VDD) sur la broche RA5 :

PORTAbits.RA5 = 1;

Exemple

Voici un exemple plus complet qui fait clignoter les sorties RB4 et RC5 de manière complémentaire.

#include 
#define _XTAL_FREQ  16000000

/* Fonction d'initialisation du microcontroleur */
void initPIC(){
    // FOSC = 16 MHz
    OSCCONbits.IRCF = 0b1111;
    /* RB4 */
    ANSELBbits.ANSB4 = 0;
    TRISBbits.TRISB4 = 0;
    PORTBbits.RB4 = 0;     // initialisation de la broche a 0
    /* RC5 */
    ANSELCbits.ANSC5 = 0;
    TRISCbits.TRISC5 = 0;
    PORTCbits.RC5 = 1;     // initialisation de la broche a 1
}

/* Fonction principale */
int main(){
    /* Initialisation du microcontroleur */
    initPIC();
    /* Boucle infinie */
    while(1){
        PORTBbits.RB4 = ! PORTBbits.RB4;
        PORTCbits.RC5 = ! PORTCbits.RC5;
        __delay_ms(10);
    }
}

on pourra noter ici l’utilisation de la fonction __delay_ms(int n) qui permet de faire une pause d’une durée de n ms (passée en paramètre de la fonction). Cette fonction nécessite la définition de la constante _XTAL_FREQ pour fonctionner, qui correspond à la fréquence sélectionnée pour les oscillations du quartz interne au microcontroleur (imposée via l’instruction OSCCONbits.IRCF = 0b1111; ici à 16 MHz).

Entrées Numériques

Configuration

Pour initialiser la broche RB2 en entrée numérique, on peut utiliser les lignes suivantes :

ANSELBbits.ANSB2 = 0;
TRISBbits.TRISB2 = 1;

La première ligne permet de spécifier que la broche sera utilisée en mode numérique (‘0’). La seconde ligne permet de spécifier que la broche sera utilisée en entrée (‘1’).

N.B. On pourra également trouver des instructions qui permettent de configurer le port complet :

ANSELB = 0;
TRISB = 0xFF;

Ces deux lignes permettent de mettre l’ensemble du port B en entrée numérique.
Par défaut, l’ensemble des ports d’entrées/sorties sont configurés en entrée analogique !

Utilisation

Par la suite, on peut alors utiliser la broche RB2 comme entrée de la façon suivante pour stocker la valeur de cette broche dans la variable k :

char k = PORTBbits.RB2;

La variable vaudra alors 0 si l’entrée RB2 est à la masse ou 1 si l’entrée RB2 est à un potentiel de VDD.

Exemple

Voici un exemple plus complet qui permet de modifier la sortie RB4 en fonction de la valeur sur l’entrée RB2.

#include 
#define _XTAL_FREQ  16000000

/* Fonction d'initialisation du microcontroleur */
void initPIC(){
    // FOSC = 16 MHz
    OSCCONbits.IRCF = 0b1111;
    /* RB4 */
    ANSELBbits.ANSB4 = 0;
    TRISBbits.TRISB4 = 0;
    PORTBbits.RB4 = 0;     // initialisation de la broche a 0
    /* RB2 */
    ANSELBbits.ANSB2 = 0;
    TRISBbits.TRISB2 = 0;
}

/* Fonction principale */
int main(){
    /* Initialisation du microcontroleur */
    initPIC();
    /* Boucle infinie */
    while(1){
        PORTBbits.RB4 = PORTBbits.RB2;
        __delay_ms(10);
    }
}
Microchip PIC16F / Entrées-Sorties Numériques