Partage
  • Partager sur Facebook
  • Partager sur Twitter

Multiplexeur 74HC4067, conflit entre les canaux

Sujet résolu
    30 novembre 2021 à 15:07:24

    Bonjour,

    Je travaille actuellement sur un Arduino Zero avec un multiplexeur 74HC4067 et je rencontre des incohérences lors des tests sur certains des canaux.

    Ma classe est la suivante (elle doit être fonctionnelle pour des multiplexeurs 8 ou 16 canaux).

    Multiplexer.h :

    #ifndef Multiplexer_h
    #define Multiplexer_h
    
    #include "Arduino.h"
    
    
    class Mux
    {
      public:
        Mux(uint8_t numberOfChannels, byte sigPin, byte adress1, byte adress2, byte adress3, byte adress4 = 0);
    
        uint8_t muxRead(byte pin);//Read specific mux pin
        void selectMuxPin(byte pin);
    
      private:
        uint8_t m_numberOfChannels;
        byte m_sigPin ;
        byte m_adress1 ;
        byte m_adress2 ;
        byte m_adress3 ;
        byte m_adress4 ;
        uint8_t m_numberOfAdressPins;
    };
    
    #endif

    Multiplexer.cpp :

    #include "Multiplexer.h"
    
    //**************************************************************    
    
    Mux::Mux(uint8_t numberOfChannels,
             byte sigPin, 
             byte adress1, 
             byte adress2, 
             byte adress3, 
             byte adress4) 
    
    :   m_numberOfChannels(numberOfChannels),
        m_sigPin(sigPin),
        m_adress1(adress1),
        m_adress2(adress2),
        m_adress3(adress3),
        m_adress4(adress4)
    {
      if(m_numberOfChannels > 8) {m_numberOfAdressPins = 4;}
      else {m_numberOfAdressPins = 3;}
    
      //Set adresses to OUTPUT
      pinMode(m_adress1, OUTPUT);
      pinMode(m_adress2, OUTPUT);
      pinMode(m_adress3, OUTPUT);
      if(m_numberOfChannels > 8){pinMode(m_adress4, OUTPUT);};
    
      //Set adresses to LOW
      digitalWrite(m_adress1, LOW);
      digitalWrite(m_adress2, LOW);
      digitalWrite(m_adress3, LOW);
      if(m_numberOfChannels > 8){digitalWrite(m_adress4, LOW);};
      
      pinMode(m_sigPin, INPUT_PULLUP);
    }
    
    //**************************************************************
    
    uint8_t Mux::muxRead(byte pin)
    {
      selectMuxPin(pin);
      bool value = digitalRead(m_sigPin);
      return(value) ;
    }
    
    void Mux::selectMuxPin(byte pin)
    { 
      const int selectPins[4] = {m_adress1, m_adress2, m_adress3, m_adress4};
      if (pin > (m_numberOfChannels - 1)) return; // Exit if pin is out of scope
      
      for (int i = 0; i < m_numberOfAdressPins; i++)
      {
        if (pin & (1<<i)) {digitalWrite(selectPins[i], HIGH);}
        else {digitalWrite(selectPins[i], LOW);}
      }
    }

    Pour réaliser mes tests sur le 74HC4067, je connecte mon multiplexeur, je mets la pin 8 de mon Arduino à l'état "LOW" et à l'aide d'un jumper je test chacune des pins via le code suivant :

    #include "Multiplexer.h"
    
    //**************************************************************
    
    Mux Mux0(16, 6, 2, 3, 4, 5);
    
    //**************************************************************
    
    void setup() {
      Serial.begin(115200);
    }
    
    //**************************************************************
    
    void loop() {
    
      //Set pin 8 to LOW for the test with a jumper
      analogWrite(8, LOW);
    
      //For this test, we print the name of the multiplexer's channel if it's LOW
    
      bool channel0 = Mux0.muxRead(0);
      if(!channel0)
        Serial.println("Channel 0");
    
      bool channel1 = Mux0.muxRead(1);
      if(!channel1)
        Serial.println("Channel 1");
    
      bool channel2 = Mux0.muxRead(2);
      if(!channel2)
        Serial.println("Channel 2");
    
      bool channel3 = Mux0.muxRead(3);
      if(!channel3)
        Serial.println("Channel 3");
    
      bool channel4 = Mux0.muxRead(4);
      if(!channel4)
        Serial.println("Channel 4");
    
      bool channel5 = Mux0.muxRead(5);
      if(!channel5)
        Serial.println("Channel 5");
    
      bool channel6 = Mux0.muxRead(6);
      if(!channel6)
        Serial.println("Channel 6");
    
      bool channel7 = Mux0.muxRead(7);
      if(!channel7)
        Serial.println("Channel 7");
    
      bool channel8 = Mux0.muxRead(8);
        if(!channel8)
        Serial.println("Channel 8");
    
      bool channel9 = Mux0.muxRead(9);
      if(!channel9)
        Serial.println("Channel 9");
    
      bool channel10 = Mux0.muxRead(10);
      if(!channel10)
        Serial.println("Channel 10");
    
      bool channel11 = Mux0.muxRead(11);
      if(!channel11)
        Serial.println("Channel 11");
    
      bool channel12 = Mux0.muxRead(12);
      if(!channel12)
        Serial.println("Channel 12");
    
      bool channel13 = Mux0.muxRead(13);
      if(!channel13)
        Serial.println("Channel 13");
    
      bool channel14 = Mux0.muxRead(14);
      if(!channel14)
        Serial.println("Channel 14");
    
      bool channel15 = Mux0.muxRead(15);
      if(!channel15)
        Serial.println("Channel 15");
    }



    Pour la plupart des canaux cela fonctionne plutôt bien. Lorsque je connecte le jumper (pin 8) à un canal du multiplexer, le nom de la pin correspondante s'affiche dans la console.

    Cependant deux canaux posent problème. Le canal 0 et le canal 8. Peu importe que je connecte le jumper sur l'un ou sur l'autre, je vois s'afficher à chaque fois dans la console "Channel 0" et "Channel 8" comme si les deux étaient connectés et que le changement d'état de l'un engendrait le changement d'état de l'autre.

    Une idée de la raison ?

    Merci

    -
    Edité par Fanch JMR 30 novembre 2021 à 16:25:56

    • Partager sur Facebook
    • Partager sur Twitter
      1 décembre 2021 à 0:12:58

      C'est tres difficile de repondre, parce que le comportement depend pas mal du coté electronique. C'est pas forcément un probleme dans le code mais le code qui peut ne pas correspondre a l'electronique.
      • Partager sur Facebook
      • Partager sur Twitter

      Rejoignez le discord NaN pour discuter programmation.

        2 décembre 2021 à 8:38:39

        Pour ce qui est du code, une boucle ne serait pas déconseillée.
        • Partager sur Facebook
        • Partager sur Twitter
          7 décembre 2021 à 17:15:11

          @gbdrivers : 

          effectivement après pas mal de tests et de recherches je pense que le problème vient du hardware et non du software... Je prototype avec des multiplexeurs CMS que j'achète déjà soudés sur des petits circuits imprimés. Il doit y avoir un souci dans la conception du circuit imprimé qui génère des interférences entre la piste du channel 0 et du channel 8... 

          @michelbillaud :

          Il s'agit d'un code test que je n'ai pas l'intention de réutiliser. L'objectif est de pouvoir travailler indépendamment sur chaque channel, ce q'une boucle ne me permet pas.

          • Partager sur Facebook
          • Partager sur Twitter
            10 décembre 2021 à 10:52:40

            J'ai réalisé des tests complémentaires avec le même composant mais proposé par un autre fournisseur et ça fonctionne parfaitement. Le problème venait donc bien du hardware.
            • Partager sur Facebook
            • Partager sur Twitter
              10 décembre 2021 à 12:28:16

              Fanch JMR a écrit:

              @michelbillaud :

              Il s'agit d'un code test que je n'ai pas l'intention de réutiliser. L'objectif est de pouvoir travailler indépendamment sur chaque channel, ce q'une boucle ne me permet pas.

              Il s'agissait juste de ne pas perdre de temps avec 15 copier-coller-modifier manuels, perte de temps et cause d'erreurs stupides :

              bool channel[16];
              
              for (int i=0; i < 15; i++) {
                channel[i] = Mux0.muxRead(i);
                if (!channel[i]) {
                  Serial.print("Channel ");
                  Serial.println(i);
                }
              }

              Dans les tests, on a déjà suffisamment de problèmes pour ne pas s'en ajouter avec des histoires de faute de frappe.


              Personne ne voudrait tester du hardware avec un appareil de mesure bricolé vite fait jamais essayé avant ?

              -
              Edité par michelbillaud 10 décembre 2021 à 13:16:57

              • Partager sur Facebook
              • Partager sur Twitter

              Multiplexeur 74HC4067, conflit entre les canaux

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              • Editeur
              • Markdown