IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Embarqué Discussion :

MAX6958 8 LEDs + 4 digits


Sujet :

Embarqué

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 52
    Points : 4
    Points
    4
    Par défaut MAX6958 8 LEDs + 4 digits
    Bonjour à tous,

    J'ouvre ce sujet suite aux difficultés que je rencontre dans le fonctionnement du MAX6958.
    Voici la datasheet qui m'a pas mal aidé : http://studylib.net/doc/18122405/max...-3v-to-5.5v--4

    J'ai réussi à brancher 4 afficheurs sur le max6958 et à les gérer (affichage). J'ai programmé en C sur code composer studio.

    A présent j'aimerais rajouter 8 LEDs sur les ports input 1 et input 2. Il y a beaucoup d'informations sur la datasheet mais j'ai beaucoup de mal à les interpréter...
    Au niveau hardware les branchements sont corrects je pense, il ne me reste qu'à configurer tout ça sur code composer.

    J'ai bien trouvé l'adresse du registre pour les LEDs 0x24 (cf page 10 datasheet). Mais je n'arrive pas à configurer le reste..
    Est-ce que quelqu'un pourrait me donner des indications ?
    Pour le moment mon code sur la configuration des ports input1 et input 2 ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void leds8(int8_t j)
    {
        UCB1CTL1 |= UCTR + UCTXSTT;             // I2C TX, start condition
        __delay_cycles(100);
        UCB1TXBUF = 0x24;                       //address of 8 leds
        __delay_cycles(100);
        UCB1TXBUF = j;
        __delay_cycles(100);
        UCB1CTL1 |= UCTXSTP;
        __delay_cycles(100);                    // I2C stop condition
        while (UCB1CTL1 & UCTXSTP);             // Ensure stop condition got sent
    }
    Bien à vous, Pierre

  2. #2
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 52
    Points : 4
    Points
    4
    Par défaut Code deja présent
    Code permettant d'initialiser mes digits :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    void dig1(int8_t i)     //Function wich permitt to display numbers on the dig1 (red left digit)
    {
        UCB1CTL1 |= UCTR + UCTXSTT;             // I2C TX, start condition
        __delay_cycles(100);
        UCB1TXBUF = 0x20;						//address of left digit in decoder is 0x20
        __delay_cycles(100);
        i=i>>4;
        UCB1TXBUF = i;
        __delay_cycles(100);
        UCB1CTL1 |= UCTXSTP;					// I2C stop condition
        __delay_cycles(100);					
        while (UCB1CTL1 & UCTXSTP);             // Ensure stop condition got sent
    }
    
    void dig2(int8_t i) //Function wich permitt to display numbers on the dig2 (red riight digit)
    {
        UCB1CTL1 |= UCTR + UCTXSTT;             // I2C TX, start condition
        __delay_cycles(100);
        UCB1TXBUF = 0x21;						//address of Right digit in decoder is 0x21
        __delay_cycles(100);
        UCB1TXBUF = i;
        __delay_cycles(100);
        UCB1CTL1 |= UCTXSTP;
        __delay_cycles(100);                    // I2C stop condition
        while (UCB1CTL1 & UCTXSTP);             // Ensure stop condition got sent
    }
    
    void dig3(int8_t k) //Function wich permitt to display numbers on the dig3 (green left digit)
    {
        UCB1CTL1 |= UCTR + UCTXSTT;             // I2C TX, start condition
        __delay_cycles(100);
        UCB1TXBUF = 0x22;                       //address of Right digit in decoder is 0x22
        __delay_cycles(100);
        k=k>>4;
        UCB1TXBUF = k;
        __delay_cycles(100);
        UCB1CTL1 |= UCTXSTP;
        __delay_cycles(100);                    // I2C stop condition
        while (UCB1CTL1 & UCTXSTP);             // Ensure stop condition got sent
    }
    
    void dig4(int8_t k) //Function wich permitt to display numbers on the dig4 (green right digit)
    {
        UCB1CTL1 |= UCTR + UCTXSTT;             // I2C TX, start condition
        __delay_cycles(100);
        UCB1TXBUF = 0x23;                       //address of Right digit in decoder is 0x23
        __delay_cycles(100);
        UCB1TXBUF = k;
        __delay_cycles(100);
        UCB1CTL1 |= UCTXSTP;
        __delay_cycles(100);                    // I2C stop condition
        while (UCB1CTL1 & UCTXSTP);             // Ensure stop condition got sent
    }
    void initLedDriver()        //Initialisation of LEDs to 0
    {
    	  P4SEL |= 0x06;                                // Assign I2C pins to USCI_B1
    	  P4REN |= 0x06;
    	  P4OUT |= 0x06;
    	  UCB1CTL1 |= UCSWRST;                          // Enable SW reset
    	  UCB1CTL0 = UCMST + UCMODE_3 + UCSYNC;         // I2C Master, synchronous mode
    	  UCB1CTL1 = UCSSEL_2 + UCSWRST;                // Use SMCLK, keep SW reset
    	  UCB1BR0 = 3;                                  // fSCL = SMCLK/3 = ~400kHz
    	  UCB1BR1 = 0;
    	  UCB1I2CSA = 0x38;                             // Slave Address is 038h
    	  UCB1CTL1 &= ~UCSWRST;                         // Clear SW reset, resume operation
    	  //UCB1IE |= UCTXIE;                           // Enable TX interrupt
    	  resetLedDriver();
    	  dig1(0);								        //Reset the display to 0 number
    	  dig2(0);
    	  dig3(0);
    	  dig4(0);
    }

  3. #3
    Modérateur

    Homme Profil pro
    Ingénieur électricien
    Inscrit en
    Septembre 2008
    Messages
    1 267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur électricien

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 267
    Points : 4 829
    Points
    4 829
    Par défaut
    Bonjour Pierre

    Pourquoi ne pas utiliser le datasheet directement depuis le site du fabricant de la puce https://datasheets.maximintegrated.c...58-MAX6959.pdf

    Citation Envoyé par eliters48 Voir le message
    A présent j'aimerais rajouter 8 LEDs sur les ports input 1 et input 2. Il y a beaucoup d'informations sur la datasheet mais j'ai beaucoup de mal à les interpréter...
    Au niveau hardware les branchements sont corrects je pense, il ne me reste qu'à configurer tout ça sur code composer.
    Des Led sur des entrées (inputs) cela sonne déjà mal, puis après vérification du datasheet, les 8 diodes sur les entrées 1 et 2 ne sont pas des Led, mais de simple diode de signalisation qui servent au matriçage de 8 contacts qui peuvent être lus par le MAX6958.

    [Edit:]Donc inutile d'aller plus loin, notamment au niveau du code. Si tu veux commander des Leds en plus, il faut un circuit additionnel. Sauf dans le cas où tu n'utilises pas les 4 digits que peut commander le MAX6958 et dans ce cas uniquement, tu peux utiliser les connections du 4ème digit pour commander des Led individuelles. En fait non, les MAX6958 et MAX6959 ont bien la possibilité de commander 8 leds en plus des 4 digits à 7 segments.

    Delias

  4. #4
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 190
    Points : 11 573
    Points
    11 573
    Par défaut
    Salut,
    Il nous faut :

    Un schéma de ce que tu veux faire car pour moi c'est pas clair (tu veux mettre 8 LED à l'endroit prévu pour un clavier ? input 1 et 2 sont des entrées, du coup je ne comprends pas l'histoire des LED dessus ?).
    La référence du microcontrôleur que tu utilises.

    A+

    EDIT : message croisé avec celui de Delias
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  5. #5
    Modérateur

    Homme Profil pro
    Ingénieur électricien
    Inscrit en
    Septembre 2008
    Messages
    1 267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur électricien

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 267
    Points : 4 829
    Points
    4 829
    Par défaut
    Bon pour le coup, j'avais pas assez lu en détail le datasheet.

    Le circuit est capable de gérer 8 leds supplémentaires, à condition de ne pas utiliser de point décimaux sur les digits, mais ce n'est pas via les entrées Input 1 et Input 2. C'est les branchements désignés SEG 0 à SEG 7 dans le datasheet qui faut utiliser.

    Et pendant qu'on y est, Input 1 et Input 2 ne sont disponible que sur le MAX6959, sur le 6958 les pins sont N.C. et doivent rester en l'air ou être connecté à VCC...

    Delias

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 52
    Points : 4
    Points
    4
    Par défaut
    Merci à vous pour vos réponses,
    effectivement je ne suis pas complet, je vais y remédier :
    J'utilise un MSP430F5529 qui permet d'utiliser un clavier et d'afficher ce que je tape sur ce clavier sur les écrans. Pour ne pas utiliser de nombreux ports sur le MSP j'ai utilisé un MAX6958 qui permet de gérer 4 écrans avec uniquement 2 ports sur le MSP. J'ai bien réussi à programmer et brancher tout ce qui concerne le clavier et les écrans.

    Maintenant je souhaite ajouter 8 LEDs qui doivent s'allumer lorsque je ferme un interrupteur manuellement. Dans un premier temps j'ai branché les interrupteurs et les leds directement sur le MSP mais au bout d'un moment il manque des ports. Comme pour les écrans j'ai décidé de mettre les 8 LEDS sur le MAX6958 que je souhaite controler avec les interrupteurs. Mon soucis est la configurations de ces 8 LEDs sur le MAX6958 que je n'arrive pas à programmer.

    Voilà j'espère que je suis un peu plus clair ?

    Bien à vous, Pierre

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 52
    Points : 4
    Points
    4
    Par défaut
    De ce que j'ai compris de la datasheet,
    les branchements se font effectivement sur les SEG0 à SEG7 mais on contrôle les LEDs grâce au ports : INPUT 1 et INPUT 2
    Cf datasheet :
    Nom : Captura.PNG
