Liaison I2C entre deux PIC (Maître -Esclace)
Répondre à la discussion
Affichage des résultats 1 à 4 sur 4

Liaison I2C entre deux PIC (Maître -Esclace)



  1. #1
    invite0c16129b

    Liaison I2C entre deux PIC (Maître -Esclace)


    ------

    Bonjour à vous!

    Je viens vers vous car j'essais de réaliser une liaison I2C entre deux PIC (l'un étant le maître et aurra la fonction "d'interrupteur", et l'autre sera l'escalve et allumera des leds en fonction des ordres du maître)
    Mon problème est que sa ne marche pas! Et pourtant j'ai pris exemple sur la doc de CCS!
    Je travail sous MPLAB avec CCS en C. Voici mes codes:
    Maître :
    #include <18F4685.h>
    #use delay(clock=20000000)
    #fuses H4,NOWDT,NOPROTECT,NOLVP
    #use I2C(master, sda=PIN_C4, scl=PIN_C3,FORCE_HW)
    void main()
    {
    unsigned int1 tmp=1;
    output_a(0x00);
    output_b(0x00);
    output_c(0x00);
    output_d(0x00);
    while (1)
    {
    if(input_state(PIN_A4) == 1)
    {
    output_bit(PIN_A1,1);
    i2c_start(); // Start condition
    i2c_write(0xa0);// Device address
    i2c_write(0x22); //ON
    i2c_stop(); // Stop condition
    output_bit(PIN_A1,0);
    }
    else{
    if(input_state(PIN_A5) == 1)
    {
    output_bit(PIN_A2,1);
    i2c_start(); // Start condition
    i2c_write(0xa0);// Device address
    i2c_write(0x33); //OFF
    i2c_stop(); // Stop condition
    output_bit(PIN_A2,0);
    }
    }
    if(input_state(PIN_B4) == 1)
    {
    output_bit(PIN_A0,tmp);
    delay_ms(300);
    tmp = !tmp;
    }
    }
    }
    Esclave :
    #include <16F887.h>
    #use delay (clock = 20000000)
    #use I2C(slave,sda=PIN_C4,scl=PIN_C 3,address=0xa0,FORCE_HW,RESTAR T_WDT)
    #fuses HS,NOWDT,NOPROTECT,NOLVP

    unsigned char data1=0x00,state;
    void main() {
    unsigned int1 etat2=1,etat3=0;
    output_a(0x00);
    output_b(0x00);
    output_c(0x00);
    output_d(0x00);

    while(1){
    output_bit(PIN_A0,1);
    i2c_start();
    i2c_write(0xa1);//aquitement mais je ne sais pas ou le gérer
    data1 = i2c_read();
    i2c_stop();

    if(data1 == 0x22)
    {
    output_bit(PIN_A1,1);
    output_bit(PIN_A2,1);
    delay_ms(100);
    }
    else if(data1 == 0x33)
    {
    output_bit(PIN_A1,0);
    delay_ms(100);
    }
    else if(data1 == 0x00)
    {
    output_bit(PIN_A1,1);
    output_bit(PIN_A2,1);
    delay_ms(100);
    }
    }
    }
    A première vu, ce code est-il correct?

    Je vous remerci d'avance pour vos réponse, et j'esper vraiment pouvoir trouver une solution à mon problème!

    -----

  2. #2
    Seb.26

    Re : Liaison I2C entre deux PIC (Maître -Esclace)

    utilise la balise [C0DE] et [/C0DE] ... sinon, c'est illisible ... c'est le # dans le menu !
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  3. #3
    invite0c16129b

    Re : Liaison I2C entre deux PIC (Maître -Esclace)

    Merci pour le conseil!
    Maître:
    Code:
    #include <18F4685.h>
    #use delay(clock=20000000) 
    #fuses H4,NOWDT,NOPROTECT,NOLVP
    #use I2C(master, sda=PIN_C4, scl=PIN_C3,FORCE_HW)
    void main()
    {	
    unsigned int1 tmp=1;
    unsigned char AC;//aquitment de l'esclave
    output_a(0x00);
    output_b(0x00);
    output_c(0x00);
    output_d(0x00);
    	while (1)
    	{		
    		if(input_state(PIN_A4) == 1)
    		{
    			output_bit(PIN_A1,1);
    			i2c_start();    // Start condition
    			i2c_write(0xa0);// Device address
    			AC = i2c_read();
    			if(AC == 0xa1)
    			{
    				i2c_write(0x22);	//ON
    			}
    			i2c_stop();     // Stop condition	
    			output_bit(PIN_A1,0);
    			delay_ms(100);
    		}
    		else{
    			if(input_state(PIN_A5) == 1)
    			{
    				output_bit(PIN_A2,1);
    				i2c_start();    // Start condition
    				AC = i2c_read();
    				if(AC == 0xa1)
    				{
    				i2c_write(0xa0);// Device address
    				i2c_write(0x33);	//OFF
    				}
    				i2c_stop();     // Stop condition	
    				output_bit(PIN_A2,0);
    			}
    		}
    		if(input_state(PIN_B4) == 1)
    		{
    			output_bit(PIN_A0,tmp);
    			delay_ms(300);
    			tmp = !tmp;	
    		}
    	}
    }
    Esclave
    Code:
    #include <16F887.h>
    #use delay (clock = 20000000)
    #use I2C(slave,sda=PIN_C4,scl=PIN_C3,address=0xa0,FORCE_HW,RESTART_WDT)
    #fuses HS,NOWDT,NOPROTECT,NOLVP
    
    unsigned char data1=0x00,state;
    
    void main() {
    
    unsigned int1 etat2=1,etat3=0;
    
    output_a(0x00);
    output_b(0x00);
    output_c(0x00);
    output_d(0x00);
    	while(1){		
    		output_bit(PIN_A0,1);
    
    		i2c_start();
    		i2c_write(0xa1);
    		data1 = i2c_read();
    		i2c_stop();
    		
    		if(data1 == 0x22)
    		{
    			output_bit(PIN_A1,1);
    			output_bit(PIN_A2,1);
    			delay_ms(100);  
    		}
    		else if(data1 == 0x33)
    		{
    			output_bit(PIN_A1,0);
    			delay_ms(100);  
    		}
    		else if(data1 == 0x00)
    		{
    			output_bit(PIN_A1,1);
    			output_bit(PIN_A2,1);
    			delay_ms(100);
    		}
    		output_bit(PIN_A0,0);
    		delay_ms(100);
    	}	
    }

  4. #4
    invite0c16129b

    Re : Liaison I2C entre deux PIC (Maître -Esclace)

    Voila, j'ai impeu avancé!
    A présent la communication fonctionne (test sous ISIS) mais lorsque je récuper la donnée transmise, je me rand compte que ma variable qui prend normalement la valeur de la donnée (DATA), prend la valeur de l'adresse de l'esclave (soit 0xA2)!!!
    Avez-vous une explication?
    Maitre:
    Code:
    #include <18F4685.h>
    #use delay(clock=20000000) 
    
    #fuses H4,NOWDT,NOPROTECT,NOLVP
    #use I2C(master, sda=PIN_C4, scl=PIN_C3,RESTART_WDT)//,stream=i2cM)
    
    //// aide
    //// http://www.developpez.net/forums/d694257/c-cpp/c/bus-i2c-compilateur-c-ccs/
    //// http://www.botdream.com/blog/2008/02/01/testing-pic-code-for-i2c-masterslave-communication-2/
    ////
    
    void send_i2c(BYTE NumSlave, BYTE data) 
    { 
    	i2c_start();//i2cM);               //begin transmission 
    	i2c_write(NumSlave); //          //select address of device to communicate with 
    	i2c_write(data);       //    //send actual data 
    	i2c_write(data);
    	i2c_stop();//i2cM);                //terminate communication   
    	delay_ms(10);             //debouncing delay                  
    }
    
    void main()
    {	
    	setup_adc_ports(NO_ANALOGS); 
    	setup_adc(ADC_OFF); 
    	setup_psp(PSP_DISABLED); 
    	//set_tris_a(0xFF);    
    	//set_tris_b(0xFF); 
    	set_tris_c(0b10111111); 
    	setup_comparator(NC_NC_NC_NC);
    	setup_vref(FALSE);
    	while (1)
    	{	
    		send_i2c(0xA2, 0x33);  	//NumSlave,Data      		          
    		delay_ms(5); 
    	} 
    }
    Esclave
    Code:
    #include <18F4685.h>
    
    //#device adc=8 
    #use delay(clock=20000000) 
    #fuses H4,NOWDT,NOPROTECT,NOLVP
    
    #use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, address=0xA2, FORCE_HW,RESTART_WDT)//, stream = i2cS)
    
    
    BYTE DATA = 0x00,INCOM,state,address;          
    #INT_SSP NOCLEAR
    void ssp_interupt ()
    {
    	clear_interrupt(int_SSP);
    	state = i2c_isr_state();//);
    
    	if(state < 0x80) //le maitre est entrain d'envoyé des donnée
    		{
    			if(state == 0) //premier octet réçue est l'adresse de l'esclave
    			{ // output_high(LED);
    			}
    			if(state == 1) //second octet réçue est l'adresse
    			{
    				INCOM = i2c_read();
    				DATA = INCOM;
    			}
    		}
    	  if(state == 0x80)  //Master is requesting data
    		{
    			i2c_write (DATA);
    		}
    }
    
    void main() {
    
    //unsigned int1 etat2=1,etat3=0;
    set_tris_c(0xFF); 
    enable_interrupts(INT_SSP); //enable I2C interrupts
    enable_interrupts(GLOBAL);
    
    	while(1){
    		
    		output_bit(PIN_A0,1);		
    		output_d(DATA);
    
    		if(DATA == 0x33)
    		{
    			output_bit(PIN_A1,1);
    			output_bit(PIN_A2,1);
    			delay_ms(200);
    			output_bit(PIN_A1,0);
    			output_bit(PIN_A2,0);  
    		}
    		DATA = 0; 
    	}
    }
    Je vous remercie d'avance pour votre aide!!!

  5. A voir en vidéo sur Futura

Discussions similaires

  1. Transaction I2C entre deux pics 18f4550 (maître-esclave)
    Par invite29cca51d dans le forum Électronique
    Réponses: 9
    Dernier message: 12/04/2011, 15h17
  2. PIC 18F4620 Conflit entre I2C et PWM
    Par invite79d00d4d dans le forum Électronique
    Réponses: 9
    Dernier message: 06/02/2010, 19h34
  3. Probleme liaison I2C PIC 16F877
    Par invitecd367060 dans le forum Électronique
    Réponses: 8
    Dernier message: 18/03/2009, 08h17
  4. Communication I2C entre 3 pic 16f876
    Par invitee092e9a2 dans le forum Électronique
    Réponses: 0
    Dernier message: 07/04/2008, 19h40
  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...