Cours de Programmation - Chap 04 - Carte de Test PIC16F876

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 5

CMJK ELM 21 - page 80

C O U R S D E P R O G R A M M A T I O N

• CHAPITRE IV •

La pr
programmation
ogrammation
des PIC16F876
de la thé
théorie à la pratique

Continuons notre route avec les fichiers assembleur et la


présentation de deux programmes. Le premier exploite le
convertisseur A/D, le second est destiné au pilotage un afficheur
7 segments.

ans cette leçon, nous sion peut être prélevée sur le cur-
allons continuer ce que seur d’un potentiomètre ou pro-
nous avons commencé venir d’un signal extérieur, selon
dans la précédente, la position de JP1 sur la carte test.
c’est-à-dire décrire des
programmes qui vous permettront Etudions en détail la fonction du
de comprendre comment utiliser registre ADCON0 qui gère juste-
divers accessoires. La car te de ment le convertisseur A/D.
test décrite dans ELM numéro 18,
page 76 et suivantes vous sera Il s’agit d’un registre constitué de
bien utile pour vos essais. 8 bits :

- Le bit 0, dénommé ADON, sert


Le fichier à allumer ou à éteindre le conver-
DEMO_5.ASM tisseur (0 éteint, 1 allumé).
- Le bit 1 n’est pas utilisé.
Ce programme permet la gestion - Le bit 2, dénommé GO/DONE
du conver tisseur A/D (analo- doit être mis à 1 pour lancer la
gique/digital) intégré au micro- conversion (GO). Une fois celle-
contrôleur. ci terminée, le microcontrôleur
met automatiquement à 0 ce bit,
Dans la car te test nous avons pour indiquer que le résultat est
prévu la possibilité d’utiliser une entrée analogique (RA0) disponible (DONE).
non pas comme une ligne normale d’entrée/sortie digitale, - Les bits de 3 à 5 sont utilisés pour sélectionner lequel
mais comme une entrée à laquelle on peut appliquer une des canaux analogiques possibles doit être utilisé pour
tension analogique comprise entre 0 et 5 volts. Cette ten- la conversion.

ELECTRONIQUE 80 magazine - n° 21
CMJK ELM 21 - page 81

;********************************************************* CALL DELAY2MS


