Compter des impulsions avec un pic
Répondre à la discussion
Page 1 sur 2 1 DernièreDernière
Affichage des résultats 1 à 30 sur 31

Compter des impulsions avec un pic



  1. #1
    invite02a9928f

    Compter des impulsions avec un pic


    ------

    Salut a tous,

    Je suis en train de faire un capacimètre LCD avec un 18F452 et un NE555 monté en oscillateur.

    Le condensateur a tester se monte dans le circuit de l'oscillateur et donc fait varier la fréquence du signal. Ce signal est envoyé sur la pin RC0 du pic.

    Je voudrais donc soit compter pendant pendant un temps donné et savoir combien j'ai eu de front montant ou alors compter un nombre de front montant et connaître le temps que j'ai mis pour les compter.
    J'ai pas fait de programmation depuis un an et j'ai un peu de mal a mis remettre ... J'ai fait fonctionner le LCD mais la je bloque un peu ... Car une fois que je connais le temps et le nombre d'impulsion, il me sera assez simple de trouver la capacité du condo ...





    Est ce qu'un truc de ce genre pourrait fonctionner ?

    while (Delay_ms(100)) // boucle à effectuer pendant 100 ms
    {
    if (RC0 =1) // si j'ai un front montant
    {
    compt=compt++; // incrémentation d'un compteur
    }
    }

    merci d'avance

    -----

  2. #2
    sdec25

    Re : Compter des impulsions avec un pic

    Salut.
    Tu as expliqué le principe mais il manque les chiffres :
    Le PIC fonctionne à quelle fréquence ? Et le signal à compter ? La durée de l'échantillon ?

    Il y a plusieurs façon de compter les fronts :
    Soit dans un boucle en testant la valeur de l'entrée, soit avec un timer (si la durée des fronts est de l'ordre de quelques µs).
    Pour compter le temps, le plus simple est d'utiliser un timer.

    Code:
    T2CON = T2OFF_aconfigurer;
    TMR2IF = 0;
    TMR2 = 0;
    PR2 = 100; // valeur de timer à atteindre pour que TMR1IF = 1
    T2CON.TMR2ON = 1;
    char etat = RC0;
    while(TMR2IF == 0) {
    if (etat == 0 && RC0 == 1) nbFrontsMontant++;
    etat = RC0;
    }
    J'ai utilisé le timer 2 car on peut facilement donner un délai (avec PR2).
    Sinon on peut tout aussi bien utiliser les autres timers.
    Mais il faut connaître le temps de l'échantillonnage pour configurer le timer.
    Dernière modification par sdec25 ; 04/07/2009 à 23h31.

  3. #3
    invite02a9928f

    Re : Compter des impulsions avec un pic

    Merci sdec25 pour t'as reponse

    Alors pour les chiffres :

    Le pic a été monté avec un quartz de 20mHz, le temps de l'échantillon je l'affinerai (faut que je vois si j'ai besoin de beaucoup de temps pour avoir un peu de précision ...) et pour la fréquence du signal => elle n'est pas fixe puisque c'est le condensateur a tester qui va la fixer ...

    Dans ton bout de code, il y a quelques ptits trucs que je ne comprends pas :

    Qu'est ce qui démare le timer ? (j'avais pensé au timers mais je sais pas pourquoi je croyais qu'il fonctionnait seulement sur interruptions sur RB0 ...)

    Et je ne comprends pas a quoi sert la variable "etat" et pourquoi il y a etat=RC0 ...

    Pour la config du timer faudra que je regarde la doc du pic mais la, il se fait un peu tard pour lire ce genre de doc' ...

    En tout cas MERCI

  4. #4
    sdec25

    Re : Compter des impulsions avec un pic

    Le pic a été monté avec un quartz de 20mHz, le temps de l'échantillon je l'affinerai (faut que je vois si j'ai besoin de beaucoup de temps pour avoir un peu de précision ...) et pour la fréquence du signal => elle n'est pas fixe puisque c'est le condensateur a tester qui va la fixer ...
    ok, donc avec le timer2 à 20Mhz on peut mesurer, avec prescaler 16 et postscaler 16, 13ms maximum. Au delà il faut attendre un overflow et reconfigurer le timer. Ça complique un peu le code.
    Avec le timer0 on peut compter jusqu'à 3 secondes.

    On n'initialise pas les timers de la même façon, et c'est plus simple de configurer les prescalers une fois pour toute, donc il vaut mieux avoir une période de mesure fixe. On peut quand même l'affiner mais en restant dans une même plage (ne pas varier entre 100µs et 10s).

    Qu'est ce qui démare le timer ? (j'avais pensé au timers mais je sais pas pourquoi je croyais qu'il fonctionnait seulement sur interruptions sur RB0 ...)
    Si tu parles tu timer pour compter les fronts, en fait je ne l'ai pas utilisé dans ce code, j'en ai parlé au cas où la période des fronts ne dépasserait pas quelques µs. L'interruption externe RB0 c'est autre chose (l'entrée externe du timer 0 est sur RA4/T0CKI).
    Si tu parles du timer pour compter le temps, il suffit de faire TxCON.TMRxON = 1;

    Et je ne comprends pas a quoi sert la variable "etat" et pourquoi il y a etat=RC0 ...
    Pour détecter les changements de front dans le programme, il faut connaître l'état actuel (RC0) et l'ancien état. D'où la variable etat.

    En tout cas MERCI
    de rien
    A+
    Dernière modification par sdec25 ; 05/07/2009 à 00h33.

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

    Re : Compter des impulsions avec un pic

    J'ai lu la doc du pic mais j'ai du mal avec la config' du timer0 ...

    Dèja je comprends pas trop comment fonctionne le prescaler :
    J'arrive pas à retrouver les valeurs que tu m'as dit plus haut (3 secondes pour tmr0...)

    Pour le timer2, c'était PR2 qui définissait le moment ou le flag se mettait à 1, mais pour le tmr0 comment on fait (je voudrais qu'il se mette à 1 après 2 secondes...)

    Merci par avance

  7. #6
    sdec25

    Re : Compter des impulsions avec un pic

    Pour le timer 0 le flag se met à 1 quand le compteur arrive à 0, il n'y a pas de PR2 comme sur le timer 2.
    Si on veut compter 1000 cycles, soit on teste while(TMR0<1000), soit on initialise le timer à -1000 (=64536 sur 16 bits) et on teste le flag IF.

    Avec un prescaler de 256 et un timer 16 bits on peut compter jusqu'à 65536*256 = 16777216 cycles d'horloge.
    A 20Mhz un cycle dure 0.2µs, donc on peut compter jusqu'à 3 secondes avec une précision de 51µs + le temps de passage dans la boucle.

  8. #7
    invite02a9928f

    Re : Compter des impulsions avec un pic

    Ah ok .. j'avais compris que le prescaler divisait et donc pour moi, il s'incrémentait tout les 256 cycles d'horloge ...
    Je comprends un peu mieux maintenant
    Un seul truc reste un peu flou mais je pense le decouvrir tout seul : dans TMR0=-1000, "1000" c'est des cycles d'horloge? (toute façon je vais faire un prog qui lorsque le flag sera a 1 affichera un truc sur le LCD et je pourrait voir la durée que ça a mit ...)

    Merci

  9. #8
    sdec25

    Re : Compter des impulsions avec un pic

    Citation Envoyé par Kmicaz Voir le message
    Ah ok .. j'avais compris que le prescaler divisait et donc pour moi, il s'incrémentait tout les 256 cycles d'horloge ...
    Tu avais bien compris
    Le prescaler comme son nom l'indique est utilisé avant d'incrémenter le compteur. Donc avec un prescaler de 256 le compteur s'incrémente après 256 cycles d'horloge.

    dans TMR0=-1000, "1000" c'est des cycles d'horloge?
    C'est des cycles d'horloge x prescaler. Si le prescaler vaut 1 c'est des cycles d'horloge. Plus le prescaler est grand, moins ça compte vite et moins c'est précis.
    Si on a un prescaler de 16, au bout de 16 cycles d'horloge (ou 16 impulsions sur T0CKI si la source du timer est une broche du PIC) TMR0 est incrémenté de 1. Donc avec un prescaler de 16, TMR0 atteint 1000 au bout de 16000 cycles, contre 8000 avec un prescaler de 8 et 1000 sans prescaler.

  10. #9
    sdec25

    Re : Compter des impulsions avec un pic

    Au fait tu as une idée de la fréquence mini et de la fréquence maxi du signal à mesurer ?

  11. #10
    invite02a9928f

    Re : Compter des impulsions avec un pic

    Merci pour ta reponse
    Alors pour les fréquences, l'ideal serait de partir de 0Hz et d'aller jusqu'a 400-500Khz ... (ça me permettrait de mesurer une plage assez grande de capacité ...)
    Mais le but premier de ce petit projet était de me remettre à la prog donc déja si j'arrive a mesurer (même si la plage n'est pas trés etendue c'est pas trés grave ...) je serait deja content

  12. #11
    invite02a9928f

    Re : Compter des impulsions avec un pic

    Je viens de faire ce petit bout de code pour voir si le timer faonctionnait bien (si j'avais les 3 secondes d'attente) mais le programme fait comme si le flag été a 1 dessuite (j'ai pas d'attente )...
    Code:
    void main()
    {
      
      TRISC = 0x01;                              // RC0 en entrée
      ADCON1 = 0x3F;                             // Set AN pins to Digital I/O
      LCD_Config(&PORTB, 5, 4, 6, 3, 2, 1, 0);   // initialize  (4-bit interface connection)
    
      Lcd_Cmd(LCD_CLEAR);                        // Effacer écran
      Lcd_Cmd(LCD_CURSOR_OFF);             // Curseur off
      Lcd_Out(1,3, "Capacimetre");               // Affichage texte sur LCD
      Lcd_Cmd(LCD_SECOND_ROW);
      Lcd_Out(2,6, "V1.0");
    
       T0CON = 00000111;                         // config du timer avec prescaler de 256
       INTCON.TMR0IE = 1;                         // autoriser les interruptions timer
       TMR0L = -15000000;                       // 3 secondes
       INTCON.TMR0IF = 0;
       T0CON.TMR0ON=1;                          // début de l'attente 
       if (INTCON.TMR0IF = 1)
          {
          Lcd_Cmd(LCD_CLEAR);
          Lcd_Out(1,3, "Youhou !!");
          }
    }
    C'est bien le TMR0L qui faut configurer a 3 secondes ??

  13. #12
    sdec25

    Re : Compter des impulsions avec un pic

    Je vois 2 problèmes dans le code :
    TMR0L = -15000000; // 3 secondes
    TMR0L est un registre 8 bits, on peut lui donner une valeur de 0 à 256, donc pas de -15000000.
    Le timer 0 est un timer 16 bits, avec 2 registres (TMR0L et TMR0H). On peut lui donner une valeur de 0 à 65535.
    Regarde la figure 10-2 page 104 de la datasheet, tout est expliqué.
    Rappelle toi que le nombre de cycles d'horloge est prescaler * timer.
    if (INTCON.TMR0IF = 1)
    {
    Lcd_Cmd(LCD_CLEAR);
    Lcd_Out(1,3, "Youhou !!");
    }
    Il n'y a pas de boucle pour attendre.

  14. #13
    invite02a9928f

    Re : Compter des impulsions avec un pic

    N'arrivant pas aprés 5 heures à faire marcher le tmr0 je suis tombé sur ce site ou le tmr1 + un compteur sont utilisés afin d'attendre jusqu'a la valeur que l'on veut ( à chaque interruption, le timer décrémente le compteur et une fois le compteur=0 l'action peut se faire donc plus on initialise le compteur avec une grande valeur, plus on attendra ...)

    http://clubelek.insa-lyon.fr/joomla/...ntroleur_3.php

    J'ai donc essayé et il se passe un truc pas très normal :

    Durant l'attente, mon LCD "clignote" puis va afficher n'importe quoi ...
    Ralala c'est plus simple d'utiliser les Delays des librairies que les timers ... lol

  15. #14
    invite02a9928f

    Re : Compter des impulsions avec un pic

    oups dsl j'ai posté 2 fois le même message ...

  16. #15
    sdec25

    Re : Compter des impulsions avec un pic

    On va commencer par un programme simple : on démarre à 0 et on attend que le timer 0 ait atteint une certaine valeur (qu'il est censé atteindre en 1s par exemple).
    Voilà la structure du programme à utiliser :
    Code:
    TMR0H = 0;
    TMR0L = 0;
    T0IF = 0;
    T0ON = 1;
    // permet de lire TMR0 en entier en commençant par TMR0L (à vérifier dans le code asm).
    #define TMR0 *((unsigned int*)&TMR0L)
    // fin du compteur (en cycles de timer0), s'assurer que FIN_COMPTEUR est compris entre 0 et 65535
    #define FIN_COMPTEUR  ???
    while(TMR0 < FIN_COMPTEUR) {
    ...
    }
    // 1s s'est écoulée
    à toi de définir le T0CON et FIN_COMPTEUR.
    A+

  17. #16
    invite02a9928f

    Re : Compter des impulsions avec un pic

    Salut,
    alors voila j'ai éssayé ton code mais cela ne fonctionne pas :

    Code:
    void main() {
      
      
      ADCON1 = 0x3F;                             // Set AN pins to Digital I/O
      LCD_Config(&PORTB, 5, 4, 6, 3, 2, 1, 0);   // initialize  (4-bit interface connection)
                                                 //   see auto complete
      Lcd_Cmd(LCD_CLEAR);       // Clear display
      Lcd_Cmd(LCD_CURSOR_OFF);  // Turn cursor off
    
    T0CON = 0b00000111;
    TMR0H = 0;
    TMR0L = 0;
    INTCON.T0IF = 0;
    T0CON.TMR0ON = 1;
    // permet de lire TMR0 en entier en commençant par TMR0L (à vérifier dans le code asm).
    #define TMR0 *((unsigned int*)&TMR0L)
    
    while (TMR0 < 39000)                        // fin du compteur (en cycles de timer0), s'assurer que FIN_COMPTEUR est compris entre 0 et 65535
    {
    Lcd_Out(1,3, "Youhou !!");
    }
    // 2s s'est écoulée
    }
    Il n'y a pas d'arrêt, Youhou apparait tout le temps sur le LCD (j'ai laissé le LCD branché 2 minutes et Youhou été toujours a l'écran ...)

    Pour la valeur 39000 j'ai fait comme cela :
    prescaler de 256 => 39000*256*0.2µ= 2 secondes

    Dans ce code il y a une ligne que je ne comprends pas :
    #define TMR0 *((unsigned int*)&TMR0L)
    tu m'as dit de verifier dans le .asm mais je vois pas de quel .asm tu fais référence ...

  18. #17
    sdec25

    Re : Compter des impulsions avec un pic

    Citation Envoyé par Kmicaz Voir le message
    Pour la valeur 39000 j'ai fait comme cela :
    prescaler de 256 => 39000*256*0.2µ= 2 secondes
    Ça c'est bon.

    Dans ce code il y a une ligne que je ne comprends pas :
    #define TMR0 *((unsigned int*)&TMR0L)
    tu m'as dit de verifier dans le .asm mais je vois pas de quel .asm tu fais référence ...
    En fait pour lire le contenu de TMR0H il faut d'abord lire TMR0L. En faisant comme ça le compilateur lit d'abord TMR0L.
    Sous MPLAB : view > disassembly listing pour voir le code asm.

    Je chercherais plutôt l'erreur de ce côté :
    Code:
    while (TMR0 < 39000)                        // fin du compteur (en cycles de timer0), s'assurer que FIN_COMPTEUR est compris entre 0 et 65535
    {
    Lcd_Out(1,3, "Youhou !!");
    }
    traduction en français :
    pendant 2 secondes on affiche "Youhou !!".
    Donc c'est normal qu'il soit affiché tout le temps.
    Si tu as des difficultés avec le C il doit y avoir des tutos sur les boucles en C.

  19. #18
    invite02a9928f

    Re : Compter des impulsions avec un pic

    Citation Envoyé par sdec25 Voir le message

    traduction en français :
    pendant 2 secondes on affiche "Youhou !!".
    Donc c'est normal qu'il soit affiché tout le temps.
    Le problème c'est que je le traduit comme toi et je ne vois pas d'érreur ... Pour moi on reste dans la boucle 2 secondes puis au bout des 2 secondes on sort et plus rien ne s'affiche ...

    Le C j'en ai fait l'an dernier car j'ai fait un DUT de génie électrique (on avait fait une horloge satellite qui recevait les trames par liaison série et des tableaux d'affichage par I2C).
    Mais cette année, on y a pas touché et vu la quantité de chose qu'on voit en 2nde année, j'ai oublié certains trucs en C.
    Je travaillais sur MPLAB mais pour ce projet, je n'ai pas trouvé de routine pour le LCD, la seule que j'ai trouvé c'est dans le logiciel MikroC et donc je me sert de ce dernier. J'avais un ICD2 pour débugger mais il a "pété un cable" et ne reconnait plus les pics ... donc tout ça fait que je pédale grave dans la semoule ...

  20. #19
    sdec25

    Re : Compter des impulsions avec un pic

    Citation Envoyé par Kmicaz Voir le message
    Pour moi on reste dans la boucle 2 secondes puis au bout des 2 secondes on sort et plus rien ne s'affiche ...
    Quand on n'envoie pas d'instruction à l'écran il ne change pas l'affichage.
    Donc pas besoin de faire LcdOut("youhou !!") dans la boucle, une fois au début suffit.
    Et pour effacer l'écran il faut lui envoyer la commande Clear. Après quoi il faut faire une pause (while(1); par exemple) pour ne pas que le PIC se redémarre et recommence tout depuis le début.

  21. #20
    invite1c20f11a

    Re : Compter des impulsions avec un pic

    Bonjour,

    . . .C'est vrai que je ne serai jamais électronicien et je ne comprends rien aux messages précédents, pourtant je voudrais aussi mesurer un condensateur, avec un PIC16F88, un 555, et en assembleur, c'est plus facile.

    . . Sortant de la broche 3 du 555, j'enverrai l'oscillation dans 2 compteurs, ce qui me donnera un nombre binaire sur 8 bits qui sera "cadré" par une tempo de 1s ou autre pour avoir un affichage direct de la capa. Comme la capa ne variera pas , je pourrai faire plusieurs lectures, en commutant plusieurs 555 et même d'autres oscillateurs, pour avoir une étendue de mesure énorme, tout ce qui pourra osciller sera bon à utiliser.
    pont

  22. #21
    invite5637435c

    Re : Compter des impulsions avec un pic

    Bonjour,

    pourquoi faire un 555, si vous avez ce PIC à votre disposition?

    Vous pouvez utiliser un PIC équipé de comparateurs (c'est justement le cas du PIC16F88) et former votre oscillateur avec ceux-ci, vous gagnez un circuit intégré.
    A+

  23. #22
    invite5637435c

    Re : Compter des impulsions avec un pic

    Kmicaz, ton problème doit se traiter avec les interruptions, les timings sont importants et doivent être précis, sinon ce n'est plus un appareil de mesures mais un gadget.

    Il faut donc gérer en interruption les évènements que tu as à surveiller (flags de tempo, flags d'évènements, etc) et activer des variables (de type 'volatile') qui seront exploitées dans le programme principal pour effectuer des tâches dédiées.

    Ca par exemple:

    Code:
    if (INTCON.TMR0IF = 1)
          {
          Lcd_Cmd(LCD_CLEAR);
          Lcd_Out(1,3, "Youhou !!");
          }
    C'est bidon car si l'évènement survient pendant la phase d'écriture sur le LCD les évènements seront faussés dans le traitement.

    Alors qu'en interruption dès que l'évènement survient, l'action devra être traité PRIORITAIREMENT.

    A+

  24. #23
    invite02a9928f

    Re : Compter des impulsions avec un pic

    Merci pour les reponses

    Pour le moment je re-regarde les progs de µC que j'avais fait a l'iut pour bien me remettre dan le bain (car comme vous avez put le constater, à froid j'ai du mal ...). Ensuite va falloir que je règle le problème de mon ICD2 qui ne reconnait plus les pic ... ensuite je me remettrai a la prog de mon capacimètre

  25. #24
    invite02a9928f

    Re : Compter des impulsions avec un pic

    Tant que j'y suis, est ce que vous ne connaitriez pas des sites avec des programmes en C avec quelques commentaires ? car il y a beaucoup de sites avec des programmes mais ils sont deja compilés en .hex ... ça me permettrai de voir plein de choses en C plus parlantes que des cours ...

  26. #25
    invite02a9928f

    Re : Compter des impulsions avec un pic

    Bonjour a tous,
    je sors un peu du sujet, mais ça y contribue quand même
    Je viens de "réparer" mon ICD2 (lors de ma dernière utilisation, il avait téléchargé un nouveau OS et il a du avoir un petit bug car à cause de ça il ne marchait plus ...)
    Mais j'ai toujours un ptit probème : lorsque je branche mon pic sur une plaque de test, l'ICD2 dialogue avec le pic.
    Mais lorsque je remet mon pic dans mon montage et que je branche l'ICD2 à mon montage, ce dernier ne reconnait pas mon pic (il me dit qu'il n'y a pas de pic (attendue 0x27, lut 0x00) )
    Je viens de voir que microchip précaunise de mettre une resistande de 10K sur le MCLR => j'ai oublié de la mettre ...



    Est ce que vous pensez que l'oubli de cette résistance est en cause (sur ma plaque de test, l'ICD2 est en liaison directe avec le pic tandis que sur le montage, il y a les composants autour ...) sachant que la prise ICD2 du montage est bien branchée au pic ...

    Merci par avance

  27. #26
    sdec25

    Re : Compter des impulsions avec un pic

    Salut.
    Est ce que vous pensez que l'oubli de cette résistance est en cause
    Ça dépend de ce qu'il y a autour.
    La résistance (qu'on peut remplacer par une diode) sert à relier MCLR à Vdd en protégeant Vdd du 12V qu'il y a sur Vpp.
    Avec un schéma ce serait plus simple de trouver le problème.

  28. #27
    invite02a9928f

    Re : Compter des impulsions avec un pic

    Voici le schéma :


  29. #28
    sdec25

    Re : Compter des impulsions avec un pic

    Ce n'est pas étonnant que ça ne marche pas :
    MCLR est relié au +5V.
    L'ICD2 utilise MCLR pour communiquer avec le PIC. MCLR ne peut pas être à 0V (il y a un court-circuit) donc rien que pour ça l'ICD2 ne peut pas voir le PIC.
    En plus, quand il y a du +12V sur MCLR, le 12V se retrouve sur l'alim 5V, c'est pas très bon !

    Le 5V doit se retrouver sur MCLR et pas l'inverse. Pour faire ça il y a 2 solutions (décrites dans la doc de l'ICD ou du PICkit2 page 31) :
    Mettre une résistance entre 5V et MCLR.
    ou Mettre une résistance ET une diode Schottky entre 5V et MCLR.

  30. #29
    invite02a9928f

    Re : Compter des impulsions avec un pic

    je vais faire la modif

    Merci (encore une fois ...)

  31. #30
    invite757b16d0

    Re : Compter des impulsions avec un pic

    salut kmikaz

    je suis interesse par ton travail, en effet je suis entrain de réaliser un compteur de fronts sur un signal carré et je viens afficher le nombre sur un lcd deux lignes.

    Je voudrais savoir si tu aurais la gentillesse de me communiquer le programme que tu a réaliser sur ton microcontroleur car je t'avoue je patauge.
    merci

Page 1 sur 2 1 DernièreDernière

Discussions similaires

  1. Compter des impulsions avec une carte K8055 (Velleman)
    Par invitef7c180e6 dans le forum Électronique
    Réponses: 9
    Dernier message: 04/02/2009, 15h55
  2. Capter des impulsions sans contact (avec un enroulement)
    Par invitef98219cd dans le forum Électronique
    Réponses: 3
    Dernier message: 16/05/2008, 16h32
  3. Impulsions avec PIC
    Par invite436dc8ee dans le forum Électronique
    Réponses: 4
    Dernier message: 21/06/2006, 21h24
  4. Impulsions Avec Pic
    Par invite436dc8ee dans le forum Électronique
    Réponses: 12
    Dernier message: 28/05/2006, 19h43
  5. Comment utiliser les timer/compter du Pic 16f877A
    Par invitee5d5e4d7 dans le forum Électronique
    Réponses: 1
    Dernier message: 11/08/2005, 00h27
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...