Bonjour tout le monde,
Pour ceux qui me connaissent (a), mon programme fonctionne enfin !!
Enfin il marche presque.
En réalité, je le test en mode Debugger avec le MPLAB ICD 2.
Mes deux 7 segments affichent bien ce qu'ils doivent afficher, seulement un des 7 segments (le 7 segments des unités) est très faiblement alimenté. Du coup je suis obligé d'éteindre les lumières pour voir les chiffres bougés et encore il faut vraiment faire attention... Par contre, le 7 segments des dizaines s'affichent correctement.
Pour ceux qui ne connaissent pas mon projet, je répète les grandes lignes.
Je mesure la force qu'on met pour attraper des objets. Pour ça j'ai des capteurs de pression à résistance variable qui font varier la tension du circuit de 0 à 4,5V. Mon PIC18F2525 fait 8 conversions analogiques-N, il fait la moyenne, puis un pourcentage de la moyenne. De là, je compte le nombre de dizaine et le nombre d'unité. Et je veux les afficher à l'aide de l'interruption du timer0 toutes les 20ms.
Le programme est écrit, mais comme je l'ai dit au début du message, mon cadran des unités n'est pas assez éclairé et je ne sais pas pourquoi...
Mes 7 segments sont des TDSR 5160 à cathode commune. Ils sont pilotés par 2 transistors branchés sur les PORTC,0 et PORTC2.
Quelqu'un aurait une idée du problème ?
Voici mon code :
Code:;********************************************************************* ; INTERRUPTION * ;********************************************************************* ; AFFICHAGE ; ; Cette interruption sert à afficher toutes ; ; les 20ms sur les cadrans 7 segments les ; ; données stockées dans les registres ones ; ; et tens ; ;********************************************** org 0x08 movlw MASK_PIR1OFF movwf PIR1,0 AFFICHAGE movlw UPPER(tabl_segment) ; charger bits 16 à 21 de l’adresse movwf TBLPTRU ; dans pointeur UPPER movlw HIGH(tabl_segment) ; charger bits 8 à 15 de l’adresse movwf TBLPTRH ; dans pointeur HIGH movlw LOW(tabl_segment) ; charger bits 0 à 7 de l’adresse movwf TBLPTRL ; dans pointeur LOW clrf PORTC BCF PORTC,0,0 ; On configure RC0 et RC2 en sortie BCF PORTC,2,0 movlw 0x01 ; on met 1 dans w movwf casel ; on charge 1 dans casel cpfseq casel,0 ; comparer casel à w, et sauter s'ils sont égaux bra AFITENS ; si différent alors on va afficher les dixaines movf ones,w,0 ; mettre le nombre d'unité dans w addwf TBLPTRL,1,0 ; ajouter ones dans le pointeur de la table L tblrd * ; lire la table à l'adresse du pointeur movf TABLAT,w ; mettre le résultat de la table dans w movwf PORTB ; envoyer la valeur de la table vers l'afficheur 7 segments BCF PORTC,0 ; allumer uniquement le cadran des unités BRA NVCASEL ; aller à NVCASEL de façon à sélectionner un nouveau cadran AFITENS movlw 0x02 ; charger 2 dans w cpfseq casel,0 ; comparer si casel est égal à deux ; si oui alors sauter l'instruction suivante bra NVCASEL ; sinon aller à NVCASEL movf tens,w,0 ; charger les tens dans w clrf TBLPTRL addwf TBLPTRL,1,0 ; Ajouter les tens dans le pointeur de la table tblrd * ; lire la table movf TABLAT,w ; charger la valeur de la table pointer dans w movwf PORTB ; envoyer la valeur vers l'afficheur BSF PORTC,0 BCF PORTC,2 ; allumer uniquement le cadran des dixaines NVCASEL RLNCF casel,1,0 ; faire une rotation de bit vers la gauche movlw 0x02 ; si casel > 2 alors le remettre à 1 cpfsgt casel,0 ; si = à 2 alors retourner pour afficher les dixaines bra AFITENS bcf INTCON,TMR0IF ; enlever le flag de l'interruption movlw 0x63 ; charger w pour le timer low movwf TMR0L ; charger le registre low du timer movlw 0xFF ; charger w pour le timer high movwf TMR0H ; charger le registre high du timer movlw MASK_PIR1ON ; Autoriser l'interruption du timer2 movwf PIR1 retfie FAST
-----