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.