Partage
  • Partager sur Facebook
  • Partager sur Twitter

Contrôler un SAA1064

qui contrôle 2 afficheurs 7 segments

Sujet résolu
    17 mars 2012 à 9:08:47

    Bonjour,
    en fouillant j'ai trouvé un CI avec 2 afficheurs 7 segments contrôlés par un SAA1064T, comme ici, ma question, très simple, et la suivante : comment puis-je arriver à faire marcher ces 2 afficheurs ?

    J'ai déjà trouvé ce code :
    /*
       Example 39.1 - NXP SAA1064 I2C LED Driver IC Demo I
       Demonstrating display of digits
       http://tronixstuff.wordpress.com/tutorials > chapter 39
       John Boxall July 2011 | CC by-sa-nc
      */
    
     #include "Wire.h" // enable I2C bus
    
     byte saa1064 = 56; // define the I2C bus address for our SAA1064 (pin 1 to GND)
    
     int digits[16]={63, 6, 91, 79, 102, 109, 125,7, 127, 111, 119, 124, 57, 94, 121, 113};
     // these are the byte representations of pins required to display each digit 0~9 then A~F
    
     void setup()
     {
       Wire.begin(); // start up I2C bus
       delay(500);
       initDisplay();
     }
    
     void initDisplay()
     // turns on dynamic mode and adjusts segment current to 12mA
     {
       Wire.beginTransmission(saa1064);
       Wire.write((uint8_t)B00000000); // this is the instruction byte.  Zero means the next byte is the control byte
       Wire.write((uint8_t)B01000111); // control byte (dynamic mode on, digits 1+3 on, digits 2+4 on, 12mA segment current
       Wire.endTransmission();
     }
    
     void displayDigits()
     // show all digits 0~9, A~F on all digits of display
     {
       for (int z=0; z<16; z++)
       {
         Wire.beginTransmission(saa1064);
         Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
         Wire.write(digits[z]); // digit 1 (RHS)
         Wire.write(digits[z]); // digit 2
         Wire.write(digits[z]); // digit 3
         Wire.write(digits[z]); // digit 4 (LHS)
         Wire.endTransmission();
         delay(500);
       } 
    
      // now repeat but with decimal point 
    
      for (int z=0; z<16; z++)
       {
         Wire.beginTransmission(saa1064);
         Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
         Wire.write(digits[z]+128); // digit 1 (RHS)
         Wire.write(digits[z]+128); // digit 2
         Wire.write(digits[z]+128); // digit 3
         Wire.write(digits[z]+128); // digit 4 (LHS)
         Wire.endTransmission();
         delay(500);
       }
     }
    
     void clearDisplay()
     // clears all digits
     {
       Wire.beginTransmission(saa1064);
       Wire.write((uint8_t)1); // instruction byte - first digit to control is 1 (right hand side)
       Wire.write((uint8_t)0); // digit 1 (RHS)
       Wire.write((uint8_t)0); // digit 2
       Wire.write((uint8_t)0); // digit 3
       Wire.write((uint8_t)0); // digit 4 (LHS)
       Wire.endTransmission();
     }
    
     void loop()
     {
       displayDigits();
       clearDisplay();
       delay(1000);
     }
    

    ici

    Et surtout, où brancher quoi ? ;)

    Merci de votre réponse !

    PS : ne vous entonnez pas d'avoir (peut-être) vu sa 2 fois j'ai fais un méchant copier/coller d'ici (ça n'avancer pas trop)
    • Partager sur Facebook
    • Partager sur Twitter
    2b||!2b   sqrt(4b²)
      17 mars 2012 à 12:15:48

      Tu connais le protocole de communication I²C ? Car ce composant (d'après le code fourni) se base la dessus. Je pense que ton controlleur de led (saa1064) peut piloter jusqu'à quatre afficheur (pas mal !) à la fois :)

      Maintenant Pour le branchement, je vais partir du principe que tu as trouvé les doc. techniques à partir des liens que tu as donnée précédemment et que tu as le plus gros des composants (celui qui peut faire jusqu'à 16 LEDs, donc 4 afficheurs 7 segments en passant par un décodeur BCD par afficheur)

      On a donc pin 12 et 13 respectivement masse et +5V.
      pin 23 et 24 respectivement SDA et SCL (pour l'I²C)
      3,4,5,6 -> afficheur 1
      7,8,9,10 -> afficheur 2
      15,16,17,18 -> afficheur 3
      19,20,21,22 -> afficheur 4
      • Partager sur Facebook
      • Partager sur Twitter
        17 mars 2012 à 12:22:06

        Merci, mais ça c'était déjà tout fais quand je l'ai trouvé (schéma)
        je voudrait savoir comment le brancher après, avec les 4 pins, sur l'arduino par exemple. ;)
        • Partager sur Facebook
        • Partager sur Twitter
        2b||!2b   sqrt(4b²)
          17 mars 2012 à 12:39:48

          Ton lien marche pas...

          Sinon par rapport à Arduino, le 5V et la masse pauvent etre trouvé sans trop de difficulté (c'est comme le port salut, c'est marqué dessus !)
          et pour SDA/SCL, première ligne de la page sur lalibrairie wire dans la doc officielle arduino :

          Citation : Arduino Documentation

          This library allows you to communicate with I2C / TWI devices. On most Arduino boards, SDA (data line) is on analog input pin 4, and SCL (clock line) is on analog input pin 5


          Donc en francais : pin 4 analogique = SDA et sur sa voisine la 5 analogique on a SCL
          • Partager sur Facebook
          • Partager sur Twitter
            17 mars 2012 à 13:08:14

            Sa marche super !
            Mais par contre le mec qui a fait le code l'a fait pour quatre afficheurs, j'en ai que deux, comment je pourrais modifier le code pour que sa marque qqc de normal ?

            EDIT : PS : le lien marche maintenant
            • Partager sur Facebook
            • Partager sur Twitter
            2b||!2b   sqrt(4b²)
              17 mars 2012 à 13:45:02

              Si tu utilises exactement le même composant, tu peux utiliser le même code et les deux "Wire.write()" avant le endTransmission tu envoies 0 (ou n'importe quoi), tant que tu n'as pas de truc de brancher ca ne changera rien...
              • Partager sur Facebook
              • Partager sur Twitter
                17 mars 2012 à 14:14:27

                Le problème c'est cette ligne : 27 Wire.write((uint8_t)B01000111);
                il a configurer pour 4 afficheurs, comment le configurer pour 2 ?
                • Partager sur Facebook
                • Partager sur Twitter
                2b||!2b   sqrt(4b²)
                  17 mars 2012 à 14:44:41

                  La valeur envoyé dépend du composant utilisé. Pour la comprendre il faut aller faire un tour dans la documentation technique et plus particulièrement les pages 5 et 6.
                  On voit alors que la ligne 26 signifie "je m'adresse au registre 'controle' " et que la 27 veut dire "On se met en mode 12 mA de courant de sortie" et "Les afficheurs 1+3 et 2+4 sont "not blancked" (donc actifs)"

                  Pour le configurer pour 2 afficheurs (1+3 ou 2+4) tu devras donc envoyer :
                  Wire.write((uint8_t)B01000011); //afficheur 1+3
                  OU
                  Wire.write((uint8_t)B01000101); //afficheur 2+4
                  
                  • Partager sur Facebook
                  • Partager sur Twitter
                    17 mars 2012 à 16:10:04

                    je sais pas qui a fabriquer ça, mais quand je le met en 1+3, juste un marche, et en 2+4, c'est l'autre !
                    (donc je l'ai laissé normalement) :-°

                    Et aussi, on peut calculer quel nombre affiche quoi ?
                    Du style : on veux mettre en marche le segment B et C donc on marque 10.
                    (parce-que moi j'y suis allé a la bourrin : une boucle entre 0 et 128 qui te dis ou elle en est sur le serial ;) )

                    En tout Merci de toute ton aide !

                    EDIT : j'ai vu que j'utilise le 2 et le 3 y'a pas un mode pour sa ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                    2b||!2b   sqrt(4b²)
                      17 mars 2012 à 18:43:53

                      Nan il y a pas de mode pour 2 et 3 (a part recabler !) tu peux juste faire 1+3 et/ou 2+4

                      J'ai pas bien compris ta question avec les nombres...
                      • Partager sur Facebook
                      • Partager sur Twitter
                        17 mars 2012 à 22:41:11

                        ben pour afficher qqc sur l'afficheur, il faut mettre un nombre entre 1 et 127 (<math>\(2^7\)</math> possibilités)
                        et par exemple, pour afficher un, il entrer 10, est-ce qu'il y a un rapport entre les 2 segments qui affiche le un et le 10 que l'on rentre ?
                        • Partager sur Facebook
                        • Partager sur Twitter
                        2b||!2b   sqrt(4b²)
                          18 mars 2012 à 18:05:11

                          Pour afficher un 10 il faudra que tu envois indépendamment le 1 sur un afficheur et le 0 sur l'autre (en effet le composant ne sais pas comment les afficheurs sont placés, et quel type de décodeur tu utilises etc...)
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Contrôler un SAA1064

                          × 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