Autor Tema: Problema maestro esclavo comunicacion i2c dos pics!!!  (Leído 4376 veces)

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

Desconectado piropic

  • PIC10
  • *
  • Mensajes: 3
Problema maestro esclavo comunicacion i2c dos pics!!!
« en: 10 de Octubre de 2011, 23:23:27 »
Hola necesito de su ayuda, Necesito comunicar dos pics por i2c en el esclavo manejo un reloj de 3 hilos llamado ds1302 y en el master manejo el ds1307, con el master necesito obtener los datos del reloj ds1302 del esclavo, no se donde esta el error lo simulo en proteus y no va, esta en CCS, anexo los codigos, el master deberia mostrar las dos horas en una lcd


MASTER
Código: CSS
  1. #include <16f877a.h>
  2. #fuses NOWDT, XT, NOPROTECT, NODEBUG, BROWNOUT, NOLVP, CPD, NOWRT, PUT
  3. #use delay(clock=4000000)
  4. #use i2c(Master,sda=PIN_B0,scl=PIN_B1,FORCE_HW)
  5. #define RTC_SDA  PIN_B0
  6. #define RTC_SCL  PIN_B1
  7. #include <_ds1307.c>
  8. #include <lcd.c>
  9.  
  10.  
  11. #use fast_io(A)
  12. #use fast_io(C)                     ///   con esta instruccion evitamos que
  13. #use fast_io(D)                     ///   se este configurando cada vez que usamos
  14. #use fast_io(B)
  15. #use fast_io(E)  
  16. #byte portb = 6                  ///   alguna instruccion de entrada o salida
  17. #byte portc = 7  
  18.  
  19. int sec;
  20. int min;
  21. int hr;
  22.  
  23.  
  24. int READ_I2C(BYTE address,int buffer)
  25.  
  26. {
  27.     int8 dato=0;
  28.     i2c_start ();           //Inicio comunicacion
  29.     i2c_write (address);       //Direccion del esclavo
  30.     i2c_write (buffer);       //Direccion de memoria que queremos leer en
  31.                                 //el esclavo [buffer[0x02] = read_adc()].
  32.     //i2c_stop();             //Parada del ciclo de escritura
  33.     i2c_start ();           //Se inicia el ciclo de lectura
  34.     i2c_write (address+1);       //Añadir 1 a la direccion para pasar al modo
  35.                                 //lectura. A6 A5 A4 A2 A1 A0 R/W  ->
  36.                                 // ->R/W = 0 modo escritura; 1 modo lectura
  37.     dato = i2c_read(0); //Leemos en la direccion apuntada anteriormente
  38.     i2c_stop ();            //Fin de la comunicacion
  39.     return(dato);
  40. }
  41.  
  42. BOOLEAN i2c_ready()
  43.    {
  44.       int1 ack;
  45.       i2c_start();            // If the write command is acknowledged,
  46.       ack = i2c_write(0xd0);  // then the device is ready.
  47.       i2c_stop();
  48.       return ack;
  49.    }
  50.  
  51.  
  52. void main()
  53. {
  54.    delay_ms(100);
  55.    int8 cont1=0,sec1,min1,hrs1;
  56.    int ban=0;
  57.    lcd_init();                   //
  58.    do
  59.    {
  60.    }while (i2c_ready());
  61.    ds1307_init(DS1307_ALL_DISABLED);
  62.    ds1307_set_date_time (1,1,1,1,1,1,01); /// se escribe en el displositivo
  63.    WHILE (1)
  64.    {
  65.       delay_ms (200);
  66.       ds1307_get_time (hr, min, sec);   /// se obtiene la hora
  67.       //READ_I2C(hrs1,min1,sec1);
  68.       hrs1=READ_I2C(0XA0,2);
  69.       min1=READ_I2C(0XA0,1);
  70.       sec1=READ_I2C(0XA0,0);
  71.       lcd_gotoxy (1,2);
  72.       printf (lcd_putc, "%02d:%02d:%02d  ", hrs1,min1,sec1);
  73.       lcd_gotoxy (1,1);
  74.       printf (lcd_putc, "%02d:%02d:%02d  ", hr,min,sec);  
  75.       delay_ms (200);
  76.    }
  77. }

ESCLAVO