;*** ELM COURS PIC 16C876 *** MOVLW BITS
;*** DEMO_05.ASM *** MOVWF PORT_B ;Interface à 8 bit
;*** CONVERTISSEUR A/D - LCD *** BSF PORT_A,E ;Augmente E
;********************************************************* BCF PORT_A,E ;Baisse E
CALL DELAY2MS
list P=16F876, F=INHX8M BSF PORT_A,E
BCF PORT_A,E
E EQU 1 CALL DELAY2MS
RS EQU 2 BSF PORT_A,E
CUR_HOME EQU 02 BCF PORT_A,E
DIS_CLEAR EQU 01 CALL DELAY2MS
CG_RAM EQU H’40’ ;Adresse CG ram MOVLW DO_NC
DD_RAM_1 EQU H’80’ ;Adresse première ligne MOVWF PORT_B ;Allume l’afficheur,
DD_RAM_2 EQU H’C0’ ;Adresse deuxième ligne ;pas de curseur
BITS EQU H’38’ BSF PORT_A,E
AI_NS EQU H’06’ BCF PORT_A,E
DO_NC EQU H’0C’ CALL DELAY2MS
COUNT_1 EQU 22 ;Compteur MOVLW AI_NS
COUNT_2 EQU 21 MOVWF PORT_B ;Entre le mode
PCL EQU 02 BSF PORT_A,E
R0 EQU 24 BCF PORT_A,E
R1 EQU 25 CALL DELAY2MS
R2 EQU 26 MOVLW DIS_CLEAR
HBYTE EQU 27 MOVWF PORT_B ;Efface l’afficheur
LBYTE EQU 28 BSF PORT_A,E
COUNT EQU 29 BCF PORT_A,E
TEMP EQU 2A CALL DELAY2MS
ADDRESH EQU 01E MOVLW CUR_HOME
CARRY EQU 0 MOVWF PORT_B ;Curseur au début
BSF PORT_A,E
;Configure les ports en sorties BCF PORT_A,E
MOVLW CG_RAM
PORT_A EQU 05 ;Port A MOVWF PORT_B ;Adresse CG ram
PORT_B EQU 06 ;Port B = registre 06h BSF PORT_A,E
PORT_C EQU 07 ;Port B = registre 06h BCF PORT_A,E
STATUS EQU 03 ;Registre STATUS CALL DELAY2MS
FSR EQU 04 MOVLW DD_RAM_1
RP0 EQU 05 MOVWF PORT_B ;Adresse première ligne
RP1 EQU 06 BSF PORT_A,E
TRISA EQU 085H BCF PORT_A,E
TRISB EQU 086H CALL DELAY2MS
TRISC EQU 087H BSF PORT_A,RS ;Fin envoi instructions
ADCON0 EQU 01FH CALL DELAY2MS
ADCON1 EQU 09FH
CARRY EQU 00 ;Bit de Carry ADC1
INIT ORG 0000H BCF STATUS,RP1
GOTO START MOVLW B’10000101’
START ORG 0010H MOVWF ADCON0 ;Fais partir
;la conversion
;Configure les ports en sorties CALL DELAY200MS ;Attend la fin de
;la conversion
BCF STATUS,RP0 BCF PORT_A,RS ;Début de l’envoi
BCF STATUS,RP1 ;des instructions
MOVLW B’10000101’ CALL DELAY2MS
MOVWF ADCON0 ;Arrête ADC MOVLW DIS_CLEAR
BSF STATUS,RP0 MOVWF PORT_B ;Efface l’afficheur
BCF STATUS,RP1 BSF PORT_A,E
MOVLW B’00001110’ BCF PORT_A,E
MOVWF ADCON1 CALL DELAY2MS
MOVLW B’11110001’ MOVLW CUR_HOME
MOVWF TRISA ;Port A configuré MOVWF PORT_B ;Curseur au début
MOVLW 0 BSF PORT_A,E
MOVWF TRISB ;Port B BCF PORT_A,E
MOVLW 0 BSF PORT_A,RS ;Fin de l’envoi
MOVWF TRISC ;Port C ;des instructions
BCF STATUS,RP0 CALL DELAY2MS
BCF STATUS,RP1 MOVFW ADDRESH
MOVWF LBYTE ;En LBYTE la donnée
;Initialise les compteurs ;binaire convertie
CLRF HBYTE
MOVLW H’FF’ CALL BINBCD ;Convertis en BCD
MOVWF COUNT_1
MOVLW 0 ;Nous avons alors en R1 et R2 les données BCD
MOVWF PORT_C
CALL DELAY200MS MOVFW R1
ANDLW B’00001111’
;Initialisation de l’afficheur CALL CARATT ;Ecris le premier chiffre
MOVFW R2
INIZ MOVWF TEMP
BCF PORT_A,RS ;Envoie les instructions SWAPF TEMP

ELECTRONIQUE 81 magazine - n° 21
CMJK ELM 21 - page 82

MOVFW TEMP NOP


ANDLW B’00001111’ NOP
CALL CARATT ;Ecris le deuxième chiffre NOP
MOVFW R2 DECFSZ COUNT_1,1 ;10 uS * 200 = 2 MS
ANDLW B’00001111’ GOTO DELAY2 ;Si n’est pas 0,
CALL CARATT ;Ecris le troisième chiffre ;va à DELAY1
CALL DELAY200MS RETURN ;Reviens au programme
GOTO ADC1 ;principal 1

;Routine pour adresser la première ligne DELAY200MS


MOVLW D’100’
LIGNE_1 BCF PORT_A,RS ;Envoie une instruction MOVWF COUNT_2
MOVLW DD_RAM_1 DELAY3
MOVWF PORT_B ;Adresse la première CALL DELAY2MS
;ligne DECFSZ COUNT_2
BSF PORT_A,E GOTO DELAY3
BCF PORT_A,E RETURN
CALL DELAY2MS
BSF PORT_A,RS ;Routine de conversion binaire BCD
RETURN
BINBCD
;Routine pour adresser la deuxième ligne BCF STATUS,0
MOVLW D’16’
LIGNE_2 BCF PORT_A,RS ;Envoie une instruction MOVWF COUNT
MOVLW DD_RAM_2 CLRF R0
MOVWF PORT_B ;Adresse la deuxième CLRF R1
;ligne CLRF R2
BSF PORT_A,E
BCF PORT_A,E LOOP16
CALL DELAY2MS RLF LBYTE
BSF PORT_A,RS RLF HBYTE
RETURN RLF R2
RLF R1
;Routine pour écrire un caractère pris de TABLE RLF R0

