Bonjour,
J'ai un easypic4, et je voudrais mesurer une fréquence...
Je sais comment on prend la valeur du timer mais je voudrais savoir comment en prendre une après l'autre afin de faire un calcul sur la fréquence de pédalage...
Svp
-----
Bonjour,
J'ai un easypic4, et je voudrais mesurer une fréquence...
Je sais comment on prend la valeur du timer mais je voudrais savoir comment en prendre une après l'autre afin de faire un calcul sur la fréquence de pédalage...
Svp
Bonjour Darkross,
comment récupéres-tu la fréquence (les impulsions)
cad :
sur quel port?
en utilisant une interruption?
vede
;O]
ps :
je ferais un truc de ce style (avec RB0 comme "entrée fréquence") :
exemple avec un quartz 4Mhz...Code:active interruption sur RB0 dés qu'impulsion (changement d'état d'où int.) active le TMR1, et l'init à 0 re-active interruption sur RB0 dés qu'impulsion (changement d'état d'où int.) periode_us = TMR1 (/2?)
et prescaler TMR1 = 1
tu peux "mesurer" des "périodes" de max 65536µs (/2?)
et de minimum 10µs
(10µs temps approximatif de sauvegarde des registres avant int. avec 4Mhz... et selon le compilo...)
ceci avec une précision de 1µs.... théoriquement...à 4Mhz...
vede
;O]
C'est un 8 MHz oui mais je compren pas trop les intéruption
Je pensais utiliser le module CCP qui capture la valeur du timer lorsque un état haut a lieu sur l'entre RC2
Mais je n'arrive pas a prendre deux valeur différentes qd j'appuye justement sur ce bouton pq il me faudrait faire une sorte de boucle et deux if qui ont comme condition la mise a un de rc2 et de changer de fonction si on veux..
d'abord on passe a t1 puis après a t2 et on revien a t1, puis pendant ce temps on calcule la fréquence...
Et pouvais vous m'indiquer le code avec interruption ? parce que je ne comprend pas comment les utiliser...
Et je mesure une fréquence de rotation d'une pédale de vélo donc c'est juste mesurer le temps entre chaque impulsion en faite
Bonjour,
je te conseille de commencer par faire clignoter une led...
avec juste un Timer comme base de "temps" de clignotement...
afin de plus facilement assimiler son principe...
avant de tenter de "l'utiliser"...
sinon ici et google sont farcis d'exemples...
en cherchant...
vede
;O]
exemple :
http://forums.futura-sciences.com/se...archid=3999806
(ou je tente même d'expliquer en quelques lignes ... ;O] )
re ;O]
par exemple dans le fil
http://forums.futura-sciences.com/el...nce-temps.html
à partir du post #15
ou dans celui là
http://forums.futura-sciences.com/el...pic16f690.html
à partir du post #12
bonn'journée,
vede
;O]
Rebonjours...
Ben enfaite j'ai réussi a afficher la valeur du timer sur un LCD avec le registre CCP mais le seul kouak c que je veux enregistrer deux valeur de CCP différente et en faire la différence mais je n'arrive pas a faire sa !
re ;O]
ok, c'est quel pic exactement? un 18Fxxxx?
et est-ce que tu pourrais envoyer ton code,
ça pourrait aider...
je connaissais pas l'interrupt. sur CPP et avec le compteur Timer1,
d'après la doc, chaque interrupt. remet le Timer1 à zéro,
et met sa valeur (du Timer1) au moment de l'interrupt.
dans les registres CCP1L et CPP1H ...
donc à chaque interrupt. , il faut lire ces 2 registres
pour connaître le temps écoulé... depuis la précédente interrupt.
avec Fosc = 8Mhz, une instruction = 0,5µs, d'où :
période(temps) en µs = ( CCP1L + (CPP1H * 256) ) * 2
vede
;O]
Easy PIC 4 avec PIC 16f877a
unsigned int ccpl;
unsigned int ccph;
unsigned long ccp;
unsigned char ccpch[5] ;
void main (){
TRISC=0b00000100;
PORTC=0b00000000;
T1CON=0b00000001;
INTCON=0b00000000;
PIE1=0b00000100;
CCP1CON=0b00000101;
TRISD=0b00000000;
PORTD=0b00000000;
CCPR1L=0b00000000;
CCPR1H=0b00000000;
Lcd_Init(&PORTD);
Lcd_Cmd(Lcd_CLEAR);
Lcd_Cmd(Lcd_CURSOR_OFF);
Lcd_Out(1,1,"Temps:");
ccp=0;
while(1){
ccpl=CCPR1L;
ccph=CCPR1H;
ccp= (ccph*256)+ccpl ;
LongToStr(ccp,ccpch);
Lcd_Out(1,6,ccpch);
if(ccp>=50000){
PORTD.F0=1;
}
else{
PORTD.F0=0;
}
}
}
re re ;O]
bon comme je connaissais pas cette interruption,
j'ai fait un petit code pour déjà voir si l'interruption "CCP1"
se déclenche sur une impulsion sur CCP1...
pour l'instant, ça ne déclenche rien...
sans ça c'est énervant, quand ça fonctionne pas...
mais avant de m'entêter je vais attendre d'autres zavis zavizés...
au fait pourquoi veux-tu utiliser cette interruption?
pourquoi pas celle sur INT RB0? que je maîtrise...
vede
;O]
mon pseudo-code qui ne déclenche pas l'interruption
cad qui ne fonctionne pas...
avec un BP sur CCP1 (CCP1 est sur RB0 sur un 88),
et avec une led sur RB1 qui devrait changer d'état à chaque int. :
Code:program test_intCCP1 ' sub procedure interrupt PortB.1 = not PortB.1 'change état led PIR1.CCP1IF = 0 ' efface flag int. PIR2.CMIF = 0 ' efface flag int. end sub ' ' main: ANSEL = %00000000 ' ADC OFF sur 16F88 TrisB = %00000000 ' ports A en sorties TrisB = %00000001 ' port RB0 en entrée (CPP1 sur 16F88) T1CON = %000001 ' activation du TMR1 INTCON = %11000000 ' activation interruptions sur peripheriques PIE1.CCP1IE = 1 ' active int CCP1 ' PIE2.CMIE = 1 ' active int CCP ' while true nop wend ' end.
ps :(...)
mon pseudo-code qui ne déclenche pas l'interruption
cad qui ne fonctionne pas...
avec un BP sur CCP1 (CCP1 est sur RB0 sur un 88),
et avec une led sur RB1 qui devrait changer d'état à chaque int. :
Code:program test_intCCP1 ' sub procedure interrupt PortB.1 = not PortB.1 'change état led PIR1.CCP1IF = 0 ' efface flag int. PIR2.CMIF = 0 ' efface flag int. end sub ' ' main: ANSEL = %00000000 ' ADC OFF sur 16F88 TrisB = %00000000 ' ports A en sorties TrisB = %00000001 ' port RB0 en entrée (CPP1 sur 16F88) T1CON = %000001 ' activation du TMR1 INTCON = %11000000 ' activation interruptions sur peripheriques PIE1.CCP1IE = 1 ' active int CCP1 ' PIE2.CMIE = 1 ' active int CCP ' while true nop wend ' end.
merci d'avance à tous pour vos éclaircissements...
que pensez vous d'utiliser une l'int. sur le module CCP
pour détecter des impulsions sur l'"entrée" CCP1 (via BP ou fréquence...)...
Bonjour à tous,
j'y suis arrivé... enfin ça parait fonctionner... ;O]
en fait je pensais que l'INT CPP1 était basée sur
le mode "compare" (et du Special Event Trigger),
alors qu'elle fonctionne en mode "capture"...
bon, on vois qu'avec Fosc 8Mhz et Prescaler = 1,
on peut "mesurer" max 32,768ms...
et on a une précision théorique de 0.5µS...
max 8 x 32,7ms avec le TIMER1 prescaler au max(8)...
donc en perdant en précision...
et même plus avec un compteur...
mais en perdant encore en précision...
et pour espérer une bonne précision,toujours commencer
par ajouter au moins 20 au "TEMPS", cad les 5µs utilisées par
le compilo à chaque appel d'interruption...
pour sauvegarder les registres "vitaux"...
le pseudo-code testé avec un 16F88:
vedeCode:program INTCPP1 ' VARIABLES dim TEMPS as word dim cph, cpl as byte ' INTERRUPTION sub procedure interrupt cph = CCPR1H cpl = CCPR1L PIR1.CCP1IF = 0 ' re-active interruption end sub ' ' INITIALISATION DU PIC main: ANSEL = %00000000 ' désactive ADC (sur un 16F88) TrisB = %00000001 ' ports RB0 en entrée (RB0=CPP1 sur un 16F88) CCP1CON= %00000101 ' capture mode... T1CON = %00000001 ' activation du TMR1, avec PreScaler=1 INTCON = %11000000 ' activation interruptions sur peripheriques PIE1 = %00000100 ' active interruption sur CPP1 (CCP1IE = 1) ' LE PROGRAMME PRINCIPAL while true ' (...dans une boucle infinie...) TEMPS = cph * 256 TEMPS = cpl + TEMPS TEMPS = TEMPS / 2 ' pour avor des µs avec Fosc 8Mhz LCD_OUT(TEMPS + "µs") wend ' end.
;O]
EDIT :
et pour espérer une bonne précision,toujours commencer
par ajouter ENVIRON 20 au "TEMPS", cad...
cet ENVIRON est "mesurable**"...d'où "réglable"...
pour ceusses qui aiment avoir des horloges calées au millioniéme/s...
(**avec un fréquencemètre étalonné notamment,
mesurable mais pas calculable, cf dispertions pic/quartz)...
re :
enfin... l'interruption fonctionne... le reste....
re re :
on dirait qu'il faut remettre "manuellement" à zéro le Timer1
dans l'interruption...pour avoir des valeurs "crédibles"...
(je brancherais le GBF et le fréquencemètre ce soir...)
d'où correction :
Code:' INTERRUPTION sub procedure interrupt cph = CCPR1H cpl = CCPR1L TMR1H = 0 TMR1L = 0 PIR1.CCP1IF = 0 ' re-active interruption end sub
______________________________ ___________
simu, simu... maîtrise le réél... puis ton logiciel... pour oser en parler...
(c'est un Big Up à feu MONSIEUR André BUSTICO... qui avec son
expérience maitrisait la simulation analogique...et ses "bugs"...)...
Ouah je pensais pas faire tout sa lol
Ben moi je voulais juste quand j'appuye sur mon bouton RC2 deux foix qu'il m'affiche le temps que j'ai pris pour appuyé deux fois quoi
et si on fait sa x fois qu'il nous affiche la fréquence justement !!
Hi Dark,
tout quoi? c'est les bases... pour "finir" avec un minimum de précision...
et mon code est relativement court...
bon après je m'en sors pas avec INT sur CCP1...
alors que c'est un truc "ultra courant" (FreqMeter) en utilisant l'INT RB0...
mais bon comme ça m'énerve,
ben je vais continuer à creuser...
l' INT CPP1...
en attendant je t'envoie un code testé et fonctionnel
utilisant INT RB0... dans les 24h...
pourquoi tu veux utiliser l'INT CPP1???
vede
;O]
ps : faut avouer qu'on est pas beaucoup aidé...
j'suis d'accord surtout que moi j'y connais rien lol
le module CCP s'effectue avec le bouton RC2 !
re ;O]
bon ben disons que ça simplifierait tout en utilisant RB0 et son INT en entrée...
pourquoi utiliser le module CCP pour réaliser ce "période/fréquencemètre"...
c'est obligé ou non?
vede
;O]
ps : RC2 sur un 16F877A, et RB0 sur un 16F88...
sinon le module CCP est un module dont la fonction principale
est la comparaison ou la capture de tensions analogiques...
cad rien à voir avec un période/fréquencemètre... à la base...
Ben sur le 16f877a le module ccpr est capable de prendre la valeur du timer lorsque un état haut survien sur le bit RC2 sa marche bien pq j'arrive a affiché la valeur du timer qd j'appuye sur RC2 et pour faire la fréquence je voulais faire la différence des deux valeurs puis la multiplier pour donner des secondes puis faire l'inverse et on a la fréquence...
Bonjour Dark,Ben sur le 16f877a le module ccpr est capable de prendre la valeur du timer lorsque un état haut survien sur le bit RC2 sa marche bien pq j'arrive a affiché la valeur du timer qd j'appuye sur RC2 et pour faire la fréquence je voulais faire la différence des deux valeurs puis la multiplier pour donner des secondes puis faire l'inverse et on a la fréquence...
je comprends pas bien pourquoi tu veux récupérer 2 valeurs...
et faire "la différence" entre elles...
car quand tu appuie 2 fois sur RC2...
la valeur du Timer1 est le temps écoulé entre les 2 impulsions...
vede
;O]
Oooh le boulet....
Je ne savais pas sa... lol excusez moi
donc enfaite c tout simple alors
y'a qu'a faire directement le calcul pour la fréquence et c dans la boite nan ?
re ;O]
théoriquement oui...
et en sachant qu'avec Fosc = 8Mhz,
donc que le Timer1 s'incrémente toutes les 0.5µs
donc si par exemple valeur Timer1 = 2000
alors :
temp(s) = 0.001 (1ms)
et
F(hz) = 1/t(s) = 1000 (1Khz)
vede
;O]
Ah ben voila qui finie bien ! Heum mais si se temps depase la valeur de timer donc superieur a 65535 la valeur seras fossé ou negative alors ?
rere ;O]
oui...
mais en positionnant le prescaler du Timer1 à 8
tu peux arriver à "mesurer" des "périodes" de max 8x32ms...
sinon faut "réduire" le quartz...
exemple, 4Mhz, pour "mesurer" max 16x32ms...
vede
;O]
Ou alors rajouter 65535 au resultat s'il est négatif
non impossible...
à moins d'être sur et certain qu'elle n'a dépassé qu'une fois les 65535...
si vraiment tu veux prévoir de pouvoir mesurer plus de 8x32ms
orientes toi vers l'INT RB0...
vede
;O]
ps : et de toute façon le résultat ne sera JAMAIS négatif...
à moins de vraiment vouloir compliquer les choses...
C quoi l'INT ?
INT RB0
ben c'est l'interruption "déclenchable" sur une impulsion sur RB0...
et en fait, faudrait commencer par savoir dans quelle plage
de période/fréquence tu veux faire des mesures...
56454445
3B4F29
______________________________ __________
46554D4552204E4520545545205041 53203B4F29