TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: joseluislo12 en 31 de Marzo de 2017, 18:42:46

Título: i2c (CCS + Proteus)
Publicado por: joseluislo12 en 31 de Marzo de 2017, 18:42:46
Buenos días

Tengo una inquietud con la implementación del protocolo i2c en proteus.

Tengo el siguiente código para el PIC master:

Código: [Seleccionar]
#include <16F1827.h>
#fuses XT,PUT,NOPROTECT,BROWNOUT,NOLVP,NOWDT
#use delay(clock = 32M)
#use i2c(MASTER, FAST, SDA = PIN_B1, SCL = PIN_B4, NOFORCE_SW)

int a,i = 0;

void envio_I2C(){
   if(input(PIN_A6)){a = 0xA0;}
   else{a = 0xB0;}
   
   i2c_start();
   i2c_write(a);
   i2c_write(i);
   i2c_stop();
   
}

void main(){
   output_LOW(PIN_B5);
   
   while(true){
      if(!input(PIN_A0)){
         while(!input(PIN_A0)){;}
         i = 1;
         envio_I2C();
         output_toggle(PIN_B5);
      }
      if(!input(PIN_A1)){
         while(!input(PIN_A1)){;}
         i = 2;
         envio_I2C();
         output_toggle(PIN_B5);
      }
      if(!input(PIN_A2)){
         while(!input(PIN_A2)){;}
         i = 3;
         envio_I2C();
         output_toggle(PIN_B5);
      }
   }
}

Y para los PIC esclavos el siguiente:

Código: [Seleccionar]
#include <16F1827.h>
#fuses XT,PUT,NOPROTECT,BROWNOUT,NOLVP,NOWDT
#use delay(clock = 32M)

#INT_SSP
void ssp_interupt(){   
   unsigned int8 incoming, state;

   state = i2c_isr_state();
   
   if(state != 0x80){
      incoming = i2c_read();
      if(state == 1){
         switch(incoming){
            case 1:
               output_HIGH(PIN_A0);
            break;
            case 2:
               output_LOW(PIN_A0);
            break;
            case 3:
               output_TOGGLE(PIN_A0);
            break;
         }
      }
   }
}

void main(){
   enable_interrupts(INT_SSP);
   enable_interrupts(GLOBAL);
   
   while(true){
   }
}

Para el esclavo uno tengo

Código: [Seleccionar]
#use i2c(SLAVE, FAST, SDA = PIN_B1, SCL = PIN_B4, NOFORCE_SW, [b]ADDRESS = 0xA0[/b])
y para el esclavo dos tengo

Código: [Seleccionar]
#use i2c(SLAVE, FAST, SDA = PIN_B1, SCL = PIN_B4, NOFORCE_SW, [b]ADDRESS = 0xB0[/b])
En proteus tengo la siguiente simulación:

(http://www.todopic.com.ar/foros/imgtiny/b4joz9.png)

El problema que tengo es que funciona correctamente solo cuando conecto el I2C DEBUGGER de proteus al bus. Si no lo tengo conectado no funciona.
Quisiera saber por qué puede estar sucediendo esto.
Título: Re:i2c (CCS + Proteus)
Publicado por: KILLERJC en 31 de Marzo de 2017, 19:10:32
1K8 me parece poco para el pull-up. Pero no creo que afecte en la simulacion.

Y por lo que comentas parece ser un error del Proteus.