CARATT CALL TABLE DECFSZ COUNT


MOVWF PORT_B GOTO ADJDEC
BSF PORT_A,E RETLW 0
BCF PORT_A,E
CALL DELAY2MS ADJDEC
RETURN MOVLW R2
MOVWF FSR
;Tableau CALL ADJBCD
MOVLW R1
TABLE ADDWF PCL MOVWF FSR
RETLW ‘0’ CALL ADJBCD
RETLW ‘1’ MOVLW R0
RETLW ‘2’ MOVWF FSR
RETLW ‘3’ CALL ADJBCD
RETLW ‘4’ GOTO LOOP16
RETLW ‘5’
RETLW ‘6’ ADJBCD
RETLW ‘7’ MOVLW 3
RETLW ‘8’ ADDWF 0,W
RETLW ‘9’ MOVWF TEMP
BTFSC TEMP,3
;Routine de retard MOVWF 0
MOVLW 30
DELAY2MS ADDWF 0,W
MOVLW D’200’ MOVWF TEMP
MOVWF COUNT_1 BTFSC TEMP,7
DELAY2 MOVWF 0
NOP RETLW 0
NOP
NOP END
NOP

- Les bits 6 et 7, dénommés respecti- tats de la conversion, dénommés senté de deux façons différentes :
vement ADCS0 et ADCS1, servent à ADRESH et ADRESL. Vous pouvez, à Alignement à droite (ADFM = 1) :
choisir la vitesse de conversion, obte- travers le bit 7 du registre ADCON1, ADRESH : 00000011
nue par la division de la fréquence à dénommé ADFM, définir le format de ADRESL : 00101001
laquelle le microcontrôleur est en train sor tie du conver tisseur, avec aligne-
de travailler. ment à droite ou à gauche. Alignement à gauche (ADFM = 0) :
ADRESH : 11001010
Rappelez-vous que le convertisseur du Supposons par exemple que le résul- ADRESL : 01000000
microcontrôleur travaille sur 10 bits. tat de la conversion soit le numéro
C’est la raison pour laquelle il existe binaire à 10 bits suivant : Au cas où vous voudriez utiliser le
deux registres qui contiennent les résul- 1100101001. Ceci peut être repré- convertisseur avec les 10 bits, il sera

ELECTRONIQUE 82 magazine - n° 21
CMJK ELM 21 - page 83

nécessaire de sélectionner le format était de 8 bits, de façon à avoir le résul- Dans les programmes que nous avons
avec alignement à droite, puisque nous tat sur un seul byte, plus facile à exploi- réalisés, nous avons utilisé le conver-
aurons en ADRESH et ADRESL les deux ter. Dans ce deuxième cas, vous devrez tisseur exactement de cette façon.
bytes de la conversion. utiliser l’alignement à gauche et lire le
résultat de la conversion directement Voyons maintenant le programme qui
Il est cependant très souvent suffisant en ADRESH, en laissant de côté le effectue la conversion et en visualise
d’utiliser le conver tisseur comme s’il contenu de ADRESL. le résultat sur l’afficheur LCD.

;********************************************************* GOTO UP1


