A voir également:
- Programme C pour mesure de durée
- Regle mesure - Guide
- Programme demarrage windows 10 - Guide
- Mettre en veille un programme - Guide
- Cette action ne peut pas être réalisée car le fichier est ouvert dans un autre programme - Guide
- Désinstaller programme windows 10 - Guide
5 réponses
mamiemando
Messages postés
33545
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
25 février 2025
7 829
4 juin 2008 à 01:56
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
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
mamiemando
Messages postés
33545
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
25 février 2025
7 829
4 juin 2008 à 14:29
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 :
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
- 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
Je ne vois pas vraiment ce que tu entend par "passer en paramètre" , mes variables sont définies dans le programme.
mamiemando
Messages postés
33545
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
25 février 2025
7 829
6 juin 2008 à 16:05
6 juin 2008 à 16:05
Ben par exemple :
sachant que CCPR1 et PIR1bits devraient aussi être passés en paramètre.
Bonne chance
//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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
4 juin 2008 à 08:47
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.