[Programmation] Commande de 48 leds avec MSP430G2
Répondre à la discussion
Affichage des résultats 1 à 5 sur 5

Commande de 48 leds avec MSP430G2



  1. #1
    invitee556ddd9

    Commande de 48 leds avec MSP430G2


    ------

    Bonjour à tous !
    Je suis apprenti ingénieur et j'ai découvert le langage C il y a, à peu près 2 mois. En entreprise je dois donc commander 48 leds, celles-ci devant prendre différentes couleurs selon certaines conditions. J'utilise un µp MSP430G2553.
    J'ai donc déclaré les couleurs et initialisé mes ports, fait la structure du programme qui tourne mais les leds ne s'allument pas, je pense que c'est lié à la façon dont j'envoie les informations dans le buffer, pour commander une led il faut envoyer 3 octets correspondant à rouge,vert et bleu. Mais je ne trouve pas le problème j'ai peut être mal compris le fonctionnement du buffer.
    Je pense que, lorsque j'envoie un octet et que j'attend que ce soit bon je peux envoyer le suivant mais peut être pas...
    Notez que je ne l'ai pas encore mis en série donc les conditions sont remplacées par un tableau incrémenté jusqu’à 6 simplement pour afficher les différentes couleurs.
    A la fin j'allume les leds du µp pour vérifier que le programme tourne.
    Le problème est donc (à mon avis), l'envoi des informations vers le port P1.7.
    Voila mon programme :
    Code:
    #include <msp430g2553.h>
    #include <msp430g2231.h>
    
    typedef unsigned char u_char;
    typedef unsigned int u_int;
    typedef struct {
    	u_char r;
    	u_char g;
    	u_char b;
    } RGBLED;
    #define LED_0 BIT0
    #define LED_1 BIT6
    #define LED_OUT P1OUT
    #define LED_DIR P1DIR
    
    #define DATA_OUT_PIN BIT7
    void sendRGB(u_char numberOfLEDs);
    
    #define NUMBER_OF_LEDS 48
    RGBLED leds[NUMBER_OF_LEDS] = { 0, };
    
     unsigned int timerCount = 0;
    void main(void) {
    
    	WDTCTL = WDTPW + WDTHOLD;
    
    	BCSCTL1 = CALBC1_16MHZ;
    	DCOCTL = CALDCO_16MHZ;
    
    	// setup USIB, utilise pour le driver
    	P1SEL |= DATA_OUT_PIN;
    	P1SEL2 |= DATA_OUT_PIN;
    	UCB0CTL0 |= UCCKPH + UCMSB + UCMST + UCSYNC; // 3-pin, 8-bit SPI master
    	UCB0CTL1 |= UCSSEL_2; // SMCLK
    	UCB0BR0 |= 0x04; // 1:4 - 16MHz/4 = 0.25us
    	UCB0BR1 = 0;
    	UCB0CTL1 &= ~UCSWRST;
    
    	//animation section
    RGBLED REDLED = { 0xFF, 0, 0};
    RGBLED GREENLED = {0, 0xFF, 0};
    RGBLED WHITELED = { 0xFF, 0xFF, 0xFF};
    RGBLED YELLOWLED = { 0xFF, 0xFF, 0};
    RGBLED PURPLELED={ 0xFF, 0, 0xFF};
    RGBLED BLUELED = { 0, 0, 0xFF};
    
    //creation variables
    
    int j,i,eclairage=0,nb_palettes=6,tab[6]={1,2,3,4,5,6};
    //animation loop
    while (1) {
    	__delay_cycles(200000);
    		if (eclairage==1){    // si l'operateur demande l'eclairage, toutes les LEDs doivent être blanches
                          for(j=0;j<NUMBER_OF_LEDS;j++){
                                  leds[j]=WHITELED;
                                       while(!(IFG2&UCB0TXIFG)); //on attend que le buffer soit pret
                                        UCB0TXBUF = leds[j].r;   //envoi de l'octet rouge dans le buffer
                                        while(!(IFG2&UCB0TXIFG));
                                        UCB0TXBUF = leds[j].g;
                                        while(!(IFG2&UCB0TXIFG));
                                        UCB0TXBUF = leds[j].b;
    
                          __delay_cycles(800); //attente que les donnees soient bien envoyees
                          }
    		}else{
    			j=0;
    				for(i=0;i<nb_palettes;i++){
    					if (tab[i]==1){
    						j+=1;
    						leds[j]=GREENLED;
    						j+=1;
    						leds[j]=GREENLED;
    					}else if(tab[i]==2){
    						j+=1;
    						leds[j]=REDLED;
    						j+=1;
    						leds[j]=REDLED;
    					}else if(tab[i]==3){
    						j+=1;
    						leds[j]=BLUELED;
    						j+=1;
    						leds[j]=BLUELED;
    					}else if(tab[i]==4){
    						j+=1;
    						leds[j]=PURPLELED;
    						j+=1;
    						leds[j]=PURPLELED;
    					}else if(tab[i]==5){
    						j+=1;
    						leds[j]=YELLOWLED;
    						j+=1;
    						leds[j]=YELLOWLED;
    					}else if(tab[i]==6) {
    						j+=1;
    						leds[j]=WHITELED;
    						j+=1;
    						leds[j]=WHITELED;
    					}
    
    					if (!(IFG2 & UCB0TXIFG)){ //attente que le buffer soit pret
    
    						UCB0TXBUF = leds[j-1].r;
                            __delay_cycles(800);
    						while(!(IFG2&UCB0TXIFG));
                            UCB0TXBUF = leds[j-1].g;
                            while(!(IFG2&UCB0TXIFG));
                            UCB0TXBUF = leds[j-1].b;
                            while(!(IFG2&UCB0TXIFG));
                            UCB0TXBUF = leds[j].r;
                            while(!(IFG2&UCB0TXIFG));
                            UCB0TXBUF = leds[j].g;
                            while(!(IFG2&UCB0TXIFG));
                            UCB0TXBUF = leds[j].b;
    
    
    					}
    
    					__delay_cycles(800);	//attente que les donnees soient bien envoyees
    				}
    	}
            {
    WDTCTL = WDTPW + WDTHOLD; // arret du watchdog
    LED_DIR |= (BIT0 + BIT6);
    LED_OUT &= ~ (BIT0 + BIT6);
    
    {
    P1OUT ^= BIT6; //allumage de la LED du µp pour verifier que le programme tourne
    }
    }
    }
    }
    Si vous pouviez m'aider ce serait super je suis bloqué depuis 2jours même en ayant écumé les forums

    -----

  2. #2
    Vincent PETIT
    Animateur Électronique

    Re : Commande de 48 leds avec MSP430G2

    Salut,
    Avis personnel : Ton programme est anormalement complexe pour ce qu'il est sensé faire et il est très difficile à lire à cause de l'indentation non régulière.

    Il y a un problème avec ces lignes en bas de ton programme :
    Code:
    LED_DIR |= (BIT0 + BIT6);
    LED_OUT &= ~ (BIT0 + BIT6);
    P1OUT ^= BIT6; //allumage de la LED du µp pour verifier que le programme tourne
    Elles configurent les pin en sorties et allume une LED mais ces lignes doivent être avant ou dans la boucle infinie while(1) car sinon le programme n'ira jamais jusque là.

    A minima cette ligne doit être avant le while(1) pour configurer les ports d'entrées/sorties
    Code:
    LED_DIR |= (BIT0 + BIT6);
    Que vient faire UCB0TXBUF la dedans ?
    Dernière modification par Vincent PETIT ; 10/12/2018 à 14h12.
    Là où il n'y a pas de solution, il n'y a pas de problème.

  3. #3
    invitee556ddd9

    Re : Commande de 48 leds avec MSP430G2

    Bonjour,
    Merci de votre réponse. Effectivement la LED du microprocesseur ne s'allumait pas et j'avais mal compris l'utilisation de UCB0TXBUF qui est l'envoi d'une donnée dans le buffer. J'ai réussi à m'en sortir en envoyant chaque bit dans le buffer grâce à une boucle de 24 qui me permet d'envoyer tous les bits nécessaires à l'établissement d'une couleur, c'est à dire 3 octets.

  4. #4
    bobflux

    Re : Commande de 48 leds avec MSP430G2

    C'est des LED ou des neopixel genre WS2812B ?

  5. A voir en vidéo sur Futura
  6. #5
    invitee556ddd9

    Re : Commande de 48 leds avec MSP430G2

    Ce sont des WS2811

Discussions similaires

  1. [Numérique] commande de plusieurs leds avec une seule antenne
    Par invite50113e53 dans le forum Électronique
    Réponses: 5
    Dernier message: 19/04/2017, 14h38
  2. Programmation MSP430G2
    Par invite57b37f86 dans le forum Électronique
    Réponses: 5
    Dernier message: 26/03/2015, 15h41
  3. Commande de beaucoup de leds
    Par invite861d9b56 dans le forum Électronique
    Réponses: 0
    Dernier message: 17/02/2012, 14h14
  4. Commande de leds de puissance
    Par invitea1299aa1 dans le forum Électronique
    Réponses: 1
    Dernier message: 30/09/2011, 13h45
  5. Commande de Matrice (8 * 8) LEDs Avec PIC16F80
    Par invitebec10049 dans le forum Électronique
    Réponses: 5
    Dernier message: 07/09/2009, 01h05
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...