Partage
  • Partager sur Facebook
  • Partager sur Twitter

MCP4261 et Arduino

Sujet résolu
    13 août 2013 à 17:40:30

    Bonjour,

    J'ai un petit problème avec le MCP4261 (double potentiomètre électronique), j'arrive à faire fonctionner le premier, mais le deuxième reste désactivé...

    Je suppose qu'il faut changer un bit dans ceux que l'on envoie au CI pour l'activer, mais je n'arrive pas à déterminer lequel, et la datasheet m'embrouille...

    Voici le code en question :

        //
        //
        //   Test programme for MCP4261 using SPI
        //
        //
    
        #include <SPI.h>
        #include <Serial.h>
    
        #define SS_PIN 10
        #define MOSI_PIN 11
        #define MISO_PIN 12
        #define CLK_PIN 13
    
        // Command defines for Pot  0
    
        #define W_CMD B00000000
        #define R_CMD B00001100
    
        void rWrite(byte val);
        byte rRead();
    
        int i, r;
    
        void setup()
        {
          pinMode(SS_PIN, OUTPUT);
          pinMode(MOSI_PIN, OUTPUT);
          pinMode(CLK_PIN, OUTPUT);
          pinMode(MISO_PIN, INPUT);
          digitalWrite(SS_PIN, HIGH);
          SPI.begin();
          SPCR = B01011100;
          Serial.begin(9600);
          Serial.println("Setup Complete");
          Serial.print("SPCR = ");
          Serial.println(SPCR, BIN);
          rWrite(0, 0);
          rWrite(1, 0);
        }
    
        void loop()
        {
          //*
          for(i=0; i<=256; i++)
          {
            rWrite(1, i);
            Serial.print("Wrote: ");
            Serial.print(i);
            r = rRead(1);
            Serial.print("\tRead: ");
            Serial.print(r);
            if(r != i)
              Serial.print("\t***");
            Serial.println();
            delay(100);
          }//*/
          /*
          for(i=0; i<=256; i++)
          {
            rWrite(0, i);
            delay(5);
          }
          for(i=0; i<=256; i++)
          {
            rWrite(1, i);
            delay(5);
          }
          for(i=256; i>=0; i--)
          {
            rWrite(0, i);
            delay(5);
          }
          for(i=256; i>=0; i--)
          {
            rWrite(1, i);
            delay(5);
          }//*/
        }
    
        void rWrite(int pot, unsigned int val)
        {
            int r1, r2; 
            int cmd = (pot<<12) | W_CMD;
            if(val>255)
              cmd |= ((val | 0x100)>>8);
            digitalWrite(SS_PIN, LOW);
            r1 = SPI.transfer(cmd);
            r2 = SPI.transfer(val);
            digitalWrite(SS_PIN, HIGH);
        }
    
        unsigned int rRead(int pot)
        {
            unsigned int wpos; 
            int r1, r2; 
            int cmd = (pot<<12) | R_CMD;
            digitalWrite(SS_PIN, LOW);
            r1 = SPI.transfer(R_CMD);
            r2 = SPI.transfer(0x00);
            digitalWrite(SS_PIN, HIGH);
            wpos = r2 +256 * (r1 & 0x01);
            return wpos;
        }
    

    Merci d'avance.

    • Partager sur Facebook
    • Partager sur Twitter
    2b||!2b   sqrt(4b²)
      15 août 2013 à 0:53:19

      Up !

      Je suppose qu'il faut modifier la ligne 17, me je n'arrive pas à voir quel bit fait quoi ...

      • Partager sur Facebook
      • Partager sur Twitter
      2b||!2b   sqrt(4b²)
        18 août 2013 à 20:52:10

        Je croit déjà avoir tout dit dans mon premier message non ?

        Ou alors je ne comprend pas la question ?

        • Partager sur Facebook
        • Partager sur Twitter
        2b||!2b   sqrt(4b²)
          19 août 2013 à 13:10:42

          ... J'avais la flemme de lire la datasheet hier ^^' c'est dingue comment je connais rien en électronique --"...

          Euh... a priori si je comprend bien t'essaye de faire monter puis descendre la résistance de chacun des deux potentiomètre les uns après les autres...

          => page 47 figure 7-1 ;)

          + p47 figure 7-2

           Tu veras que W_CMD doit être à 0x00000000 donc c'est bon... je pense que le bout de programme est correct pour faire marcher les deux pento ^^'

          val à envoyer : aaaa ccdd dddd dddd =>

          - a = adresse (sur 4 bit)
          - c = commande : 00 = écrire / 11 = lire
          - d = data , les registres étant des registres de 9 bits le Msb est ignoré (cf datasheet)

          Perso ce que je ferai c'est que je créerai ma propre fonction que devrait ressembler à un truc comme ça :

          void putRes(int pot, int val)//pot le potentiomètre (1 ou 0) , val la val de la resistance 
          {
          int cmd=0; // cmd est la commande que l'on va envoyer.
          cmd = pot<<12; // 000x 0000 0000 0000 cf figure 7-2
          val = val&255; // ainsi val <= 255
          cmd |= val; // 000x 0000 dddd dddd (d=data)(x=pot) 
          digitalWrite(SS_PIN, LOW); // protocole de base
          SPI.transfer(cmd); // r1 sert à rien à mon avis... peut être pour les erreur... doc à regarder 
          digitalWrite(SS_PIN, HIGH);
          }

          ... est ce que tu vois la résistance changer sur ton premier potentiomètre ? :)

          -
          Edité par nicolay1 19 août 2013 à 13:29:33

          • Partager sur Facebook
          • Partager sur Twitter
            19 août 2013 à 16:52:08

            Ça marche !

            Ce qui faisait bloquer le programme c'est qu'apparemment SPI.transfer(); n'envoie que 8 bits, et pas 16...

            Le code final avec quelques ajouts :

            void write_pot(int pot, int inc, int val)//pot : le potentiomètre 1/0 , inc : incrementation:01/decrementation:10/normal:00, val : 0-256
            {
              int cmd=0b00000000;
              
              cmd = pot<<4;
              cmd |= inc<<2;
              
              if(val > 255)
              {
                val = val&255; // ainsi val <= 255
                cmd |= 1;
              }
              
              digitalWrite(SS_PIN, LOW); // protocole de base
              SPI.transfer(cmd); //AAAACCXD
              SPI.transfer(val); //DDDDDDDD
              digitalWrite(SS_PIN, HIGH);
            }

             Merci !

            -
            Edité par diode 19 août 2013 à 16:52:46

            • Partager sur Facebook
            • Partager sur Twitter
            2b||!2b   sqrt(4b²)
              19 août 2013 à 17:04:42

              Pour vous servir ;) j'aime décortiquer les datasheet ^^' c rigolo :3
              • Partager sur Facebook
              • Partager sur Twitter

              MCP4261 et Arduino

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown