Microcontroleur, utiliser une donnée RS232
Répondre à la discussion
Affichage des résultats 1 à 2 sur 2

Microcontroleur, utiliser une donnée RS232



  1. #1
    Tony78

    Microcontroleur, utiliser une donnée RS232


    ------

    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 ?

    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);
    	}
    }
    Merci pour votre aide,

    Tony

    -----

  2. #2
    invite067d8d6c

    Re : Microcontroleur, utiliser une donnée RS232

    Salut,

    Donc si j'ai bien compris, ton port ne varie pas!
    Essaies d'ajouter une petite tempo dans ton main histoire de laisser le temps à l'interruption de recharger les valeurs
    valeur_rouge
    valeur_vert
    valeur_bleu

    C'est toujours une piste

Discussions similaires

  1. Projet RS232&PIC avec un microcontroleur.
    Par invite7d156dae dans le forum Électronique
    Réponses: 8
    Dernier message: 17/05/2008, 22h35
  2. Alimenter un microcontroleur avec une pile et une alim
    Par invitef35a1d64 dans le forum Électronique
    Réponses: 14
    Dernier message: 27/11/2007, 14h31
  3. Transformer une image en base de donnée
    Par invite8653e861 dans le forum Logiciel - Software - Open Source
    Réponses: 2
    Dernier message: 28/06/2007, 13h15
  4. PB d'accès à une Base De Donnée
    Par invite1469b964 dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 23/01/2007, 18h26
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...