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 :
Si vous pouviez m'aider ce serait super je suis bloqué depuis 2jours même en ayant écumé les forumsCode:#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 } } } }
-----