Ce tutorial explique comment implémenter une conversion sur un pic 18F877. Le résultat fournit est sur 10 bits. Comme la taille maximale des registres du pic est de 8 bits, le résultat est stocké dans deux registres différents : ADRESH et ADRESL.

La configuration des ADCs s'effectue grâce aux registres ADCON0 et ADCON1.

ADCON1 permet de choisir si les branches du port A du pic sont utilisées comme Entrées/Sorties ou comme ADC ainsi que de justifier, soit à gauche, soit à droite le résultat dans les registres ADRESH et ADRESL (cf figure 1).

Figure 1 : Illustration du fonctionnement des registres ADRESH et ADRESL

Ainsi, en mettant la valeur 10001110 dans ADCON1, on active uniquement l'ADC situé sur la branche 0 du port A et on justifie le résultat à droite. Ainsi, la valeur contenue dans ADRESH n'est constituée que de 2 bits, ce qui signifie que la valeur peut varier entre 0 et 3.

ADCON0 permet principalement d'activer le module ADC du pic, de demander une conversion grâce au bit 2 et de sélectionner l'ADC que l'on souhaite utiliser. A l'initialisation, la valeur 0x01 permet de choisir l'ADC 0 et d'activer le module ADC.

Pour finir, on désactive l'interruption de fin de conversion de l'ADC grâce au registre PIE1.

Voici le code d'initialisation de l'ADC :

   ;------------------ 
   ; ADC configuration  
   ;------------------ 

BANK1 movlw b'10001110' ;AN0 ON, others OFF, Vrefs = Vdd & Vss ;et Right Justified movwf ADCON1 BANK0 movlw b'00000001' ; AN0 ON, Operating, No conversion in progress. movwf ADCON0 BANK1 clrf PIE1 bcf PIE1, ADIE ; Interruption sur AN0 OFF BANK0 clrf PIR1 ; Peripherical Flags OFF

BANK0 et BANK1 sont des macros que l'on peut utiliser sous MPLAB pour alléger le code.

BANK0 macro   
        bcf   STATUS,RP0          ; sélectionner bank 0  
        bcf   STATUS,RP1   
      endm

A chaque appel à BANK0, le compilateur remplace l'occurrence par le code saisit dans la macro.

Ensuite, dans la boucle principale du programme, on effectue une conversion en mettant à 1 le bit 2 de ADCON0 qui s'appelle GO/DONE . C'est le même bit qui indique que la conversion est terminée, lorsqu'il passe à 0.

Voici le code de la conversion :

      bsf         ADCON0, GO_DONE          ; Lance la conversion   
  loop:  
      btfsc       ADCON0, GO_DONE          ; Attd que conversion finie    
      goto        loop

Et voilà, j'espère avoir été clair. Si vous avez des questions n'hésitez pas !!