• home

Exemples de programmation du CAN du PIC


CONVERSION sans interruption
Algorithme et registres à programmer
  1. Configuration de CAN
    • Configuration des pins analogiques et numériques et Vref    ADCON1
    • Choix de la division pour l’horloge et justification du résultat   ADCON1
    • Selection de l’entrée à convertir     ADCON0
    • Choix de la division pour l’horloge    ADCON0
    • Mise en service du CAN    ADCON0
    • Mise en entrée des pins analogiques    TRISx
  2. Attente du temps d’acquisition
    • En fonction de la resistance de la source
  3. Lancement de la conversion
    • Go/Done = 1    ADCON0
  4. Attendre la fin de la conversion
    • Attendre que Go/Done repasse à 0    ADCON0
  5. Lecture du résultat
    • ADRESH pour 8 bits ou ADRES pour 10 bits    ADRESH ou ADRES = ADRESH + ADRESL
Ordinogramme



Exemple 1
/*---------------- Initialisation du CAN */void init_can(void)
{
    ADCON1 = 0b00001110;     /* Justifié à gauche Fosc/8 RA0=AN0 analogique */
    ADCON0 = 0b01000001;     /* Fosc/8 AN0 CAN=activé */
    TRISAbits.RA0 = 1;       /* RA0 = AN0 en entrée */
}
/*---------------- Utilisation du CAN */unsigned char convertir(void)
{
    Delay10TCYx( 5 );         /* attente 5x10x1=50us */
    ADCON0bits.GO = 1;        /* lancement conversion */
    while(ADCON0bits.GO);     /* attente fin de conversion */
    return (ADRESH);          /* retour du resultat */
}

Note : ADRESH retourne les 8 bits les plus significatifs



Exemple 2
 /*---------------- Initialisation du CAN */
void init_can(void)
{
    ADCON1 = 0b11000100;     /* Justifié à droite Fosc/16 RA3=AN3 analogique */
    ADCON0 = 0b01011001;     /* Fosc/16 AN3 CAN=activé */
    TRISA = 0b00001011;      /* RA0, RA1 et RA3 en entrée RA2, RA4 à RA7 en sortie */
}
/*---------------- Utilisation du CAN */
unsigned int convertir(void)
{
    Delay10TCYx( 12 );        /* attente 12x10x0,4=48us */
    ADCON0bits.GO = 1;        /* lancement conversion */
    while(ADCON0bits.GO);     /* attente fin de conversion */
    return (ADRES);           /* retour du resultat */
}

Note : ADRES permet de retourner ADRESH et ADRESL
CONVERSION avec interruption
Algorithme et registres à programmer
  1. Configuration de CAN
    • Configuration des pins analogiques et numériques et Vref     ADCON1
    • Choix de la division pour l’horloge et justification du résultat    ADCON1
    • Selection de l’entrée à convertir     ADCON0
    • Choix de la division pour l’horloge    ADCON0
    • Mise en service du CAN     ADCON0
    • Mise en entrée des pins analogiques    TRISx
  2. Configuration des interruptions
    • ADIP = 0 / 1 suivant priorite désirée    IPR1
    • ADIF = 0    PIR1
    • ADIE = 1    PIE1
    • GIE = 1    INTCON
    • PEIE = 1    INTCON
  3. Attente du temps d’acquisition
    • En fonction de la résistance de la source
  4. Lancement de la conversion
    • Go/Done = 1    ADCON0
  5. Attendre la fin de la conversion
    • Attendre l’interruption du CAN
  6. Interruption CAN
    • ADRESH pour 8 bits ou ADRES pour 10 bits     ADRESH ou ADRES = ADRESH + ADRESL
    • Attente du temps d’acquisition
    • ADIF = 0 pour permettre l’interruption suivante    PIR1
    • Go/Done = 1    ADCON0
  7. Prochaine conversion
    • Refaire à partir de l’étape 3
Ordinogramme


Exemple 3
/*---------------- Initialisation du CAN */void init_can(void)
{
    ADCON1 = 0b00001110;   /* Justifié à gauche Fosc/8 RA0=AN0 analogique */
    TRISAbits.RA0 = 1;     /* RA0 = AN0 en entrée */
    IPR1bits.ADIP = 0;     /* priorité basse */
    PIR1bits.ADIF = 0;     /* RAZ flag */
    PIE1bits.ADIE = 1;     /* int CAN autorisées */
    INTCONbits.GIE = 1;    /* toutes les int validées */
    INTCONbits.PEIE = 1;   /* toutes les int des périphériques validées */
    ADCON0 = 0b01000001;   /* Fosc/8 AN0 CAN=activé */
}
/*---------------- programme principal */void main(void)
{
    init_can
(); /* Initialisation du CAN */
    .....
    while(1)
    {   .....
        Delay10TCYx( 5 );  /* attente 5x10x1=50us */
        ADCON0bits.GO = 1; /* lancement conversion */
        .....

     }
}

/*---------------- Low priority interrupt vector */#pragma code InterruptVectorLow = 0x18
void InterruptVectorLow(void)
{
    _asm
        goto InterruptHandlerLow // Saut au prog d’interruption
    _endasm
}

/*---------------- Low priority interrupt routine */#pragma code
#pragma interrupt InterruptHandlerLow
void InterruptHandlerLow()
{
    if(PIR1bits.ADIF) /* test si interruption du CAN */
    {   result_can = ADRESH; /* rangement résultat conversion dans result_can*/        PIR1bits.ADIF = 0;   /* RAZ flag */        ADCON0bits.GO = 1;   /* lancement conversion */

    }
  
    /* ..... autres interruptions ici.....*/
}

0 commentaires:

Publier un commentaire

-->