Répondre à la discussion
Affichage des résultats 1 à 13 sur 13

Temporisation pour un PIC16F84A en C



  1. #1
    Bernibernouille

    Temporisation pour un PIC16F84A en C


    ------

    Bonjour à tous,

    Voila, j'utilise le programme MikroC et je cherche désespérément comment on fait pour utiliser une temporisation.
    Tout ce que j'ai trouvé pour le moment c'est le "delay". Mais le souci avec ce système c'est que le Microcontrôleur ne fait plus d'autre action pendant le temps du delay.

    J'ai déjà réussi à le faire avec MPlab mais je n'arrive pas a lme faire avec MikroC.

    Si qqun peut m'aider ?

    Merci en tout cas !

    -----

  2. Publicité
  3. #2
    amgab2003

    Re : Temporisation pour un PIC16F84A en C

    Bonjour,
    Tu dois utiliser les interruption d'un timer.
    Jette un coup d'oeil sur le cours de BigonOff part1 c'est trés bien expliqué.

    En plus c'est pas relatif au mikroC (normalement le meme code que tu as testé sur mplab doit marcher sur mikroC) j'estime que c'est un probleme de syntax. poste le , pour verifier.
    Amine

  4. #3
    Bernibernouille

    Re : Temporisation pour un PIC16F84A en C

    Voila le code que j'ai voulu exécuter sur MikroC
    unsigned temps : 16;
    char newtmro;

    void main ()
    {
    PORTB=0;
    TRISB= 0x00;
    OPTION = 0xC5;
    temps=0;
    newtmro = TMRO+1;
    for (;
    {
    clrwdt();
    if (TMRO == newtmro)
    {
    ++temps;
    ++newtmro;
    }
    if (temps == 15625)
    {
    RB0_bit =! RB0_bit;
    temps=0;
    }
    }
    }

    p.s.: Ce code je l'ai réaliser avec le tuto que j'ai télécharger ici

  5. #4
    eSb`

    Re : Temporisation pour un PIC16F84A en C

    Tu n'utilises pas correctement le principe de l'interruption ou du moins, ce n'est pas adapté à la syntaxe de mikroC. Regarde les exemples donnés avec mikroC (ici fourni avec EasyPIC5 quand on était encore en mikroC 8.0).

    Il me semble déjà que tu écris TMRO à la place de TMR0 (donc la lettre à la place du chiffre), ça ne peut pas fonctionner.

    Ensuite, tu dois configurer l'interruption sur TMR0 via T0CON et INTCON (voir exemple, datasheet et cours de Bigonoff).

    Pour l'inversion, RB0_bit ne fonctionnera pas en mikroC, il faut utiliser PORTB.F0 ou LATB.F0 (si t'es en 16F ou 18F).

    Normalement, sur base de l'exemple ci-dessous, tu devrais arriver à faire ce que tu désires.

    Code:
    unsigned cnt;
    
    void interrupt() {
      cnt++;                   // Increment value of cnt on every interrupt
      TMR0L  = 96;
      INTCON = 0x20;           // Set T0IE, clear T0IF
    }
    
    void main() {
      ADCON1      = 0x0F;      // Set AN pins to Digital I/O
      T0CON       = 0xC4;      // Set TMR0 in 8bit mode, assign prescaler to TMR0
      TRISB = 0;               // PORTB is output
      PORTB = 0xFF;            // Initialize PORTB
      TMR0L = 96;              // Timer0 initial value
      INTCON = 0xA0;           // Enable TMRO interrupt
      cnt = 0;                 // Initialize cnt
    
      do {
        if (cnt == 400) {
          PORTB = ~PORTB;      // Toggle PORTB LEDs
          cnt = 0;             // Reset cnt
          }
        } while(1);
    }

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

    Re : Temporisation pour un PIC16F84A en C

    Merci je vais regarder ca de plus près
    Merci pour ton aide en tout cas

  8. #6
    eSb`

    Re : Temporisation pour un PIC16F84A en C

    Salut,

    J'espère que ça a fonctionné. Je voulais juste préciser qu'apparemment RB0_bit devrait fonctionner si tu utilises mikroC PRO. Je l'utilise depuis hier donc je ne connais pas encore les nouvelles syntaxes ; ).

  9. Publicité
  10. #7
    Bernibernouille

    Re : Temporisation pour un PIC16F84A en C

    J'ai vu que j'avait quelque problème dan le syntaxe et voila ce que ca m'a donné mais j'ai pas encore peu tester. Blocus oblige

    Code:
      char temps;
      void main ()
      {
       PORTB=0;
       TRISB= 0x00;
       OPTION_REG = 0b11000111;
       temps=0;
       TMR0=0;
       for (;;)
       {
        if (TMR0 == 250)
        {
         ++temps;
         TMR0=0;
        }
        if (temps == 16)
        {
         RB0_bit =! RB0_bit;
         temps=0;
         }
        }
       }

  11. #8
    Bender4972

    Re : Temporisation pour un PIC16F84A en C

    Bonjour tu n'as pas activé les interruptions avec le registre INTCON
    (INTCON = 0xA0; // Enable TMRO interrupt)

  12. #9
    jonathan82

    Thumbs up Re : Temporisation pour un PIC16F84A en C

    Il ne veux pas utiliser d'interruptions... Simplement une tempo.

    Code:
    char temps;
      void main ()
      {
       PORTB=0;
       TRISB= 0x00;
       OPTION_REG = 0b11000111; Why ? Tu active les interruptions...
       temps=0;
       TMR0=0;
       for (;;)
       {
        if (TMR0 == 250)
        {
         ++temps; Je savais pas ques les + devant fonctionnaient
         TMR0=0;
        }
        if (temps == 16)
        {
         RB0_bit =! RB0_bit; Il s'agit d'une comparaison de différence, pas une inversion d'état. eSb' le montre dans son exemple...
         temps=0;
         }
        }
       }
    J'ai changé mon PIC et mon quartz et simulé ton programme avec ma modification et ca fonctionne très bien. Je l'optimise dans la foulée...

    Code:
    char temps = 0;
      void main () {
       PORTB=0;                     // Mise à 0 du PORT B
       TRISB= 0x00;                 // Mise des pins en sortie
       OPTION_REG = 0b10000111;     // Prescaler à 256
       TMR0=0;                      // Initialisation du Timer0
    
       do
       {
        if (TMR0 == 250)
        {
         temps++;
         TMR0=0;
        }
        if (temps == 16)
        {
         RB0_bit = ~RB0_bit;        // Inverstion de l'état de RB0
         temps=0;
         }
        } while (1);
       }
    Voilà, ca tourne nickel.
    Now, petite suggestion... Fini ton code sur ton PIC16F84 et passe à un 16F628. Ils sont moins chère et plus performant... (Pour ton projet, tu peux y mettre un quartz horloger dessus... )

    Cordialement
    Jonathan

  13. #10
    eSb`

    Re : Temporisation pour un PIC16F84A en C

    Au niveau du ++ devant, ça ne fait pas la même chose, donc il faut savoir ce qu'on veut.
    Avec ++ devant, on incrémente la valeur puis on l'évalue (donc si on fait un if (++x > 5) il va réaliser le if avec la valeur déjà incrémentée, if (x++ > 5), il va réaliser le if avec l'ancienne valeur de x et puis l'incrémenter.

    Les deux sont utiles, ça dépend du cas ; ).

    Je ne crois pas qu'il soit utile de tester "temps" si on ne l'a pas incrémenté, soit si on n'est pas passé par TMR0 == 250, donc on pourrait faire :
    Code:
      
    if (TMR0 == 250)
    {
         if(temps++ == 16)
         {
               RB0_bit = ~RB0_bit;        // Inversion de l'état de RB0
               temps=0;
         }
         TMR0=0;
    }
    Je n'ai pas testé, mais logiquement, ça doit passer ; ).

    Sinon, je sais qu'il ne veut pas d'interruption, mais je trouve ça absurde de tester TMR0. On n'est pas en réel "travail de fond", le PIC s'occupe de faire des comparaisons inutiles qui sont normalement comprises dans l'interruption (si TMR0 atteint la valeur voulue, il déborde et génère l'interruption).

    Je préfère l'exemple de mikroElektronika qui, pour moi, fait vraiment ce qui est demandé.

    Et pour l'optimisation réalisée, en quoi un do while (1) serait mieux qu'un for(; ? (Je préfère aussi cette syntaxe mais c'est purement subjectif à mon avis ; )).

  14. #11
    Bernibernouille

    Re : Temporisation pour un PIC16F84A en C

    il doit surement avoir un problème chez moi pcq ca ne marche toujours pas

    J'ai copier le programme de jonathan82 sans résultat. la led ne clignote pas!

    c'est con tout les difficultés que l'on peut rencontrer pour faire clignoté une &!%$µ$!§ de LED.

    Merci en tout cas pour votre aide

  15. #12
    eSb`

    Re : Temporisation pour un PIC16F84A en C

    Tu sais nous donner un schéma du hardware histoire que ça ne soit pas un problème matériel ?
    Ou bien, si c'est sur un EasyPic, t'es sûr d'avoir bien mis le curseur des LEDs ; ) ?

  16. Publicité
  17. #13
    Bernibernouille

    Re : Temporisation pour un PIC16F84A en C

    nn ca va j'ai trouver le problème.
    J'avais mis l'oscillateur sur XT et pas sur HS

    Merci pour votre aide ca fonctionne très bien

Discussions similaires

  1. Temporisation pour LCD
    Par hoffmann dans le forum Électronique
    Réponses: 4
    Dernier message: 31/10/2008, 09h06
  2. Réponses: 1
    Dernier message: 23/07/2008, 21h01
  3. Temporisation en asm pour Pic
    Par samux dans le forum Électronique
    Réponses: 3
    Dernier message: 09/06/2007, 23h31
  4. Temporisation pour relais
    Par jfpelletier dans le forum Électronique
    Réponses: 22
    Dernier message: 01/04/2007, 01h40
  5. aide pour programmer pic16f84A
    Par jerome2b dans le forum Électronique
    Réponses: 7
    Dernier message: 24/04/2006, 19h20
Découvrez nos comparatifs produits sur l'informatique et les technologies.