Programme C pour mesure de durée

Fermé
Blirtz - 3 juin 2008 à 23:40
 Blirtz - 9 juin 2008 à 08:49
Bonjour,
Je viens sur ce forum afin de trouver de l'aide pour un programme en langage C ayant pour but de calculer la durée d'un déplacement.

Je vous explique un peu mon projet, je voudrais connaitre la durée pendant laquelle un sportif soulève des poids sur un banc de musculation.

Pour ce faire, j'utilise un codeur incrémental à 2 voix (A et B), un PIC18f4550 et une bascule D.

Le principe est simple (plus que la programmation ;) ), je fais entrer le signal A du codeur directement sur mon PIC pour faire un comptage de front montant me permettant de mesurer une hauteur (ce programme la je l'ai fait et il fonctionne), et je fais aussi entrée ce signal A sur une entrée de ma bascule D, ainsi que le signal B sur la deuxième entrée de la bascule.

Les deux signaux de mon codeur (A et B) sont en quadrature de phase, ce qui me permet en câblant comme il le faut ma bascule d'obtenir un état haut en sortie Q.

C'est ce signal Q que j'envoie sur le timer1 de mon PIC.

A partir de la, je voudrais faire un programme me permettant de mesurer la durée entre un front montant et un front descendant du signal Q, puisque cette durée correspond a la durée a l'état haut de Q.

Voila, moi j'ai déjà essayé un tas de choses, sans trouver de solution!

Si quelqu'un peut me faire avancer, je le remercie d'avance ;)

5 réponses

mamiemando Messages postés 33077 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2024 7 748
4 juin 2008 à 01:56
En ce qui concerne je veux bien t'aider mais malheureusement mes lointains souvenir sur les bascules ne me permettent pas de comprendre exactement ce que tu as fait et ce que tu cherches à faire. En particulier j'ai oublié certains termes (genre quadrature de phase).

Si j'ai bien compris ton problème, tu as un signal qui vaut 0 ou 1 (état haut ou état bas) et tu cherches à calculer le temps pendant lequel on reste à l'état 1. Dans ce cas il faudrait nous donner ta structure de donnée en C qui décrit le signal. L'idéal serait simplement qu'au niveau du programme C tu stockes les dates des changements d'états et l'état dans lequel tu te trouves.

Bonne chance
0
Merci de m'avoir répondu, mais je n'ai jamais fais ce genre de chose en programmation.

je te met mon programme pour te montrer un peu ce que j'ai essayer de faire:

/**********************************************
Sous programme mesure duree
***********************************************/

unsigned int duree; // représente le comptage entre 2 fronts
float durimp;
char maj=1; // indique qu'une nouvelle mesure est prête
char chaine[6]; // pour itoa
float freq;
unsigned int ancien;

// sous programme d'interruption
#pragma interrupt mesdur
void mesdur(void)
{

if(PIR1bits.CCP1IF=1) // l'IT provient d'une capture
{
duree=CCPR1-ancien; // comptage entre les deux front
ancien=CCPR1; // mémorise le CCPR1 actuel
maj=1; // nouvelle mesure prete
}
PIR1bits.CCP1IF=0; //efface le drapeau d'IT
CCP1CONbits.CCP1M0^=1;

}

#pragma code interruption=0x8
void fontion (void)
{
_asm goto mesdur _endasm
}
#pragma code
/************************************************************/

Bien entendu, mes ports sont bien reglés, mes interruptions de même.

Le probleme de ce programme est qu il ne mesure pas la durée.
0
mamiemando Messages postés 33077 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2024 7 748
4 juin 2008 à 14:29
D'un point de vue algorithmique, ça me paraît bon, à part
- la gestion de la variable maj qui ne repasse jamais à 0,
- la variable ancien qui n'est pas initialisée

De manière générale évite autant que possible les variables globales. Idéalement tes variables se déclarent dans le main et sont passées en paramètre aux fonctions. Exemple :
#include <stdio.h>

// incrémenter prend un entier en paramètre un entier provenant déclarée 
// dans une autre fonction. On manipule donc un pointeur (une adresse), 
// ce qui syntaxiquement parlant revient à manipuler *x au lieu de x
void incrementer(int *x){
  ++ (*x);
}

int main(){
  int x = 69; // initialisation de x
  printf("%d\n",x); // afficher x (affiche 69)
  // on passe x en paramètre à incrementer, plus 
  // précisément son adresse (opérateur &)
  incremetenter(&x); 
  printf("%d\n",x); // afficher x (affiche 70)
  return 0;
}

Dans ton cas les variables maj, ancien etc... devraient de la même façon être passées en paramètre afin d'être sûr
- que tu manipules bien la variable que tu crois
- que ces variables sont correctement initialisées

Bonne chance
0
merci pour tes conseil, je vais essayé ça des demain matin!

je vous tiens au courant pour la suite ;)
0
Je ne vois pas vraiment ce que tu entend par "passer en paramètre" , mes variables sont définies dans le programme.
0
mamiemando Messages postés 33077 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2024 7 748
6 juin 2008 à 16:05
Ben par exemple :
//unsigned int duree; // représente le comptage entre 2 fronts
// float durimp;
// char maj=1; // indique qu'une nouvelle mesure est prête
// char chaine[6]; // pour itoa
// float freq;
// unsigned int ancien; 

// ...

void mesdur(unsigned *duree, unsigned *ancien, char *maj)
{
  if(PIR1bits.CCP1IF=1) // l'IT provient d'une capture
  {
    *duree=CCPR1-ancien; // comptage entre les deux front
    *ancien=CCPR1; // mémorise le CCPR1 actuel
    *maj=1; // nouvelle mesure prete
  }
  PIR1bits.CCP1IF=0; //efface le drapeau d'IT
  CCP1CONbits.CCP1M0^=1;
} 

//...

int main(){
  unsigned int ancien; 
  char maj=1; // indique qu'une nouvelle mesure est prête
  unsigned int duree; // représente le comptage entre 2 fronts
  mesdur(&duree,&ancien,&maj);
  return 0;
}

sachant que CCPR1 et PIR1bits devraient aussi être passés en paramètre.

Bonne chance
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
merci de ton aide, j'essaye ça tout de suite et je vous tiens au courant ;)
0