Affichages : 395
Taille : 38,5 Ko

    C'est ce branchement que j'ai réaliser, chaque LED doit être controller par l'interrupteur qui lui correspond

  8. #8
    Modérateur

    Homme Profil pro
    Ingénieur électricien
    Inscrit en
    Septembre 2008
    Messages
    1 267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur électricien

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 267
    Points : 4 829
    Points
    4 829
    Par défaut
    Non, non et Non relis mes réponses (entretemps complétées)

    Ce ne sont pas des Leds, et cela n'est dispo que sur le MAX6959 et pas sur le MAX6958 que tu utilises.

    Delias

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 52
    Points : 4
    Points
    4
    Par défaut
    D'accord, je n'avais pas lu l'ensemble des ñessages, quand j'écrivais le miens, le votre a été publié.

    je dois donc brancher chaque LED directement au msp...

  10. #10
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 52
    Points : 4
    Points
    4
    Par défaut
    Je ne comprends pas pourquoi dans la datasheet ils parlent de la gestion de 8 LEDs en plus de 4 ecrans ? si le seul probleme est que j'utilise un max6958 au lieu d'un max6959, je peux le changer

  11. #11
    Modérateur

    Homme Profil pro
    Ingénieur électricien
    Inscrit en
    Septembre 2008
    Messages
    1 267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur électricien

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 267
    Points : 4 829
    Points
    4 829
    Par défaut
    Le schéma c'est uniquement le raccordement des contacts à faire lire par le MAX6959.
    Sans les diodes, que ce passe-t-il si deux contacts sont fermés Il y a pontage de deux lignes DIGx/SEGx et dysfonctionnement de l'affichage (tient d'ailleurs ce schéma a une erreur avec x allant de 0 à 7 au lieu de 2x 0 à 3).
    Donc les diodes (par exemple des 1N4148 pour la version fil) évitent le passage du courant d'une ligne DIGx/SEGx vers une autre. C'est la base de la lecture de contact par multiplexage.

    Et puis cette partie n'est disponible que sur le MAX6959.

    ****************

    On parle de chiffre ou digit en anglais, pas d'écran!!!!
    Les 8 Leds sont à brancher selon la table 1, et cela est disponible sur les 2 versions: MAX6958 et MAX6959. La Led SEG 0 se branche entre les pins DIG1/SEG1 (anode) et DIG0/SEG0 (cathode), la SEG 1 c'est l'inverse, 2 et 3 sont sur DIG3/SEG3 et DIG4/SEG4, les leds 4 à 7 sont entre SEG9 et DIGx/SEGx avec x = 0 à 3. Par contre pas très lisible la double signification de SEG0 à SEG7 (car c'est soit une broche, soit l'une des leds commandées)

    Leur contrôle se fait via le registre 0x24, Tables 4 et 5.

    Delias

  12. #12
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 52
    Points : 4
    Points
    4
    Par défaut
    Bonjour à tous,

    Merci Delias ! Je comprends comment faire mon branchement correctement. J'avais noté le registre 0x24, je vais essayé tout ça et je vous tiens au courant.

    Merci encore

    Bien à vous, Pierre

  13. #13
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 52
    Points : 4
    Points
    4
    Par défaut
    Juste un petit point à souligner, je pense qu'il s'agit d'une faute de frappe de ta part :
    "2 et 3 sont sur DIG3/SEG3 et DIG4/SEG4"
    Pour moi c'est plutôt : 2 et 3 sont sur DIG2/SEG2 et DIG3/SEG3

  14. #14
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 52
    Points : 4
    Points
    4
    Par défaut
    J'ai beaucoup de mal à comprendre comment accéder au registre 0x24 et allumer une LED par exemple..
    Pouvez vous me donner une indication ? si je comprends bien il faut accéder au registre qui contient 8 bits, il s'agit de mettre des 0/1 sur les bits qui allume ou non leur leds respectivent ?

  15. #15
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 52
    Points : 4
    Points
    4
    Par défaut
    La difficulté vient aussi de l'initialisation des 8 LEDs

  16. #16
    Modérateur

    Homme Profil pro
    Ingénieur électricien
    Inscrit en
    Septembre 2008
    Messages
    1 267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur électricien

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 267
    Points : 4 829
    Points
    4 829
    Par défaut
    Citation Envoyé par eliters48 Voir le message
    Juste un petit point à souligner, je pense qu'il s'agit d'une faute de frappe de ta part :
    "2 et 3 sont sur DIG3/SEG3 et DIG4/SEG4"
    Pour moi c'est plutôt : 2 et 3 sont sur DIG2/SEG2 et DIG3/SEG3
    tu as corrigé par toi même

    Citation Envoyé par eliters48 Voir le message
    J'ai beaucoup de mal à comprendre comment accéder au registre 0x24 et allumer une LED par exemple..
    Pouvez vous me donner une indication ? si je comprends bien il faut accéder au registre qui contient 8 bits, il s'agit de mettre des 0/1 sur les bits qui allume ou non leur leds respective ?
    Ne programmant pas sur MCP, je n'avais pas lu les codes de tes premiers messages. L'erreur étant manifestement au niveau hard. A priori, la fonction leds8 est correcte (en supposant que les fonctions dig1 à dig4 le sont) et le paramètre passé en référence définit l'état des 8 LED. Si tu appelles leds8(0x00); les 8 LED seront éteintes, leds8(0xFF); les 8 LED seront allumées, leds8(0x81); la première et la dernière seront allumées et les autres éteintes, etc.

    Citation Envoyé par eliters48 Voir le message
    La difficulté vient aussi de l'initialisation des 8 LEDs
    Aucune initialisation demandée, à l'allumage et au reset, les 8 Leds sont éteintes. (Table 9).

    Une initialisation globale doit sortie le MAX du mode stand-by, définir l'intensité et mettre le décodage pour les digit. Les deux premières étapes s'appliquent également aux 8 Leds, la dernière est spécifique aux digits. Mais comme en l'état l'affichage sur les digit fonctionne, il n'y a rien à ajouter (même si dans les codes joints, la fonction n'apparait pas)

    Le code a beaucoup de copier-coller, ce n'est pas terrible. Une fonction void ecritureMAXI2C(uint8_t reg, uint8_t val) qui s'occupe de l'envoi des ordres et qui serait appelé par les autres fonctions serait un plus. Val pouvant même être un tableau, puisque que le MAX6958/6959 accepte l'écriture (et la lecture) de plusieurs registres à la suite (avec incrémentation automatique de l'adresse).


    Delias

  17. #17
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 52
    Points : 4
    Points
    4
    Par défaut
    Une fois de plus merci pour ta réponse je comprends mieux le fonctionnement maintenant.

    Les fonctions dig1 à 4 fonctionnent parfaitement seules. En revanche lorsque j'appelle la fonction led8 cela ne fonctionne plus.
    Si j'appelle la fonction led8 seule, elle est censée allumer des LEDs en fonction du paramètre entré, mais rien ne se passe...
    La fonction led8 doit donc comporter une ou des erreurs..

    Bien à vous, Pierre

  18. #18
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 52
    Points : 4
    Points
    4
    Par défaut
    J'ai un doute sur la fonction suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    void resetLedDriver()       //Permitt to manage 4 digits
    {
        UCB1CTL1 |= UCTR + UCTXSTT;             // I2C TX, start condition
        __delay_cycles(100);
        UCB1TXBUF = 0x01;
        __delay_cycles(100);					// Set dig0 dig1 to decode mode
        UCB1TXBUF = 0x0f;   //0x03 old value for 1 display ; new value 0x0f to manage 4 digit     0x0f
        __delay_cycles(100);
        UCB1TXBUF = 0xff;  //0x3f old value for 1 display ; new value 0xff to manage 4 digit      0xff
        __delay_cycles(100);
        UCB1TXBUF = 0x0f;   //0x03 old value for 1 display ; new value 0x0f to manage 4 digit       0x0f
        __delay_cycles(100);
        UCB1TXBUF = 0x0f;  // 0x03 old value for 1 display ; new value 0x0f to manage 4 digit      0x0f
        __delay_cycles(100);
        UCB1CTL1 |= UCTXSTP;
        __delay_cycles(100);
        while (UCB1CTL1 & UCTXSTP);             // Ensure stop condition got sent
    }
    Pour moi cela ne configure que les digits et non pas les leds mais apperement cela fait les deux, je ne sais pas trop comment

  19. #19
    Modérateur

    Homme Profil pro
    Ingénieur électricien
    Inscrit en
    Septembre 2008
    Messages
    1 267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur électricien

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 267
    Points : 4 829
    Points
    4 829
    Par défaut
    Oula, il y a beaucoup d’incompréhension sur le dernier bout de code (la fonction resetLedDriver), notamment dans les commentaires.

    La ligne 5, donne l'adresse du 1er registre écrit, 0x01 -> c'est OK.
    La ligne 7, c'est le paramétrage du registre @0x01: Decode mode
    La ligne 9, c'est le paramétrage du registre @0x02: Intensity
    La ligne 11, c'est le paramétrage du registre @0x03: Scan limit
    La ligne 13, c'est le paramétrage du registre @0x04: Configuration

    Regarde en détail se que signifie chaque registre, mais les commentaires et les valeurs en l'état sur ce bout de code c'est à moitié du n'importe quoi Par principe les bit indiqués X dans la doc, càd sans intérêt sont à écrire à 0.

    Le Scan Limit, qui indique le nombre de digits contrôlés, contrôle également les Leds contrôlées. Mais c'est logique au niveau des connections: SEG0 et SEG4 sont commandées par le digit 0, SEG1 et SEG5 sont commandées par le digit 1, etc.

    Edit: Par contre dés le moment où les digits fonctionnent, il n'y a pas de raison que les Leds ne fonctionnent pas également. Ou leur branchement reste faux et on revient à la demande initiale, quel est le schéma de branchement des leds? (Même si la description que tu fais semble indiqué que tu as compris.) On veut un schéma

    Delias

  20. #20
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 52
    Points : 4
    Points
    4
    Par défaut
    Bonjour à tous, encore merci pour vos réponses, cela s'éclairci petit à petit pour moi

    Alors voilà j'ai essayé de corrigé le code et voila ce que ça donne avec un commentaire 'correcte' : (j'ai un doute sur la derniere ligne)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    void resetLedDriver()       //Permitt to manage 4 digits
    {
        UCB1CTL1 |= UCTR + UCTXSTT;             // I2C TX, start condition
        __delay_cycles(100);
        UCB1TXBUF = 0x01;                    //first register
        __delay_cycles(100);					// Set dig0 dig1 to decode mode
        UCB1TXBUF = 0x0f;    // 0x0f : decode mode - hexadecimal decode for digits 3-0                                           
        __delay_cycles(100);
        UCB1TXBUF = 0x3f;  // 0x3f : intensity parameters - 63/64 max on - 22.64                                                
        __delay_cycles(100);
        UCB1TXBUF = 0x03;   //    0x03 : scan limit register - display digits 0 to 3 and leds 0 to 7                            
        __delay_cycles(100);
        UCB1TXBUF = 0x03;  //     0x03 : ????                                                                                   
        __delay_cycles(100);
        UCB1CTL1 |= UCTXSTP;
        __delay_cycles(100);
        while (UCB1CTL1 & UCTXSTP);             // Ensure stop condition got sent
    }
    J'ai à présent rentrer une valeur initiale pour l'affichage des LEDs, j'ai mis 0 par défaut donc en principe rien ne doit s'allumer.
    Cela fonctionne et les digits s'allument aussi. En revanche dès que je met une valeur différente de 0 pour leds8, les digits ne s'allument plus et les leds non plus..
    Donc au final je n'ai toujours pas réussi à allumer des LEDs en même temps que les digits...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    void initLedDriver()        //Initialisation of LEDs to 0
    {
    	  P4SEL |= 0x06;                                // Assign I2C pins to USCI_B1
    	  P4REN |= 0x06;
    	  P4OUT |= 0x06;
    	  UCB1CTL1 |= UCSWRST;                          // Enable SW reset
    	  UCB1CTL0 = UCMST + UCMODE_3 + UCSYNC;         // I2C Master, synchronous mode
    	  UCB1CTL1 = UCSSEL_2 + UCSWRST;                // Use SMCLK, keep SW reset
    	  UCB1BR0 = 3;                                  // fSCL = SMCLK/3 = ~400kHz
    	  UCB1BR1 = 0;
    	  UCB1I2CSA = 0x38;                             // Slave Address is 038h
    	  UCB1CTL1 &= ~UCSWRST;                         // Clear SW reset, resume operation
    	  //UCB1IE |= UCTXIE;                           // Enable TX interrupt
    	  resetLedDriver();
    	  dig1(0);								        //Reset the display to 0 number
    	  dig2(0);
    	  dig3(0);
    	  dig4(0);
    	  leds8(0);
    }
    Voilà un schéma pour le branchement de mes LEDs à noter que les branchement des Digits est complexe et que pour ne pas encombrer le schéma j'ai choisi de ne pas les mettres. Je suis sûre qu'ils sont bons puisque avant l'ajout des LEDs cela fonctionnait parfaitement.

    Nom : IMG_3699.JPG
Affichages : 361
Taille : 189,2 Ko

    J'espère ne pas être trop flou...

    Bien à vous, Pierre

Discussions similaires

  1. [Débutant creation de composant] Créer une LED numérique
    Par C_Marteau dans le forum C++Builder
    Réponses: 8
    Dernier message: 14/06/2005, 21h23
  2. [RegExp] digit ET lettre
    Par denisC dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 12/05/2005, 09h29
  3. Réponses: 4
    Dernier message: 06/05/2005, 13h37
  4. [TP]Créer une animation leds clavier
    Par Thomas748 dans le forum Turbo Pascal
    Réponses: 16
    Dernier message: 27/11/2004, 20h18
  5. comment faire un compteru digital?
    Par Zorgz dans le forum MFC
    Réponses: 5
    Dernier message: 13/01/2004, 23h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo