Image PortAD

Lecture d'une tension


Le fichier source est téléchargeable ICI.
 Nous abordons ici une des partie les plus intéressantes de notre projet : les Convertisseurs Analogique/ Numérique du HC12. ( A ne pas confondre avec les bus série CAN du HC12) .  Avec le 68HC11 nous disposons d'un CA/N de 8 canaux, 8 bits, le HC12 nous en propose deux fois plus : deux convertisseurs A/N 8 ou 10 bits de 8 voies, ATD0 et ATD1. La tension d'entrée doit être comprise entre 0 et 5,2 volts. Pour plus de précisions consulter la documentation du HC12.

Pour commencer nous avons écrit un petit programme test qui lit une tension sur une entrée du CA/N et met celle-ci en mémoire à l'adresse $1000. Nous lisons donc le résultat en affichant la mémoire  à partir de cette adresse et convertissons le résultat donné en hexa à l'aide de la calculatrice scientifique du système d'exploitation. Mais comme nous maitrisons maintenant l'affichage nous afficherons le résultat sur l'écran LCD.

Mais auparavent il nous faut installer sur notre carte un potentiomètre qui fournira la tension à mesurer. Une des extrémités du potentiomètre est reliée au + de l'alimentation, l'autre au - et le curseur à la broche PAD00 (broche 25 du connecteur X6 de CardS12).

Examinons maintenant les parties essentielles du programme.

* Initialisation des registres pour les convertisseurs A/N
       
MOVB #$80,ATD0CTL2
MOVB #$20,ATD0CTL3
MOVB #$83,ATD0CTL4


Les registres du HC12 utilisés pour cette application sont ATD0CTL2, ATD0CTL3, ATD0CTL4 et ATD0CTL5.
Le nombre hexa figurant sous le nom du registre est son adresse en mémoire.

 

ATD0CTL2 
$0080  
b7 b6 b5 b4 b3 b2 b1 b0
ADPU AFFC AWAI ETRIGLE ETRIGP ETRIG ASCIE ASCIF
1 0 0 0 0 0 0 0

La mise à 1 du bit b7 (A/D power up) nous permet de valider le convertisseur ATD0. Par défaut les convertisseurs ne sont pas alimentés pour économiser l'alimentation du HC12.


  ATD0CTL3    $0083      
b7 b6 b5 b4 b3 b2 b1 b0
0 S8C S4C S2C S1C FIFO FRZ1 FRZ0
0 0 1 0 0 0 0

Les bits b3 à b6 permettent de définir le nombre de conversions par séquence. Au reset du HC12 ce nombre est mis à 4. Ici nous avons choisi 2.



ATD0CTL4
$0084  
b7 b6 b5 b4 b3 b2 b1 b0
SRES8 SMP1 SMP0 PRS4 PRS3 PRS2 PRS1 PRS0
1 0 0 0 0 0 1 1

Les bits b0 à b4 servent à programmer le prédiviseur pour avoir la vitesse maximum. Comme nous avons une fréquence bus de 16 MHz le prédiviseur doit être mis à 3.

FBus MHz       2   4   8   12   16   20   24
Prédiviseur       0   0   1    2     3     4     5

Les bits b5 et b6 permettent de régler la vitesse d'échantillonage;  00 pour la vitesse maximum ou 11 pour une vitesse plus lente mais plus précise.
Enfin le bit b7 permet de choisir la résolution : 0 pour 10 bits ou 1 pour 8 bits. Nous avons choisi une résolution sur 8 bits.

**********************************
* Partie principale du programme *
**********************************


LECTURE        MOVB #$80,ATD0CTL5
FIN_CONV0      LDAA ATD0STAT0       ; attente fin de conversion
               ORAA #$7F            ; extraction du bit b15 (SCF)de ATD0CTL5
               CMPA #$FF            ; SCF = 1 ?
               BNE  FIN_CONV0       ; non --> FIN_CONV0
               LDD  ATD0DR0H        ; oui --> mise en mémoire de tension (en hexa)
               STD  TENSION0  


Une écriture dans le registre ATD0CTL5 lance une séquence de conversion.
b0, b1, b2 indiquent le numéro du canal concerné (de 0 à 7)


  ATD0CTL5
$0085     
b7 b6 b5 b4 b3 b2 b1 b0
cadrage S8CM SCAN MULT CD
CC CB CA
1 0 0 0 0 0 0 0

ATD0CTL5 est utilisé pour choisir le mode de conversion, les canaux à convertir et pour initialiser la conversion.
cadrage indique le cadrage des 10 bits sur 16 bits , 0 à gauche, 1 à droite.
S8CM est utilisé pour choisir le nombre de conversions : 0 pour 4 conversions ou 1 pour 8 conversions.
SCAN est utilisé pour choisir entre une simple conversion (0) ou une conversion continue (1).
MULT détermine si la conversion s'effectue sur un seul canal ou plusieurs canaux. Si MULT = 0, le convertisseur effectue toutes les conversions sur un seul canal sélectionné par CD, CC, CB et CA. Si MULT = 1, la conversion s'effectue sur plusieurs canaux différents dans le groupe défini par CD, CC, CB et CA


  ATD0STAT0
$0086   
b15 b14 b13 b12 b11 b10 b9 b8
SCF n.u. n.u.
n.u. n.u.
CC2 CC1 CC0
CCF7 CCF6 CCF5 CCF4 CCF3 CCF2 CCF1 CCF0
b7
b6
b5
b4
b3
b2
b1
b0

ATD0STAT0 détermine le statut du processus de conversion. C'est un registre 16 bits. Le bit qui nous intéresse ici est le SCF. Celui-ci nous indique la fin du cycle de conversion. Nous avons donc écrit une boucle FIN_CONV0 pour attendre que ce bit prenne la valeur 1.
Quand le processsus de conversion est terminé, nous lisons la valeur obtenue dans le registre ATDODR0H. Les registres ATDxDRyH et ATDxDRyL reçoivent les résultats sur 16 bits des canaux y du convertisseur x (x = 0 ou x = 1, y = 0 à 7). Comme nous avons paramétré une résolution sur 8 bits, seule la partie haute du résultat nous intéresse et est mise en mémoire.

Il ne reste plus qu'à convertir le résultat en code ASCII et à l'afficher. Ces procédures ont été expliquées dans les programmes précédents.

Suite : Servotest

Retour sommaire Retour sommaire HC12