Microcontrolador se puede comportar como maestro y esclavo a la vez ?

que tal foreros, pues aqui pidiendo su ayuda de nueva cuenta, mi pregunta es si un microcontrolador puede desempeñar la función de maestro y esclavo a la vez con la comunicación I2C, y si es así me podrían decir como debo escribir esas lineas de código por favor,
 
Lo de "a la vez" es medio confuso, o mejor dicho imposible, ya que I2C tiene una unica linea de datos por lo que no puede, un solo micro, transmitir y recibir a la vez. O transmite, o recibe... Pero si, un micro puede ser maestro del bus en un momento dado, y esclavo en otro momento.

De esa pregunta, saltar directamente a como seria el codigo (sin aclarar lenguaje ni modelo de micro como ya te dijo Scooter) es como preguntar como se mantiene parado un bebe... para inscribirlo en una Maraton.
 
Última edición:
Uso I2C pero no como maestro y esclavo a la vez, lo que querés hacer es usar I2C multi master.
De lo que recuerdo (y por ende susceptible error), en I2C multi master el dispositivo que pretende ser el maestro busca fijar la condición de start, luego lee la línea para ver si efectivamente el bus quedó en condición de start, y de ser así puede transferir 1 byte. Puede dejar de ser maestro en el ciclo de acknowledge lo que se conoce como "arbitration loss". Algo así...
Los módulos USCIB de los msp430 pueden trabajar en multimaster, no sé los módulos de otros micros.
 
jeje perdón, no agregue mucha información y como dice chclau, "a la vez" no quería que pensaran que el pic se desempeña como maestro y esclavo en el mismo instante, no, sino que en un mismo pic pueda tener maestro y esclavo, en si esta es la jerarquia que quiero:

PIC1(maestro)------PIC2(esclavo de PIC1 y maestro de DS1307)--------DS 1307

y pues los pics que estoy usando son 16f887 y el lenguaje es picC
 
Puedes utilizar una línea I2C entre PIC1 y PIC2 y otra, si tu microcontrolador lo permite, entre PIC2 y DS1307.
También, como te han dicho, puedes utilizar el modo multimaster, donde todos comparten la misma línea I2C. En este caso deberás utilizar una librería más compleja.
 
mmmm, de que forma podria hacerlo, porque en este caso, ya tengo ambas partes pero por separado, ya tengo el programa que ejecuta el reloj del DS1307, y ya tengo un código que envia datos entre un dos pics por i2c, la pregunta es como puedo hacer uso del multimaster o tambien si me puedes decir que gama de pics pueden tener dos lineas distintas de i2c, en serio me esta siendo de gran ayuda lo que he aprendido con ustedes
 
Mira, yo uso el PIC C Compiler, el que tiene el compilador CCS, lo que puedes hacer es comunicar el PIC2 al DS1307 con I2C o como lo estes haciendo, y comunicar el PIC1 con el PIC2 a través de la USART o mejor conocido como RS232, el pic 16f877 soporta esa comunicación, y su configuración es muy sencilla con este compilador, si te interesa me dices, si no me la se, pues nos enredamos los dos jajajajaja... espero haberte ayudado.
 
No pues te tengo que decir otro dato entonces, el pic que quiero que funcione como esclavo-maestro pues no puede usar la usart para comunicarse con el otro pic, porque por ahi estoy uso de esa salida para comunicar el pic con otra cosa. o sea que tengo que hacer lo comunicacion de los dos pic y el reloj a fuerza por el I2C
 
Entiendo... bueno otra alternativa seria que comunicaras el PIC2 al DS1307 con I2C o como lo estes haciendo, y comunicar el PIC1 con el PIC2 a través del protocolo SPI. Este pic soporta por hardware este protocolo, ya sería que lo configuraras para ambos pics y entablaras una comunicación entre ambos; yo jamás he usado este protocolo, entonces no puedo ayudarte con ello.
 
¿Algún compañero del foro me podría decir por qué este código no me recibe nada?
No hace nada cuando recibe datos por I2C ¿Qué le hará falta?
Porque lo hago con i2c_poll() y no tengo problemas, pero cuando quiero usar el isr_state() no me hace nada.
¿Qué le podría estar faltando?
Espero me puedan brindar su ayuda.

Código:
#include <16f887.h>
#fuses PUT,NOWDT,NOPROTECT,INTRC_IO//#FUSES XT, NOPROTECT, BROWNOUT, NOLVP, NOWDT
#USE delay(clock=4000000)
#USE i2c(SLAVE, SDA=PIN_C4, SLOW, SCL=PIN_C3, ADDRESS=0XA0, NOFORCE_SW)

#byte TRISA=0x85
#byte PORTA=0x05

int flag=0, valor=0;

#INT_SSP
   void serial(){
      int llegada;
      byte estado;
      estado= i2c_isr_state();
      if(estado < 0x80){                         //Master esta enviando datos
               if(estado == 0){//Se recibe dato
                  }
               if(estado == 1){                   //El primer byte es la direccion 
                  valor = i2c_read();
                  flag=1;
                  //estado=0;
                  }
            }  
   }
   
   void main(){
      TRISA=0b00000000;
      PORTA=0x00;
      enable_interrupts(INT_SSP);
      enable_interrupts(GLOBAL);
      
      while(TRUE){
         if(flag==1){
         output_A(valor);
         delay_ms(2000);
         output_A(0);
         flag=0;
         valor=0;
         }
         }
      }
 
Atrás
Arriba