;*** ELM COURS PIC 16C876 *** CALL DELAY100MS
;*** DEMO_06.ASM *** RETURN
;**VISUALISER DES CHIFFRES SUR L’AFFICHEUR 7 SEGMENTS**
;********************************************************* DOWN
CALL DELAY100MS
list p=16F876, f=inhx8m MOVLW 0
SUBWF SORTIE,0
PORT_A EQU 05 ;Port A BTFSS STATUS,Z ;SORTIE = 0 ?
PORT_B EQU 06 ;Port B = registre 06h DECF SORTIE ;NON : décrémente
PORT_C EQU 07 ;Port B = registre 06h CALL BIN7SEG
STATUS EQU 03 ;Registre STATUS
PCL EQU 02 DOWN1
RP0 EQU 05 BTFSS PORT_A,5 ;Tant que le bouton
RP1 EQU 06 ;est appuyé
Z EQU 02 GOTO DOWN1
TRISA EQU 085h CALL DELAY100MS
TRISB EQU 086h RETURN
TRISC EQU 087h
ADCON0 EQU 01Fh BIN7SEG
ADCON1 EQU 09Fh MOVFW SORTIE
COUNT_1 EQU 21 ;Compteur CALL TABLE
COUNT_2 EQU 22 ;Compteur MOVWF PORT_C
SORTIE EQU 23 RETURN
CARRY EQU 00 ;Bit de Carry
INIT ORG 0000H ;Tableau
GOTO START
START ORG 0010H TABLE
ADDWF PCL
;Configure les ports en sorties RETLW b’10111110’
RETLW b’00011000’
BCF STATUS,RP0 RETLW b’01110110’
BCF STATUS,RP1 RETLW b’01111010’
MOVLW 0 RETLW b’11011000’
MOVWF ADCON0 ;Arrête ADC RETLW b’11101010’
BSF STATUS,RP0 RETLW b’11001110’
BCF STATUS,RP1 RETLW b’00111000’
MOVLW 07 RETLW b’11111110’
MOVWF ADCON1 ;Toutes les broches RETLW b’11111000’
;digitales
MOVLW 0FFh ;Routine de retard
MOVWF TRISA ;Port A entrée
MOVLW 0FFh DELAY2MS
MOVWF TRISB ;Port B MOVLW D’200’ ;1 uS
MOVLW 0 MOVWF COUNT_1 ;1 uS
MOVWF TRISC ;Port C
BCF STATUS,RP0 DELAY2
BCF STATUS,RP1 NOP
NOP
;Programme principal NOP
NOP
MOVLW 00 NOP
MOVWF SORTIE ;Sortie = 0 NOP
CALL BIN7SEG ;Visualise 0 NOP
DECFSZ COUNT_1,1 ;10 uS * 200 = 2 MS
MAIN GOTO DELAY2 ;Si n’est pas 0,
BTFSS PORT_A,4 ;Bouton UP appuyé ? ;va à DELAY1
CALL UP RETURN ;Reviens au programme
BTFSS PORT_A,5 ;Bouton DOWN appuyé ? ;principal 1
CALL DOWN
GOTO MAIN DELAY100MS
MOVLW D’50’
UP MOVWF COUNT_2
CALL DELAY100MS
MOVLW 9 DELAY3
SUBWF SORTIE,0 CALL DELAY2MS
BTFSS STATUS,Z ;SORTIE = 9 ? DECFSZ COUNT_2
INCF SORTIE ;Non : incrémente GOTO DELAY3
CALL BIN7SEG RETURN
UP1
BTFSS PORT_A,4 ;Tant que le bouton END
;est pressé

ELECTRONIQUE 83 magazine - n° 21
CMJK ELM 21 - page 84

Rappelez-vous que le nombre que vous verrez écrit sur l’af- ABONNEZ-VOUS A
ficheur n’est pas la valeur de tension, mais le résultat sur
8 bits de la conversion.

Etant donné que nous avons comme échelle d’entrée du


convertisseur l’entière tension d’alimentation (de 0 à 5 V),
nous devrons appliquer cette simple formule pour obtenir
la valeur de tension : Le chiffre 0 est chargé dans le registre SORTIE et la rou-
tine BIN7SEG est appelée. Celle-ci ne fait que lire un tableau,
V = (5/255) x valeur lue adressé par la variable SORTIE, et en charger la valeur sur
le port C, c’est-à-dire le port qui pilote l’afficheur à 7 seg-
Après cette longue introduction, étudions en détail le pro- ments.
gramme : DEMO_05.ASM.
Imaginons par exemple que SORTIE vaut 0. Le tableau est
Tout d’abord, on initialise l’afficheur. On charge, ensuite, appelé, et le nombre binaire 10111110 est passé au port
la combinaison binaire 10000101 dans le registre ADCON0 C à travers le registre W. Ceci permet d’allumer les diffé-
(afin d’imposer comme fréquence de conversion la fréquence rents segments de l’afficheur de façon à visualiser correc-
de l’oscillateur divisée par 32), puis on impose l’utilisation tement le chiffre 0.
du canal 0 (RA0) pour la conversion.
Tous les autres nombres codifiés dans le tableau, corres-
Pour terminer, on commande le début de la conversion en pondent exactement aux 0 et aux 1 à mettre sur le port C
mettant le bit 2 au niveau logique 1. pour visualiser les chiffres de 0 à 9. Donc, si l’on met un
nombre dans la variable SORTIE, et que l’on appelle la rou-
Une routine de temporisation de 200 ms est alors appe- tine BIN7SEG, le chiffre décimal correspondant à la valeur
lée : un temps extrêmement plus long que celui de la conver- de SORTIE est immédiatement visualisé.
sion (à peu près 8 µs) mais adéquat pour nos objectifs, où
peu de conversions à la minute sont demandées pour visua- Maintenant le programme doit tester continuellement si l’un
liser les données sur l’afficheur LCD. des deux boutons est pressé.

