Autor Tema: 16F887 y RT DS1307 no se comunican [RESUELTO]  (Leído 2951 veces)

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

Desconectado LucasBols

  • PIC16
  • ***
  • Mensajes: 129
    • Desarrollos y Servicios Digitales
16F887 y RT DS1307 no se comunican [RESUELTO]
« en: 03 de Febrero de 2017, 14:20:45 »
hola, buenas tardes,

estoy programando con XC8 en el MPLAB X IDE, el pic es un 16F887 conectado a un DS1307,

el PIC con el DS1307 en el proteus andan, me tira un par de errores pero funciona,

* Simulation_Log.png
(13.55 kB, 800x200 - visto 497 veces)


* I2C_Debug.png
(81.73 kB, 999x892 - visto 468 veces)

el cristal interno está a 8Mhz
Código: C
  1. /************** FRECUENCIA DEL OSCILADOR **************
  2.      *
  3.      * IRCF<2:0>: Internal Oscillator Frequency Select bits
  4.      *      111 = 8 MHz
  5.      *      110 = 4 MHz (default)
  6.      *      101 = 2 MHz
  7.      *      100 = 1 MHz
  8.      *      011 = 500 kHz
  9.      *      010 = 250 kHz
  10.      *      001 = 125 kHz
  11.      *      000 = 31 kHz (LFINTOSC)
  12.      */
  13.     OSCCONbits.IRCF0 = 1;
  14.     OSCCONbits.IRCF1 = 1;
  15.     OSCCONbits.IRCF2 = 1;
en el main, inicializo el 1307 así
Código: C
  1. TRISCbits.TRISC3 = 1; /* SDA and SCL as input pin */
  2.     TRISCbits.TRISC4 = 1; /* these pins can be configured either i/p or o/p */
  3.     SSPSTATbits.SMP = 1; /* Slew rate disabled */
  4.     SSPCONbits.SSPEN = 1; /* Enables the serial port and configures the SDA and
  5.                            * SCL pins as the source of the serial port pins */
  6.     SSPCON = 0x28; /* SSPEN = 1, I2C Master mode, clock = FOSC/(4 * (SSPADD + 1)) */
  7.     /*
  8.      * Velocidad=Fosc/(4*(SSPADD+1))
  9.      * SSPADD=(Fosc/(4*Velocidad))-1
  10.      * SSPADD=(8000000/(4*100000))-1
  11.      */
  12.     SSPADD = 0x13; /* 100Khz @ 8Mhz Fosc */
y más adelante, inicio el pulso de 1Hz desde el 1307 así
Código: C
  1. for ( unsigned char i=0; i<10; i++ )
  2.         __delay_ms(100);
  3.    
  4.     SEN = 1; /* Start condition enabled */
  5.     while (SEN); /* automatically cleared by hardware */
  6.     /* wait for start condition to finish */
  7.  
  8.     SSPBUF = 0xD0; /* Move data to SSPBUF */
  9.     while (BF); /* wait till complete data is sent from buffer */
  10.  
  11.     SSPBUF = 0x07; /* Move data to SSPBUF */
  12.     while (BF); /* wait till complete data is sent from buffer */
  13.  
  14.     SSPBUF = 0b00010000; /* Move data to SSPBUF */
  15.     while (BF); /* wait till complete data is sent from buffer */
  16.  
  17.     PEN = 1; /* Stop condition enabled */
  18.     while (PEN); /* Wait for stop condition to finish */
  19.     /* PEN automatically cleared by hardware */
los errores del proteus creo que son por las resistencias de 10k que deben ser reemplazadas por unas pullup, pero funciona, el tema es que en el proto no,

el pulso del 1307 lo mando a un RB y cuando salta la int de flanco asc o desc enciendo o apago un led de acuerdo al flanco del pulso de 1 seg generado por el 1307,

en el proto el cristal de 32768 es un smd, pero eso no creo que afecte,

¿alguna recomendación?

Muchas gracias,

Saludos,
« Última modificación: 04 de Febrero de 2017, 16:29:21 por LucasBols »
Un experto es alguien que te explica algo sencillo de forma confusa de tal manera que te hace pensar que la confusión sea culpa tuya.

DSD http://www.dysd.com.ar/

Desconectado LucasBols

  • PIC16
  • ***
  • Mensajes: 129
    • Desarrollos y Servicios Digitales
Re:16F887 y RT DS1307 no se comunican
« Respuesta #1 en: 03 de Febrero de 2017, 14:47:13 »
el cristal es este, es el MC-306, le soldé un par de cables desde los pines 1 y 4 a x1 y x2 del 1307
Un experto es alguien que te explica algo sencillo de forma confusa de tal manera que te hace pensar que la confusión sea culpa tuya.

