IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Capture de fronts montants avec un PIC16F876


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Capture de fronts montants avec un PIC16F876
    bonjour et merci pour ce beau site
    Je dois réaliser un programme qui me permet de capturer les front montant d’un signal carré 0 ou 5V et de fréquence variable et a chaque front détecter on incrémente une variable.
    Pour programmer j’utilise un logiciel pour PIC à savoir PIC C compiler de chez CCS.
    Il existe un certain nombre de fonction déjà faite et une seule a retenue mon attention.
    Elle permet la capture de chaque front et déclenche un timer. Apres on peut l’utiliser pour faire une mesure ou autre chose. Bref mon problème n’est pas là mais je pourrait peut être me servir de cette fonction pour faire mon compteur d’impulsions.
    Voici la doc fournie par CCS pour l’utilisation de cette fonction. (SETUPCCP1.doc)

    En faite mon souci est plus un souci de C que d’électronique mais tout est lié.
    Il faudrait que quand cette fonction est active j’incrémente une variable par exemple et que je ne tienne pas compte du timer !
    Voici aussi un exemple d’utilisation donner par CCS


    long rise,fall,pulse_width;

    #int_ccp2
    void isr()
    {
    rise = CCP_1;
    fall = CCP_2;

    pulse_width = fall - rise; // CCP_1 is the time the pulse went high
    } // CCP_2 is the time the pulse went low
    // pulse_width/(clock/4) is the time

    // In order for this to work the ISR
    // overhead must be less than the
    // low time. For this program the
    // overhead is 45 instructions. The
    // low time must then be at least
    // 9 us.

    void main()
    {
    printf("\n\rHigh time (sampled every second):\n\r");
    setup_ccp1(CCP_CAPTURE_RE); // Configure CCP1 to capture rise
    setup_ccp2(CCP_CAPTURE_FE); // Configure CCP2 to capture fall
    setup_timer_1(T1_INTERNAL); // Start timer 1

    enable_interrupts(INT_CCP2); // Setup interrupt on falling edge
    enable_interrupts(GLOBAL);

    while(TRUE) {
    delay_ms(1000);
    printf("\r%lu us ", pulse_width/5 );
    }
    }


    il y a une autre fonction qui, me semble-t-il, pourrait crée une interuption comme dans l'exemple si dessus.
    voila merci pour l'entraide!!
    Fichiers attachés Fichiers attachés

  2. #2
    Membre éprouvé Avatar de gnto
    Homme Profil pro
    Ingénieur système logiciel
    Inscrit en
    Janvier 2006
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur système logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2006
    Messages : 923
    Points : 1 210
    Points
    1 210
    Par défaut


    je ne vois pas ou est ton probleme de langage C ? ce que tu recherche c'est quelqu'un qui programme le pic en C pas une aide sur le C a proprement parler .

  3. #3
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par sylvain42
    bonjour et merci pour ce beau site
    Bienvenu et merci de lire les regles du forums afin d'apprendre à encadrer les code avec les balises adéquates.
    Je dois réaliser un programme qui me permet de capturer les front montant d’un signal carré 0 ou 5V et de fréquence variable et a chaque front détecter on incrémente une variable.
    C'est plus un problème de conception que de langage C.

    Il y a plusieurs approches possibles, notamment interruption ou scrutation (polling).

    Pour des impulsions occasionelles, une interruption sur front montant est suffisante. Celle-ci entraine l'exécution d'un bout de code (interrupt handler) qui effectue une opération simple comme positionner un flag et acquitter l'interruption. Ce flag est surveillé par l'application dans sa 'boucle de fond'. Si il devient actif, il est est inactivé et une action conséquente est effectuée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    static int G_flag;
     
    interrupt handler()
    {
       G_flag = 1;
    }
     
    int main (void)
    {
       G_flag = 0;
       /* installation et activation de l'interruption */
     
       /* boucle de fond */
       for (;;)
       {
          if (G_flag)
          {
             G_flag = 0;
             /* action consequente */
          }
       }
       return 0;
    }
    Pour la scrutation, il faut lire l'état et déterminer si il passe de 0 à 1. On peut avoir besoin d'un filtrage, dans ce cas, on utilise un compteur... Si l'état n'est pas confirmé, le compteur est remis à 0. Si il est confirmé le nombre de fois consécutives requis, l'action conséquente est effectuée puis la recherche du front montant est relancée. C'est un opération de logique séquencielle qui se spécifie (et se code) facilement avec une machine à états...
    Pas de Wi-Fi à la maison : CPL

  4. #4
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    salut,
    c est vrai que ce n est pas vraiment du C dont tu parles ..
    j'ai programme du pic il a quelque temps (mais c'est vrai que c etait en asm) et je ne comprends pas pourquoi tu dois incrementer une variable etc etc ...

    dans le 16F87 le timer peut etre configurer en sorte de detecter les fronts montants et de les compter (c est le but du timer .. ) ensuite tu dois pouvoir recuperer la valeur lors d'une interruption declenchee par exemple apr le deuxieme timer ...

Discussions similaires

  1. Capturer un <a></a> avec une regex
    Par mioux dans le forum C#
    Réponses: 3
    Dernier message: 15/06/2007, 10h47
  2. Réponses: 5
    Dernier message: 19/04/2007, 12h45
  3. Capture d'une image avec une webcam
    Par Freyja dans le forum Linux
    Réponses: 2
    Dernier message: 09/08/2006, 12h35
  4. [FW2.0][VB.net] évenement front montant
    Par grand_prophete dans le forum Windows Forms
    Réponses: 9
    Dernier message: 09/05/2006, 17h25
  5. Réponses: 4
    Dernier message: 30/05/2005, 10h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo