Comme vous pouvez le constater, je n'ai toujours pas réussi a faire ma programmation de PIC...
Bon mon programme fonctionne parfaitement en simulation. Seulement, après l'avoir loader dans le pic via MPLAB ICD 2, ça ne marchhhee paaaaaas
Le premier gros problème que j'ai, c'est que mon PIC fait des conversions analogiques digitales ANARCHIQUES !!!
Il met vraiment ce qu'il veut... Je n'arrive pas à comprendre pourquoi.
Peut être que qlqun pourrait m'aider?
Merci
[CODE] LIST p=18F2525 #include <p18F2525.inc>
CONFIG OSC = INTIO67 CONFIG FCMEN = OFF CONFIG IESO = OFF CONFIG PWRT = OFF CONFIG BOREN = OFF CONFIG WDT = OFF CONFIG MCLRE = OFF CONFIG LPT1OSC = OFF CONFIG PBADEN = OFF CONFIG DEBUG = ON
MASK_ADCON0 EQU B'00000000' ; la conversion analogique n'est pas autorisée MASK_ADCON1 EQU B'00001101' ; Le voltage de référence pour la conversion étant comme VSS et VDD MASK_ADCON2 EQU B'10001100' ; définie la justification par la droite ou gauche
MASK_AD1CON0 EQU B'00000111' ; la conversion analogique est autorisée et lancée sur le channel 1
MASK_TRISA EQU B'00000011' ; les pins 2 et 3 sont configurées comme des entrées ; et 4,5,6,7,9 et 10 comme des sorties MASK_TRISB EQU B'00000000' ; Toutes les pins PORTB sont configurées comme des sorties
MASK_TRISC EQU B'01000000' ; Toutes les pins PORTC sont configurées en sortie sauf RC6 qui sera utilisé ; pour l'USART
MASK_T2CONOFF EQU B'00000011' ; Le timer2 n'est pas enclenché MASK_T2CONON EQU B'00000111' ; le timer2 est enclenché
MASK_T0CONOFF EQU B'00000111' ; le timer n'est pas enclenché MASK_T0CONON EQU B'10000111' ; le timer est enclenché
MASK_CCP2ON EQU B'00001100' ; configure le registre CCP2 en mode PWM MASK_CCP2OFF EQU B'00000000' ; désactive le mode PWM du CCP2
MASK_PIR1ON EQU B'00000010' ; Autorise l'interruption lorsque TIMER2 dépasse PR2 MASK_PIR1OFF EQU B'00000000' ; interdire l'interruption du timer2
MASK_INTCONOFF EQU B'00000000' ; interdire les interruptions du timer0 MASK_INTCONON EQU B'10100000' ; autorise l'interruption du timer 0
#DEFINE a PORTB,0 ; Afficheur de la barre a #DEFINE b PORTB,1 ; Afficheur de la barre b #DEFINE c PORTB,2 ; Afficheur de la barre c #DEFINE d PORTB,3 ; Afficheur de la barre d #DEFINE e PORTB,4 ; Afficheur de la barre e #DEFINE f PORTB,5 ; Afficheur de la barre f #DEFINE g PORTB,6 ; Afficheur de la barre g #DEFINE dp PORTB,7 ; Afficheur de la barre dp
#DEFINE Unites PORTC,0 ; Allume le 7 segments des unités #DEFINE Dixaines PORTC,2 ; allume le 7 segments des dixaines #DEFINE Son PORTC,1 ; alimente le haut parleur
;********************************************************************* ; TABLE 7 segments * ;Cette table permet le stockage d'informations concernant l'affichage* ; des 7 segments. Elle contient les adresses qui permettent d'affiher* ;tel ou tel chiffre. Les adresses suivantes sont attribuées * ;respectivement à 0,1,2,3,4,5,6,7,8,9,10 * ;********************************************************************* tabl_segment EQU 0x0001000
org tabl_segment
db 0x3F,0x06,0x5B,0x4F db 0x26,0x6D,0x7D,0x07 db 0x7F,0x6F,0x00
CBLOCK 0x00 cmptac : 1 ; Temps nécessaire à la charge du convertisseur pour l' ; acquisition cmptac50 : 1 cmptmoy : 1 ; compteur permettant d'avoir 8 échantillons et d'en faire ; la moyenne accumL : 1 accumH : 1
moyenneL : 1 ; 8 premiers octets de la moyenne moyenneH : 1 ; 8 derniers octets de la moyenne
ones : 1 ; variables des unités pour 7-segments tens : 1 ; variables des dixaines pour 7-segments casel : 1 ; permet de sélectionner quel cadran allumer
cmptpile : 1 ; registre permettant de tester la pile pileL : 1 ; valeur de la conversion pour vérifier la pile pileH : 1
onespile : 1 ; unité et dixaine de la conversion tenspile : 1 ; pour vérifier la pile
; 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 ; On configure RC0 et RC1 en sortie BCF PORTC,1
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
BSF PORTC,0,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 clrf PORTB movwf PORTB ; envoyer la valeur vers l'afficheur
BSF PORTC,2,0 ; 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
;********************************************************************* ; INITIALISATION * ;********************************************************************* init movlw MASK_ADCON1 ; ANO = entrée analogique. Vref = Vss et Vdd movwf ADCON1
movlw MASK_ADCON0 ; AN0 sélectionnée, pas de conversion en cours movwf ADCON0
movlw MASK_ADCON2 ; Justification par la droite, Acquisition time = 2Tad movwf ADCON2
movlw MASK_TRISA ; Configurer Pin 2 et 3 comme des entrées movwf TRISA
clrf PORTB movlw MASK_TRISB ; Configurer toutes les pins PORTB comme des sorties movwf TRISB
clrf PORTC movlw MASK_TRISC ; configurer les pins 11,12,13,14,15,16,18 en sortie et 17 en entrée movwf TRISC
movlw MASK_T0CONON ; Lancer le timer0 movwf T0CON,0 movlw 0x63 ; l'interruption aura lieu toutes les 20msec movwf TMR0L movlw 0xFF movwf TMR0H movlw MASK_INTCONON ; autoriser les interruptions du timer0 movwf INTCON
movlw MASK_CCP2OFF ; désactiver le mode PWM car pas de moyenne movwf CCP2CON
GOTO MAIN
;********************************************************************* ; Test de la pile * ;*********************************************************************
PILE
movlw MASK_T0CONOFF ; Arreter le timer0 pendant la conversion movwf T0CON,0
movlw MASK_PIR1OFF movwf PIR1
movlw MASK_AD1CON0 ; autoriser et lancer la conversion sur ch1 movwf ADCON0
BOUCLECONVPILE
btfsc ADCON0,GO/DONE ; tester si = 0 alors conversion finie ; une fois la conversion finie, le résultat ; vient se mettre dans deux registres : ADRESL et ADRESH bra BOUCLECONVPILE ; =/0 donc boucle2
movlw MASK_T0CONON ; Relancer le timer0 movwf T0CON
movlw MASK_PIR1ON ; Autoriser l'interruption du timer2 movwf PIR1
movff ADRESL,pileL movff ADRESH,pileH
; movlw 0x23 ; simulation de prise d'échantillon pour la pile ; movwf pileL ; movlw 0x0 ; movwf pileH ; CHIFFRES ; pour savoir combien il y a de dixaine ; ********************************************************** CHIFFREPILE
clrf onespile ; Effacer "ones" et "tens" clrf tenspile
DIXAINEPILE
movlw 0xA ; Charger 10 dans w pour savoir ; combien de dixaine il y a dans notre moyenne subwf pileL,1,0 ; pour se faire, on soustrait 10 à L et on laisse ; le résultat dans accumL jusqu'à obtenir un négatif movlw 0x0 subwfb pileH,1,0 ; sousraire le Report de soustraction si il y en a
bn NEGATIFPILE ; si le résultat < 0 alors N du reg status vaut 1 ; Donc on va direct à NEGATIF. Si > 0 incf tenspile ; alors on incrémente de 1 la variable tens
BZ FIN_CHIFFREPILE ; si le résultat = 0 alors plus de reste donc terminé
bra DIXAINEPILE ; Si le résultat est possitif alors on recommence.
NEGATIFPILE
movlw 0xA ; on rajoute les 10 dans accumL pour retrouver un chiffre positif addwf pileL,1,0 ; et les passer dans la variable ones
UNITEPILE
movff pileL,onespile
FIN_CHIFFREPILE ; AFFICHAGE ; SI tens = 8 et ones = 8 ; alors afficher deux lignes sur les cadrans ; pour dire que la pile est plate ; ************************************************
movlw 0x9 ; simulation d'une pile HS movwf tenspile
movlw 0x9 ; la pile est alors chargé à 99% movwf onespile
AFFICHAGEPILE
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
BCF PORTC,0 ; On configure RC0 et RC1 en sortie BCF PORTC,1
movlw 0x8 subwf tenspile
BZ AFIONESPILE BN ZERO
bra CHIFFRE_RECHARGEPILE
AFIONESPILE
movlw 0x9 subwf onespile
bz MAIN
ZERO
movlw MASK_INTCONOFF ; interdire les interruptions movwf INTCON,0
movlw 0 ; afficher 0 pour dire que la pile est morte addwf TBLPTRL,1,0 ; Ajouter 0 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,1,0 ; allumer uniquement le cadran des dixaines
bra ZERO ; tourner en boucle pour ne pas permettre ; l'utilisation du cadran
;********************************************************************* ; PROGRAMME PRINCIPALE * ;*********************************************************************
MAIN
movlw MASK_T0CONON ; Lancer le timer0 movwf T0CON,0 movlw 0x63 ; l'interruption aura lieu toutes les 20msec movwf TMR0L
movlw 0xFF movwf TMR0H
movlw MASK_INTCONON movwf INTCON
movlw 0x32 ; charge le compteur à 50 de façon à ce qu'à 0 movwf cmptpile ; il y ait test de la pile
bsf ADCON0,ADON ; autoriser la conversion analogique
movlw 0xFA ; charger le registre W à 250 movwf cmptac ; charger la variable cmpt1 pour obtenir un échantillon toutes les 25ms
movlw 0x8 ; charger le w à 8 pour obtenir 8 échantillons movwf cmptmoy ; charger cmptmoy à 8
BOUCLE ; toutes les 50ms prendre un échantillon movlw 0xA ; charger 10 dans w movwf cmptac50
BOUCLE50MS_INTERRUPTIONON
movlw MASK_INTCONON ; Autorise l'interruption du timer0 pendant la boucle movwf INTCON
movlw MASK_PIR1ON ; Autorise l'interruption du timer2 pendant la boucle movwf PIR1
BOUCLE50MS
decfsz cmptac ; décrémenter cmptac
bra BOUCLE50MS ; =/ 0 boucle1
decfsz cmptac50
bra BOUCLE50MS_INTERRUPTIONON
movlw MASK_T0CONOFF ; Arreter le timer0 pendant la conversion movwf T0CON
movlw MASK_PIR1OFF ; interdire l'interruption du timer2 pendant la conversion movwf PIR1
bsf ADCON0,GO_DONE ; lancer la conversion analogique/digitale
BOUCLECONV
btfsc ADCON0,GO/DONE ; tester si = 0 alors conversion finie ; une fois la conversion finie, le résultat ; vient se mettre dans deux registres : ADRESL et ADRESH bra BOUCLECONV ; =/0 donc boucle2
movlw MASK_T0CONON ; Relancer le timer0 movwf T0CON
movlw MASK_PIR1ON ; Autoriser l'interruption du timer2 movwf PIR1
; movlw 0x10 ; simuler une acquisition ; movwf ADRESL
; movlw 0x00 ; simuler une acquisition ; movwf ADRESH
; STOCKER LES ECHANTILLONS POUR FAIRE LA MOYENNE ;*********************************************************************
movf ADRESL,w ; charger la conversion ADRESL dans registre w addwf accumL ; additionner la précédente conversion avec la valeur de add8v0
movf ADRESH,w ; charger la conversion ADRESH dans registre w addwfc accumH ; additionner la précédente conversion avec la valeur de add8v1
; retour à la prise d'échantillons ;*********************************************************************
BOUCLEMOY decfsz cmptmoy ; décrémenter le registre cmptmoy de 1 bra BOUCLE ; si =/ 0 alors retour à BOUCLE 1
; calculer la moyenne ;**********************************************************************
MOYENNE
RRCF accumH ; divise RRNCF et RRCF par 2 RRNCF accumL RRCF accumH ; Divise encore par 2 RRNCF accumL RRCF accumH ; divise encore par 2 donc finalement on a par 8 RRNCF accumL
decfsz cmptpile ; enlever 1 à cmptpile bra CHIFFRE
CHIFFRE_RECHARGEPILE movlw 0x32 ; charge le compteur à 50 de façon à ce qu'à 0 movwf cmptpile ; il y ait test de la pile
CHIFFRE
movlw MASK_INTCONON movwf INTCON,0
clrf ones ; Effacer "ones" et "tens" clrf tens
DIXAINE
movlw 0xA ; Charger 10 dans w pour savoir ; combien de dixaine il y a dans notre moyenne subwf accumL,1,0 ; pour se faire, on soustrait 10 à accumL et on laisse ; le résultat dans accumL jusqu'à obtenir un négatif movlw 0x0 subwfb accumH,1,0 ; sousraire le Report de soustraction si il y en a
bn NEGATIF ; si le résultat < 0 alors N du reg status vaut 1 ; Donc on va direct à NEGATIF. Si > 0 incf tens ; alors on incrémente de 1 la variable tens
BZ FIN_CHIFFRE ; si le résultat = 0 alors plus de reste donc terminé
bra DIXAINE ; Si le résultat est possitif alors on recommence.
NEGATIF
movlw 0xA ; on rajoute les 10 dans accumL pour retrouver un chiffre positif addwf accumL,1,0 ; et les passer dans la variable ones
UNITE
movff accumL,ones
FIN_CHIFFRE
; TEST des unités pour sélectionner la fréquence ; *********************************************************************
TEST_SON
movff tens,tensson ; charger les dixaines dans tensson pour savoir quelle fréquence charger
TEST90
movlw 0x9 ; charger 9 dans w subwf tensson ; tensson > 90?
bn TEST80 ; NON donc aller au test suivant
bra FREQUENCE90 ; OUI donc charger le timer1 pour une fréquence à 90
TEST80
addwf tensson ; rajouter 90 dans tensson movlw 0x8 ; charger 8 dans w subwf tensson ; 90 > tensson > 80?
bn TEST70 ; NON donc aller au test suivant
bra FREQUENCE80 ; OUI donc charger le timer1 pour fréquence à 80
TEST70
addwf tensson ; rajouter 80 dans tensson movlw 0x7 ; charger 7 dans w subwf tensson ; 80 > tensson > 70?
bn TEST60 ; NON donc aller au test suivant
bra FREQUENCE70
TEST60
addwf tensson ; charger 70 dans tensson movlw 0x6 ; charger 6 dans w subwf tensson ; 70 > tensson > 60?
bn TEST50 ; NON donc aller au test suivant
bra FREQUENCE60 ; OUI donc charger le timer1 pour une fréquence à 60
TEST50
addwf tensson ; rajouter 60 dans tensson movlw 0x5 ; charger 5 dans w subwf tensson ; 60 > tensson > 50?
bn TEST40 ; NON donc aller au test suivant
bra FREQUENCE50 ; OUI donc charger le timer1 pour fréquence à 50
TEST40
addwf tensson ; rajouter 50 dans tensson movlw 0x4 ; charger 4 dans w subwf tensson ; 50 > tensson > 40?
bn TEST30 ; NON donc aller au test suivant
bra FREQUENCE40 ; OUI donc chager le timer1 pour fréquence à 40
TEST30
addwf tensson ; rajouter 40 dans tensson movlw 0x3 ; charger 3 dans w subwf tensson ; 40 > tensson > 30?
bn TEST20 ; NON donc aller au test suivant
bra FREQUENCE30 ; OUI donc charger le timer1 pour fréquence à 30
TEST20
addwf tensson ; rajouter 30 dans tensson movlw 0x2 ; charger 2 dans w subwf tensson ; 30 > tensson > 20?
bn TEST10 ; NON donc aller au test suivant
bra FREQUENCE20 ; OUI donc charger le timer1 pour fréquence à 20
TEST10
addwf tensson ; rajouter 20 dans tensson movlw 0x1 ; charger 1 dans w subwf tensson ; 20 > tensson > 10?
bn FREQUENCE0 ; NON donc retourner à la conversion
bra FREQUENCE10 ; OUI donc charger le timer1 pour fréquence à 10
; CONTROLE DE LA FREQUENCE DU HAUT PARLEUR ;*********************************************************************
FREQUENCE0
movlw MASK_PIR1OFF ; Arrête l'interruption du timer2 car Moyenne = 0 movwf PIR1
bra CONVERSION
FREQUENCE90
movlw MASK_CCP2ON ; activer le mode PWM car pas de moyenne movwf CCP2CON
movlw MASK_PIR1ON ; autorise l'interruption du timer2 car Moyenne > 90 movwf PIR1
movlw MASK_T2CONON ; lance le timer2 movwf T2CON
movlw 0x5F ; Charge 95 dans PR2 movwf PR2
movlw 0x30 ; charge 192 dans valeur de comparaison BCD, ce qui équivaut à movwf CCPR2L ; dire que nous chargeons notre valeur de comparaison à 48 ; car nous avons une précision de 1/4. Les décimales correspondent movlw 0x0 ; aux deux bits de poids forts qui se situent dans CCP2X et CCP2Y movwf CCP2CON,5 ; mettre les deux bits faibles dans le bit 4 et 5 dans CCP2 movwf CCP2CON,4
bra CONVERSION
FREQUENCE80 movlw MASK_CCP2ON ; Activer le mode PWM car pas de moyenne movwf CCP2CON
movlw MASK_PIR1ON ; autorise l'interruption du timer2 car Moyenne > 80 movwf PIR1
movlw MASK_T2CONON ; lance le timer2 movwf T2CON
movlw 0x67 ; charge 103 dans PR2 movwf PR2
movlw 0x34 ; charge 52 dans les bits forts du BCD movwf CCPR2L
movlw 0x0 ; charge les bits faibles dans CCP2X et Y à 0 movwf CCP2CON,5 movwf CCP2CON,4
bra CONVERSION
FREQUENCE70 movlw MASK_CCP2ON ; activer le mode PWM car pas de moyenne movwf CCP2CON
movlw MASK_PIR1ON ; autorise l'interruption du timer2 car moyenne > 70 movwf PIR1
movlw MASK_T2CONON ; lance le timer2 movwf T2CON
movlw 0x71 ; charge 113 dans PR2 movwf PR2
movlw 0x38 ; charge 56 dans les bits forts du BCD movwf CCPR2L
movlw 0x1 ; charge les bits faibles dans CCP2X et Y à 1 movwf CCP2CON,5 movwf CCP2CON,4
bra CONVERSION
FREQUENCE60 movlw MASK_CCP2ON ; activer le mode PWM car pas de moyenne movwf CCP2CON
movlw MASK_PIR1ON ; autorise l'interruption du timer2 car moyenne > 60 movwf PIR1
movlw MASK_T2CONON ; lance le timer2 movwf T2CON
movlw 0x7C ; charge 124 dans PR2 movwf PR2
movlw 0x3E ; charge 62 dans les bits forts du BCD movwf CCPR2L
movlw 0x1 movwf CCP2CON,5 ; charge le bit faible CCP2X à 1 movlw 0x0 movwf CCP2CON,4 ; charge le bit faible CCP2Y à 0
bra CONVERSION
FREQUENCE50 movlw MASK_CCP2ON ; activer le mode PWM car pas de moyenne movwf CCP2CON
movlw MASK_PIR1ON ; autorise l'interruption du timer2 car moyenne > 50 movwf PIR1
movlw MASK_T2CONON ; lance le timer2 movwf T2CON
movlw 0x8A ; charge 138 dans PR2 movwf PR2
movlw 0x45 ; charge 69 dans les bits forts du BCD movwf CCPR2L
movlw 0x1 movwf CCP2CON,5 ; charge le bit faible X du BCD à 1
movlw 0x0 movwf CCP2CON,4 ; charge le bit faible Y du BCD à 0
bra CONVERSION
FREQUENCE40 movlw MASK_CCP2ON ; activer le mode PWM car pas de moyenne movwf CCP2CON
movlw MASK_PIR1ON ; autorise l'interruption du timer2 car moyenne > 40 movwf PIR1
movlw MASK_T2CONON ; lance le timer2 movwf T2CON
movlw 0x9B ; charge 155 dans PR2 movwf PR2
movlw 0x4E ; charge 78 dans les bits forts du BCD movwf CCPR2L
movlw 0x0 movwf CCP2CON,5 ; charge le bit faible X du BCD à 0 movlw 0x1 movwf CCP2CON,4 ; charge le bit faible Y du BCD à 1
bra CONVERSION
FREQUENCE30 movlw MASK_CCP2ON ; activer le mode PWM car pas de moyenne movwf CCP2CON
movlw MASK_PIR1ON ; autorise l'interruption du timer2 car moyenne > 30 movwf PIR1
movlw MASK_T2CONON ; lance le timer2 movwf T2CON
movlw 0xB2 ; charge 178 dans PR2 movwf PR2
movlw 0x59 ; charge 89 dans les bits forts du BCD movwf CCPR2L
movlw 0x0 movwf CCP2CON,5 ; charge le bit faible X du BCD à 0 movlw 0x1 movwf CCP2CON,4 ; charge le bit faible Y du BCD à 1
bra CONVERSION
FREQUENCE20 movlw MASK_CCP2ON ; activer le mode PWM car pas de moyenne movwf CCP2CON
movlw MASK_PIR1ON ; autorise l'interruption du timer2 car moyenne > 20 movwf PIR1
movlw MASK_T2CONON ; lance le timer2 movwf T2CON
movlw 0xCF ; charge 207 dans PR2 movwf PR2
movlw 0x68 ; charge 104 dans les bits forts du BCD movwf CCPR2L
movlw 0x0 movwf CCP2CON,5 ; charge le bit faible X du BCD à 0 movlw 0x1 movwf CCP2CON,4 ; charge le bit faible Y du BCD à 1
bra CONVERSION
FREQUENCE10
movlw MASK_CCP2ON ; activer le mode PWM car pas de moyenne movwf CCP2CON
movlw MASK_PIR1ON ; autorise l'interruption du timer2 car moyenne > 10 movwf PIR1
movlw MASK_T2CONON ; lance le timer2 movwf T2CON
movlw 0xF9 ; charge 249 dans PR2 movwf PR2
movlw 0x7D ; charge 125 dans les bit forts du BCD movwf CCPR2L
movlw 0x0 ; charge les bits faible x et y du BCD à 0 movwf CCP2CON,5 movwf CCP2CON,4
Marsh Posté le 13-06-2009 à 22:17:13
Bonsoir tout le monde...
Comme vous pouvez le constater, je n'ai toujours pas réussi a faire ma programmation de PIC...
Bon mon programme fonctionne parfaitement en simulation. Seulement, après l'avoir loader dans le pic via MPLAB ICD 2, ça ne marchhhee paaaaaas
Le premier gros problème que j'ai, c'est que mon PIC fait des conversions analogiques digitales ANARCHIQUES !!!
Il met vraiment ce qu'il veut... Je n'arrive pas à comprendre pourquoi.
Peut être que qlqun pourrait m'aider?
Merci
[CODE]
LIST p=18F2525
#include <p18F2525.inc>
CONFIG OSC = INTIO67
CONFIG FCMEN = OFF
CONFIG IESO = OFF
CONFIG PWRT = OFF
CONFIG BOREN = OFF
CONFIG WDT = OFF
CONFIG MCLRE = OFF
CONFIG LPT1OSC = OFF
CONFIG PBADEN = OFF
CONFIG DEBUG = ON
;*********************************************************************
; Masques *
; *
;*********************************************************************
MASK_ADCON0 EQU B'00000000' ; la conversion analogique n'est pas autorisée
MASK_ADCON1 EQU B'00001101' ; Le voltage de référence pour la conversion étant comme VSS et VDD
MASK_ADCON2 EQU B'10001100' ; définie la justification par la droite ou gauche
MASK_AD1CON0 EQU B'00000111' ; la conversion analogique est autorisée et lancée sur le channel 1
MASK_TRISA EQU B'00000011' ; les pins 2 et 3 sont configurées comme des entrées
; et 4,5,6,7,9 et 10 comme des sorties
MASK_TRISB EQU B'00000000' ; Toutes les pins PORTB sont configurées comme des sorties
MASK_TRISC EQU B'01000000' ; Toutes les pins PORTC sont configurées en sortie sauf RC6 qui sera utilisé
; pour l'USART
MASK_T2CONOFF EQU B'00000011' ; Le timer2 n'est pas enclenché
MASK_T2CONON EQU B'00000111' ; le timer2 est enclenché
MASK_T0CONOFF EQU B'00000111' ; le timer n'est pas enclenché
MASK_T0CONON EQU B'10000111' ; le timer est enclenché
MASK_CCP2ON EQU B'00001100' ; configure le registre CCP2 en mode PWM
MASK_CCP2OFF EQU B'00000000' ; désactive le mode PWM du CCP2
MASK_PIR1ON EQU B'00000010' ; Autorise l'interruption lorsque TIMER2 dépasse PR2
MASK_PIR1OFF EQU B'00000000' ; interdire l'interruption du timer2
MASK_INTCONOFF EQU B'00000000' ; interdire les interruptions du timer0
MASK_INTCONON EQU B'10100000' ; autorise l'interruption du timer 0
;*********************************************************************
; DEFINITION *
;*********************************************************************
#DEFINE a PORTB,0 ; Afficheur de la barre a
#DEFINE b PORTB,1 ; Afficheur de la barre b
#DEFINE c PORTB,2 ; Afficheur de la barre c
#DEFINE d PORTB,3 ; Afficheur de la barre d
#DEFINE e PORTB,4 ; Afficheur de la barre e
#DEFINE f PORTB,5 ; Afficheur de la barre f
#DEFINE g PORTB,6 ; Afficheur de la barre g
#DEFINE dp PORTB,7 ; Afficheur de la barre dp
#DEFINE Unites PORTC,0 ; Allume le 7 segments des unités
#DEFINE Dixaines PORTC,2 ; allume le 7 segments des dixaines
#DEFINE Son PORTC,1 ; alimente le haut parleur
;*********************************************************************
; TABLE 7 segments *
;Cette table permet le stockage d'informations concernant l'affichage*
; des 7 segments. Elle contient les adresses qui permettent d'affiher*
;tel ou tel chiffre. Les adresses suivantes sont attribuées *
;respectivement à 0,1,2,3,4,5,6,7,8,9,10 *
;*********************************************************************
tabl_segment EQU 0x0001000
org tabl_segment
db 0x3F,0x06,0x5B,0x4F
db 0x26,0x6D,0x7D,0x07
db 0x7F,0x6F,0x00
;*********************************************************************
; VARIABLES *
;*********************************************************************
CBLOCK 0x00
cmptac : 1 ; Temps nécessaire à la charge du convertisseur pour l'
; acquisition
cmptac50 : 1
cmptmoy : 1 ; compteur permettant d'avoir 8 échantillons et d'en faire
; la moyenne
accumL : 1
accumH : 1
moyenneL : 1 ; 8 premiers octets de la moyenne
moyenneH : 1 ; 8 derniers octets de la moyenne
ones : 1 ; variables des unités pour 7-segments
tens : 1 ; variables des dixaines pour 7-segments
casel : 1 ; permet de sélectionner quel cadran allumer
cmptpile : 1 ; registre permettant de tester la pile
pileL : 1 ; valeur de la conversion pour vérifier la pile
pileH : 1
onespile : 1 ; unité et dixaine de la conversion
tenspile : 1 ; pour vérifier la pile
tensson : 1 ; test des fréquences
ENDC
org 0x000
bra init
;*********************************************************************
; 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 ; On configure RC0 et RC1 en sortie
BCF PORTC,1
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
BSF PORTC,0,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
clrf PORTB
movwf PORTB ; envoyer la valeur vers l'afficheur
BSF PORTC,2,0 ; 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
;*********************************************************************
; INITIALISATION *
;*********************************************************************
init
movlw MASK_ADCON1 ; ANO = entrée analogique. Vref = Vss et Vdd
movwf ADCON1
movlw MASK_ADCON0 ; AN0 sélectionnée, pas de conversion en cours
movwf ADCON0
movlw MASK_ADCON2 ; Justification par la droite, Acquisition time = 2Tad
movwf ADCON2
movlw MASK_TRISA ; Configurer Pin 2 et 3 comme des entrées
movwf TRISA
clrf PORTB
movlw MASK_TRISB ; Configurer toutes les pins PORTB comme des sorties
movwf TRISB
clrf PORTC
movlw MASK_TRISC ; configurer les pins 11,12,13,14,15,16,18 en sortie et 17 en entrée
movwf TRISC
clrf ones
clrf tens
clrf accumL
clrf accumH
clrf onespile
clrf tenspile
clrf pileL
clrf pileH
movlw MASK_T0CONON ; Lancer le timer0
movwf T0CON,0
movlw 0x63 ; l'interruption aura lieu toutes les 20msec
movwf TMR0L
movlw 0xFF
movwf TMR0H
movlw MASK_INTCONON ; autoriser les interruptions du timer0
movwf INTCON
movlw MASK_CCP2OFF ; désactiver le mode PWM car pas de moyenne
movwf CCP2CON
GOTO MAIN
;*********************************************************************
; Test de la pile *
;*********************************************************************
PILE
movlw MASK_T0CONOFF ; Arreter le timer0 pendant la conversion
movwf T0CON,0
movlw MASK_PIR1OFF
movwf PIR1
movlw MASK_AD1CON0 ; autoriser et lancer la conversion sur ch1
movwf ADCON0
BOUCLECONVPILE
btfsc ADCON0,GO/DONE ; tester si = 0 alors conversion finie
; une fois la conversion finie, le résultat
; vient se mettre dans deux registres : ADRESL et ADRESH
bra BOUCLECONVPILE ; =/0 donc boucle2
movlw MASK_T0CONON ; Relancer le timer0
movwf T0CON
movlw MASK_PIR1ON ; Autoriser l'interruption du timer2
movwf PIR1
movff ADRESL,pileL
movff ADRESH,pileH
; movlw 0x23 ; simulation de prise d'échantillon pour la pile
; movwf pileL
; movlw 0x0
; movwf pileH
; CHIFFRES
; pour savoir combien il y a de dixaine
; **********************************************************
CHIFFREPILE
clrf onespile ; Effacer "ones" et "tens"
clrf tenspile
DIXAINEPILE
movlw 0xA ; Charger 10 dans w pour savoir
; combien de dixaine il y a dans notre moyenne
subwf pileL,1,0 ; pour se faire, on soustrait 10 à L et on laisse
; le résultat dans accumL jusqu'à obtenir un négatif
movlw 0x0
subwfb pileH,1,0 ; sousraire le Report de soustraction si il y en a
bn NEGATIFPILE ; si le résultat < 0 alors N du reg status vaut 1
; Donc on va direct à NEGATIF. Si > 0
incf tenspile ; alors on incrémente de 1 la variable tens
BZ FIN_CHIFFREPILE ; si le résultat = 0 alors plus de reste donc terminé
bra DIXAINEPILE ; Si le résultat est possitif alors on recommence.
NEGATIFPILE
movlw 0xA ; on rajoute les 10 dans accumL pour retrouver un chiffre positif
addwf pileL,1,0 ; et les passer dans la variable ones
UNITEPILE
movff pileL,onespile
FIN_CHIFFREPILE
; AFFICHAGE
; SI tens = 8 et ones = 8
; alors afficher deux lignes sur les cadrans
; pour dire que la pile est plate
; ************************************************
movlw 0x9 ; simulation d'une pile HS
movwf tenspile
movlw 0x9 ; la pile est alors chargé à 99%
movwf onespile
AFFICHAGEPILE
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
BCF PORTC,0 ; On configure RC0 et RC1 en sortie
BCF PORTC,1
movlw 0x8
subwf tenspile
BZ AFIONESPILE
BN ZERO
bra CHIFFRE_RECHARGEPILE
AFIONESPILE
movlw 0x9
subwf onespile
bz MAIN
ZERO
movlw MASK_INTCONOFF ; interdire les interruptions
movwf INTCON,0
movlw 0 ; afficher 0 pour dire que la pile est morte
addwf TBLPTRL,1,0 ; Ajouter 0 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,1,0 ; allumer uniquement le cadran des dixaines
bra ZERO ; tourner en boucle pour ne pas permettre
; l'utilisation du cadran
;*********************************************************************
; PROGRAMME PRINCIPALE *
;*********************************************************************
MAIN
movlw MASK_T0CONON ; Lancer le timer0
movwf T0CON,0
movlw 0x63 ; l'interruption aura lieu toutes les 20msec
movwf TMR0L
movlw 0xFF
movwf TMR0H
movlw MASK_INTCONON
movwf INTCON
movlw 0x32 ; charge le compteur à 50 de façon à ce qu'à 0
movwf cmptpile ; il y ait test de la pile
CONVERSION
clrf accumL
clrf accumH ; réinitialiser accum à 0
bsf ADCON0,ADON ; autoriser la conversion analogique
movlw 0xFA ; charger le registre W à 250
movwf cmptac ; charger la variable cmpt1 pour obtenir un échantillon toutes les 25ms
movlw 0x8 ; charger le w à 8 pour obtenir 8 échantillons
movwf cmptmoy ; charger cmptmoy à 8
BOUCLE
; toutes les 50ms prendre un échantillon
movlw 0xA ; charger 10 dans w
movwf cmptac50
BOUCLE50MS_INTERRUPTIONON
movlw MASK_INTCONON ; Autorise l'interruption du timer0 pendant la boucle
movwf INTCON
movlw MASK_PIR1ON ; Autorise l'interruption du timer2 pendant la boucle
movwf PIR1
BOUCLE50MS
decfsz cmptac ; décrémenter cmptac
bra BOUCLE50MS ; =/ 0 boucle1
decfsz cmptac50
bra BOUCLE50MS_INTERRUPTIONON
movlw MASK_T0CONOFF ; Arreter le timer0 pendant la conversion
movwf T0CON
movlw MASK_PIR1OFF ; interdire l'interruption du timer2 pendant la conversion
movwf PIR1
bsf ADCON0,GO_DONE ; lancer la conversion analogique/digitale
BOUCLECONV
btfsc ADCON0,GO/DONE ; tester si = 0 alors conversion finie
; une fois la conversion finie, le résultat
; vient se mettre dans deux registres : ADRESL et ADRESH
bra BOUCLECONV ; =/0 donc boucle2
movlw MASK_T0CONON ; Relancer le timer0
movwf T0CON
movlw MASK_PIR1ON ; Autoriser l'interruption du timer2
movwf PIR1
; movlw 0x10 ; simuler une acquisition
; movwf ADRESL
; movlw 0x00 ; simuler une acquisition
; movwf ADRESH
; STOCKER LES ECHANTILLONS POUR FAIRE LA MOYENNE
;*********************************************************************
movf ADRESL,w ; charger la conversion ADRESL dans registre w
addwf accumL ; additionner la précédente conversion avec la valeur de add8v0
movf ADRESH,w ; charger la conversion ADRESH dans registre w
addwfc accumH ; additionner la précédente conversion avec la valeur de add8v1
; retour à la prise d'échantillons
;*********************************************************************
BOUCLEMOY
decfsz cmptmoy ; décrémenter le registre cmptmoy de 1
bra BOUCLE ; si =/ 0 alors retour à BOUCLE 1
; calculer la moyenne
;**********************************************************************
MOYENNE
RRCF accumH ; divise RRNCF et RRCF par 2
RRNCF accumL
RRCF accumH ; Divise encore par 2
RRNCF accumL
RRCF accumH ; divise encore par 2 donc finalement on a par 8
RRNCF accumL
decfsz cmptpile ; enlever 1 à cmptpile
bra CHIFFRE
bra PILE
; CHIFFRES
;*********************************************************************
CHIFFRE_RECHARGEPILE
movlw 0x32 ; charge le compteur à 50 de façon à ce qu'à 0
movwf cmptpile ; il y ait test de la pile
CHIFFRE
movlw MASK_INTCONON
movwf INTCON,0
clrf ones ; Effacer "ones" et "tens"
clrf tens
DIXAINE
movlw 0xA ; Charger 10 dans w pour savoir
; combien de dixaine il y a dans notre moyenne
subwf accumL,1,0 ; pour se faire, on soustrait 10 à accumL et on laisse
; le résultat dans accumL jusqu'à obtenir un négatif
movlw 0x0
subwfb accumH,1,0 ; sousraire le Report de soustraction si il y en a
bn NEGATIF ; si le résultat < 0 alors N du reg status vaut 1
; Donc on va direct à NEGATIF. Si > 0
incf tens ; alors on incrémente de 1 la variable tens
BZ FIN_CHIFFRE ; si le résultat = 0 alors plus de reste donc terminé
bra DIXAINE ; Si le résultat est possitif alors on recommence.
NEGATIF
movlw 0xA ; on rajoute les 10 dans accumL pour retrouver un chiffre positif
addwf accumL,1,0 ; et les passer dans la variable ones
UNITE
movff accumL,ones
FIN_CHIFFRE
; TEST des unités pour sélectionner la fréquence
; *********************************************************************
TEST_SON
movff tens,tensson ; charger les dixaines dans tensson pour savoir quelle fréquence charger
TEST90
movlw 0x9 ; charger 9 dans w
subwf tensson ; tensson > 90?
bn TEST80 ; NON donc aller au test suivant
bra FREQUENCE90 ; OUI donc charger le timer1 pour une fréquence à 90
TEST80
addwf tensson ; rajouter 90 dans tensson
movlw 0x8 ; charger 8 dans w
subwf tensson ; 90 > tensson > 80?
bn TEST70 ; NON donc aller au test suivant
bra FREQUENCE80 ; OUI donc charger le timer1 pour fréquence à 80
TEST70
addwf tensson ; rajouter 80 dans tensson
movlw 0x7 ; charger 7 dans w
subwf tensson ; 80 > tensson > 70?
bn TEST60 ; NON donc aller au test suivant
bra FREQUENCE70
TEST60
addwf tensson ; charger 70 dans tensson
movlw 0x6 ; charger 6 dans w
subwf tensson ; 70 > tensson > 60?
bn TEST50 ; NON donc aller au test suivant
bra FREQUENCE60 ; OUI donc charger le timer1 pour une fréquence à 60
TEST50
addwf tensson ; rajouter 60 dans tensson
movlw 0x5 ; charger 5 dans w
subwf tensson ; 60 > tensson > 50?
bn TEST40 ; NON donc aller au test suivant
bra FREQUENCE50 ; OUI donc charger le timer1 pour fréquence à 50
TEST40
addwf tensson ; rajouter 50 dans tensson
movlw 0x4 ; charger 4 dans w
subwf tensson ; 50 > tensson > 40?
bn TEST30 ; NON donc aller au test suivant
bra FREQUENCE40 ; OUI donc chager le timer1 pour fréquence à 40
TEST30
addwf tensson ; rajouter 40 dans tensson
movlw 0x3 ; charger 3 dans w
subwf tensson ; 40 > tensson > 30?
bn TEST20 ; NON donc aller au test suivant
bra FREQUENCE30 ; OUI donc charger le timer1 pour fréquence à 30
TEST20
addwf tensson ; rajouter 30 dans tensson
movlw 0x2 ; charger 2 dans w
subwf tensson ; 30 > tensson > 20?
bn TEST10 ; NON donc aller au test suivant
bra FREQUENCE20 ; OUI donc charger le timer1 pour fréquence à 20
TEST10
addwf tensson ; rajouter 20 dans tensson
movlw 0x1 ; charger 1 dans w
subwf tensson ; 20 > tensson > 10?
bn FREQUENCE0 ; NON donc retourner à la conversion
bra FREQUENCE10 ; OUI donc charger le timer1 pour fréquence à 10
; CONTROLE DE LA FREQUENCE DU HAUT PARLEUR
;*********************************************************************
FREQUENCE0
movlw MASK_PIR1OFF ; Arrête l'interruption du timer2 car Moyenne = 0
movwf PIR1
bra CONVERSION
FREQUENCE90
movlw MASK_CCP2ON ; activer le mode PWM car pas de moyenne
movwf CCP2CON
movlw MASK_PIR1ON ; autorise l'interruption du timer2 car Moyenne > 90
movwf PIR1
movlw MASK_T2CONON ; lance le timer2
movwf T2CON
movlw 0x5F ; Charge 95 dans PR2
movwf PR2
movlw 0x30 ; charge 192 dans valeur de comparaison BCD, ce qui équivaut à
movwf CCPR2L ; dire que nous chargeons notre valeur de comparaison à 48
; car nous avons une précision de 1/4. Les décimales correspondent
movlw 0x0 ; aux deux bits de poids forts qui se situent dans CCP2X et CCP2Y
movwf CCP2CON,5 ; mettre les deux bits faibles dans le bit 4 et 5 dans CCP2
movwf CCP2CON,4
bra CONVERSION
FREQUENCE80
movlw MASK_CCP2ON ; Activer le mode PWM car pas de moyenne
movwf CCP2CON
movlw MASK_PIR1ON ; autorise l'interruption du timer2 car Moyenne > 80
movwf PIR1
movlw MASK_T2CONON ; lance le timer2
movwf T2CON
movlw 0x67 ; charge 103 dans PR2
movwf PR2
movlw 0x34 ; charge 52 dans les bits forts du BCD
movwf CCPR2L
movlw 0x0 ; charge les bits faibles dans CCP2X et Y à 0
movwf CCP2CON,5
movwf CCP2CON,4
bra CONVERSION
FREQUENCE70
movlw MASK_CCP2ON ; activer le mode PWM car pas de moyenne
movwf CCP2CON
movlw MASK_PIR1ON ; autorise l'interruption du timer2 car moyenne > 70
movwf PIR1
movlw MASK_T2CONON ; lance le timer2
movwf T2CON
movlw 0x71 ; charge 113 dans PR2
movwf PR2
movlw 0x38 ; charge 56 dans les bits forts du BCD
movwf CCPR2L
movlw 0x1 ; charge les bits faibles dans CCP2X et Y à 1
movwf CCP2CON,5
movwf CCP2CON,4
bra CONVERSION
FREQUENCE60
movlw MASK_CCP2ON ; activer le mode PWM car pas de moyenne
movwf CCP2CON
movlw MASK_PIR1ON ; autorise l'interruption du timer2 car moyenne > 60
movwf PIR1
movlw MASK_T2CONON ; lance le timer2
movwf T2CON
movlw 0x7C ; charge 124 dans PR2
movwf PR2
movlw 0x3E ; charge 62 dans les bits forts du BCD
movwf CCPR2L
movlw 0x1
movwf CCP2CON,5 ; charge le bit faible CCP2X à 1
movlw 0x0
movwf CCP2CON,4 ; charge le bit faible CCP2Y à 0
bra CONVERSION
FREQUENCE50
movlw MASK_CCP2ON ; activer le mode PWM car pas de moyenne
movwf CCP2CON
movlw MASK_PIR1ON ; autorise l'interruption du timer2 car moyenne > 50
movwf PIR1
movlw MASK_T2CONON ; lance le timer2
movwf T2CON
movlw 0x8A ; charge 138 dans PR2
movwf PR2
movlw 0x45 ; charge 69 dans les bits forts du BCD
movwf CCPR2L
movlw 0x1
movwf CCP2CON,5 ; charge le bit faible X du BCD à 1
movlw 0x0
movwf CCP2CON,4 ; charge le bit faible Y du BCD à 0
bra CONVERSION
FREQUENCE40
movlw MASK_CCP2ON ; activer le mode PWM car pas de moyenne
movwf CCP2CON
movlw MASK_PIR1ON ; autorise l'interruption du timer2 car moyenne > 40
movwf PIR1
movlw MASK_T2CONON ; lance le timer2
movwf T2CON
movlw 0x9B ; charge 155 dans PR2
movwf PR2
movlw 0x4E ; charge 78 dans les bits forts du BCD
movwf CCPR2L
movlw 0x0
movwf CCP2CON,5 ; charge le bit faible X du BCD à 0
movlw 0x1
movwf CCP2CON,4 ; charge le bit faible Y du BCD à 1
bra CONVERSION
FREQUENCE30
movlw MASK_CCP2ON ; activer le mode PWM car pas de moyenne
movwf CCP2CON
movlw MASK_PIR1ON ; autorise l'interruption du timer2 car moyenne > 30
movwf PIR1
movlw MASK_T2CONON ; lance le timer2
movwf T2CON
movlw 0xB2 ; charge 178 dans PR2
movwf PR2
movlw 0x59 ; charge 89 dans les bits forts du BCD
movwf CCPR2L
movlw 0x0
movwf CCP2CON,5 ; charge le bit faible X du BCD à 0
movlw 0x1
movwf CCP2CON,4 ; charge le bit faible Y du BCD à 1
bra CONVERSION
FREQUENCE20
movlw MASK_CCP2ON ; activer le mode PWM car pas de moyenne
movwf CCP2CON
movlw MASK_PIR1ON ; autorise l'interruption du timer2 car moyenne > 20
movwf PIR1
movlw MASK_T2CONON ; lance le timer2
movwf T2CON
movlw 0xCF ; charge 207 dans PR2
movwf PR2
movlw 0x68 ; charge 104 dans les bits forts du BCD
movwf CCPR2L
movlw 0x0
movwf CCP2CON,5 ; charge le bit faible X du BCD à 0
movlw 0x1
movwf CCP2CON,4 ; charge le bit faible Y du BCD à 1
bra CONVERSION
FREQUENCE10
movlw MASK_CCP2ON ; activer le mode PWM car pas de moyenne
movwf CCP2CON
movlw MASK_PIR1ON ; autorise l'interruption du timer2 car moyenne > 10
movwf PIR1
movlw MASK_T2CONON ; lance le timer2
movwf T2CON
movlw 0xF9 ; charge 249 dans PR2
movwf PR2
movlw 0x7D ; charge 125 dans les bit forts du BCD
movwf CCPR2L
movlw 0x0 ; charge les bits faible x et y du BCD à 0
movwf CCP2CON,5
movwf CCP2CON,4
bra CONVERSION
END
[CODE/]