Mode capture PIC
Répondre à la discussion
Affichage des résultats 1 à 19 sur 19

Mode capture PIC



  1. #1
    krimo-30

    Exclamation Mode capture PIC


    ------

    Salut à tous !
    Voila je doit mesurer une période à l'aide du mode capture de pic. J'utilise un pic 18f4620 que je programme en C à l'aide du compilateur MCC18 de Mplab. (Oscillateur à quartz 10MHz)
    Mon souci est que j'injecte un signal carré de fréquence 590Hz (environ) afin de mesurer la periode mais je n'arive pas a retrouver cette valeur dans mon programme. Voila je joint mon bout de code et si vous avez des suggestion je suis preneur avec plaisir (même les critiques sont prises à condition quelles soient justifié).
    Merci d'avance.
    a+
    Code:
    void main(void)
    {
    	unsigned int result;
    // configure PORTC CCP1
    	TRISCbits.TRISC2=1;	// RC2/CCP1 en entree
    	T3CONbits.T3CCP2 = 0;			// active Timer1 avec mode capture	
    	//configure mode capture
    		OpenCapture1(CAPTURE_INT_ON &
    		C1_EVERY_RISE_EDGE );
    		//congure timer 1
    		OpenTimer1(TIMER_INT_ON &
    		T1_SOURCE_INT &
    		T1_PS_1_1);
    		while(PIR1bits.CCP1IF)		
    		result = ReadCapture1();
    		PIR1bits.CCP1IF=0;
    		WriteUSART(result);
    		CloseTimer1();
    	while (1);
    }

    -----

  2. #2
    invite0c083bae

    Re : Mode capture PIC

    Hello,

    j'ai juste survolé ton code parce que je le trouve lourd à lire dans un premier temps. J'ai moi aussi fait du relevé de fréquence grâce à un pic.
    Dans un premier temps il faut comprendre les timers. Est ce que tu sais quelle valeur de ton timer 1 représente 590 Hz ? (c'est déjà la base)

    Est ce que tu sais quand est ce que ton timer "dépasse" ?

    Enfin, pour pouvoir relever une fréquence avec le ccp il faut faire en gros :

    - 1er front = CCP (ici ton 1er front sera égale à 50 000 par ex)
    - 2eme front = CCP (ton 2eme front sera égale à 60 000 par ex)
    - Periode = 2eme front - 1er front

    etc ...

    sachant que ton timer 1 va faire du "dépassement" à un moment donné, s'il est de 16 bits, toutes les 65536 valeurs il va repasser à 0 .. bref énormément de chose à prendre en compte.

    En survolant ton code je vois pas tout ça

  3. #3
    krimo-30

    Talking Re : Mode capture PIC

    Citation Envoyé par Julien21000 Voir le message
    Est ce que tu sais quelle valeur de ton timer 1 représente 590 Hz ?
    Non je ne sait pas comment calculée ceci. Mais tu va peut etre m'aider

    Citation Envoyé par Julien21000 Voir le message
    En survolant ton code je vois pas tout ça
    C'est normal ceci est ait a l'aide des fonction deja toute faite de la librairie capture.h voila pourquoi sa n'apparait pas dans mon code
    Mais c'est bien configuré je pense c'est juste que je ne trouve pas la bonne valeur je devrais trouvé 1ms et je trouve 4,5µs.
    Voila en tout cas merci de ta réponse.

  4. #4
    krimo-30

    Re : Mode capture PIC

    Bonjour à tous c'est encore moi !
    voila j'apporte quelques indication si cela peut aider:
    je travaille avec un quartz de 10Mhz
    => 1/(10.000.000/4) = 0.4µs par cycle
    débordement timer 1 => 65536 => 65536*0.4 = 26214.4µs
    Fréquence => 1/(26214.4µs) = 38 Hz.
    Voila mais c'est tout ce que je sait à l'heure actuelle.
    Merci à tous ceux qui vont m'apporter leur aide.

  5. A voir en vidéo sur Futura
  6. #5
    Aurélien

    Re : Mode capture PIC

    - ton programme ne s'execute qu'une fois et ensuite reste bloqué dans la boucle while (1) finale.
    - tu essayes d'envoyer un int (16 bits) provenant de ta capture vers l'UART, qui aux dernieres nouvellles n'accepte que des chars.
    - tu fermes le port juste apres avoir écrit, est ce que l'octet est parti ?
    -
    je n'arive pas a retrouver cette valeur dans mon programme. Voila je joint mon bout de code
    . Peux tu DETAILLER ? Je vois beaucoup de à problemes dans ce code, liés à une mauvaise compréhension du fonctionnement d'un micro, pas seulement du mode capture. Revoir les bases...
    Tu ne sais meme pas expliquer ce que tu attends de ton programme précisemment. Si tu comptais envoyer la fréquence sur ton UART, tu as de gros soucis...
    La programmation c'est pas une loterie, on met pas des fonctions en esperant que ça marche...

    Aurélien

  7. #6
    krimo-30

    Re : Mode capture PIC

    Citation Envoyé par Aurélien Voir le message
    tu essayes d'envoyer un int (16 bits) provenant de ta capture vers l'UART, qui aux dernieres nouvellles n'accepte que des chars.
    Aurélien
    Ouups juste une erreur de copie dans le post.

    Citation Envoyé par Aurélien Voir le message
    Peux tu DETAILLER ?
    Aurélien
    Je voudrait juste calculer la periode de mon signal c'es tout, pouvoir la retrouver dans la variable résult.
    Citation Envoyé par Aurélien Voir le message
    La programmation c'est pas une loterie, on met pas des fonctions en esperant que ça marche...
    Aurélien
    On aurais pu ce passer de ce commentaire quand meme

  8. #7
    Aurélien

    Re : Mode capture PIC

    Ben j'aimerais bien t'aider mais là ya trop d'incohérences et d'approximations...

  9. #8
    krimo-30

    Re : Mode capture PIC

    Citation Envoyé par Aurélien Voir le message
    Ben j'aimerais bien t'aider mais là ya trop d'incohérences et d'approximations...
    Pas de souci, merci quand meme! Il y en auras bien un qui va m'aider (enfin j'espere )

  10. #9
    krimo-30

    Re : Mode capture PIC

    Bon alors j'ai trouvé une solution qui marche apparament j'ai fait plusieur test je poste le code si jamais sa peut aider quelqu'un d'autre.
    Code:
    #include <p18f4620.h>
    #include <math.h>
    
    #pragma config OSC=HS
    #pragma config LVP=OFF
    #pragma config WDT=OFF
    #pragma config DEBUG=ON
     
    #define RB0 PORTBbits.RB0
    
    // mesure de période sur CCP1 (RC2) (TIMER1 et fonction capture)
    float duree;	// représente le comptage entre 2 fronts
    unsigned int periode;
    char maj=1;					// indique qu'une nouvelle mesure est prête
    unsigned int freq;
    
    // sous programme d'interruption
    #pragma interrupt itcomp
    void itcomp(void) 
    {
    unsigned static int ancien;			
    	if(PIR1bits.CCP1IF)				// l'IT provient d'une capture
    		{						
    			periode=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
    }			
    			
    #pragma code interruption=0x8
    void fontion (void)
    {
    _asm goto itcomp  _endasm
    }
    #pragma code
    
    
    void main(void)
    {	
    // configure PORTC CCP1
    	DDRCbits.RC2=1;	// RC2/CCP1 en entree
    
    // configure le TIMER1
    	T1CONbits.RD16=0;		// TMR1 mode simple (pas de RW)
    	T1CONbits.TMR1CS=0;		// compte les impulsions sur internal clock
    	T1CONbits.T1CKPS1=0;	// prédiviseur =1 periode sortie = 64uS
    	T1CONbits.T1CKPS0=0;	
    	T1CONbits.T1SYNC=1;		// pas de synchronisation sur sleep/Reset	
    	T1CONbits.TMR1ON=1;		// TMR1 Activé
    
    // configure le mode capture sur le TIMER1 avec IT sur CCP1 
    	T3CONbits.T3CCP2=0;		// mode comparaison entre TMR1 et CCPR1
    	CCP1CON=0x05;			// capture mode sur fronts montants
    	PIE1bits.CCP1IE=1;		// active IT sur mode capture/comparaison CCP1
    	RCONbits.IPEN=1;		// Interruption prioritaires activées
    	INTCONbits.GIE=1;		// Toutes les IT démasquées autorisées
    	TMR1H=0;
    	TMR1L=0;
    	while(1)
    	{
    		if (maj)
    		{
    			duree = (periode*0.4e-6);
    			freq = 1.0/(duree);
    			maj=0;
    		}
    	}
    }
    La durée correspont à la période et la fréquence à la fréquence du signal.
    Une derniere question: je voudrais affiché sur l'USART seulement la partie réelle de la periode, comment pourais-je faire ?
    Merci d'avance.
    A+ à tous.

  11. #10
    invite0c083bae

    Re : Mode capture PIC

    Ta période doit être de 4237 cycles pour 590 Hz, tu n'as donc pas de dépassement à gérer. As-tu essayé de programmer ce que je t'ai dit hier ?

    Il faut programmer dans l'interruption CCP (pas dans le main) ce que je t'ai dit. Dès qu'il va y avoir un front montant, l'interruption CCP va s'activer et ainsi avec les étapes que je t'ai donné tu vas récupérer la valeur de ton timer 1 qui tourne de 0 à 65535 continuellement. Il faut prendre soin de bien le remettre à 0 grâce à un set_timer1(0) car si il est à 62 000 à une fréquence de 590Hz il va te fausser la mesure et te donner 702 comme valeur.

    Malheureusement on peut pas faire le code à ta place il faut suivre les étapes qui te sont données et montrer si tu veux le code à chaque fois ...

    Mais c'est bien compliqué ce que tu veux réaliser alors que tu ne connais pas le fonctionnement du PIC, donc des timers, donc de l'interruption CCP ... etc

  12. #11
    krimo-30

    Smile Re : Mode capture PIC

    Citation Envoyé par Julien21000 Voir le message
    Mais c'est bien compliqué ce que tu veux réaliser alors que tu ne connais pas le fonctionnement du PIC, donc des timers, donc de l'interruption CCP ... etc
    Je ne sait pas si tu regarde avant de poster mais j'ai trouver la solution
    Quand même tes explications mon bien aider mais de la à dire que l'on ne connait absolument rien sur le pic 2fois de suite c'est abuzé, tu ne trouve pas.
    Certes je ne suis pas un programmateur pro je suis tout juste débutant, mais le but du forum c'est d'aider les autres et cela meme si la question est idiote. En ce qui te concerne tu m'a bien aider sur ton premier message sa me suffit amplement et je t'en remercie mais de la à dire qu'on ne connait rien... j'ai lu le cours de bigonoff sur le module capture avant de poster j'ai effectué des recherche avant de poster si j'ai poster c'est que j'avais besoin d'aide
    Citation Envoyé par Julien21000 Voir le message
    Malheureusement on peut pas faire le code à ta place
    Je n'y conté pas du tout

    http://forums.futura-sciences.com/el...uncements.html
    Quand un débutant pose une question, même naïve ou maladroite on lui répond courtoisement en cherchant à le guider. Les réponses désagréables, méprisantes ou arrogantes ne font progresser personne : elles font fuir.

  13. #12
    invite0c083bae

    Re : Mode capture PIC

    J'étais en train de te répondre lorsque tu as posté ton message

    C'est bien si ma 1ère réponse t'a aidée

    C'est pas être désagréable, je suis pas un pro de la programmation loin de là non plus, j'ai commencé il y a un peu de temps mais avant d'aller dans les choses compliquées (un fréquencemètre n'a rien de simple ..) je me suis amusé à allumer des LEDs grâce au timer etc .. tu es pas si mauvais puisque tu as déjà fait un fréquence mètre. Mais la base de la base ce sont les calculs qu'il faut savoir réalisé avant de programmer (chose que tu ne savais pas lorsque tu as posté )

    Bref bon courage pour la suite et un petit conseil, structure mieux tes codes pour que ca soit plus simple pour toi et pour les autres et fais attention aux déclarations : int32 int16 et compagnie parce que dans ton cas tu multiplies du 16bits par des µs que tu vas diviser .. etc etc ça risque de bugger à un moment donné sans que tu saches pourquoi.

    a++

  14. #13
    krimo-30

    Re : Mode capture PIC

    Citation Envoyé par krimo-30 Voir le message
    Une derniere question: je voudrais affiché sur l'USART seulement la partie réelle de la periode, comment pourais-je faire ?
    Merci d'avance.
    A+ à tous.
    Un petit UP au passage !

  15. #14
    invite0c083bae

    Re : Mode capture PIC

    Qu'appelles tu par partie réelle ?

    Pour moi quand tu parles partie réelle c'est qu'il y a une partie imaginaire : 130 + 18j (j complexe)

    partie réelle : 130
    partie imaginaire : 18j


  16. #15
    krimo-30

    Talking Re : Mode capture PIC

    Citation Envoyé par Julien21000 Voir le message
    Qu'appelles tu par partie réelle ?

    Pour moi quand tu parles partie réelle c'est qu'il y a une partie imaginaire : 130 + 18j (j complexe)

    partie réelle : 130
    partie imaginaire : 18j

    Oupsss décidément je suis le roi de la boulette
    Je voulais dire la partie entiere pas un nombre à virgule serait-ce possible ?

  17. #16
    invite0c083bae

    Re : Mode capture PIC

    C'est en partie par rapport à ce que je t'ai dit il y a 2 3 jours.

    Dans tes déclarations tu utilises des Float, ce sont des nombres qui peuvent être à virgule, tu divises avec une durée qui est à virgule aussi ... donc le compilo fait un peu ce qu'il veut.

    Dans des cas comme celui là il faut faire du "transtipage". Je m'explique

    Nombre16Bits = Nombre8Bits * Durée16Bits + Temps32Bits

    pour être sur que ça fonctionne il faut transtiper (convertir) comme ceci :

    Nombre16Bits = (int16)Nombre8Bits * Durée16Bits + (int16)Temps32Bits

    Dans ce cas le résultat ne sera pas faussé. Donc il faut que tu revois un peu tes déclarations, tes divisions etc ..

  18. #17
    krimo-30

    Re : Mode capture PIC

    Citation Envoyé par Julien21000 Voir le message
    C'est en partie par rapport à ce que je t'ai dit il y a 2 3 jours.

    Dans tes déclarations tu utilises des Float, ce sont des nombres qui peuvent être à virgule, tu divises avec une durée qui est à virgule aussi ... donc le compilo fait un peu ce qu'il veut.

    Dans des cas comme celui là il faut faire du "transtipage". Je m'explique

    Nombre16Bits = Nombre8Bits * Durée16Bits + Temps32Bits

    pour être sur que ça fonctionne il faut transtiper (convertir) comme ceci :

    Nombre16Bits = (int16)Nombre8Bits * Durée16Bits + (int16)Temps32Bits

    Dans ce cas le résultat ne sera pas faussé. Donc il faut que tu revois un peu tes déclarations, tes divisions etc ..
    Ok merci !

  19. #18
    Houlayem

    Re : Mode capture PIC

    j'aime avoir une explication simple de mode capture pic18f4520 et si possible un exemple de programme en c

  20. #19
    RISC

    Re : Mode capture PIC

    Salut,

    Ce sujet a été traités des dizaines de fois sur les PIC18.
    Cherche dans le forum avec les bons mots clés ;=)

    a+

Discussions similaires

  1. mode capture CCPx
    Par invite69641788 dans le forum Électronique
    Réponses: 2
    Dernier message: 20/05/2010, 21h31
  2. PIC différence entre le mode iddle et le mode sleep
    Par Fiston dans le forum Électronique
    Réponses: 4
    Dernier message: 18/01/2010, 09h30
  3. [PIC] Utilisation du mode Capture
    Par Tripic dans le forum Électronique
    Réponses: 5
    Dernier message: 23/08/2009, 21h34
  4. Mode capture sur 18F
    Par invited6358b87 dans le forum Électronique
    Réponses: 0
    Dernier message: 24/02/2007, 15h54
  5. mode capture du PIC16F627 ?
    Par invite164b8116 dans le forum Électronique
    Réponses: 3
    Dernier message: 03/10/2006, 17h39
Découvrez nos comparatifs produits sur l'informatique et les technologies.