Nous n`avons malheureusement pas pu atteindre les objectifs

publicité
CYR
Frédéric
DERAMAIX Guillaume
VARIN
Olivier
EL 211 – Convertisseur Sigma Delta
Rapport de TP
Le but de ces séances de TP est de programmer un PIC16F84 pour l’acquisition de la
sortie d’un modulateur sigma delta. Nous avons donc chercher à compter, pendant un temps
donné par une horloge, le nombre de fois où SL ( Serial Line , sortie du modulateur sigma
delta) est à l’état haut de façon à pouvoir par la suite déduire le rapport cyclique de SL. Le
signal d’horloge du modulateur sigma delta est généré par un Timer intégré au PIC16F84. A
chaque front montant de notre horloge, nous devons regarder l’état de SL. L’acquisition,
déclenchée par une pression sur le bouton A0, lance le timer pour 1000 coups d’horloge.
Chaque coup d’horloge lance un programme d’interruption, qui va changer l’état du signal
d’horloge sortant, incrémenter un registre de comptage du nombre d’interruptions, et
incrémenter un des registres de comptage du nombre d’états hauts de SL. On désarme les
interruptions au bout de 1000 coups d’horloge, et on affiche le résultat de l’acquisition, c'est-àdire le nombre de SL.
Problèmes rencontrés :
Nous avons eu de gros problème pour comprendre le fonctionnement du PIC. Le langage
bien que proche de celui de l’assembleur a des particularité qui furent un obstacle a la
programmation. C’est pour cela que nous n’avons pu réaliser que l’affichage sur l’écran
LCD
Programme
__CONFIG H'3FF9'
#DEFINE
#DEFINE
PAGE0 BCF
PAGE1 BSF
OPTION_REG
PCL
STATUS
PORTA
TRISA
PORTB
TRISB
INTCON
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
H'81'
H'02'
H'03'
H'05'
H'85'
H'06'
H'86'
H'0B'
compteur1
compteur2
CLKCNT
stockage EQU
RSLINE EQU
EQU
EQU
EQU
H'27'
H'2F'
H'20'
H'21'
H'22'
; XT mode
STATUS,5
STATUS,5
;compteur 1
;compteur 2 (pour le LCD)
;compteur 125 secs
;stockage de la valeur à envoyer dans lCD
;bit 4 du RS line , permet de choisir
;d'envoyer des données ou des instructions (data 1, instruction 0)
W
F
EQU
EQU
0
1
ORG
GOTO
GOTO
ORG
0
5
5
5
;Vecteur reset
;Va au début du programme
;Va au début du programme
;Adresse début programme
;*********************************************************************************
;
;initialisation du LCD
;
CLRF PORTB
PAGE1
CLRF TRISB
;Initialisation du port b
MOVLW
B'00000110'
;set timer ratio 1:128
MOVWF
OPTION_REG
PAGE0
GOTO debutprog
INITLCD
ADDWF
PCL,F
RETLW B'00110011'
RETLW B'00110011'
RETLW B'00110010'
RETLW B'00101100'
RETLW B'00000110'
RETLW B'00001100'
RETLW B'00000001'
RETLW B'00000010'
;initialisation du LCD
;fin initialisation
STARTPROG
CLRF
CLRF
compteur1
RSLINE
;initialise la boucle du LCD
;clear RS line, pour envoi d'instructions (bit 4)
;boucle de configuration
LOOP1 MOVF compteur1,W
CALL INITLCD
CALL sendLCD
INCF compteur1,F
BTFSS compteur1,3
GOTO LOOP1
CALL PAUSIT
CLRF
BSF
compteur1
RSLINE,4
;met valeur de la boucle registre de travail
;saisie d'une ligne de configuration
;envoi au LCD
;incrémentation
;test si 8ème boucle
;non reboucle
;oui, délai de 1/5 secondes (tps de travail LCD) puis suite
;initialise compteur
;set RS line, pour envoi d'instructions (bit 4)
;boucle d'affichage de la première ligne
LOOP2 MOVF compteur1,W
CALL DISPLAYWEL
CALL sendLCD
INCF compteur1,F
BTFSS compteur1,4
GOTO LOOP2
CALL PAUSIT
CLRF RSLINE
MOVLW
B'11000000'
CALL sendLCD
;get table address
;met une lettre de la 1ère chaîne de caractères dans W
;affichage de cette lettre
;incrementation de la lettre
;test si 8ème lettre
;non => reboucle
;oui => pause
;initialisation RSline pour envoi d'instructions
;met valeur dans W pour passage à la deuxième ligne
;execution
CALL PAUSIT
;attente 1/5s
CLRF
BSF
;initialise compteur1
;set bit 4 de RSline pour envoyer des adresses
compteur1
RSLINE,4
;boucle d'affichage de la deuxième ligne
LOOP3 MOVF compteur1,W
;envoi de boucle dans W
CALL DISPLAYPRESS
;met une lettre de la 2ème chaîne de caractères dans W
CALL sendLCD
;affichage
INCF compteur1,F
;incrémentation de compteur1
BTFSS compteur1,4
;teste si dernier caractère de la chaîne
GOTO LOOP3
;non, reboucle
;boucle infinie lorsque la fin du prog est atteinte
LOOP_INF
BTFSC PORTA,0
GOTO lasuite
GOTO LOOP_INF
;passe à la suite du programme qui lance un compteur
;boucle infinie
;**************************************************************************************
;sous programme d'envoi des données au LCD
sendLCD
MOVWF
MOVLW
MOVWF
stockage
D'50'
compteur2
attente DECFSZ compteur2,F
GOTO attente
SEND
;stockage de la valeur a afficher
;temps minimum d'attente
;décremente compteur2 de 50 à 0
CALL SEND
CALL SEND
RETURN
;envoi du MSB
;envoi du LSB
SWAPF stockage,F
MOVF stockage,W
ANDLW
H'0F'
IORWF RSLINE,W
MOVWF
PORTB
BSF
PORTB,5
BCF
PORTB,5
;permutation des bits de poids fort et ceux de poids faible
;récupération du bit de poids fort (ou faible)
;OR RSline pour envoyer les paramètres au LCD
;envoi du bit
;fait passer l'info du W (MSB ou LSB) vers le port b
RETURN
;*********************************************************************************
;sous programme d'attente
PAUSIT
MOVLW
5
MOVWF
CLKCNT
CLRF INTCON
PAUSE
BTFSS INTCON,2
GOTO PAUSE
;met le compteur à 5
;(pour 1/5ème secondes)
;initialise le drapeau d'interruption
;initial 1/5th sec wait before setting up LCD
;test si le décomptage est terminé
RETURN
;************************************************************************************
;chaînes de caractères à afficher
DISPLAYWEL ADDWF
RETLW 'B'
RETLW 'i'
RETLW 'e'
RETLW 'n'
RETLW 'v'
RETLW 'e'
RETLW 'n'
RETLW 'u'
RETLW 'e'
RETLW '!'
RETLW ' '
RETLW ' '
RETLW ' '
RETLW ' '
RETLW ' '
RETLW ' '
PCL,F
DISPLAYPRESS
ADDWF
RETLW 'A'
RETLW 'p'
RETLW 'p'
RETLW 'u'
RETLW 'y'
RETLW 'e'
RETLW 'z'
RETLW ' '
RETLW 's'
RETLW 'u'
RETLW 'r'
RETLW ' '
RETLW ' '
RETLW 'A'
RETLW '0'
RETLW ' '
DISPLAYWAIT ADDWF
RETLW 'a'
RETLW 'c'
RETLW 'q'
RETLW 'u'
RETLW 'i'
RETLW 's'
RETLW 't'
RETLW 'i'
RETLW 'o'
RETLW 'n'
RETLW '.'
RETLW '.'
RETLW '.'
RETLW ' '
PCL,F
PCL,F
RETLW ' '
RETLW ' '
;****************************************************************************
;suite du programme qui affiche "en attente d'acquisition..."
CLRF compteur1
;initialise la boucle du LCD
CLRF RSLINE
;initialisation RSline pour envoi d'instructions
MOVLW
B'00000001'
;met valeur dans W pour passage à la deuxième ligne
CALL sendLCD
;execution
CALL PAUSIT
;attente 1/5s
LOOP4 MOVF compteur1,W
CALL DISPLAYWAIT
CALL sendLCD
INCF compteur1,F
BTFSS compteur1,4
GOTO LOOP4
CALL PAUSIT
;get table address
;met une lettre de la 1ère chaîne de caractères dans W
;affichage de cette lettre
;incrementation de la lettre
;test si dernière lettre
;non, reboucle
;oui, pause pour laisser du temps au LCD
attente2 goto
;boucle sans fin
attente
END
Conclusion
Nous n’avons malheureusement pas pu atteindre les objectifs prévus. En effet, nous
avons eu des difficultés à programmer le PIC, à comprendre comment ça marchait, la syntaxe à
utiliser etc…ce qui est notamment dû aux différences entre le langage de programmation du
PIC et celui du langage assembleur (par exemple pour le registre W). A cela se sont rajoutées
des erreurs de programmation que nous avons eu énormément de mal à débugger et qui nous
ont retardé considérablement.
Téléchargement