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

2,5 V sur l'input d'un PIC ???



  1. #1
    Voltron

    Unhappy 2,5 V sur l'input d'un PIC ???


    ------

    salut,

    je commande avec un PIC 16F877 avec un clavier 20 touches via l'encodeur 74C923 (à travers 4 pins), RB4,RB5,RB6 et RB7,
    comme première étape, j'ai testé mon encodeur (sans relier ses pin de sorties au pic !!! )qui lorseque j'appuie sur une touche du clavier (par exemple celle situé à la 2ème ligne,3ème colonne), me donne le code binaire correspondand à sa sortie (0110) qui en pratique , 5 Volts sur ces pins 16 et 17 et 0 Volt sur les pins 15, 18 et 19 !!,pour toutes les touches du clavier, l'encodeur a fonctionné correctement en donnant le code exacte pour chaque touche!!

    dans la 2ème étape, j'ai relié les pins 15-->19 au pic et j'ai refait le test précédant !!, gros problème , lorseque j'appuie sur une touche qui dans le code binaire dépasse 00011, cad qu'elle sollicite les pin 16 et 17, j'ai toujours au alentours de 2,5 V sur ces pins, même si la pin n'est pas mise à 5 Volts (comme c le cas pour 00111), j'ai 5V, sur 19 et 18 (c'est bon), et 2,5 sur 17 et 16 !!!

    Rque:
    pin 16 (DATA OUT D) est rélié a RB7
    pin 17 (DATA OUT C) est relié à RB6


    je pense que dans ce cas en plus de l'erreur dans le codage, le pic ne va pas savoir si le 2,5 volts correspond à 0 ou à 5 V ?

    d'après vous c'est quoi la cause de mon problème ?

    pour mieux comprendre voici le datasheet du 74C923 : http://www.datasheetcatalog.com/data...9/74C923.shtml

    NB: sur ISIS la simulation a pourtant bien fonctionner sur l'encodeur 74C922 relié à un clavier 16 touches !


    voici le code du programme du PIC :
    Code:
    #include <16F877a.h>
    //#device adc=8
    #use delay(clock=4000000)
    #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7)
    
    
    
    #define DEM1      PIN_A0
    #define DEM2      PIN_A1   // pin reliée au démultiplexeur
    #define DEM3      PIN_A2
    #define DEM4      PIN_A3
    #define A4        PIN_A4
    #define A5        PIN_A5
    
    #define TIS       PIN_E0  // pin relié au relais de choix Temp/Isol pour Simplexe
    #define TID       PIN_E1  // pin relié au relais de choix Temp/Isol pour Duplexe
    #define CTD       PIN_E2  // pin relié au relais de choix test de température C1/C2 pour Duplexe
    
    #define R1        PIN_C0  // pin reliée au  relais 1 via l'étage de puissance
    #define R2        PIN_C1  // pin reliée au  relais 2 via l'étage de puissance
    #define R3        PIN_C2  // pin reliée au  relais 3 via l'étage de puissance
    #define R4        PIN_C3  // pin reliée au  relais 4 via l'étage de puissance
    #define LED_isol  PIN_C4  // pin reliée a une LED qui indique que le test en cours est un test d'isolement
    #define LED_temp  PIN_C5
    #define C6        PIN_C6
    #define C7        PIN_C7
    
    
    #define D0        PIN_D0
    #define D1        PIN_D1
    #define D2        PIN_D2
    #define D3        PIN_D3
    #define D4        PIN_D4   //  pin du PIC relié au Décodeur (affichage)
    #define D5        PIN_D5
    #define SIM       PIN_D6
    #define DUP       PIN_D7
    
    #define B0        PIN_B0
    #define B1        PIN_B1
    #define B2        PIN_B2
    #define B3        PIN_B3
    #define B4        PIN_B4   //  pin du PIC relié au Décodeur (affichage)
    #define B5        PIN_B5
    #define B6        PIN_B6
    #define B7        PIN_B7
    
    
    int simpl, dupl, isol, temp ;
    
    
    
    
    void choix_et_affich_isol(byte encodeur)  // cette fonction lorsequ'elle est exécuté fait éteindre la LED d'isolement, pkoi  ???!, port c ?
    
    {
    if (isol==1)
    
     {
    
    
      switch (encodeur)
       {
    
    case (0x04) :   // test d'isolement C1m
    
         {
         output_c(0X19) ;   //printf("maintenant test d'isolement C1m") ;
         output_d(0X01) ;
         break;
         }
    
    
    case (0x05) :  // test d'isolement C1M
    
         {
         output_c(0X11) ;
         output_d(0X02) ;
    
         break;
         }
    
    
    
    case (0x06) :  // test d'isolement mM
    
          {
          output_c(0X18) ;
          output_d(0X03) ;
          break;
          }
    
    
    case (0x07) :  // test d'isolement C2m
    
          {
          output_c(0X1A) ;
          output_d(0X04) ;
          break;
          }
    
       }
    
     }
    
    }
    
    
    
    
    
    void reset(byte encodeur)
    
    {
    
     if ( (encodeur==0x00) || (encodeur==0x01) )
      {
        simpl=0 ;
        dupl=0;
        isol=0;
        temp=0;
        output_low(LED_isol);
        output_low(LED_temp);
        output_low(TIS);
        output_low(TID);
        output_low(CTD);
        output_a(0x00);
      }
    
    }
    
    
    
    
    
    
    
    void choix_simplex_duplex(byte encodeur)  // cette fonction est rebouclé tout le temps , on peut passer entre les deux boutons en traversant le programme sans alterer le reste car le main est un ensemble de fonction avec des case et si aucune n'est validé , on retourne a la fonction du début qui est choix simplex/duplex
    {
    
    reset(encodeur);  // cette fonction n'est exécutée que si le dernier bouton appuyé est SIMPL ou DUPL --> il ya pas donc de risque d'une reset en boucle
               // même si on ne touche pas à un bouton (après avoir appuyé sur SIMPL ou DUPL ) la fonction reset() est exécutée ( car elle est à l'intérieur d'une boucle) .
    
      switch (encodeur) {
    
    
    
     case (0x00) :  // bouton simplexe
    {
    //reset(encodeur);
    
    output_high(SIM) ;  // c temporaire, juste pour visualiser
      simpl=1;
      dupl=0;
      break;
    }
    
     case  (0x01) : // bouton duplexe
    {
    //reset(encodeur);
    output_high(DUP) ;
      dupl=1;
      simpl=0;
      break;}
    
      }
    }
    
    
    void  choix_isol_temp(byte  encodeur)
    
    {
    
    switch (encodeur)
    
     {
    
    
     case (0X02) :  // bouton isolement appuyé
    
       {
       output_c(0x10) ;      // LED d'isolement allumée
          // output_high(LED_isol) ;
          // output_low(LED_temp) ;
    
      isol=1;
      temp=0;
    
       if (simpl==1)
           {
          // output_low(TIS) ;
          output_e(0x0) ;         // passer d'un eventuel test en Temp
           }
    
    
       if (dupl==1)
           { // output_low(TID) ;
             output_e(0x0) ;         // passer d'un eventuel test en Temp
           }
    
       break;
    
        }
    
     case (0X03) :    // bouton temperature appuyé
        {
    
        output_c(0x20) ;   // c bon, ca n'affecte pas la commande des 4 relais et la LED reste allumé pendant la sélection de voies.
           //output_low(LED_isol) ;
           //output_high(LED_temp) ;
    
      isol=0;
      temp=1;
    
    
      if (simpl==1)
         { // output_high(TIS) ;
            output_e(0x01) ;   // passer à un test en Temp
         }
    
      if (dupl==1)
         { // output_high(TID) ;
           output_e(0x02) ;     // passer à un test en Temp
         }
    
       break;
        }
     }
    
    }
    
    void select_voie(byte encodeur)
    
    {
     if (simpl==1) {
    
      switch (encodeur) {
     case (0x08)  :             {
    
    output_a(0x00) ;
    
    break; }
    
     case  (0b00001001)  :  //     0b00001101 : // voie 2, simplexe
    
        {
    output_a(0x01) ;
    
    break; }
    
     case (0b00001010) : //   0b00001110 : // voie 3, simplexe
    
        {
    
    output_a(0x02) ;
    
    break; }
    
     case (0b00001011) : // voie 4, simplexe
    
        {
    output_a(0x03) ;
    break; }
    
     case (0b00001100) : // voie 5, simplexe
    
        {
    output_a(0x04) ;
    break;}
    
     case (0b00001101) : // voie 6, simplexe
     
        {
    
    output_a(0x05) ;
    
    break; }
    
     case (0b00001110) : // voie 7, simplexe
    
        {
    
    output_a(0x06) ;
    
    break; }
    
     case (0b00001111) : // voie 8, simplexe
    
        {
    
    output_a(0x07) ;
    
    break; }
    
    } // fin pour switch
    
         } // pour if
    
    
         if (dupl==1) {
    
     switch (encodeur) {
    
     case (0b00001000) : // voie 1, duplexe
     
        {
    output_a(0x08) ;
    
    break; }
    
     case (0b00001001) : // voie 2, duplexe
    
        {
    
    output_a(0x09) ;
    
    break;  }
    
     case (0b00001010) : // voie 3, duplexe
    
        {
    
    output_a(0x0a) ;
    
    break; }
    
     case (0b00001011) : // voie 4, duplexe
    
        {
    
    output_a(0x0b) ;
    
    break; }
    
     case (0b00001100) : // voie 5, duplexe
    
        {
    
    output_a(0x0c) ;
    
    break; }
    
     case (0b00001101) : // voie 6, duplexe
     
        {
    
    output_a(0x0d) ;
    
    break; }
    
     case (0b00001110) : // voie 7, duplexe
    
        {
    
    output_a(0x0e) ;
    
    break; }
    
     case (0b00001111) : // voie 8, duplexe
    
        {
    
    output_a(0x0f) ;
    
    break; }
    
      }  // fin pour switch
    
     }  //fin pour if
    
    }
    
    
    
    byte  encodeur;
    
    void main()
    {
    
       setup_adc_ports(NO_ANALOGS);
       setup_adc(ADC_OFF);  // convertisseur ana/num désactivé !
       set_tris_a(0) ;
       set_tris_c(0) ;
       set_tris_d(0) ;
       set_tris_e(0) ;
    
    // set_tris_b(1) ;
    
     output_d(0)   ;
     output_c(0)   ;
    
    
    encodeur=input_b() >> 4 ;  // même princie en nput ??
    
    
    output_low(LED_isol) ; // LED éteinte
    output_low(LED_temp) ;
    
    
    while (1)
       {
    
    encodeur=input_b() >> 4 ;
    
    choix_simplex_duplex(encodeur) ;
    
    choix_isol_temp(encodeur) ;
    
    choix_et_affich_isol(encodeur) ;
    
    select_voie(encodeur);
    
    
       }
    
    }

    -----
    Dernière modification par Voltron ; 06/09/2007 à 01h36.

  2. Publicité
  3. 📣 Nouveau projet éditorial de Futura
    🔥🧠 Le Mag Futura est lancé, découvrez notre 1er magazine papier

    Une belle revue de plus de 200 pages et 4 dossiers scientifiques pour tout comprendre à la science qui fera le futur. Nous avons besoin de vous 🙏 pour nous aider à le lancer...

    👉 Je découvre le projet

    Quatre questions à explorer en 2022 :
    → Quels mystères nous cache encore la Lune 🌙 ?
    → Pourra-t-on bientôt tout guérir grâce aux gènes 👩‍⚕️?
    → Comment nourrir le monde sans le détruire 🌍 ?
    → L’intelligence artificielle peut-elle devenir vraiment intelligente 🤖 ?
  4. #2
    DAUDET78

    Re : 2,5 V sur l'input d'un PIC ???

    J'y connais rien en PIC, mais c'est typique d'un conflit entre ton entrée externe et ta patte de PIC qui est resté en Output. Règle ce problème et ensuite tu auras un beau 5V que ton PIC lira avec voluptuosité !
    J'aime pas le Grec

  5. #3
    invite_P89
    Invité

    Re : 2,5 V sur l'input d'un PIC ???

    LU
    pour mettre ton port B en entrée IL faut TRISB=1
    pour mettre ton port D en entrée Il faut TRISD=1
    a bientôt

  6. #4
    invite_P89
    Invité

    Re : 2,5 V sur l'input d'un PIC ???

    RELU
    pas vu desolé sorties decodeur sur port A
    fait attention A4 est a drain OUVERT donc resistance sur ce port si tu utilise A4

  7. A voir en vidéo sur Futura
  8. #5
    invite_P89
    Invité

    Re : 2,5 V sur l'input d'un PIC ???

    Citation Envoyé par Voltron Voir le message
    salut,

    je commande avec un PIC 16F877 avec un clavier 20 touches via l'encodeur 74C923 (à travers 4 pins), RB4,RB5,RB6 et RB7,

    ici tu nous dit que ton decodeur est sur PORT B
    puis apres c'est le port A qui gere le decodeur on sait plus regarde de ce coté
    ou est ton decodeur sur quel port,ce port est-il en entré moi je ne sais plus

    a bientôt

  9. #6
    freepicbasic

    Re : 2,5 V sur l'input d'un PIC ???

    2,5V sera lu comme un 5V c'est à dire 1.
    Il semblerait qu'il y ai un mauvais cablage 2,5V signifie qu'il y a 2 résistances égales 1 au + 1 au moins, ou comme disait Daudet78 2 sorties en conflit l'une à 0 l'autre a 1.

    Sur le bout de code on ne voit pas la partie scan ou autre ,
    donc on ne peut pas savoir s'il y a un bug,
    mais c'est plutôt un problème de câblage, un bug ne peut pas faire du 2,5V.
    A+, pat

  10. Publicité
  11. #7
    Voltron

    Re : 2,5 V sur l'input d'un PIC ???

    Citation Envoyé par DAUDET78 Voir le message
    J'y connais rien en PIC, mais c'est typique d'un conflit entre ton entrée externe et ta patte de PIC qui est resté en Output. Règle ce problème et ensuite tu auras un beau 5V que ton PIC lira avec voluptuosité !
    Salut,

    salut DAUDET,

    les ports B du PIC sont déjà configuré en input ?, la preuve c'est que le PIC a capté le signal issues de l'encodeur sur RB4 et RB5 !

  12. #8
    Voltron

    Talking Re : 2,5 V sur l'input d'un PIC ???

    Citation Envoyé par Pom26 Voir le message
    ici tu nous dit que ton decodeur est sur PORT B
    puis apres c'est le port A qui gere le decodeur on sait plus regarde de ce coté
    ou est ton decodeur sur quel port,ce port est-il en entré moi je ne sais plus

    a bientôt
    salut Pom26,

    il s'agit d'une erreur dans le commentaire que j'ai oublié de supprimer !
    , ce sont uniquement les pins B (RB3-->RB7) qui gèrent l'encodeur !

  13. #9
    Voltron

    Re : 2,5 V sur l'input d'un PIC ???

    Citation Envoyé par freepicbasic Voir le message
    2,5V sera lu comme un 5V c'est à dire 1.
    Il semblerait qu'il y ai un mauvais cablage 2,5V signifie qu'il y a 2 résistances égales 1 au + 1 au moins, ou comme disait Daudet78 2 sorties en conflit l'une à 0 l'autre a 1.

    Sur le bout de code on ne voit pas la partie scan ou autre ,
    donc on ne peut pas savoir s'il y a un bug,
    mais c'est plutôt un problème de câblage, un bug ne peut pas faire du 2,5V.

    salut freepicbasic,

    j'ai vérifié le cablage et le code et il me semble qu'il sont correctes !

  14. #10
    DAUDET78

    Re : 2,5 V sur l'input d'un PIC ???

    Faut être réaliste :
    1/ Ton encodeur marche si il est seul et à un Vout de 5V
    2/ ton niveau logique sur la broche du PIC passe à 2,5V si tu branches ton encodeur

    Donc il y a un conflit, tu trouvera jamais la cause du problème si tu parts du principe que ton soft est bon et que ton hard est bon.

    Un simple test. Fait un pont diviseur 5V__1K__1K__0V
    Et place le point milieu sur la patte de ton PIC (sans l'encodeur).
    1/ Tu mesures 5V ou 0V sur la patte, elle est en sortie
    2/ Tu mesures 2,5V , elle est en entrée
    (mesure à faire à l'oscilloscope de préférence)
    J'aime pas le Grec

  15. #11
    Voltron

    Re : 2,5 V sur l'input d'un PIC ???

    Citation Envoyé par DAUDET78 Voir le message
    Faut être réaliste :
    1/ Ton encodeur marche si il est seul et à un Vout de 5V
    2/ ton niveau logique sur la broche du PIC passe à 2,5V si tu branches ton encodeur

    Donc il y a un conflit, tu trouvera jamais la cause du problème si tu parts du principe que ton soft est bon et que ton hard est bon.

    Un simple test. Fait un pont diviseur 5V__1K__1K__0V
    Et place le point milieu sur la patte de ton PIC (sans l'encodeur).
    1/ Tu mesures 5V ou 0V sur la patte, elle est en sortie
    2/ Tu mesures 2,5V , elle est en entrée
    (mesure à faire à l'oscilloscope de préférence)
    bien DAUDET, mais j'aurais toujours 2,5 V sur RB6 ou RB7 dans ce cas !, car avec ce montage j'impose la tension au pin du PIC, qu'il soit configuré en entrée ou en sortie !?

    t'en dis quoi ?


  16. #12
    DAUDET78

    Re : 2,5 V sur l'input d'un PIC ???

    Citation Envoyé par Voltron Voir le message
    bien DAUDET, mais j'aurais toujours 2,5 V sur RB6 ou RB7 dans ce cas !, car avec ce montage j'impose la tension au pin du PIC, qu'il soit configuré en entrée ou en sortie !?
    Si ton PIC est en sortie j'impose une tension de sortie de 2,5v à ton PIC Mais avec un courant max de 5 mA. Si ton PIC est en sortie, c'est lui qui impose sa tension (je crois qu'il peut driver 25 mA).

    Avant de discuter, fait la manip et on regarde les résultats !
    J'aime pas le Grec

  17. Publicité
  18. #13
    Voltron

    Re : 2,5 V sur l'input d'un PIC ???

    Citation Envoyé par DAUDET78 Voir le message
    Avant de discuter, fait la manip et on regarde les résultats !
    OK !!

  19. #14
    cranor

    Re : 2,5 V sur l'input d'un PIC ???

    Citation Envoyé par Pom26 Voir le message
    LU
    pour mettre ton port B en entrée IL faut TRISB=1
    pour mettre ton port D en entrée Il faut TRISD=1
    a bientôt
    ça mettra uniquement la premiere broche de chaque port en entrée..

    TRISB(ou D)=255 (ou 0xFF) pour toutes les broches

  20. #15
    RISC

    Re : 2,5 V sur l'input d'un PIC ???

    Citation Envoyé par Voltron Voir le message
    je pense que dans ce cas en plus de l'erreur dans le codage, le pic ne va pas savoir si le 2,5 volts correspond à 0 ou à 5 V ?
    Salut pour les microcontroleurs et autres circuits logiques, les 0 et 1 logiques correspondent à des plages de tensions qui dépendent de la tension d'alimentation.
    Pour le PIC16F877, voir la documentation page 155 paramètres VIL et VIH :
    http://ww1.microchip.com/downloads/e...Doc/30292c.pdf

    Un 0 logique (VIL) doit être compris entre 0 et 0.15Vdd
    Un 1 logique (VIH) doit être compris entre 0.25Vdd+0.8V et Vdd .

    Donc en gros de 0 à 0.8V c'est compris en entrée comme un 0 et de 2V à 5V comme un 1.
    Ton 2.5V sera donc vu comme un 1 (si ton alimentation est de 5V).

    A+

  21. #16
    cranor

    Re : 2,5 V sur l'input d'un PIC ???

    Les seuils limites des niveaux logiques sont fixés par les technologies
    utilisées dans les triggers de schmitt (voir caractéristiques : TTL, CMOS,...)
    qui se trouvent sur les entrées/sorties et ça peut changer sur chaque
    microcontroleur (dépend de l'architecture interne du µC => toujours regarder le datasheet).

  22. #17
    DAUDET78

    Re : 2,5 V sur l'input d'un PIC ???

    Citation Envoyé par RISC Voir le message
    Ton 2.5V sera donc vu comme un 1 (si ton alimentation est de 5V).
    Oui, mais c'est se cacher un gros problème. Si la sortie (niveau TTL) de son décodeur de clavier s'écroule à 2,5V, c'est qu'il y a un conflit entre le PIC et le décodeur. Il faut résoudre ce problème de configuration qui n'est pas une situation normale
    J'aime pas le Grec

  23. #18
    cranor

    Re : 2,5 V sur l'input d'un PIC ???

    Comme je l'ai dit plus haut:

    "Il faut mettre TRISB et TRISD à 255 pour configurer toutes les broches d'un port en entrée."

    Je détaille un peu:

    Il faut mettre à un le bit du registre TRIS[lettre du port] correspondant
    à la broche à configurer en entrée (et à 0 ceux à configurer en sortie):

    Donc pour configurer toutes les broches d'un port en entrée:
    en binaire on a b'1111 1111', ce qui donne 0xFF en hexa, et 255 en décimal.

    Pour configurer les 4 premieres broches en entrée et les 4 dernières en sortie:
    TRIS[lettre du port]=15; [= 0000 1111 en binaire, 0x0F en hexa]

    Une fois configurée en entrée, les broches seront en haute impédance,
    donc il n'y aura pas de chute de tension ( cad, impossible d'avoir 2,5volts
    en branchant du 5volts sur la broche)

    CQFD.


    PS: Avec ton programme ça ne semble pas etre le cas, mais il y a un autre
    cas où tu peux mesurer 2.5volts au multimètre.. c'est le cas où la moyenne
    de ta tension est 2.5v, c'est à dire que t'as des 0 et 1 en alternance avec
    un temps identique entre les transitions de 0 à 1 et 1 à 0. (si 0="0v", 1="5v")
    (Le multimètre "voit" une moyenne)
    Sinon => utiliser oscilloscope, mode trigger single shot sur front montant ou descendant
    pour visualiser le signal.

  24. Publicité
  25. #19
    invite_P89
    Invité

    Re : 2,5 V sur l'input d'un PIC ???

    LU

    peut-être pas assez de jus sortie décodeur
    mettre des buffers regarde datasheet du 877 et celui du decodeur
    a mon avis il te manque un peu de I

    a bientôt

  26. #20
    DAUDET78

    Re : 2,5 V sur l'input d'un PIC ???

    Citation Envoyé par Pom26 Voir le message
    peut-être pas assez de jus sortie décodeur
    Une sortie de circuit CMOS n'a aucun problème pour attaquer un PIC configuré en entrée
    J'aime pas le Grec

  27. #21
    invite_P89
    Invité

    Re : 2,5 V sur l'input d'un PIC ???

    daudet je peut ne tromper mais il faut 50µA alors que sur le decodeur IL sort 1µA
    ou alors j'ai mal vu sur la doc

  28. #22
    invite_P89
    Invité

    Re : 2,5 V sur l'input d'un PIC ???

    erreur décodeur 10µA

  29. #23
    DAUDET78

    Re : 2,5 V sur l'input d'un PIC ???

    Le 74C923 est capabe d'absorber 360µA au niveau haut ou au niveau bas, ce qui est beaucoup plus que le courant en entrée d'un PIC sans PullUp
    Alors effectivement, il faut vérifier que le PIC n'a pas ses PullUp activés
    J'aime pas le Grec

  30. #24
    invite_P89
    Invité

    Re : 2,5 V sur l'input d'un PIC ???

    ou change de PORT
    a bientôt

  31. Publicité

Discussions similaires

  1. erreur 0X00 programmation PIC plus questions sur les PIC
    Par ROTT dans le forum Électronique
    Réponses: 4
    Dernier message: 22/07/2007, 15h36
  2. autour d'un PIC!?
    Par jim@ dans le forum Électronique
    Réponses: 7
    Dernier message: 04/07/2007, 18h34
  3. Fort courent sur uen entrée d'un PIC
    Par Djludo dans le forum Électronique
    Réponses: 10
    Dernier message: 23/05/2007, 22h26
  4. Aide sur les variables d'un PIC
    Par Acidmaster dans le forum Électronique
    Réponses: 4
    Dernier message: 12/06/2006, 19h17
  5. Réponses: 24
    Dernier message: 11/05/2006, 15h07
Découvrez nos comparatifs produits sur l'informatique et les technologies.