Código: CSS
  1. #include <16f877a.h>
  2. #fuses NOWDT, XT, NOPROTECT, NODEBUG, BROWNOUT, NOLVP, CPD, NOWRT, PUT
  3. #use delay(clock=4000000)
  4. #use i2c(SLAVE,sda=PIN_C4,scl=PIN_C3,ADDRESS=0XA0,FORCE_HW)//NOFORCE_SW
  5. #include <lcd.c>
  6. #include <ds1302.c>
  7.  
  8.  
  9. #define EEPROM_ADDRESS long int
  10. #use fast_io(A)
  11. #use fast_io(C)                     ///   con esta instruccion evitamos que
  12. #use fast_io(D)                     ///   se este configurando cada vez que usamos
  13. #use fast_io(E)  
  14. #byte portb = 6                  ///   alguna instruccion de entrada o salida
  15. #byte portc = 7    
  16.  
  17. int state,address,buffer[3],dato;
  18.  
  19. byte i2c_dato_entrada;
  20. byte i2c_dato_funcion;
  21.  
  22. #INT_SSP
  23. void ssp_interupt ()
  24. {
  25.   state = i2c_isr_state();
  26.   if(state < 0x80)                 //Master esta enviando datos
  27.   {
  28.        i2c_dato_entrada = i2c_read();          
  29.   }
  30.   if(state == 0x80)                //master pide un dato
  31.   {
  32.      //i2c_write (buffer[address]);  //Mandar el dato en la direccion solicitada
  33.      //i2c_write (buffer[address+1]);
  34.      //i2c_write (buffer[address+2]);
  35.      //i2c_write (buffer[0]);  //Mandar el dato en la direccion solicitada
  36.      //i2c_write (buffer[1]);
  37.      //i2c_write (buffer[2]);
  38.      buffer[i2c_dato_funcion] = i2c_dato_entrada;
  39.      i2c_write(buffer[i2c_dato_funcion]);
  40.       }
  41.   }
  42.  
  43. int sec,min,hrs,day,month,yr,dow;
  44. int pos1=0,fecha[6]={1,1,1,0,0,0};
  45.  
  46. void main()
  47. {
  48.    rtc_init();
  49.    lcd_init();
  50.    enable_interrupts(INT_SSP);      //Activamos las interrupciones de I2C
  51.    enable_interrupts(GLOBAL);
  52.    rtc_set_datetime (11,9,3,4,10,5); ////  rtc_set_datetime(day,mth,year,dow,hour,min)
  53.    lcd_gotoxy(1,2);                                 /// el tiempo deseado
  54.    lcd_putc("fecha:");
  55.    lcd_gotoxy(1,1);                                 /// el tiempo deseado
  56.    lcd_putc("hora:");
  57.    int ban=0;
  58.    WHILE (1)
  59.    {
  60.       delay_ms(10) ;
  61.       //rtc_get_date(day,month,yr,dow);  /// se obtiene la fecha
  62.       rtc_get_time(hrs,min,sec);   /// se obtiene la hora
  63.       buffer[0]=sec;
  64.       buffer[1]=min;
  65.       buffer[2]=hrs;
  66.       lcd_gotoxy (6,1);
  67.       printf (lcd_putc, "%02d:%02d:%02d  ", hrs,min,sec);
  68.       lcd_gotoxy (7,2);
  69.       printf (lcd_putc, "%02d/%02d/%02d_%02d  ", day,month,yr,dato);
  70. }
  71.  
  72. }
« Última modificación: 11 de Octubre de 2011, 16:30:36 por piropic »

Desconectado Marioguillote

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1926
    • Servisystem
Re: AYUUUUUUUUUUUDAAAAAAAAAAAA Comunicacion i2c dos pics
« Respuesta #1 en: 11 de Octubre de 2011, 09:54:05 »
Por favor, lee las reglas del foro antes de poner escribir los títulos de los mensajes.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Comunicacion i2c dos pics
« Respuesta #2 en: 11 de Octubre de 2011, 10:24:41 »
Por favor, lee las reglas del foro antes de poner escribir los títulos de los mensajes.

Exactamente! Por usar ese tipo de títulos muchos ni leen tu post  ;-)  Probá de la siguiente manera:

Código: C
  1. #INT_SSP
  2. void ssp_interupt ()
  3. {
  4.   state = i2c_isr_state();
  5.   if(state >= 0x80)                 //master pide un dato
  6.   {
  7.        i2c_write(buffer[i2c_dato_funcion]);          
  8.   }
  9.   else if(state == 0x01)               //Master esta enviando datos
  10.   {
  11.      i2c_dato_entrada = i2c_read();
  12.      buffer[i2c_dato_funcion] = i2c_dato_entrada;    
  13.    }
  14. }

De esa manera lo implementé hace mucho y funciono  :mrgreen:


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado piropic

  • PIC10
  • *
  • Mensajes: 3
Re: AYUUUUUUUUUUUDAAAAAAAAAAAA Comunicacion i2c dos pics
« Respuesta #3 en: 11 de Octubre de 2011, 16:29:04 »
Hola Suky agradezco tu respuesta, primero que todo soy novato y no habia leido las reglas ya lo modificare, gracias, he probado pero me sigue igual en la lcd del maestro pone -1:-1:-1 parece q no estuviera trayendo ningun dato del ds1302, que mas puedo probar

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Problema maestro esclavo comunicacion i2c dos pics!!!
« Respuesta #4 en: 11 de Octubre de 2011, 16:33:01 »
Primero que nada tendrías que probar que los datos recibidos del ds1302 son correctos, o sea que esa parte funciona y después encarar el tema de la comunicación i2c.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado piropic

  • PIC10
  • *
  • Mensajes: 3
Re: Problema maestro esclavo comunicacion i2c dos pics!!!
« Respuesta #5 en: 11 de Octubre de 2011, 23:39:06 »
Hola suky gracias por tu atencion , pues si te entiendo bien yo coloco una lcd al pic esclavo y el me muestra la hora del ds1302 perfecto lo que no hace es la comunicacion con el maestro bien