Fréquencemètre avec un pic18f
Répondre à la discussion
Page 1 sur 2 1 DernièreDernière
Affichage des résultats 1 à 30 sur 40

Fréquencemètre avec un pic18f



  1. #1
    invitee3a9db1e

    Fréquencemètre avec un pic18f


    ------

    Bonjour à tous,

    J'essaie de mesurer la fréquence d'un signal en entrée d'un PIC18F24K22 à l'aide du mode capture.
    Je travail sur MPLAB8.85 avec le compilateur C18.

    En entrée, sur ma broche T1CKI (RC0), j'ai un signal de l'ordre de 10MHz, et je déclenche des interruptions grâce à un pulse chaque seconde sur la broche CCP1 (RC2).

    Au final, lorsque j'ai essayé d'envoyer le résultat de mon compteur (Timer1) sur mon hyperterminal, j'ai découvert que le compteur envoyait sans arrêt la même valeur erronée, et que mon programme plantait toutes les 6-7 secondes.

    Je crois que j'ai un problème de gestion d'horloge, ou d'overflow quelque part mais, j'avoue que ça me dépasse. Je ne trouve pas la source exacte de mon problème.
    Si quelqu'un a déjà eu ce genre de problème, ou arrive à trouver mon (ou mes) erreur(s), je lui serais très reconnaissant.

    Voici le code que j'ai utilisé :

    Code:
    #define USE_OR_MASKS  
     #include <stdlib.h>  
     #include <stdio.h>  
     #include <p18f24k22.h>  
     #include <usart.h>  
     #include <timers.h>  
     #include <capture.h>  
     #include <EEP.h>  
     
     #pragma config FOSC      = INTIO7    // Internal oscillator block clock out on OSC2 for debug the clock speed  
     #pragma config PLLCFG   = OFF        // Oscillator used directly  
     #pragma config PWRTEN  = ON        // Power up timer enabled  
     #pragma config BOREN    = NOSLP        // Brown-out reset enabled in hardware only  
     #pragma config BORV      = 250         // VBOR set to 2.50V nominal  
     #pragma config LVP         = OFF  
     #pragma config WDTEN   = NOSLP        // WDT is disabled in sleep, otherwise enabled  
     #pragma config WDTPS   = 2048        // WD timer prescaler 1:2.048  
     #pragma config FCMEN    = OFF        // fail-safe clk monitor not enable  
     #pragma config IESO       = OFF         // internal/external oscillator switch not enabled, so PORTA6 and PORTA7 can be used  
     #pragma config MCLRE    = EXTMCLR    // MCLR pin enable bit  
     #pragma config HFOFST   = ON        // HFINTOSC fast start-up enabled without waiting  
     
     
     unsigned int        nb_period         = 0;          
     unsigned int        old                   = 0;  
     unsigned char     it_OK                = 0;       
     
     char begin[] = "BEGIN OF MAIN \r\n";  
     char text[] = "number of periods per second : ";  
     
     
     #pragma interrupt it_PPS  
     void it_PPS( void)   
     {  
         if(PIR1bits.CCP1IF)     
         {  
             nb_period = CCPR1 - old;   
             old = CCPR1;      
             it_OK = 1;                   
         }  
         PIR1bits.CCP1IF = 0;    
     }  
     
     #pragma code interruption=0x8  
     void it_prioritaire( void)  
     {  
         _asm goto it_PPS _endasm  
     }  
     #pragma code  
     
     
     void main( void)   
     {  
         // Oscillator configuration  
         OSCCONbits.IRCF        = 7;    // default is 3  
         OSCCONbits.OSTS       = 0;    // Device is running from the internal oscillator  
         OSCCONbits.HFIOFS    = 1;    // HFINTOSC frequency is stable  
         OSCCONbits.SCS        = 2;    // System clock select internal oscillator block  
         OSCCON2bits.PLLRDY  = 0;    // System clock comes from an oscillator, other than 4xPLL  
         OSCCON2bits.PRISD    = 1;    // Primary Oscillator Drive circuit ON  
     
     
         TRISCbits.TRISC2     = 1;    // Configure RC2 (CCP1) as an input  
         ANSELCbits.ANSC2    = 0;    // RC2 defined as digital  
     
         // Timer1 configuration  
         TRISCbits.TRISC0       = 1;    // Configure RC0 (clk_PIC) as an input  
         T1CONbits.TMR1CS1   = 1;    // clk source : external clock from T1CKI pin  
         T1CONbits.TMR1CS0   = 0;  
         T1CONbits.T1CKPS1    = 0;    // 1:1 prescale value  
         T1CONbits.T1CKPS0    = 0;      
         T1CONbits.T1SOSCEN = 0;      // secondary oscillator disabled  
         T1CONbits.T1SYNC     = 1;    // external clk input not synchronized  
         T1CONbits.TMR1ON     = 1;     // timer1 turned ON      
     
         // Capture Mode configuration  
         CCP1CONbits.CCP1M3    = 0;    // Capture mode  : every rising edge <3:0> = 0101  
         CCP1CONbits.CCP1M2    = 1;  
         CCP1CONbits.CCP1M1    = 0;  
         CCP1CONbits.CCP1M0    = 1;  
         PIR1bits.CCP1IF        = 0;    // flag cleared              
         PIE1bits.CCP1IE        = 1;    // enable CCP1 interrupts  
     
         // USART Configuration  
         SPBRG1                  = 103;    // 9600 baud @16MHz  
         TXSTA                    = 0x24;    // Config TX  
         RCSTA                    = 0x90;    // Config RX      
         TRISCbits.TRISC7    = 1;    // RS232_RX_10MHZ as input  
         TRISCbits.TRISC6    = 0;    // RS232_TX_10MHZ as output  
         INTCON                  |= 0xC8;  
         INTCON2                |= 0b10000001;  
     
         RCONbits.IPEN         = 1;  
         INTCONbits.GIE        = 1;  
     
         while(!TXSTA1bits.TRMT);  
         puts1USART((char*)begin);  
     
         while(1) {  
             if(it_OK) {  
                 while(!TXSTA1bits.TRMT);  
                 puts1USART((char*)text);  
     
                 nb = INT_to_ASCII_conversion(nb_period); // personnal function, which works correctly  
                 puts1USART(nb);  
                 it_OK = 0;  
             }  
         }  
     }
    Merci pour votre aide

    Jean

    -----

  2. #2
    invite5637435c

    Re : Fréquencemètre avec un pic18f

    Bonsoir,

    10MHz?
    Vous faites travailler le PIC à quelle fréquence?
    Comme vous faites une interruption chaque seconde je soupçonne quelque chose d'incohérent coté timings, en tout cas c'est bien supérieur à 65535.
    J'ai la flemme de regarder le code
    Essayer avec une fréquence bien plus petite pour commencer genre 50KHz pour voir.

  3. #3
    RISC

    Re : Fréquencemètre avec un pic18f

    Salut,

    Le PIC18F24K22 peut fonctionner jusqu'à Fosc = 64MHz (Fcycle = 16MIPS).
    D'après ton programme, tu fonctionnes à Fosc = 16MHz ce qui est beaucoup trop faible pour mesurer une fréquence élevée.
    De plus si tu utilises ton oscillateur internen pour mesurer ta fréquence externe, il faut être conscient que l'erreur peut aller jusqu'à +/-2% (0 à 70C) et +/-5% (-40 à +85C) ce qui n'est pas terrible pour un fréquencemètre...

    Je te recommande d'utiliser un quartz externe de 16MHz + la PLL interne x4 pour avoir une référence de fréquence de l'ordre de 10ppm.

    Il faudra changer les bits de configuration.
    Si tu travailles sous MPLAB X, tu peux t'aider du générateur de code source en C pour les bits de configuration ( Window > PIC memory views > Configuration bits )

    a+

  4. #4
    invitee3a9db1e

    Re : Fréquencemètre avec un pic18f

    En effet je n'avais pas multiplié par 4 ma fréquence.
    Je suis conscient des potentielles erreurs dues à l'utilisation de l'oscillateur interne mais je voulais tester cette solution en premier.

    j'ai changé ma config et je n'ai gardé que ça:
    #pragma config FOSC = INTIO7
    #pragma config PLLCFG = ON
    #pragma config STVREN = OFF
    #pragma config HFOFST = ON
    Est-ce judicieux ?

    J'ai aussi modifier ma façon de lire le registre CCPR1 en écrivant :
    nb_period = (CCPR1H<<8)+CCPR1L;
    mais sans résultat...

    Toujours au même point... Merci pour votre aide

    Jean

  5. A voir en vidéo sur Futura
  6. #5
    paulfjujo

    Re : Fréquencemètre avec un pic18f

    bonjour,

    Verifier si a faible frequence le resultat escompte est bon.
    ce qui devrait etre le cas si le programme actuel est correct.
    et ensuite, penser a gerer le nombre de debordement du timer
    pour rajouter n x 65536 au comptage final

  7. #6
    invitee3a9db1e

    Re : Fréquencemètre avec un pic18f

    Bon ba le problème a l'air plus grave !
    Si je ne mets rien en entrée de mon timer1 (T1CKI) il ne devrait rien compter, non?
    J'envoie un signal nul sur cette broche et il arrive quand même à me renvoyer une valeur totalement fausse, et mon programme continue à planter toutes les 6-7 secondes...

    Je me suis pourtant inspiré de codes qui fonctionnaient (selon les utilisateurs), je ne dois pas être loin de la vérité quand même...
    Je continue à chercher.

    Si vous avez d'autres suggestions n'hésitez pas

    Merci

    Jean

  8. #7
    RISC

    Re : Fréquencemètre avec un pic18f

    Salut,

    Je te recommande de désactiver le watchdog dans les bits de configuration. Dans pas mal de PICs il est activé par défaut.

    Ensuite, il faut commencer par vérifier que tu fonctionnes bien à la fréquence que tu penses. Tu écris un simple programme qui fait clignoter une led toute les secondes. Si tes calculs de valeurs sont corrects tu seras sûr de ta fréquence . Ensuite on pourra s'occuper de l'unité CCP en mode capture ;=)

    a+

  9. #8
    invitee3a9db1e

    Re : Fréquencemètre avec un pic18f

    J'ai simplifié mon code pour ne tester que le mode capture sans lancer le compteur.
    A la place, j'affiche un message lors de l'interruption déclenchée par le front montant en entrée de CCP1. .

    Code:
     #include <stdlib.h>  
     #include <stdio.h>  
     #include <p18f24k22.h>  
     #include <usart.h>  
     
     #pragma config FOSC      = INTIO7    
     #pragma config PLLCFG   = ON         
     #pragma config STVREN = OFF
     #pragma config HFOFST   = ON       
     
     unsigned char     it_OK                = 0;       
     unsigned char debut[] = "DEBUT DU MAIN \r\n";  
     unsigned char interruption[] = "INTERRUPTION !!!\r \n ";  
     
     
     #pragma interrupt it_PPS  
     void it_PPS( void)   
     {  
         if(PIR1bits.CCP1IF)     
         {        
             it_OK = 1;                   
         }  
         PIR1bits.CCP1IF = 0;    
     }  
     
     #pragma code interruption=0x8  
     void it_prioritaire( void)  
     {  
         _asm goto it_PPS _endasm  
     }  
     #pragma code  
     
     
     void main( void)   
     {  
         // Oscillator configuration  
         OSCCONbits.IRCF        = 7;    // default is 3       
     
         // Capture Mode configuration  
         TRISCbits.TRISC2     = 1;    // Configure RC2 (CCP1) as an input  
         ANSELCbits.ANSC2    = 0;    // RC2 defined as digital  
         CCP1CONbits.CCP1M3    = 0;    // Capture mode  : every rising edge <3:0> = 0101  
         CCP1CONbits.CCP1M2    = 1;  
         CCP1CONbits.CCP1M1    = 0;  
         CCP1CONbits.CCP1M0    = 1;  
         PIR1bits.CCP1IF        = 0;    // flag cleared              
         PIE1bits.CCP1IE        = 1;    // enable CCP1 interrupts  
     
         // USART Configuration  
         SPBRG1                  = 103;    // 9600 baud @16MHz  
         TXSTA                    = 0x24;    // Config TX  
         RCSTA                    = 0x90;    // Config RX      
         TRISCbits.TRISC7    = 1;    // RS232_RX_10MHZ as input  
         TRISCbits.TRISC6    = 0;    // RS232_TX_10MHZ as output  
         INTCON                  |= 0xC8;  
         INTCON2                |= 0b10000001;  
     
         RCONbits.IPEN         = 1;   
     
         while(!TXSTA1bits.TRMT);  
         puts1USART((char*)debut);  
     
         while(1) {  
             if(it_OK) {  
                 while(!TXSTA1bits.TRMT);  
                 puts1USART((char*)interruption);  
                 it_OK = 0;  
             }  
         }  
     }
    Résultat sur l'hyperterminal:
    DEBUT DU MAIN
    INTERRUPTION !!!
    INTERRUPTION !!!
    INTERRUPTION !!!
    INTERRUPTION !!!
    INTERRUPTION !!!
    INTERRUPTION !!!
    DEBUT DU MAIN
    et c'est reparti...

    Ca s'affiche mais ça reset tout seul, quelqu'un voit où j'aurais pu faire une connerie, svp ?

    Merci

    Jean

  10. #9
    invite5637435c

    Re : Fréquencemètre avec un pic18f

    Voici comment faire un frequencemetre simplement en quelques lignes:

    Code:
    volatile unsigned int cnt;
    unsigned int freq;
    
    void interrupt (void)
    {
    if(TMR1IF) TMR1IF = 0;
    cnt ++;
    }
    
    void fenetre_freq (void)
    {
    T0CON = 0x87; // configuration du Timer 0 - selection mode 16-bit
    // internal clock source enable, 1:256 prescaler
    TMR0H = 0x85; // pour une fenetre de 1s
    TMR0L = 0xEE;
    TMR0IF = 0;
    while(!TMR0IF); // jusqu'à ce que timer0 deborde
    }
    
    void main (void)
    {
    cnt = 0;
    freq = 0;
    TMR1H =0; 
    TMR1L =0;
    TMR1IF = 0; 
    IPEN = 1; 
    TMR1IP = 1; 
    TMR1IE = 1; 
    T1CON = 0x87; // prescaler 1
    INTCON = 0xC0; 
    fenetre_freq (); 
    GIE = 0; 
    freq = cnt * 65536 + TMR1H * 256 + TMR1L; //calcul de la frequence
    }
    Vérifie je n'ai pas testé mon code, adapte le selon ta fréquence principale.
    @+

  11. #10
    invite5637435c

    Re : Fréquencemètre avec un pic18f

    Ton reset provient probablement du watch-dog, ou du fait que tu ne déclares pas la variable it_ok en volatile...

  12. #11
    invitee3a9db1e

    Re : Fréquencemètre avec un pic18f

    Sans le Watchdog, je n'ai plus de reset toutes les 6-7 secondes. Merci RISC et HULK28.
    Reste plus qu'à comprendre pourquoi mon module CCP ne fonctionne pas...

  13. #12
    invite5637435c

    Re : Fréquencemètre avec un pic18f

    Regarde du coté du registre CPPTMRS

  14. #13
    invitee3a9db1e

    Re : Fréquencemètre avec un pic18f

    De base tous les modules Capture du pic18f24k22 utilisent le Timer1. Le registre CCPTMRS est OK.

  15. #14
    invitee3a9db1e

    Re : Fréquencemètre avec un pic18f

    Quelqu'un peut-il confirmer ou critiquer cette remarque :
    lorsque l'on utilise une horloge extérieure pour le Timer1, sur la broche T1CKI, le Timer1 s'incrémente à chaque front montant de la clock.
    J'en déduis donc que le Timer1 doit renvoyer 0 si le signal en entrée de T1CKI est nul, et 10000 si la clock est de 10KHz. VRAI ?

    Merci
    Jean

  16. #15
    invite5637435c

    Re : Fréquencemètre avec un pic18f

    Citation Envoyé par jean_23 Voir le message
    De base tous les modules Capture du pic18f24k22 utilisent le Timer1. Le registre CCPTMRS est OK.
    Je le vois déclaré où dans ton code?

  17. #16
    invite5637435c

    Re : Fréquencemètre avec un pic18f

    Citation Envoyé par jean_23 Voir le message
    Quelqu'un peut-il confirmer ou critiquer cette remarque :
    lorsque l'on utilise une horloge extérieure pour le Timer1, sur la broche T1CKI, le Timer1 s'incrémente à chaque front montant de la clock.
    Quand il est déclaré en compteur oui.

  18. #17
    invitee3a9db1e

    Re : Fréquencemètre avec un pic18f

    Dans la DS il est écrit : CCPTMRS0bits.C1TSEL = 0 par défaut
    bit 1-0 C1TSEL<1:0>: CCP1 Timer Selection bits
    00 = CCP1 – Capture/Compare modes use Timer1, PWM modes use Timer2
    01 = CCP1 – Capture/Compare modes use Timer3, PWM modes use Timer4
    10 = CCP1 – Capture/Compare modes use Timer5, PWM modes use Timer6

    Du coup, j'ai rien mis dans mon code au début. Là je viens de rajouter CCPTMRS0bits.C1TSEL = 0 et pas de changement notoire. Il compte toujours dans le vide

  19. #18
    invite5637435c

    Re : Fréquencemètre avec un pic18f

    Attention c'est 2 bits qu'il faut écrire (le bit 0 et le bit 1), là tu n'en mets qu'un seul à 0.

  20. #19
    invite5637435c

    Re : Fréquencemètre avec un pic18f

    Dans la doc je vois également ça:

    Nom : doc.jpg
