Communication I2C : Master & 5 Slaves
Répondre à la discussion
Affichage des résultats 1 à 7 sur 7

Communication I2C : Master & 5 Slaves



  1. #1
    invite70684c77

    Communication I2C : Master & 5 Slaves


    ------

    Bonjour à Tous,

    J'ai un projet qui consiste entre autre à une communication entre un Master et 5 Slaves. pour le moment mes tests portent sur un Master et 2 slaves uniquements.

    Mon problème est le suivant: un seul slave uniquement qui réçoit les données du master ( confirmé par affichage sur LCD des données réçues et LED ).

    Mon compilateur est CCS.

    démarche Code Master :

    start;
    envoi adresse "slave_1" ayant comme adresse 0xA0;
    envoi adresse interne de variable;
    envoi de la donnée;
    stop;

    start;
    envoi adresse "slave_2" ayant comme adresse 0xB0;
    envoi adresse interne de variable;
    envoi de la donnée;
    stop;

    et en résultat je ne trouve que la donnée envoyée au slave_1, par contre si je permute l'ordre d'envoi càd slave_2 avant slave_1 je récoit la donnée envoyée au slave_2.


    merci pour toute intervention et bonne journée pour tous.

    -----

  2. #2
    invited02d59f3

    Re : Communication I2C : Master & 5 Slaves

    il faut tester la ligne avant un envoie
    le slave un recoit puis bloque la ligne pour traiter les info
    et toi a se moment la tu essai de communiquer avec slave 2
    si tu ne sais pas comment tester la ligne met une tempo pour verifier la source du probleme

  3. #3
    invite70684c77

    Re : Communication I2C : Master & 5 Slaves

    Merci beaucoup pour votre intervention,

    Si j'ai bien compris je fais un delay_ms(5000) par exemple chaque fois que je vais changer le slave, est ce délai et largement suffisant pour le traitement commencé par le slave N°1 ???

    Merci

  4. #4
    invited02d59f3

    Re : Communication I2C : Master & 5 Slaves

    oui se delay devrai sufir

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

    Re : Communication I2C : Master & 5 Slaves

    Bonjour ,

    J'ai essayé avec un delay_ms(500) entre l'envoi par le Master aux slave_1 et Slave_2. mais n'as pas marché.

    Voici les code Master, slave_1 et slave_2.


    Mon problème est le suivant: un seul slave uniquement qui réçoit les données du master ( confirmé par affichage sur LCD des données réçues et LED ).



    et en résultat je ne trouve que la donnée envoyée au slave_1, par contre si je permute l'ordre d'envoi( chez lE master) càd slave_2 avant slave_1 je récoit la donnée envoyée au slave_2.




    1- Code Master :
    #include <16F876A.h>
    #device adc=8
    #use delay(clock=4000000)
    #fuses NOWDT,XT, NOPUT, NOPROTECT, NODEBUG, BROWNOUT, NOLVP, NOCPD, NOWRT
    #use i2c(Master,sda=PIN_C4,scl=PIN_ C3,RESTART_WDT)
    #include "D:\A_Projets Electroniques\I2C_Communicatio ns\PCW_Master_Communication.h"

    void main()
    {
    int8 sec,min,hour,day,date=19,month =11,year=2009;
    int16 jour_RTC;
    int16 N_jour=300,BPFA_N_jour,BPFO_N_ jour,BPFA1_N_jour,BPFO1_N_jour ;
    int8 heure=0;

    setup_adc_ports(NO_ANALOGS);
    setup_adc(ADC_OFF);
    setup_timer_0(RTCC_INTERNAL|RT CC_DIV_1);
    setup_timer_1(T1_DISABLED);
    setup_timer_2(T2_DISABLED,0,1) ;
    setup_comparator(NC_NC_NC_NC);
    setup_vref(FALSE);

    set_tris_A(0b0000011);
    delay_ms(2000);


    // Envoi de "jour_RTC" aux Slaves:------------------------------------------------------------------


    jour_RTC=(month*275/9)-((month+9)/12)*(1+ ((year-4* (year/4)+2)/3))+date-30;

    if (jour_RTC>255) {BPFA_N_jour=255;BPFO_N_jour=j our_RTC-256;} // BPFA_jour_RTC= Les 8 premiers Bits de la variable Jour_RTC
    else {BPFA_N_jour=jour_RTC;BPFO_N_j our=0;}
    i2c_start();
    i2c_write(0xB0); // adresse "Slave_1:B0" + mode écriture
    i2c_write(&BPFA_N_jour); // adresse interne slave = Les premiers 8 bits
    i2c_write(BPFA_N_jour); // donnée à écrire
    i2c_write(&BPFO_N_jour); // adresse interne slave = Les Seconds 8 bits
    i2c_write(BPFO_N_jour); // donnée à écrire
    i2c_stop();


    i2c_start();
    i2c_write(0x02); // adresse "Slave_2" + mode écriture
    i2c_write(&BPFA1_N_jour); // adresse interne slave = Les premiers 8 bits
    i2c_write(255); // donnée à écrire
    i2c_write(&BPFO1_N_jour); // adresse interne slave = Les Seconds 8 bits
    i2c_write(40); // donnée à écrire
    i2c_stop();

    delay_ms(50);

    }

    Code Slave_1 :

    #include <16F876A.h>
    #device adc=8
    #use delay(clock=4000000)
    #fuses NOWDT,XT, NOPUT, NOPROTECT, NODEBUG, BROWNOUT, NOLVP, NOCPD, NOWRT
    #use i2c(Slave,sda=PIN_C4,scl=PIN_C 3,address=0xB0,FORCE_HW,RESTAR T_WDT)
    #include "D:\A_Projets Electroniques\I2C_Communicatio ns\PCW_Slave_Communication.h"
    #define use_portb_lcd TRUE
    #include "C:\Program Files\PICC\Drivers\i2c_isr_sta te.c"
    #include <LCD.c>


    int8 N_jour,jour_RTC,BPFA_N_jour,BP FO_N_jour;
    int8 heure;
    BYTE incoming, state;
    int8 incoming1;

    #int_SSP
    void ssp_interupt (){

    state = i2c_isr_state();

    if(state <= 0x80) //Master is sending data
    {
    incoming = i2c_read();
    if(state == 0)
    { }
    if(state == 1) //First received byte is address
    {
    BPFA_N_jour=incoming;
    }

    if(state == 2) //Second received byte is data
    { incoming = i2c_read();
    BPFO_N_jour=incoming;

    N_jour=BPFA_N_jour+BPFO_N_jour ;
    if (N_jour==322) output_high(PIN_A0);
    lcd_gotoxy(1,1); printf(lcd_putc,"BPFA_N_jour:% u",BPFA_N_jour); lcd_gotoxy(1,2); printf(lcd_putc,"BPFO_N_jour:% u",BPFO_N_jour);
    }

    }
    if(state == 0x80) //Master is requesting data
    {
    // i2c_write(buffer[address]);
    }

    }

    void main()
    {

    setup_adc_ports(NO_ANALOGS);
    setup_adc(ADC_OFF);
    setup_timer_0(RTCC_INTERNAL|RT CC_DIV_1);
    setup_timer_1(T1_DISABLED);
    setup_timer_2(T2_DISABLED,0,1) ;
    setup_comparator(NC_NC_NC_NC);
    setup_vref(FALSE);
    enable_interrupts(INT_SSP);
    enable_interrupts(GLOBAL);

    lcd_init();

    while (TRUE) { }


    }

    Code Slave_2:
    #include <16F876A.h>
    #device adc=8
    #use delay(clock=4000000)
    #fuses NOWDT,XT, NOPUT, NOPROTECT, NODEBUG, BROWNOUT, NOLVP, NOCPD, NOWRT
    #use i2c(Slave,sda=PIN_C4,scl=PIN_C 3,address=0x02,FORCE_HW,RESTAR T_WDT)
    #include "D:\A_Projets Electroniques\I2C_Communicatio ns\PCW_Slave_DUHR.h"
    #define use_portb_lcd TRUE
    #include "C:\Program Files\PICC\Drivers\i2c_isr_sta te.c"
    #include <LCD.c>

    int8 N_jour,jour_RTC,BPFA_N_jour,BP FO_N_jour,BPFA1_N_jour,BPFO1_N _jour;
    int8 heure,adress_slave;
    BYTE incoming, state;

    #int_SSP
    void ssp_interupt (){

    state = i2c_isr_state();

    if(state <= 0x80) //Master is sending data
    {

    incoming = i2c_read();

    if(state ==0 ) //First received byte is address
    {
    }

    if(state ==1 ) //First received byte is address
    {
    BPFA1_N_jour=incoming;
    }

    if(state == 2) //Second received byte is data
    { incoming = i2c_read();
    BPFO1_N_jour=incoming;
    N_jour=BPFA1_N_jour+BPFO1_N_jo ur;
    if (N_jour==295) output_high(PIN_A1);
    lcd_gotoxy(1,1); printf(lcd_putc,"adress_slave: %u",adress_slave);
    lcd_gotoxy(1,2); printf(lcd_putc,"BPFO1_N_jour: %u",BPFO1_N_jour);
    }

    }
    if(state == 0x80) //Master is requesting data
    {
    // i2c_write(buffer[address]);
    }


    }

    void main()
    {

    setup_adc_ports(NO_ANALOGS);
    setup_adc(ADC_OFF);
    setup_timer_0(RTCC_INTERNAL|RT CC_DIV_1);
    setup_timer_1(T1_DISABLED);
    setup_timer_2(T2_DISABLED,0,1) ;
    setup_comparator(NC_NC_NC_NC);
    setup_vref(FALSE);
    enable_interrupts(INT_SSP);
    enable_interrupts(GLOBAL);

    lcd_init();

    while (TRUE) { }

    }


    NB/ j'attire votre attention aussi que lorsque j'ai fait un test sur le changement de niveau de la broche C3 (SCL) du slave qui n'est pas entrain de récevoir les données : résultat : pas de changement ( càd dans la routine d'interruption INT_SSP : si (Input(PIN_C3) != 1) OUTPUT_HIGH (LED) : le LED ne s'allume pas donc si comme si pas d'interruption dans le 2 ème Slave.)

    Voulez vous m'assister svp car j'ai passé pas mal des nuits à résoudre ce problème et aucun résultat satisfaisant.

    Merci Pour Tous et Bonne journée.
    Images attachées Images attachées  

  7. #6
    invited02d59f3

    Re : Communication I2C : Master & 5 Slaves

    mes competence s'arrete la je programme en ASM

    sinon just une presicision lorsque tu mes tes code source sur le forum mes les balise programme c'est plus agreable a lire
    et le pense que tu aura plus de reponse

  8. #7
    invited02d59f3

    Re : Communication I2C : Master & 5 Slaves

    just comme sa ?
    teste la ligne avant chaque essai se communocation les erreur sont souvent la

Discussions similaires

  1. communication I2c pic 16F88
    Par invite4dafc5cd dans le forum Électronique
    Réponses: 0
    Dernier message: 22/04/2009, 13h47
  2. Problème de communication I2C
    Par invite414f05fd dans le forum Électronique
    Réponses: 7
    Dernier message: 02/05/2008, 20h54
  3. Communication I2C entre 3 pic 16f876
    Par invitee092e9a2 dans le forum Électronique
    Réponses: 0
    Dernier message: 07/04/2008, 19h40
  4. USART 1 Master pour 6 Slaves?
    Par invitebd358db9 dans le forum Électronique
    Réponses: 8
    Dernier message: 06/03/2008, 13h40
  5. communication i2c entre deux pics
    Par invite45c27900 dans le forum Électronique
    Réponses: 2
    Dernier message: 02/11/2007, 23h56
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...