ADCs
Par Charles Combes, jeudi 15 mars 2007 à 10:50
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 !!