Affichages : 195
Taille : 156,9 Ko

    donc par rapport à ta question pécédente il faut bien tout regarder.
    C'est pour cela que je t'avais posté un code beaucoup plus simple, l'usage des Capture sur les PIC est un vrai bazar avec des registres dans tous les sens... vu qu'ils ont rajoutés des trucs en surcouche sur les nouvelles générations, on s'y perd rapidement.

  21. #20
    invitee3a9db1e

    Re : Fréquencemètre avec un pic18f

    C'est bien pour ça que je suis perdu.
    J'avais vu ce paragraphe dans la DS mais je ne comprends pas vraiment le sens.
    Je continue à chercher dans cette direction, je vais bien aboutir à qqchose quand même !

  22. #21
    invite5637435c

    Re : Fréquencemètre avec un pic18f

    Dans le code simplifié que tu as posté en dernier je ne vois plus les déclaratifs de T1CON, il les faut absolument.

    Je te conseille de reposter à chaque fois un code réactualisé, sans quoi on s'y perd totalement, d'autant qu'à distance c'est encore moins simple

  23. #22
    invite5637435c

    Re : Fréquencemètre avec un pic18f

    Citation Envoyé par jean_23 Voir le message
    C'est bien pour ça que je suis perdu.
    J'avais vu ce paragraphe dans la DS mais je ne comprends pas vraiment le sens.
    Je continue à chercher dans cette direction, je vais bien aboutir à qqchose quand même !
    Ca dit juste que pour les 4 conditions cités il doit enregistrer un front descendant avant de prendre en compte le premier front montant.
    Une invention de ouf, parceque si tu pars de 0 et que tu dois réagir très vite par cette entrée tu perds au mieux un temps de cycle au pire si tu bosses à 1Hz tu perds une seconde...

  24. #23
    invitee3a9db1e

    Re : Fréquencemètre avec un pic18f

    Bonjour et désolé pour le délai de ma réponse,
    je me suis éloigné de mon projet pour le WE, histoire de prendre du recul!

    Comme tu le demandais Hulk, j'ai joint mon MAIN avec ce message.

    J'arrive maintenant à compter, en prenant en compte les débordements du Timer1 mais j'ai mis un signal d'environ 10MHz à l'entrée de mon système et je calcule 16MHz environ en sortie (et encore, c'est vraiment pas précis). Si quelqu'un connait la raison de cette erreur, je suis intéressé.

    Bon début de semaine

    Jean

    Pièce jointe supprimée
    Dernière modification par JPL ; 07/01/2013 à 14h06.

  25. #24
    JPL
    Responsable des forums

    Re : Fréquencemètre avec un pic18f

    Merci d'utiliser la balise Code (#) pour inclure le programme dans le message.
    Rien ne sert de penser, il faut réfléchir avant - Pierre Dac

  26. #25
    invitee3a9db1e

    Re : Fréquencemètre avec un pic18f

    Désolé JPL.
    Voici mon code dans l'espoir que quelqu'un puisse m'aider :
    Code:
    /**********************************/
    /************* HEADERS ************/
    /**********************************/
    #define USE_OR_MASKS
    #include <stdio.h>
    #include <stdlib.h>
    #include <p18f24k22.h>
    #include <usart.h>
    #include <timers.h>
    #include <capture.h>
    #include <EEP.h>
    #include <delays.h>
    
    
    /**********************************/
    /********* CONFIG SYSTEM **********/
    /**********************************/
    #pragma config FOSC 	= INTIO7	// Internal oscillator block clock out on OSC2 for debug the clock speed
    #pragma config PLLCFG 	= ON		// Oscillator multiplied by 4
    #pragma config STVREN	= OFF
    #pragma config HFOFST	= ON		// HFINTOSC fast start-up enabled without waiting
    #pragma config WDTEN 	= OFF
    #pragma config BOREN	= OFF
    #pragma config PWRTEN 	= ON
    
    
    /***********************************************/
    /**********	    VARIABLES GLOBALES 	  **********/
    /***********************************************/
    unsigned char 		it_OK				= 0;		// (8bits) Passe à 1 lors d'une interruption
    unsigned char 		start				= 0;
    
    
    unsigned int 		nb_periodes		= 0;		// (16bits) Variable pour mémoriser le nb de periodes entre 2 fronts montants de PPS
    unsigned int		nb_overflow		= 0;		// (16bits) Variable pour stocker le nombre de débordement du Timer1 
    unsigned int		nb_impulsion_PPS	= 0;		// (16bits) Compteur pour sauvegarder le nb d'impulsion du PPS entre 2 corrections
    unsigned long int	nb_total			= 0;		// (32bits) Fréquence exprimée en hexa
    
    unsigned char 		debut[]			= "DEBUT DU MAIN \r\n";
    unsigned char 		periodes[] 			= "INTERRUPTION OK!\r\n nb_periodes : ";
    unsigned char 		PPS[] 			= " nb_impulsion_PPS : ";
    unsigned char		overflow[]			= " nb_overflow : ";
    unsigned char 		total[]			= " TOTAL : ";
    
    
    /***********************************************/
    /**********     S/P d'INTERRUPTION    **********/
    /***********************************************/
    #pragma interrupt it_PPS
    void it_PPS( void) 
    {
    	if(PIR1bits.CCP1IF) 	// flag déclenché par un front montant du PPS
    	{
    		if(start == 0) {
    			T1CONbits.TMR1ON 	= 1;
    			start 				= 1;
    		} else {
    			nb_periodes		 = CCPR1;	// copie du registre CCPR qui contient la valeur du Timer1	
    			nb_impulsion_PPS++;			// on incrémente le nb de pulse de PPS
    			it_OK 			= 1;
    		}
    	PIR1bits.CCP1IF = 0;	// flag remis à 0
    	}
    
    	if(PIR1bits.TMR1IF)		// flag déclenché par un débordement du Timer1
    	{
    		nb_overflow++;
    		PIR1bits.TMR1IF = 0;
    	}
    
    }
    
    #pragma code interruption=0x8
    void it_prioritaire( void)
    {
    	_asm goto it_PPS _endasm
    }
    #pragma code
    
    
    
    /***********************************************/
    /***********************************************/
    /**********	       	   MAIN       	  **********/
    /***********************************************/
    /***********************************************/
    void main(void) {
    
    	// Oscillateur à 16MHz
    	OSCCONbits.IRCF		= 7;
    
    	// Configuration de l'USART
    	SPBRG1 			= 103;	// 9600 baud @16MHz
    	TXSTA 			= 0x24;	// Config TX
    	RCSTA 			= 0x90;	// Config RX	
    	TRISCbits.TRISC7 	= 1;	// RS232_RX_10MHZ as input
    	TRISCbits.TRISC6	= 0;	// RS232_TX_10MHZ as output
    	INTCON 			|= 0xC8;
    	INTCON2 			|= 0b10000001;
    	PIE1bits.RC1IE 		= 1;	// Enabled USART interrupts
    	PIR1bits.RC1IF 		= 0;
    
    	// Timer1 configuration
    	TRISCbits.TRISC0	= 1;	// Configure RC0 (clk_PIC) as an input
    	T1CON			= 0x00;
    	T1CONbits.RD16		= 1;	// Timer mode 16 bits
    	T1CONbits.T1CKPS1	= 0;	// 1:1 prescale value
    	T1CONbits.T1CKPS0	= 0;
    	T1CONbits.T1SOSCEN = 0;  	// secondary oscillator disabled
    	T1CONbits.T1SYNC	= 1;	// external clk input not synchronized
    	T1CONbits.TMR1CS1 	= 0;	// clk source : external clock from T1CKI pin
    	T1CONbits.TMR1CS0	= 1;
    	T1CONbits.TMR1ON	= 0;
    	IPR1bits.TMR1IP		= 1;
    	WriteTimer1(0);
    	INTCONbits.PEIE		= 1;	
    	PIE1bits.TMR1IE		= 1;
    	INTCONbits.GIE		= 0;
    	INTCONbits.GIEL		= 0;
    	CCPTMRS0bits.C1TSEL = 0;
    
    	// Capture Mode configuration
    	TRISCbits.TRISC2 	= 1;	// Configure RC2 (CCP1) as an input
    	ANSELCbits.ANSC2	= 0;	// RC2 defined as digital
    	CCP1CONbits.CCP1M3	= 0;	// Capture mode  : every rising edge <3:0> = 0101
    	CCP1CONbits.CCP1M2	= 1;
    	CCP1CONbits.CCP1M1	= 0;
    	CCP1CONbits.CCP1M0 = 1;
    	CCPR1H = 0;
    	CCPR1L = 0;
    	PIR1bits.CCP1IF		= 0;	// flag cleared			
    	PIE1bits.CCP1IE		= 1;	// enable CCP1 interrupts
    
    	RCONbits.IPEN 		= 1;
    	INTCONbits.GIE		= 1;
    
    	PIR1bits.CCP1IF 	= 0;
    	PIE1bits.CCP1IE 	= 1;
    	
    	// AFFICHAGE "DEBUT DU MAIN"
    	while(!TXSTA1bits.TRMT);
    	puts1USART((char*)debut);
    
    
    	while(1) {
    		if(it_OK)
    		{
    			while(!TXSTA1bits.TRMT);
    			puts1USART((char*)periodes);
    			affiche(nb_periodes); // personnal function, which works correctly  
    				
    			while(!TXSTA1bits.TRMT);
    			puts1USART((char*)PPS);
    			affiche(nb_impulsion_PPS); 
    				
    			while(!TXSTA1bits.TRMT);
    			puts1USART((char*)overflow);
    			affiche(nb_overflow); 
    
    			nb_total = 65536*(long int)nb_overflow + (long int)nb_periode_10MHz - 1;
    			nb_total = nb_total/((long int)nb_impulsion_PPS); 
    				
    			while(!TXSTA1bits.TRMT);
    			puts1USART((char*)total);
    			affiche(nb_total);
    
    			it_OK = 0;
    		}		
    	}
    }

  27. #26
    JPL
    Responsable des forums

    Re : Fréquencemètre avec un pic18f

    Merci : c'est beaucoup plus commode ainsi.
    Rien ne sert de penser, il faut réfléchir avant - Pierre Dac

  28. #27
    invitee3a9db1e

    Re : Fréquencemètre avec un pic18f

    J'ai résolu au moins un souci mais cela n'a pas tout réglé :
    Dans mon code j'ai trouvé une erreur concernant le registre T1CON et en l'occurence les bits TMR1CS1 et 0.
    J'avais mis TMR1CS<1:0> = 01 au lieu de 10.

    Cela explique donc pourquoi je mesurais une fréquence de 16MHz, c'était la fréquence FOSC !
    En revanche, lorsqu'on lit la DS (cf. ci-dessous), je devrais compter la clock mise en entrée du pin T1CKI maintenant.
    Mais le timer1 me renvoie la valeur 0x0001 au lieu de compter approximativement 10000000périodes (en gérant les overflow)!

    TMRxCS<1:0>: Timer1/3/5 Clock Source Select bits
    11 =Reserved. Do not use.
    10 =Timer1/3/5 clock source is pin or oscillator:
    If TxSOSCEN = 0:
    External clock from TxCKI pin (on the rising edge)

    If TxSOSCEN = 1:
    Crystal oscillator on SOSCI/SOSCO pins
    01 =Timer1/3/5 clock source is system clock (FOSC)
    00 =Timer1/3/5 clock source is instruction clock (FOSC/4)

    Est-ce qu'il y aurait une astuce que j'aurais loupé pour réussir à compter cette horloge sur T1CKI, svp ?
    Au scope, le signal correspond aux attentes (10MHz, carré, de 0 à 3V3)...

  29. #28
    invitee3a9db1e

    Re : Fréquencemètre avec un pic18f

    Je rebondis sur mon précédent post.
    j'ai mesuré FOSC = 16MHz grâce au module CCP, mais étant donné que j'ai mis la config "#pragma config PLLCFG = ON", je devrais trouver 64Mhz non ?!?
    Je ne suis plus trop sûr de mon oscillateur interne...

  30. #29
    RISC

    Re : Fréquencemètre avec un pic18f

    Salut,

    Il faut faire attention à ne pas confondre Fosc et Fcycle.
    Pour les PIC18, Fcycle = Fosc / 4 donc 16 MIPS à 64MHz

    Comment testes-tu Fosc ?
    2 méthodes simples : l'UART ou un timer qui fait clignoter une led à 1Hz ou 2Hz.
    Si ton UART fonctionne à la vitesse que tu as prévu c'est que ton hypothèse pour Fosc est exacte (idem pour la led. Il est facile de voir visuellement 1 ou 2Hz).

    En bas de cette page tu trouveras un fichier .ZIP qui contient du code pour le PIC18F45K22 et qui est facilement modifiable pour ton PIC. Tu y verras également les bits de configuration.


    a+

  31. #30
    invitee3a9db1e

    Re : Fréquencemètre avec un pic18f

    Citation Envoyé par RISC Voir le message
    Comment testes-tu Fosc ?
    Je me perds entre Fosc et Fcycle.
    Lorsque j'ai défini mon baudrate pour l'USART de mon PIC, j'ai mis SPBRG1 = 103 (soit 9600baud avec BRGH=1 et Fosc = 16.000 MHz selon la DS, table 16-5)
    Je viens de tester en mettant SPBRG1 = 51 et la transmission fonctionne à 19200 baud, ce qui confirme que Fosc = 16MHz, enfin je pense que c'est Fosc.

    Lorsque je comptais 16Mhz avec mon module CCP, la DS dit "Timer1/3/5 clock source is system clock (FOSC)", ce qui veut dire qu'on compte FOSC ou Fcycle en sortie ?
    Si on compte Fcycle, cela contredit le réglage de mon USART.

    Ajouté à cela, j'ai défini OSCCONbits.IRCF = 7 (donc Fosc = 16MHz) mais aussi PLLCFG = ON donc ça devrait multiplier Fosc par 4, non ?

    Merci pour votre aide, c'est le flou total...

Page 1 sur 2 1 DernièreDernière

Discussions similaires

  1. frequencemetre avec les bascules
    Par invite8cfb2c49 dans le forum Électronique
    Réponses: 4
    Dernier message: 25/12/2012, 16h56
  2. Fréquencemètre avec Pic 18f4520
    Par invite20f901d9 dans le forum Électronique
    Réponses: 3
    Dernier message: 18/07/2011, 11h56
  3. Fréquencemetre avec un Atmega32
    Par invite6d67225b dans le forum Électronique
    Réponses: 15
    Dernier message: 01/06/2011, 22h53
  4. fréquencemètre précis avec communication sans fil
    Par invite99aaa6a7 dans le forum Électronique
    Réponses: 12
    Dernier message: 25/03/2010, 16h12
  5. réalisation d'un capteur de température avec un fréquencemètre
    Par inviteed63aef3 dans le forum Électronique
    Réponses: 3
    Dernier message: 25/04/2007, 11h40
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...