Bonjour à tous,
Je débute un nouveau projet à base d'ATMega168 : Un contrôleur de led RGB.
Pour le contexte : Je génère un PWM sur les trois chips (Rouge, Vert, Bleu) de la led.
Mon compilateur est AVR GCC, j'utilise la librairie WinAVR.
Au niveau de la couleur, j'arrive à ce que je veux avec la méthode sus-citée.
J'aimerais contrôler la couleur des LEDs via une liaison série d'un PC au microcontroleur.
La liaision semble bien configurée :
J'arrive à recevoir quelquechose (Le µC envoie une chaine de caractères au PC en début de programme).
Lorsque j'envoie un caractère, ce dernier et renvoyé sur le PC, avec une lettre de décalage (Décalage voulu). Le micro reçoit donc bien les données envoyées.
Dans l'interruption Rx, je charge la valeur reçue dans la variable dont dépend le chip rouge : Celle ci devrait donc varier.
Malgré ça, je n'arrive pas à modifier la couleur de ma LED...
Savez-vous ce qui cloche dans mon programme ?
Merci pour votre aide,Code:#include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #define ROUGE 0x04 #define VERT 0x02 #define BLEU 0x01 #define LED PORTC #define NIVEAUX 256 #define FOSC 20000000 #define BAUD 19200 #define MYUBRR FOSC/16/BAUD-1 //Prototypes //USART unsigned char USART_Receive( void ); void USART_Transmit( unsigned char data ); void USART_Init( unsigned int ubrr); void USART_tx_string(char *s,unsigned char sauts); //Autres void set_couleur(unsigned char rouge, unsigned char vert, unsigned char bleu); void init_ports(void); //Globales volatile unsigned char valeur_rouge = 0; volatile unsigned char valeur_vert = 0; volatile unsigned char valeur_bleu = 0; volatile unsigned char mode = 0; volatile unsigned char parametre = 0; int main(void) { init_ports(); USART_Init ( MYUBRR ); sei(); USART_tx_string("Controlleur LED RGB",1); USART_Transmit('>'); valeur_rouge = 0; valeur_vert = 0; valeur_bleu = 128; while(1) { set_couleur(valeur_rouge,valeur_vert,valeur_bleu); } } void init_ports(void) { //Direction des ports DDRD = 0xFF; DDRC = 0xFF; DDRB = 0xFF; //Etats initiaux PORTD = 0x00; PORTC = 0x00; PORTB = 0x00; } void set_couleur(unsigned char rouge, unsigned char vert, unsigned char bleu) { for (unsigned char i = 0 ; i < NIVEAUX ; i++) { LED = 0x00; if (i < rouge) LED |= ROUGE; if (i < vert) LED |= VERT; if (i < bleu) LED |= BLEU; _delay_us(10); } } void USART_Init( unsigned int ubrr) { UBRR0H = (unsigned char)(ubrr>>8); //Chargement de la vitesse de transmission UBRR0L = (unsigned char)ubrr; //(Deux registres 8 bits) UCSR0B = (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0); //Rx, Tx, Interruption Rx activés UCSR0C = (3<<UCSZ00); //Format : 8,n,1 } void USART_Transmit( unsigned char data ) { while ( !( UCSR0A & (1<<UDRE0)) ); // Attendre que le buffer se vide UDR0 = data; // Envoi de la donnée } unsigned char USART_Receive( void ) { while ( !(UCSR0A & (1<<RXC0)) ); // Attendre la reception du Data return UDR0; // Retour de fonction } ISR(USART_RX_vect) { unsigned char data; data = UDR0; valeur_rouge = data; UDR0=data + 1; //echo } void USART_tx_string(char *s, unsigned char saut) { unsigned char c ; while ((c = *s++) != 0) { USART_Transmit(c); } for (unsigned char i = 0; i < saut; i++) { USART_Transmit(10); USART_Transmit(13); } }
Tony
-----