Led toujours allumé.. et toujours eteinte!pic

Mik3fly -  
 Mik3fly -
Bonjour,

Je dispose de trois pic, relié en i2C avec un quartz a 20mhz, j'utilise mplab v8.53 et un pickit2

J'ai donc trois 18f4685 relié en i2c, un maitre, et deux esclaves, mon programme est simple

sur le maitre, je dispose de 4 bouton (BT0:BT3) et de 4 LEDs (LED0:LED3), et selon, le bouton appuyé, une valeur différente est envoyée sur les deux pics, et celle-ci s'affiche via 8 DEL

Mon 1er problème : sur les deux esclaves, sur le PORTB, j'ai 8 LEDs, la DEL RB6 est toujours allumé quelque sois la valeur envoyé, et ceci sur les deux pics, alors que la valeur par défaut est 0x1F,(quand aucun bouton est appuyé) sinon, les valeurs attribués aux boutons, commence à 0x01 et termine à 0x04.. (et elle s'affiche correctement à part pour..)

***Mon 2éme problème,
Et bien sur le maitre,.. quand j'appuie sur le bouton RB1(BT1).. la led (LED1) ne s'allume pas, et la valeur n'est pas envoyé.. puisque je n'ai aucun changement sur les esclaves.
***

EDIT, le deuxiéme probléme était une erreur de configuration du registre ADCON1 qui avant été a 0x06, et que je viens de passé a 0x0F :)
Je n'y comprends rien!!

Voici mon codee

#define TRIS_RC3  TRISCbits.TRISC3 
#define TRIS_RC4  TRISCbits.TRISC4 
#define LED0  LATDbits.LATD4 
#define LED1  LATDbits.LATD5 
#define LED2  LATDbits.LATD6 
#define LED3   LATDbits.LATD7 
#define BT0   PORTBbits.RB0 
#define BT1   PORTBbits.RB1 
#define BT2   PORTBbits.RB2 
#define BT3   PORTBbits.RB3 


int genre=0; 
int val_btn=0; 


unsigned char Send_Data(unsigned char addr, unsigned char data) 
{ 
        IdleI2C(); 
        StartI2C(); 
        IdleI2C(); 
        WriteI2C(addr&0xFE); // envoie de l'adresse, + bit écriture 
        IdleI2C(); 
        if ( SSPCON2bits.ACKSTAT )  // si ack absent 
        { 
             StopI2C(); 
             return 0;            // le bus not ack 
      }                         
        WriteI2C(data); // envoie de l'octet 
        IdleI2C(); 
        if ( SSPCON2bits.ACKSTAT )  // si ack absent 
  { 
            StopI2C(); 
            return 0;            // le bus not ack 
     }                         
        StopI2C(); 
        return 1; 
} 

void Select_cap(void) 
{ 
 LATD=0x00; 
 genre=0x1F; 
 if(BT0||BT1||BT2||BT3)  
 { 
  if(BT0) {genre=0x01;LED0=1;} 
  else{genre=genre;LED0=0;} 
  if(BT1) {genre=0x02;LED1=1;} 
  else{genre=genre;LED1=0;} 
  if(BT2) {genre=0x03;LED2=1;} 
  else{genre=genre;LED2=0;} 
  if(BT3) {genre=0x04;LED3=1;} 
  else{genre=genre;LED3=0;} 
 } 
 else{genre=0x1F;} 

} 

void init_main(void) 
{ 
  TRISB=0xF; // RB7, RB6, RB5, RB4 en entrée; 
  TRISD=0x00; // Sortie; 
  PORTD=0x00; // Valeur PORTD = 0; 
  PORTB=0x00; // Valeur PORTB = 0; 
  LATD=0x00; // Mise a zero des sorties D; 
        ADCON1=0x0F; // AN0:AN11 = Ports Digitaux; 
        TRIS_RC3 = 1; 
        TRIS_RC4 = 1; 
        OpenI2C(MASTER, SLEW_OFF); 
        SSPADD = 49;  //100KHz sous 20MHz 

} 

void main (void) 
{ 
         
  init_main(); 
        while(1) 
        { 
   Select_cap(); 
   Send_Data(0x40, genre); 
   Send_Data(0x42, genre);      
        } 
}                                           

2 réponses

Mik3fly
 
Sur le deuxième pic esclave , la LED RB6 et RB1 reste constamment allumé, sur le premier pic esclave, seulement la led RB6... :/ je n'y comprends rien

Aprés une petite recherche, le multiplexage n'y ai pour rien :/
0
Mik3fly
 
Bon et bien j'ai trouvé l'erreur, mais la "solution" que j'ai trouvé ne me plait pas..

coté esclave, j'ai avait indiqué, que dés qu'une donnée est transmise, qu'elle soit affiché sur le PORTB..

et bien avec l'adresse 40 et 42, et quand j'envoyé par exemple la valeur 1 sur les esclave, j'avais pour l'esclave a l'adresse 42 le port RB6 et RB1, et l'esclave 40, seulement le port RB6, quand RB6 est allumé, c'est a dire que la valeur envoyé est 32... et RB1 = 2..

j'ai donc fait un if sur les esclaves, pour mettre a
0 le portB si la valeur transmise était égale au SSPADD du pic esclave.. et ça marche, seulement, si je veux envoyé la valeur 40 ou 42 sur ces esclaves, je ne pourrai pas !! c'est du bricolage !! personne n'a une idée ??
0