Programmation compte tours PIC
Répondre à la discussion
Affichage des résultats 1 à 13 sur 13

Programmation compte tours PIC



  1. #1
    Kmicaz

    Programmation compte tours PIC


    ------

    Bonjour a tous,

    je suis en train de programmer un pic pour faire un compte tour qui s'actualise toutes les secondes :

    j'ai un quartz de 20Mhz et un 18F4420 et j'ai paramétré le TIMER0 en 16bits et prescaler de 128 ==> 1/(1/5*10^6)*128) = 39063 donc je dois commencer a compter à 26572 soit 01100111 11001100 en binaire.

    Voici mon code :

    Code:
    int RPM;
    int donne;
    int Mil;
    int Cent;
    int Diz;
    int Uni;
    
    void interrupt()
    {
      donne = RPM*60;
      RPM=0;
      TMR0L = 11001100;
      TMR0H = 01100111;
      INTCON = 0x20;       // autorisation T0IE, mise a zero T0IF
    }//~
    
    
    
    //////////////////////////////////////////////////////////////
    //                                                          //
    //                  Programme principal                     //
    //                                                          //
    //////////////////////////////////////////////////////////////
    
    void main()
    {
      ADCON1 = 0x3F;            // Set AN pins to Digital I/O
      T0CON  = 0X86;            // Timer en 16 bits et prédiviseur en 1/128
      TMR0L = 11001100;
      TMR0H = 01100111;
      INTCON = 0xA0;            // Autorisation des interruptions du TMR0
      TRISA = 0b00010000;  // PORTA en sortie sauf RA4
      
        Lcd_Init(&PORTD);         // LCD connecté au PORTD
      Lcd_Cmd(Lcd_CLEAR);       // Efface ecran
      Lcd_Cmd(Lcd_CURSOR_OFF);  // Curseur OFF
      RPM=0;
    
      do
      {
        if (PORTA.F4 == 1)     // si front montant sur RA4
        {
        RPM = RPM+1;           // on incremente la variable RPM
        }
    
    Mil = donne/1000;
    Cent = (donne-(Mil*1000))/100;
    Diz = (donne-(Mil*1000)-(Cent*100))/10;
    Uni = donne-(Mil*1000)-(Cent*100)-(Diz*10);
    
      
      LCD_Chr(2, 2,48 + Mil);
      LCD_Chr(2, 3,48 + Cent);
      LCD_Chr(2, 4,48 + Diz);
      LCD_Chr(2, 5,48 + Uni);
    
      } while(1);          // Boucle sans fin
    }//
    J'ai simulé sous ISIS et lorsque je mets des impulsions sur RA4, par exemple 14Hz, le LCD devrait m'afficher 14*60 soit 0840 or il affiche n'importe quoi ...

    Est ce que vous voyez d'ou vient mon problème ??

    Merci par avance

    -----

  2. #2
    Kmicaz

    Re : Programmation compte tours PIC

    je viens de trouver une erreur : j'initialisais TMR0L avant TMR0H or d'aprés ce que j'ai lu sur le net, il faut faire l'inverse. Mais cela n'a pas résolu mon problème ...

  3. #3
    amoniaque

    Re : Programmation compte tours PIC

    Hello,

    Ton while est bien étrange, tu fais tes calculs et affichages sans arrêts ?
    Ce n'est pas très conseillé ...

    Il serait plus judicieux de placer un flag lorsque l'interruption timer apparaît et dans le while, si ce flag est levé, alors effectuer les fonctions voulues. Ceci éviterait d'envoyer non stop à l'afficheur (et donc peut-être d'éviter d'afficher n'importe quoi).

    De plus le coup du signal sur RA4 et du test de l'état dans ta boucle j'ai du mal à comprendre. Pourquoi ne pas mettre ton signal sur une interruption externe et relever la valeur de ton timer lors de cette interruption ?
    Ce serait beaucoup plus précis.


    Sinon si ça peut t'aider : http://forums.futura-sciences.com/el...ic16f628a.html.

  4. #4
    RicounetZap

    Re : Programmation compte tours PIC

    Bonjour,

    Je crois qu'il faut que tu déclares ta variable ""donne" comme volatile (pour être modifié dans une interruption.
    Petite question, si ton compte tours monte à 1200 tours par minute, que va t'il se passer ? (Taille d'un int en nombre d'octet, 1200 X 60 ...)
    Cordialement
    N'importe quoi, for ever :-)

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

    Re : Programmation compte tours PIC

    arf oui je l'avais modifié le type de "donne" en long ...
    J'ai mis les variables en volatile et hélas c'est pas e là que ça vient ...

    Je vais essayer de faire avec le TMR0 le compteur et avec le TMR1 la fenêtre de comptage de 1 seconde ... c'est la 2nde fois que je me sert des timers donc j'ai pas encore l'habitude ...

  7. #6
    carcan

    Re : Programmation compte tours PIC

    Hello !

    il n'y a rien qui détecte un front montant !!!
    Ici, tu incrémentes si l'entrée est à l'état haut, il faut corriger dans ce coin ... Le plus simple est de travailler par interruption (comme déjà conseillé).

    A+
    Laurent

  8. #7
    Kmicaz

    Re : Programmation compte tours PIC

    En effet, j'ai fait une modification et cela s'approche de la valeur que je devrait obtenir

    Code:
        Newstate=PORTA.F4;
        if (Newstate==1 && Oldstate==0)     // Front montant
        {
    
        RPM = RPM+1;           // on incremente la variable RPM
        }
    Oldstate=Newstate;
    Mais j'ai un décalage entre la valeur théorique et la valeur affichée ...
    Je vais essayer de le faire par interruption, je vous dirais ce qu'il en est ...

  9. #8
    Kmicaz

    Re : Programmation compte tours PIC

    En effet, j'ai fait une modification et cela s'approche de la valeur que je devrait obtenir

    Code:
        Newstate=PORTA.F4;
        if (Newstate==1 && Oldstate==0)     // Front montant
        {
    
        RPM = RPM+1;           // on incremente la variable RPM
        }
    Oldstate=Newstate;
    Mais j'ai un décalage entre la valeur théorique et la valeur affichée ...
    Je vais essayer de le faire par interruption, je vous dirais ce qu'il en est ...

  10. #9
    Kmicaz

    Re : Programmation compte tours PIC

    Je viens de faire par interruption et j'ai un soucis, la valeur affichée sur le LCD n'est pas celle attendue ...

    Code:
    long RPM;
    long donne;
    int Mil;
    int Cent;
    int Diz;
    int Uni;
    
    
    void interrupt()
    {
    if (INTCON.TMR0IF==1)
    {
      INTCON = 0x30;       // autorisation T0IE, INT0IE, mise a zero T0IF
      donne = RPM*60;
      RPM=0;
      TMR0H = 01100111;
      TMR0L = 11001101;
      Mil = donne/1000;
      Cent = (donne-(Mil*1000))/100;
      Diz = (donne-(Mil*1000)-(Cent*100))/10;
      Uni = donne-(Mil*1000)-(Cent*100)-(Diz*10);
    }
    if (INTCON.INT0IF==1)
    {
    INTCON = 0x30;       // autorisation T0IE, INT0IE, mise a zero INT0IF
    RPM=RPM+1;
    }
    
    }
    
    
    //////////////////////////////////////////////////////////////
    //                                                          //
    //                  Programme principal                     //
    //                                                          //
    //////////////////////////////////////////////////////////////
    
    void main()
    {
      ADCON1 = 0x3F;            // Set AN pins to Digital I/O
      T0CON  = 0X86;            // Timer en 16 bits et prédiviseur en 1/128
      TMR0H = 01100111;
      TMR0L = 11001101;
      INTCON = 0xB0;            // Autorisation des interruptions du TMR0 et INT0
      INTCON2= 0x44;           // INT0 sur front montant
      TRISA = 0b00010000;       // PORTA en sortie sauf RA4
      TRISB = 0b00000001;                // PORTB en sortie sauf RB0
    
    
      Lcd_Init(&PORTD);         // LCD connecté au PORTB
      Lcd_Cmd(Lcd_CLEAR);       // Efface ecran
      Lcd_Cmd(Lcd_CURSOR_OFF);  // Curseur OFF
      RPM=0;
    
    
      do
      {
    
      LCD_Chr(2, 2,48 + Mil);
      LCD_Chr(2, 3,48 + Cent);
      LCD_Chr(2, 4,48 + Diz);
      LCD_Chr(2, 5,48 + Uni);
    
    
      } while(1);          // Boucle sans fin
    }//
    Par exemple si je mets 1Hz en entrée, il devrait m'afficher 1*60 soit 60 or il affiche 120,60,120,60 ...
    Pour 20Hz il devrait afficher 1200 or il affiche 1440,1380,1440,1380 ...

    Y'a un truc que je fais mal dans le programme ??

  11. #10
    Kmicaz

    Re : Programmation compte tours PIC

    Une personne m'a conseillé de faire avec le mode capture du timer afin de mesurer la période au lieu des impulsions. Or je ne m'en suis jamais servi et apparemment j'arrive pas a le faire marcher ...

    y'a d'autres choses a faire ??

    Code:
    void interrupt()
    {
    if (PIR2.CCP2IF == 1)
    {
      PIR2.CCP2IF=0;                               // on efface le flag
      TMR3H = 0;
      TMR3L = 0;
      TMR = (CCPR2H*256)+CCPR2L;                   // lecture de la capture
      donne= (1/((1*10^-6)*8*TMR))*60;             //   convertion en tr/min
    
      Mil = donne/1000;
      Cent = (donne-(Mil*1000))/100;
      Diz = (donne-(Mil*1000)-(Cent*100))/10;
      Uni = donne-(Mil*1000)-(Cent*100)-(Diz*10);
    }
    
    }//~
    
    
    
    //Decalrations MAIN
    
    
      ADCON1 = 0x3F;            // Set AN pins to Digital I/O
    
      INTCON = 0xE0;            // Autorisation des interruptions des périphériques
      T3CON = 0xDD;             // TMR3 en capture avec prescaler = 1/8
      TMR3H = 0;
      TMR3L = 0;
      CCP2CON = 0x04;           //Capture tous les fronts montants
      TRISA = 0b00010000;       // PORTA en sortie sauf RA4
      TRISB = 0b00000000;                // PORTB en sortie
      TRISC = 0b00000010;

  12. #11
    Kmicaz

    Re : Programmation compte tours PIC

    j'ai resolu mon problème, le mode CCP fonctionne. Par contre j'ai une erreur bizarre ...

    donne = 60/(1*0,000001*8*TMR);

    "donne" est toujours égal à 0 alors que "TMR">0 ...

    "donne" & "TMR" sont déclarés en int.

  13. #12
    RicounetZap

    Re : Programmation compte tours PIC

    Citation Envoyé par Kmicaz Voir le message
    j'ai resolu mon problème, le mode CCP fonctionne. Par contre j'ai une erreur bizarre ...

    donne = 60/(1*0,000001*8*TMR);

    "donne" est toujours égal à 0 alors que "TMR">0 ...

    "donne" & "TMR" sont déclarés en int.
    Ton calcul est équivalent à :
    donne = 60 * 1000000/1*8*TMR
    1 Million ne passe pas dans un int.
    Même sur un ordinateur, cela ne coute rien de simplifier les calculs.

    Dans le doute, fait des essais en décomposant le calcul, tu verras ou se situe le problème.
    Cordialement
    N'importe quoi, for ever :-)

  14. #13
    Kmicaz

    Re : Programmation compte tours PIC

    Bon, j'ai trouvé le problème ...

    cela venait du fait que j'avais ecrit 0,000001 au lieu de 0.000001 ...

    Merci a tous pour vos reponses

Discussions similaires

  1. [Divers] Pb compte tours
    Par invite82b98f28 dans le forum Dépannage
    Réponses: 0
    Dernier message: 27/02/2008, 06h08
  2. compte-tours
    Par invitedbef4e89 dans le forum Électronique
    Réponses: 2
    Dernier message: 29/12/2007, 17h43
  3. compte tours
    Par sdow dans le forum Électronique
    Réponses: 7
    Dernier message: 06/06/2007, 19h11
  4. Compte-tours et Km/h sur pic
    Par invite464a02ec dans le forum Électronique
    Réponses: 3
    Dernier message: 21/04/2006, 16h54
  5. compte-tours
    Par invite7e230522 dans le forum Électronique
    Réponses: 7
    Dernier message: 09/09/2003, 10h21
Découvrez nos comparatifs produits sur l'informatique et les technologies.