Une fois cette durée écoulée, vous pouvez prélever le résul- Pour vérifier la pression d’un bouton, on utilise l’instruction
tat de la conversion en ADRESH. L’afficheur est effacé et BTFSS (Bit Test File Skip If Set, soit, en bon français : teste
le curseur est reporté au début de la ligne, à travers les ins- le bit du fichier et saute s’il est égal à 1 - ouf !).
tructions appropriées envoyées au LCD.
Dans notre cas, sont testés les bits du port correspondant
Avant de pouvoir visualiser les résultats, vous devez d’abord aux deux boutons.
convertir les données binaires du registre ADRESH en trois
chiffres BCD correspondants pour les envoyer sur l’afficheur. Si ceux-ci ne sont pas pressés, la patte correspondante du
microcontrôleur se trouve au niveau logique haut par l’ef-
Pour ce faire, vous allez utiliser une routine mathématique, fet des résistances de tirage (pull-up), et donc les instruc-
dénommée BINBCD. Sans entrer dans les détails de la tech- tions BTFSS font sauter les instructions qui suivent immé-
nique de conversion binaire-BCD, nous pouvons dire que diatement, c’est-à-dire les CALLUP et CALLDOWN.
cette routine prend en entrée deux bytes, dénommés LBYTE
et HBYTE, et rend en sortie, dans les trois registres R0, R1 Si un bouton est pressé, l’instruction qui appelle la sous-
et R2, les six chiffres qui constituent le nombre binaire reçu routine sera alors exécutée. Les routines UP et DOWN atten-
en entrée. dent 100 ms et incrémentent (UP) ou décrémentent (DOWN)
le chiffre seulement après avoir contrôlé que celui-ci n’est
Comme dans votre cas vous ne devez convertir qu’un seul pas dehors de l’échelle prévue (0 à 9). Puis la routine
byte, vous utiliserez seulement le registre LBYTE, mettant BIN7SEG est appelée afin de visualiser la valeur de SOR-
donc le registre HBYTE à 0. Vous aurez comme résultat en TIE sur l’afficheur. Le programme attend tant que le bouton
R1 et en R2 les chiffres BCD de la conversion. Ces chiffres pressé n’a pas été relâché et, seulement alors, revient au
sont envoyés à l’afficheur à travers la routine CARATT qui programme principal.
s’occupe de les visualiser. ◆ R. N.

Le fichier DEMO_6.ASM LA LIBRAIRIE


Passons à un listing de programme grâce auquel vous pour-
rez faire apparaître, sur l’afficheur 7 segments, un chiffre
qui pourra être incrémenté ou décrémenté en appuyant sur Réservés, il y a encore quelques années, aux seuls industriels, les
les deux boutons présents sur la carte-test. microcontrôleurs sont aujourd’hui à la portée des amateurs et per-
mettent des réalisations aux possibilités étonnantes. Vous pouvez
SRC pub 02 99 42 52 73 02/2001

concevoir l’utilisation des microcontrôleurs de deux façons diffé-


Si l’on laisse de côté l’initialisation du microcontrôleur, le rentes. Vous pouvez considérer que ce sont des circuits « comme
les autres », intégrés à certaines réalisations, et tout ignorer de
programme en lui-même commence avec les instructions
suivantes : 90 F leur fonctionnement. Mais vous pouvez aussi profiter de ce
cours pour exploiter leurs possibilités de programmation, soit
pour concevoir vos propres réalisations, soit pour modifier le
comportement d’appareils existants, soit simplement pour com-
MOVLW 00 Réf. : JEA25 + port 35F prendre les circuits les utilisant. Pour ce faire, il faut évidemment
MOVWF SORTIE ;Sortie = 0 Utilisez le bon savoir les programmer mais, contrairement à une idée reçue qui a
CALL BIN7SEG ;Visualise 0 de commande ELECTRONIQUE la vie dure, ce n’est pas difficile. C’est le but de ce Cours.

ELECTRONIQUE 84 magazine - n° 21

Vous aimerez peut-être aussi