problème de liaison I2C entre un µC PIC24FJ64GA002 et LED tricolore programmable
Répondre à la discussion
Affichage des résultats 1 à 14 sur 14

problème de liaison I2C entre un µC PIC24FJ64GA002 et LED tricolore programmable



  1. #1
    inviteaafe8b0e

    problème de liaison I2C entre un µC PIC24FJ64GA002 et LED tricolore programmable


    ------

    Bonjour à tous,

    Mon projet actuel consiste à faire communiquer (via le protocole I2C) un microcontrôleur PIC24FJ64GA002 avec un BlinkM qui est une LED RGB intelligente et programmable. J'ai besoin d'envoyer des commandes à la LED pour la faire changer de couleurs, mais aussi de lui demander la valeur d'un registre (son adresse, une ligne de sa mémoire EEPROM, ...).

    Le µC et la LED sont alimentés à 3.4 V.
    J'utiliser le module I2C2 du PIC, j'ai placé des résistances pull-up de 1.1 kOhms sur les lignes SDA2 et SCL2.

    Jusqu'à maintenant j'ai réussi à commander la LED en choisissant la couleur ou en programmant le "light script". J'observe de bons résultats à l'affichage et les signaux mesurés avec mon analyseur logique sont corrects.
    Par contre je n'arrive pas à récupérer la valeur d'un registre : en demandant par exemple l'adresse de la LED BlinkM, celle-ci a l'air de me renvoyer la valeur zéro, peu importe ce que je lui demande (je précise "a l'air de" car je n'ai pas réussi à observer le signal de réponse avec l'analyseur logique).

    Voici le code utilisé :

    Code:
    #include "p24FJ64GA002.h"
    
    #define USE_AND_OR	// To enable AND_OR mask setting for I2C. 
    #include "i2c.h"
    
    // Watchdog Timer/ICD pins select
    _CONFIG1(JTAGEN_OFF & GCP_OFF & GWRP_OFF & COE_OFF & FWDTEN_OFF & ICS_PGx1) 
    // Disable CLK switch and CLK monitor, OSCO or Fosc/2, HS oscillator,
    // Primary oscillator
    _CONFIG2(FCKSM_CSDCMD & OSCIOFNC_OFF & POSCMOD_XT & FNOSC_PRI)
    
    // calculate baud rate of I2C
    #define Fosc	(8000000) 
    #define Fcy		(Fosc/2)	// no PLL
    #define Fsck	1000
    #define I2C_BRG	((Fcy/2/Fsck)-1)
    
    void i2c_wait(unsigned int cnt)    // fonction de temporisation
    {
    	while(--cnt)
    	{
    		asm( "nop" );
    		asm( "nop" );
    	}
    }
    
    int main()
    {
    	unsigned char SlaveAddress;
    	char i2cData[10];
    	int DataSz;
    	unsigned char i2cbyte = 0x02;
    	
            
            OpenI2C2( I2C_ON, I2C_BRG );
    
    	SlaveAddress = 0x00;
    	
    	i2cData[0] = SlaveAddress << 1 ;	//Device Address & WR
    	i2cData[1] = 0x5A;	// register	
    	DataSz = 2;
    	
    	while(1)  // boucle tant que la communication ne marche pas
    	{
    		StartI2C2();
    		IdleI2C2();
    
    		MasterWriteI2C2( i2cData[0] );  // adresse
    		IdleI2C2();
    
    		if( !I2C2STATbits.ACKSTAT )
    		{
    			MasterWriteI2C2( i2cData[1] );  // adresse du registre à lire
    			IdleI2C2();
    		}
    		
    		if( !I2C2STATbits.ACKSTAT )
    		{
    			I2C2CONbits.RSEN=1;
    			while(I2C2CONbits.RSEN);
    			
    			MasterWriteI2C2( i2cData[0] + 1 );
    			IdleI2C2();
    			if( !I2C2STATbits.ACKSTAT )
    			{
    				I2C2CONbits.RCEN = 1;
    				while(I2C2CONbits.RCEN);
    				i2cbyte = I2C2RCV;                  // lecture de la réponse
    				I2C2CONbits.ACKDT = 0;
    				I2C2CONbits.ACKEN = 1;         // NACK
    				StopI2C2();	//Send the Stop condition
    				IdleI2C2();	//Wait to complete
    				
    				// Config UART1 :
    				 _RP11R = 3;
    				_U1RXR = 12;
    				U1BRG = UART_BRG;
    				U1MODEbits.UARTEN = 1;
    				
    				while(1) // boucle de réussite
    				{
    					i2c_wait(100);
    					U1TXREG = i2cbyte;        // observation : i2cbyte est toujours nul
    					U1STAbits.UTXEN = 1;
    				}
    			}
    		}
    
    		StopI2C2();	//Send the Stop condition
    		IdleI2C2();	//Wait to complete
    	}
    }
    Si vous avez une idée pour m'aider à résoudre ce problème ... merci beaucoup.
    N'hésitez pas à me demander des précisions qui pourraient vous éclairer sur mon problème.

    Bonne journée à vous,
    Le8nard

    -----

  2. #2
    Gérard

    Re : problème de liaison I2C entre un µC PIC24FJ64GA002 et LED tricolore programmable

    Bonjour à toi et bienvenu,

    Je suis nul en C, donc je ne te serai d'aucune aide. Par contre, je voudrais bien savoir de quelle LED il est question.
    Merci d'avance.

  3. #3
    invite805ff73c

    Re : problème de liaison I2C entre un µC PIC24FJ64GA002 et LED tricolore programmable

    Gérard: https://www.sparkfun.com/products/8579

    Ca n'a probablement rien à voir mais quand même:
    U1MODEbits.UARTEN = 1;
    Si ce bit fait ce que je pense à savoir activer l'UART on fait ça une fois au début, pas dans une boucle (à moins que ce soit différent des AVR? Je ne pense pas...)

  4. #4
    Gérard

    Re : problème de liaison I2C entre un µC PIC24FJ64GA002 et LED tricolore programmable

    Miaou ...

    Merci Grosmatou.

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

    Re : problème de liaison I2C entre un µC PIC24FJ64GA002 et LED tricolore programmable

    oui bien sûr ça ne doit pas apparaître dans une boucle, mais dans ce cas il y a une boucle infinie après qui empêche de réitérer la première boucle. En tout cas ce code reste de la bidouille pour arriver à comprendre le problème que j'ai. Il me faudrait un indice pour comprendre pourquoi je ne récupère que la valeur nulle.

    Help...

  7. #6
    invite805ff73c

    Re : problème de liaison I2C entre un µC PIC24FJ64GA002 et LED tricolore programmable

    Ah désolé, je ne parle pas le PIC... Pour les 16F il y a deux bonnes AN de chez µchip, peut-être aussi pour les 24F?

  8. #7
    RISC

    Re : problème de liaison I2C entre un µC PIC24FJ64GA002 et LED tricolore programmable

    Salut,

    Quel outil de debug utilises-tu ? sous MPLAB / MPLAB X ?
    Pour ce qui concerne les PIC24F, il existe plein d'exemples de code pour les différents périphériques internes :
    http://www.microchip.com/codeexamples

    a+

  9. #8
    inviteaafe8b0e

    Re : problème de liaison I2C entre un µC PIC24FJ64GA002 et LED tricolore programmable

    j'utilise un pickit 2.
    En fait je me suis déjà aidé d'un exemple de chez microchip pour faire ce code. Tout te semble correct dans la partie réception du code ? Il doit bien y avoir une connerie de ma part, ou un oubli.

  10. #9
    invite29971eb1

    Re : problème de liaison I2C entre un µC PIC24FJ64GA002 et LED tricolore programmable

    Citation Envoyé par le8nard Voir le message
    j'utilise un pickit 2.
    En fait je me suis déjà aidé d'un exemple de chez microchip pour faire ce code. Tout te semble correct dans la partie réception du code ? Il doit bien y avoir une connerie de ma part, ou un oubli.
    Oublie les commentaires de RISC, il est là pour te vendre MplabX....

    Concernant ton problème, j'ai bien envie de te dire RTFM (je te laisse regarder la définition sur Google si tu ne connais pas).

    Par défaut, l'adresse de I²C de ta led est 0x09. Toi, tu l'adresses via 0x00 qui est une adresse de broadcast, autrement dit une adresse qui permet de commander toutes les leds présentes sur le bus mais ou logiquement (pour éviter les conflits), aucune ne doit répondre.

    Ré-essaie avec la bonne adresse et on en reparle

  11. #10
    inviteaafe8b0e

    Re : problème de liaison I2C entre un µC PIC24FJ64GA002 et LED tricolore programmable

    oui j'ai déjà essayé avec 0x09 et ça donne la même chose, une réponse nulle.

  12. #11
    Gérard

    Re : problème de liaison I2C entre un µC PIC24FJ64GA002 et LED tricolore programmable

    Citation Envoyé par ftorama Voir le message
    Oublie les commentaires de RISC, il est là pour te vendre MplabX....

    ...
    Je ne suis pas fan de MPLAB X mais RISC ne vend rien, c'est gratuit ...



    J'avais aussi pensé au problème d'adresse que tu soulèves mais d'après la réponse, ce n'est pas ça.

  13. #12
    Gérard

    Re : problème de liaison I2C entre un µC PIC24FJ64GA002 et LED tricolore programmable

    Citation Envoyé par le8nard Voir le message
    oui j'ai déjà essayé avec 0x09 et ça donne la même chose, une réponse nulle.
    Regarde page 17 et 18 de la doc, la réponse est presque toujours 0.

    La commande ci-dessous renvoie "3"
    Get Current RGB Color g 0x67 0 3 {‘g’}

  14. #13
    inviteaafe8b0e

    Re : problème de liaison I2C entre un µC PIC24FJ64GA002 et LED tricolore programmable

    Non je pense que tu te trompes : la colonne avec presque que des zéros c'est le nombre de réponses. Avec la commande 'g', il y a 3 réponses : le rouge, le vert et le bleu.

  15. #14
    Gérard

    Re : problème de liaison I2C entre un µC PIC24FJ64GA002 et LED tricolore programmable

    Citation Envoyé par le8nard Voir le message
    Non je pense que tu te trompes : la colonne avec presque que des zéros c'est le nombre de réponses. Avec la commande 'g', il y a 3 réponses : le rouge, le vert et le bleu.
    Tu as raison, j'ai relu la doc.
    Donc si tu as 3 réponses, tu dois bien observer quelque chose.

Discussions similaires

  1. PIC24FJ64GA002 pb bouton
    Par invite84109e98 dans le forum Électronique
    Réponses: 6
    Dernier message: 05/11/2009, 14h58
  2. quelle est la difference entre liaison gamma et liaison pi?
    Par inviteefe0f63c dans le forum Chimie
    Réponses: 1
    Dernier message: 01/11/2009, 15h06
  3. liaison entre ITE et isolant entre chevrons
    Par invitedd01c3f0 dans le forum Habitat bioclimatique, isolation et chauffage
    Réponses: 8
    Dernier message: 15/07/2009, 15h47
  4. choix entre un automate programmable et un microprocesseur
    Par invite57acee33 dans le forum TPE / TIPE et autres travaux
    Réponses: 0
    Dernier message: 10/04/2007, 12h11
  5. probléme de liaison entre pic et rs232
    Par invite8eaf98b9 dans le forum Électronique
    Réponses: 2
    Dernier message: 14/11/2006, 20h43
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...