pourtant lorsque je fais
je retrouve 0...frequence = ((1/(CCP_1/5)) *1000000) ;
l'ideal serait d'effectuer une mesure toute les 5 secondes environs, afin que mon afficheur suive l'evolution de ma frequence.
-----
pourtant lorsque je fais
je retrouve 0...frequence = ((1/(CCP_1/5)) *1000000) ;
l'ideal serait d'effectuer une mesure toute les 5 secondes environs, afin que mon afficheur suive l'evolution de ma frequence.
j'ai fais
ca me donne 430 Hz, c'est ce que je devrais avoir environ. Merci de m'avoir aidé.frequence = ((CCP_1/25))
Par contre faut que je resolve ce probléme d'affichage instable... Il l'est tellement qu'il m'indique 8430 et à peut prés tout les chiffres clignotent... tu as une idée ?
CCP_1 est la période, la fréquence est inversement proportionnelle à la période donc CCP_1/25 n'est pas bon.
Le premier calcul était bon.
Mathématiquement x/25 n'est pas égal à 1/(x/5)*1000000
Pour l'affichage tu peux simplement faire une pause (de 500ms par exemple).
merci g faitLe probléme de l'affichage vient je pense du fait que l'interuption peut se faire à n'importe quel moment, donc les valeurs d'unité, dizaine etc... Peuvent sensiblement changer, et à grande vitesse, on voit n'importe quoi...Code:(1000000/(CCP_1/5))
Oui donc il ne faut pas calculer les unite, dizaine, ... dans l'interruption.
Ou alors désactiver l'interruption quand on fait l'affichage.
Et puis j'ai remarqué que tu remets le timer à 0 dans l'interruption sans tenir compte du temps de traitement de l'interruption.
Voici le programme en version quasi finale:
Dernier petit probléme, je trouve 8463 pour la frequence... Ce petit 8 qui s'ajoute au niveau des milliers et qui sort de nul pars...Code:#include "C:\Documents and Settings\mortaurat\Bureau\CCS COMPILER PROJET\frequence\frequence.h" void affichage_frequence (); int unite=0, dizaine=0, centaine=0, millier=0; // initialisation des variables; unsigned long frequence ; int tab[10] ; //contient le code pour chaque led #int_ccp1 void isr_ccp1() { set_timer1(0); //clear timer clear_interrupt(int_ccp1); } void main() { int i ; //remplissage tableau tab[0]=0b0111111 ; tab[1]=0b0000110; tab[2]=0b1011011; tab[3]=0b1001111; tab[4]=0b1100110; tab[5]=0b1101101; tab[6]=0b1111101; tab[7]=000000111; tab[8]=0b1111111; tab[9]=0b1101111; while(1) { setup_timer_1(T1_internal); setup_ccp1(CCP_CAPTURE_RE); enable_interrupts(global); enable_interrupts(int_ccp1); frequence = 1000000/(CCP_1/5) ; // equivalence periode et frequence if (frequence > 9999) frequence = 9999; //extraction des unités, centaine, dizaine et millier. % permet d'avoir le reste d'une division Unite = (frequence%10); Dizaine = ((frequence%100)/10) ; centaine = ((frequence%1000)/100); millier = ((frequence)/1000); while (i<1000) { affichage_frequence(); i++; } i=0; } } void affichage_frequence () { // affichage sur BCD/7segments output_B(tab[unite]); output_low(pin_A1); delay_ms(1); output_high(pin_A1); output_B(tab[dizaine]); output_low(pin_A2); delay_ms(1); output_high(pin_A2); output_B(tab[centaine]); output_low(pin_A3); delay_ms(1); output_high(pin_A3); output_B(tab[millier]); output_low(pin_A4); delay_ms(1); output_high(pin_A4); }
Pour le 8 je ne sais pas.
Pour l'erreur de précision : 463 au lieu de 450 ça vient du timer 1 que tu dois initialiser à 311 au lieu de 0 (temps de traitement de l'interruption que j'ai calculé avec l'erreur de 13 sur 450).
Salut
J'utilise le même principe que toi pour la mesure de la fréquence d'un signal carré.
Sa fonctionne très bien pour les fréquences supérieur ou égale à 80Hz et inférieur ou égal à 1khz.
J'aimerais savoir quoi modifié pour que sa mesure les fréquences inférieur à 80Hz?
#include <18F2550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP
#device ADC=10
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C4, rcv=PIN_C5, stream=HF)
unsigned long frequence=0;;
#int_ccp1
void isr_ccp1()
{
set_timer1(50); //clear timer
clear_interrupt(int_ccp1);
}
void mesurefrequence()
{
setup_timer_1(T1_internal);
setup_ccp1(CCP_CAPTURE_RE);
enable_interrupts(global);
enable_interrupts(int_ccp1);
frequence = 1000000/(CCP_1/5) ; // equivalence periode et frequence
//frequence = CCP_1/5 ; //période en µs
}
void main()
{
setup_adc_ports( AN0_TO_AN1);
setup_adc( ADC_CLOCK_DIV_2);
while(1)
{
mesurefrequence();
fprintf(HF,"frequence= %ld\r",frequence);
{
}
Bjr à toi et bienvenue sur FUTURA,
N'oublie de regarder les dates des messages qui..précédent le tien....2009.
C'est parfois utile si l'on attends une réponse !
Bonnes fétes
La mesquinerie et rabrouement est un indicateur d'état d'esprit de l'auteur.
Bonjour.
C'est vrai que sa date mais je ne voulais pas recrée une discussion sur le même sujet.
Merci, bonne fête à toi aussi.