DSD http://www.dysd.com.ar/

Desconectado LucasBols

  • PIC16
  • ***
  • Mensajes: 129
    • Desarrollos y Servicios Digitales
Re:16F887 y RT DS1307 no se comunican
« Respuesta #2 en: 03 de Febrero de 2017, 15:17:13 »
este es el circuito del proto
en el circuito me olvidé de dibujar las resistencias de 10k a 5v de SCL, SDA y SQW/OUT, pero el proto las tiene

* circuito_proto.png
(25.01 kB, 1351x872 - visto 433 veces)
« Última modificación: 03 de Febrero de 2017, 15:48:41 por LucasBols »
Un experto es alguien que te explica algo sencillo de forma confusa de tal manera que te hace pensar que la confusión sea culpa tuya.

DSD http://www.dysd.com.ar/

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:16F887 y RT DS1307 no se comunican
« Respuesta #3 en: 04 de Febrero de 2017, 06:58:23 »
I2C es un protocolo en el cual el maestro o los esclavos tienen sus salidas como open-colector, por lo cual nunca pueden poner un 1, sino que unen el pin a GND.

Por eso es necesario las resistencias de pull-up, que son de 4.7K en SDA y SCL. Por lo cual el circuito del proto es imposible que funcione.

Desconectado LucasBols

  • PIC16
  • ***
  • Mensajes: 129
    • Desarrollos y Servicios Digitales
Re:16F887 y RT DS1307 no se comunican
« Respuesta #4 en: 04 de Febrero de 2017, 16:29:00 »
hola, buenas tardes,

el tema está resuelto, cometí una omisión, no activé el clock,
Citar
"Bit 7 of Register 0 is the clock halt (CH) bit. When this bit is set to 1, the oscillator is disabled. When cleared to 0, the oscillator is enabled. On first application of power to the device the time and date registers are typically reset to 01/01/00 01 00:00:00 (MM/DD/YY DOW HH:MM:SS). The CH bit in the seconds register will be set to a 1."
(El bit 7 del Registro 0 es el bit de parada del reloj (CH). Cuando este bit se establece en 1, el oscilador está deshabilitado. Cuando se borra a 0, el oscilador está habilitado. En la primera aplicación de energía al dispositivo, los registros de hora y fecha se restablecen normalmente a 01/01/00 01 00:00:00 (MM / DD / AA DOW HH: MM: SS). El bit CH en el registro de segundos se ajustará a 1.)

después de iniciar el pulso de 1Hz, activo el oscilador con

Código: C
  1. SEN = 1; /* Start condition enabled */
  2.     while (SEN); /* automatically cleared by hardware */
  3.     /* wait for start condition to finish */
  4.  
  5.     SSPBUF = 0xD0; /* Move data to SSPBUF */
  6.     while (BF); /* wait till complete data is sent from buffer */
  7.  
  8.     SSPBUF = 0x00; /* Move data to SSPBUF */
  9.     while (BF); /* wait till complete data is sent from buffer */
  10.  
  11.     SSPBUF = 0x00; /* Move data to SSPBUF */
  12.     while (BF); /* wait till complete data is sent from buffer */
  13.  
  14.     PEN = 1; /* Stop condition enabled */
  15.     while (PEN); /* Wait for stop condition to finish */
  16.     /* PEN automatically cleared by hardware */

por otro lado, en el registro de control (0x07):
Citar
"Bit 7: Output Control (OUT). This bit controls the output level of the SQW/OUT pin when the square-wave output is disabled. If SQWE = 0, the logic level on the SQW/OUT pin is 1 if OUT = 1 and is 0 if OUT = 0. On initial application of power to the device, this bit is typically set to a 0."
(Bit 7: Control de salida (OUT). Este bit controla el nivel de salida del pin SQW / OUT cuando la salida de onda cuadrada está desactivada. Si SQWE = 0, el nivel lógico en el pin SQW / OUT es 1 si OUT = 1 y es 0 si OUT = 0. En la aplicación inicial de potencia al dispositivo, este bit normalmente se establece en 0.)

el pulso de 1Hz lo utilizo como temporizador muy preciso de 1 seg y entra por un RB, también utilizo la alimentación por la batería para que la hora y fecha no se borren en un corte de alimentación,
cuando detecto un corte de alimentación, debo detener el pulso con

Código: C
  1. SSPBUF = 0b10000000;

para establecer la salida del pin OUT en 1, esto me indica que el 1307 no fué reseteado, que mantiene los datos de antes del corte de energía, por lo tanto, no debo activar el oscilador,

Muchas gracias,

Saludos,
Un experto es alguien que te explica algo sencillo de forma confusa de tal manera que te hace pensar que la confusión sea culpa tuya.

DSD http://www.dysd.com.ar/


 

anything