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

Problème PIC16F



  1. #1
    black templar

    Problème PIC16F


    ------

    Bonjour à tous.

    Je viens de découvrir les microcontrôleurs depuis une semaine.
    Pour le moment, j'essaye de me faire un petit vu-mètre grâce à un PIC16F876A

    Ma première version était plutôt satisfaisante.
    Toutes les milisecondes environ (un peu plus), j'effectuai une conversion A->D d'un signal audio et, en fonction de la valeur de la tension, j'allumais une ou plusieurs diodes.
    Le rendu est pas trop mal.

    Mais j'ai eu envi de l'améliorer en faisant une moyenne sur 10 acquisitions. et là, c'est le drame. je fais une fonction initialiser qui allume les une après les autres les 4 leds pendant 100ms et je me rend compte qu'en fait, mon pic reset très très périodiquement ! (en gros, il reset tous les 100ms au mieux !!)

    Le problème, c'est que je ne vois absolument pas pourquoi !! (j'ai désactiver le watchdog...)

    Voila mon code :
    Code:
    #include <16F876a.h>
    
    #fuses HS,NOPROTECT,NOWDT,NOLVP //HS : haute freq- watchdog - pas interruption
    #use delay(clock=4000000) // 4MHz vitesse Pic
    
    #define LED1 PIN_C3
    #define LED2 PIN_C2
    #define LED3 PIN_C1
    #define LED4 PIN_C0
    #define INPUT PIN_A2
                             //  #define LED_TEST1 PIN_C4
                             //  #define LED_TEST2 PIN_C5
    
    //#define S1 (80)
    //#define S2 (84)
    //#define S3 (88)
    //#define S4 (93)
    #define S1 (10)
    #define S2 (20)
    #define S3 (30)
    #define S4 (40)
    
    void init_PIC();     // initialisation du ADC
    void refresh_led(int);     // allume les led en fonction de la tension prélevé sur A2
    
    void main()
    {
       int value, somme = 0;
       int compteur_moyenne = 10;
                                    // int test = 0;
    
       init_PIC();
    
       while(1)
       {
    
          Delay_ms(1);
          value = read_adc(ADC_START_AND_READ);     // aquisition
          Delay_us(20);
    
          somme = somme + value;
          compteur_moyenne--;
                                          // Output_bit(LED_TEST2, (compteur_moyenne%2));
          if(compteur_moyenne == 0)     // moyennage sur 10 valeurs
          {
             value = (int)(somme / 10);
    
             compteur_moyenne = 10;     // remise à 0
             somme = 0;
    
             refresh_led(value);
                                       // test++;
                                       // Output_bit(LED_TEST1, (test%2));
          }
                                       // refresh_led(value);
    
       }
    
    }
    
    
    void init_PIC()
    {
       setup_adc(ADC_CLOCK_DIV_32);
       setup_adc_ports(RA0_RA1_RA3_ANALOG);
       set_adc_channel(1);
    
    
    // allume les 4 diodes pendant 100 ms les unes à la suite des autres
       Output_bit(LED1, 1);    // <= reste bloqué ici
       Output_bit(LED2, 0);
       Output_bit(LED3, 0);
       Output_bit(LED4, 0);
    
       Delay_ms(100);
    
       Output_bit(LED1, 0);
       Output_bit(LED2, 1);
    
       Delay_ms(100);
    
       Output_bit(LED2, 0);
       Output_bit(LED3, 1);
    
       Delay_ms(100);
    
       Output_bit(LED3, 0);
       Output_bit(LED4, 1);
    
       Delay_ms(100);
    
       Output_bit(LED4, 0);
    
    
    }
    
    void refresh_led(int val)
    {
          if(val < S1)
          {
             Output_bit(LED1, 0);
             Output_bit(LED2, 0);
             Output_bit(LED3, 0);
             Output_bit(LED4, 0);
          }
          else if((val >= S1) && (val < S2))
          {
             Output_bit(LED1, 1);
             Output_bit(LED2, 0);
             Output_bit(LED3, 0);
             Output_bit(LED4, 0);
          }
          else if((val >= S2) && (val < S3))
          {
             Output_bit(LED1, 1);
             Output_bit(LED2, 1);
             Output_bit(LED3, 0);
             Output_bit(LED4, 0);
          }
          else if((val >= S3) && (val < S4))
          {
             Output_bit(LED1, 1);
             Output_bit(LED2, 1);
             Output_bit(LED3, 1);
             Output_bit(LED4, 0);
          }
          else if(val >= S4)
          {
             Output_bit(LED1, 1);
             Output_bit(LED2, 1);
             Output_bit(LED3, 1);
             Output_bit(LED4, 1);
          }
          else
          {
             Output_bit(LED1, 0);
             Output_bit(LED2, 1);
             Output_bit(LED3, 1);
             Output_bit(LED4, 0);
          }
    
    
    }

    Seconde petite question, pour qu'une conversion AD s'effectue, il faut combien de temps ? 20µs ? c'est le temps que prend la fonction read_adc( ou alors, c'est le temps qu'il faut attendre après l'appel de cette fonction avant de lire le résultat ?

    Bonne soirée

    -----

  2. Publicité
  3. #2
    black templar

    Re : Problème PIC16F

    voila, j'ai mis le schéma électronique du montage.
    désolé, je n'ai pas de logiciel spécialisé, je l'ai fait sous paint

    Merci à vous !
    Images attachées Images attachées

  4. #3
    vincent66

    Re : Problème PIC16F

    Bonsoir
    Sur le schéma ne figure pas de condo de découplage sur l'alim du PIC.
    Avec des LEDs branchées directement sur des sorties, il me semble possible qu'une foi toutes allumées l'appel de courant ne déclenche le reset du dispositif intégré de contrôle de la tension d'alim...
    Je programme en assembleur et ne suis pas en mesure de débuguer du C...
    Cordialement !
    Vincent

  5. #4
    black templar

    Re : Problème PIC16F

    Bonsoir

    Merci vincent pour ta réponse.
    Mon alimentation provient d'un port USB.

    J'ai rajouté un condo de filtrage de 100µF pour être sûr et j'ai mis des résistances de 1.2K au lieu de 330 Ohm en série avec mes diodes. (mais normalement, une pin peut délivrer 20mA, donc même avec les 330, ça devrait être bon ...)

    Le problème reste le même malheuresement...

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

    Re : Problème PIC16F

    Salut,

    Sur ton schéma tu ne fais pas apparaître la résistance de 10k entre le 5V et la patte 1 du µC (MCLR). Le problème pourrait peut être venir de là.
    Tu à l'air d'utiliser comme compilateur CCS Compiler.

    Clém.

  8. #6
    Mickl1722

    Re : Problème PIC16F

    Citation Envoyé par tahiticecil Voir le message
    Salut,

    Sur ton schéma tu ne fais pas apparaître la résistance de 10k entre le 5V et la patte 1 du µC (MCLR). Le problème pourrait peut être venir de là.
    Tu à l'air d'utiliser comme compilateur CCS Compiler.

    Clém.
    Moi, en projet, nous avons rajouté un condensateur au bornes de l'alimentation de la pic, et un autre en parallèle du quartz, pour limiter les pic de courant qui entraîne un reset du programme.
    N'oubli pas de mettre ton /(MCLR) au 5V (ou MCLR au 0V) sinon il risque d'y avoir des erreurs dans ton programme.

  9. Publicité
  10. #7
    gedonet

    Re : Problème PIC16F

    Bonjour
    Je ne vois pas de BODEN_OFF dans ta config, si BODEN est activé, et que la tension descent en dessous de 4V pendant plus de 100µs il y a un "Brown-out Reset" et normalement le 5V USB, sans negociation, est limité à 100mA, un appel de courant dont parle vincent66 pourrait te causer ce probleme.
    Je ne programme pas en c, mais comme tu dis être debutant, il faudrait verifier que le programme se reboucle correctement et qu'il ne parte pas, dans certain cas, vers une adresse non programmée, sinon il parcourt toute la memmoire flash et revient en 0x00, c'est un reset et c'est pas simple à reperer.
    Gilles

  11. #8
    black templar

    Re : Problème PIC16F

    Merci
    J'ai essayé un peu tout ce que vous m'avez dit et ça marche maintenant !!
    C'était bien un problème de config du PIC !

    J'ai rajouter le NOBROWNOUT

    #fuses HS,NOPROTECT,NOWDT,NOLVP,NOBRO WNOUT


    J'ai pas ma appris grâce à vous Je vous remercie
    ++

Discussions similaires

  1. Audio pic16f....
    Par NessaVi dans le forum Électronique
    Réponses: 1
    Dernier message: 05/03/2009, 11h04
  2. Horloge à PIC16F
    Par nainpiain dans le forum Électronique
    Réponses: 32
    Dernier message: 08/02/2009, 20h38
  3. Problème interruption sur PIC16F
    Par jolindien dans le forum Électronique
    Réponses: 7
    Dernier message: 21/01/2009, 18h26
  4. Probleme d'affichage LCD avec PIC16F
    Par KaLas dans le forum Électronique
    Réponses: 2
    Dernier message: 08/11/2005, 19h17
  5. Quartz d1 PIC16F & MCP2510
    Par Blacky dans le forum Électronique
    Réponses: 4
    Dernier message: 10/02/2004, 18h48
Découvrez nos comparatifs produits sur l'informatique et les technologies.