Pic18f2525 pwm et timer2
Répondre à la discussion
Affichage des résultats 1 à 4 sur 4

Pic18f2525 pwm et timer2



  1. #1
    Haox

    Pic18f2525 pwm et timer2


    ------

    j'aimerai avoir un petit renseignement concernant ma programmation.

    Pour ce qui ne save pas je préfère répéter :

    En fait, je cherche à contrôler mon PIC18F2525 de façon à ce qu'il fasse ceci:

    1. 8 Conversions analogiques/digitales
    2. La moyenne des 8 conversions

    1 et 2 tournent en boucle

    Interruption du TIMER0 : Toutes les 20 ms survient l'interruption du timer0 permettant l'affichage sur deux 7 segments de la moyenne préalablement calculée par le PIC.

    Interruption du TIMER2 : En fait c'est là où c'est un peu spécial, et où je ne suis pas sûr de moi.

    Cette interruption consiste à contrôler la fréquence d'un haut parleur en fonction de la tension du signal.

    Je m'explique:

    J'ai un capteur de pression qui fait varier la tension dans mon circuit de 0 à 4,5V.
    Le but du projet est de donner un feedback de la force exercée sur les capteurs à l'utlisateur. Donc 2 interfaces sont utilisées : visuelle (les 7 segments) et auditive (pour les mal voyants).

    Donc j'ai décidé (pour le moment) de diviser mon signal en 10 fréquence.

    De 0 à 9 : aucun son
    de 10 à 19 : son de 500hz
    de 20 à 29 : son de 600 hz
    de 30 à 39 : son de 700hz
    de 40 à 49 : son de 800hz
    de 50 à 59 : son de 900hz
    de 60 à 69 : son de 1000hz
    de 70 à 79 : son de 1100 hz
    de 80 à 89 : son de 1200hz
    de 90 à 99 : son de 1300hz

    Pour ce faire, j'utilise le mode PWM du PIC. Ce mode est lié au TIMER2 qui arrivé à une certaine valeur passe la pin de sortie correspondante à 1 (donc sous tension) et arrivé à une deuxième valeur de comparaison repasse la pin à 0.

    Donc il est possible de faire varier la fréquence du signal de cette pin de sortie en jouant sur les deux valeurs qui sont contenues dans les registres PR2 et CCPR2L.

    PR2 permet lorsqu'il est atteint de mettre la pin sur 1, et CCPR2L (accompagné de deux autres bits faibles contenus dans le registre de contrôle CCP2CON) permet lrosqu'il est atteint de mettre la pin sur 0.

    Donc toute ma routine est programmée selon cette logique, cependant je ne suis pas sûr de moi car je ne sais pas comment simuler la mise sous tension de la pin en question afin de vérifier qu'elle s'y mette bien...


    Est ce que vous croyez que j'ai fait toutes les étapes ? Je me pause cette question car je n'ai pas écrit de sous routine d'interruption du Timer2. Je crois comprendre que tout se fait automatique mais je n'en suis pas sûr... Qu'en pensez vous ?

    -----

  2. #2
    Haox

    Re : Pic18f2525 pwm et timer2

    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	bouton		PORTA,2			; Bouton permettant de mettre sous tension
    
    #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	Ones		PORTC,0			; Allume le 7 segments des unités
    #DEFINE	Tens		PORTC,1			; allume le 7 segments des dixaines
    
    ;*********************************************************************
    ;                    	       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 	0x000
    		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		0x00
    	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
    
    	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
    	movwf	PORTB					; envoyer la valeur vers l'afficheur
    
    	BSF		PORTC,1,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	0xFE					; 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_INTCONON			; Autoriser les interruptions
    	movwf	INTCON,0
    
    	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	0xFE					; l'interruption aura lieu toutes les 20msec
    	movwf	TMR0L
    	movlw	0xFF
    	movwf	TMR0H
    	movlw	MASK_INTCONON
    	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_INTCONOFF			; interdire les interruptions
    	movwf	INTCON,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
    
    
    	movff	ADRESL,pileL
    	movff	ADRESH,pileH
    
    	movlw	0x8
    	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	0x7
    	movwf	tenspile
    	
    	movlw	0x9
    	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	0x9
    	subwf	tenspile
    
    	BZ		CHIFFRE_RECHARGEPILE
    	
    AFIONESPILE
    
    	movlw	0x9
    	subwf	onespile
    
    	bz		MAIN
    
    ZERO
    
    	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

  3. #3
    Haox

    Re : Pic18f2525 pwm et timer2

    Code:
    ;*********************************************************************
    ;                         PROGRAMME PRINCIPALE                       *
    ;*********************************************************************
    
    MAIN
    
    	movlw	MASK_T0CONON			; Lancer le timer0
    	movwf	T0CON,0				
    	movlw	0xFE					; 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	0x02					; charger 2 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_INTCONOFF			; Interdire l'interruption du timer0 pendant la conversion
    	movwf	INTCON
    
    	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_INTCONON			; Autoriser l'interruption du timer0
    	movwf	INTCON
    
    	movlw	MASK_PIR1ON				; Autoriser l'interruption du timer2
    	movwf	PIR1
    
    	movlw	0x15					; 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

  4. #4
    Haox

    Re : Pic18f2525 pwm et timer2

    up...............

  5. A voir en vidéo sur Futura

Discussions similaires

  1. Calcul PWM Period / PWM Duty Cycle
    Par Paintitblack dans le forum Électronique
    Réponses: 14
    Dernier message: 02/12/2010, 20h34
  2. Pb interruption PIC18f2525
    Par Haox dans le forum Électronique
    Réponses: 7
    Dernier message: 30/05/2009, 09h06
  3. Microcontroleur PIC18F2525
    Par Haox dans le forum Électronique
    Réponses: 2
    Dernier message: 16/02/2009, 17h08
  4. Problème adresse EEPROM pic18f2525
    Par invite8bf80359 dans le forum Électronique
    Réponses: 2
    Dernier message: 29/11/2008, 15h36
  5. problème RS232 pic18f2525
    Par invite8bf80359 dans le forum Électronique
    Réponses: 0
    Dernier message: 27/11/2008, 21h04
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...