Mesurer la durée d'une impulsion avec le module CCP d'un PIC.
Répondre à la discussion
Affichage des résultats 1 à 5 sur 5

Mesurer la durée d'une impulsion avec le module CCP d'un PIC.



  1. #1
    Montd'est

    Mesurer la durée d'une impulsion avec le module CCP d'un PIC.


    ------

    Bonjour,

    J'ai quelques problèmes avec que j'essai de faire dans le titre:

    Je cherche à mesurer a durée d'une impulsion 5 V , j'ai donc cherché à détecter un front montant qui met le compteur du timer à 0, puis ensuite, un changement est fait pour détecter un front descendant qui fait écrire la valeur du compteur du timer 1 dans la variable "val_fin".

    J'ai quelques problèmes...
    voici la process d'interruption:

    (Au démarrage du programme la détection est programmée sur front montant )


    Code:
      procedure interrupt;
        begin
        if Testbit(PIR1,CCP1IF) then
    
       begin
       
    
    
           if commence = 0 then    // si mesure pas commencée
           begin
             
                  CCPR1L:=0;  CCPR1H:=0; // raz  compteur timer 1
                  Lo(val_debut):=CCPR1L;   // enregister les valeurs du timer 1 (0 à 7) dans "val debut"
                  Hi(val_debut):=CCPR1H;    // enregister les valeurs du timer 1 (8 à 15) dans "val debut"
    
    
    
                 commence:=1; // mesure commencée
                 ClearBit(PIR1,CCP1IF); // drapeau nettoyé
                 CCP1CON:=%00000100; // détection sur front descendant maintenant
    
           end;
           
    
           
           
           if ((commence = 1) and (PIR1.CCP1IF=1)) then
           begin
                    Lo(val_fin):=  CCPR1L;
                    Hi(val_fin):=  CCPR1H;
                    CCPR1L:=0;  CCPR1H:=0; // raz
    
                      commence:=0;
                       ClearBit(PIR1,CCP1IF); // drapeau
                  CCP1CON:=%00000101; // détec front montant ( pret pour une nouvelle mesure)
    
           
           end;
    
       end;
    
       end;


    Voyez vous une grosse gaffe ? merci, désolé pour la présentation.

    -----
    Dernière modification par Montd'est ; 23/05/2015 à 20h58.
    Ya un bon moyen de se tromper de solution: c'est de se tromper de problème.

  2. #2
    invite5637435c

    Re : Mesurer la durée d'une impulsion avec le module CCP d'un PIC.

    Bonsoir,

    il me semble que tu aurais du utiliser un else plutôt qu'un second if ici:

    Code:
    if ((commence = 1) and (PIR1.CCP1IF=1)) then... // plutot un else
    puisque tu mets commence à 1 dans le premier if du coup tu y passes aussitôt après.
    @+

  3. #3
    invite5637435c

    Re : Mesurer la durée d'une impulsion avec le module CCP d'un PIC.

    Je n'avais pas vu que tu mettais bien le flag à 0 dans le 1er if, donc ce n'est pas ça la cause.
    Malgré tout l'usage du else me parait plus judicieux malgré tout.
    En C dans un if il faut mettre "==", je ne sais pas si c'est valable également en basic.
    Si tel est le cas...

  4. #4
    invite5637435c

    Re : Mesurer la durée d'une impulsion avec le module CCP d'un PIC.

    Comme tu mets une variable "commence" à 1 dans le 1er if il faudrait peut-être mettre une commande "fin" dans le 2eme pour pouvoir lancer ton calcul de différence dans ton main().
    Pour en revenir au else, il t'éviterait de mettre ton flag à 0 dans les 2 if, il suffirait de le mettre juste avant de sortir, ça allègerait un peu ton code.

  5. A voir en vidéo sur Futura
  6. #5
    Montd'est

    Re : Mesurer la durée d'une impulsion avec le module CCP d'un PIC.

    Bjr,

    Merci, en effet le else était plus adapté.

    Je commence à avoir des résultats cohérents, j'avais fait une erreur:

    Au lieu de remettre le timer 1 à 0, j'ai remi la copie du contenu du timer 1 à 0

    Code:
      procedure interrupt;
        begin
        if Testbit(PIR1,CCP1IF) then
    
       begin
       
           if commence = 0 then
           begin
    
            
            TMR1H:=0;  TMR1L:=0; // raz  compteur timer 1 ;  au paravant il y avait :CCPR1L:=0;  CCPR1H:=0; 
            Lo(val_debut):=CCPR1L;
            Hi(val_debut):=CCPR1H;
    
            commence:=1;
            ClearBit(PIR1,CCP1IF); // drapeau
             CCP1CON:=%00000100; // détec front descendan
    
           end
           
            else
           
           
           begin
           
            Lo(val_fin):=  CCPR1L;
            Hi(val_fin):=  CCPR1H;
            
            commence:=0;
            ClearBit(PIR1,CCP1IF); // drapeau
            CCP1CON:=%00000101; // détec front montant
    
           end;
    
       end;
    
       end;
    Dernière modification par Montd'est ; 24/05/2015 à 02h48.
    Ya un bon moyen de se tromper de solution: c'est de se tromper de problème.

Discussions similaires

  1. FWHM <-> durée impulsion optique
    Par invite82fffb5c dans le forum Physique
    Réponses: 2
    Dernier message: 25/05/2011, 07h49
  2. IRM - Influence de la durée d'impulsion sur la coupe
    Par invitef9469222 dans le forum Physique
    Réponses: 2
    Dernier message: 13/11/2010, 21h08
  3. Mesurer la durée d'une impulsion avec un PIC
    Par invited3dcf66c dans le forum Électronique
    Réponses: 5
    Dernier message: 08/06/2008, 18h12
  4. mesurer une largeur d'impulsion 16f84
    Par invitef2eda9f8 dans le forum Électronique
    Réponses: 10
    Dernier message: 23/08/2007, 12h39
  5. mesurer une impulsion haute
    Par invite86ad2abe dans le forum Électronique
    Réponses: 1
    Dernier message: 24/02/2007, 18h02
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...