Autor Tema: i2c (CCS + Proteus)  (Leído 1529 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado joseluislo12

  • PIC10
  • *
  • Mensajes: 20
i2c (CCS + Proteus)
« 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:



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.
« Última modificación: 31 de Marzo de 2017, 19:00:57 por joseluislo12 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:i2c (CCS + Proteus)
« Respuesta #1 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.


 

anything