Autor Tema: DS1307 y Pic2550  (Leído 3410 veces)

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

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
DS1307 y Pic2550
« en: 24 de Septiembre de 2012, 23:53:02 »
Hola tengo problemas para hacer andar este DS con este pic, no lo puedo iniciar ya que tengo un led en su salida de onda seteado a 1hz y siempre se queda prendido, incluyo el pdf de la placa que uso, se lo que me van a decir que busque tutoriales que hay muchos pero los he leido, hace dos semanas que vengo investigando, y nada hay muchos en C pero no se programar en este lenguaje, lo entiendo un poco solamente, yo programo en ASM y no hay mucho de este DS o no me dice mucho, necesito su ayuda les paso los cod. que tome de la web y me dicen si estoy bien o errado ya que no se mas que modificar:

Código: ASM
  1. ; Configura la señal cuadrada que genera el DS1307 en su pin SQW/OUT a 1 Hz.
  2. DS1307_Inicializa
  3.         call    I2C_EnviaStart                  ; Envía condición de Start.
  4.         movlw   DS1307_DireccionEscritura       ; 0XD0 Indica al DS1307 que el byte a escribir,
  5.         call    I2C_EnviaByte              
  6.         movlw   0x00                                ;
  7.         call    I2C_EnviaByte
  8.         call    Restart_I2C                         ; Envía condición de Start.
  9.  
  10.         MOVLW   DS1307_DireccionLectura     ; 0XD1
  11.         call    I2C_LeeByte                     ; Lee los segundos.
  12.         movwf   Segundo                             ; Lo carga en el registro correspondiente.
  13.         call    I2C_EnviaStop               ; Termina de enviar datos.
  14.  
  15.        CLRF    Segundo
  16.        CALL    Delay_3us
  17.  
  18.         call    I2C_EnviaStart                  ; Envía condición de Start.
  19.         movlw   DS1307_DireccionEscritura       ; 0XD0 Indica al DS1307 que el byte a escribir,
  20.         call    I2C_EnviaByte               ; al control de la señal cuadrada.
  21.         movlw   0x00                        ; está en la posición 07h, que corresponde
  22.         call    I2C_EnviaByte               ; al control de la señal cuadrada.
  23.         movlw   b'00000000'                 ; Escribe en el registro de control para
  24.         call    I2C_EnviaByte               ; configurar onda cuadrada del DS1307 a 1 Hz.
  25.         call    I2C_EnviaStop               ; Termina de enviar datos.
  26.  
  27. SEND_SQ
  28.         call    I2C_EnviaStart                  ; Envía condición de Start.
  29.         movlw   DS1307_DireccionEscritura       ; 0XD0 Indica al DS1307 que el byte a escribir,
  30.         call    I2C_EnviaByte              
  31.         movlw   0x07                        ; está en la posición 07h, que corresponde
  32.         call    I2C_EnviaByte               ; al control de la señal cuadrada.
  33.         movlw   b'00010000'                 ; Escribe en el registro de control para
  34.         call    I2C_EnviaByte               ; configurar onda cuadrada del DS1307 a 1 Hz.
  35.         call    I2C_EnviaStop               ; Termina de enviar datos.
  36.         return

Código: ASM
  1. DS1307_CargaInicial
  2.         movlw   .21                             ; Inicializa todos los datos del reloj: Año, mes,
  3.         movwf   Dia                             ; día, día de la semana, hora, minuto y segundo.
  4.         movlw   .8                              ; Inicializa todos los datos del reloj: Año, mes,
  5.         movwf   Mes
  6.         movlw   .3                              ; Inicializa todos los datos del reloj: Año, mes,
  7.         movwf   DiaSemana
  8.         MOVLW   .12
  9.         MOVWF   Anho                        ; Inicializa en el año 2012.
  10.         MOVLW   .12
  11.         MOVWF   Hora
  12.         MOVLW   .30
  13.         MOVWF   Minuto
  14.         MOVLW   .30
  15.         MOVWF   Segundo                     ; Después lo graba en el DS1307 para
  16.         CALL    DS1307_Escribe          ; ponerlo en marcha.
  17.         RETURN

Código: ASM
  1. ; Carga los datos de los registros Anho, Mes, etc., dentro del DS1307.
  2. DS1307_Escribe
  3.         call    I2C_EnviaStart                  ; Envía condición de Start.
  4.         movlw   DS1307_DireccionEscritura       ; 0XD0 Indica al DS1307 que el primer byte a escribir
  5.         call    I2C_EnviaByte                   ; está en la posición 00h que corresponde
  6.         movlw   0x01                                ; a los segundos.
  7.         call    I2C_EnviaByte
  8.         movf    Segundo,W                           ; Pasa los segundos de la memoria del PIC16F84A al
  9.         call    I2C_EnviaByte                   ; DS1307.
  10.         movf    Minuto,W                            ; Y se repite el proceso para el resto.
  11.         call    I2C_EnviaByte
  12.         movf    Hora,W
  13.         call    I2C_EnviaByte
  14.         movf    DiaSemana,W
  15.         call    I2C_EnviaByte
  16.         movf    Dia,W
  17.         call    I2C_EnviaByte
  18.         movf    Mes,W
  19.         call    I2C_EnviaByte
  20.         movf    Anho,W
  21.         call    I2C_EnviaByte
  22.         call    I2C_EnviaStop                   ; Termina de enviar datos.
  23.         return

Código: ASM
  1. ;------------------------- I2C_EnviaStart -------------------------------------------------
  2. I2C_EnviaStart
  3.     BSF     SSPCON2,SEN,0               ;Pone a uno el bit de START
  4. S2
  5.     BTFSC   SSPCON2,SEN,0               ;Espera a que se ponga a cero el bit de START
  6.     BRA     S2
  7. S3
  8.     BTFSS   PIR1,SSPIF,0                ;Espera a que la condicion de START haya sido completada
  9.     BRA     S3                          ;cuando se ponga a 1 la bandera de interrupción
  10.     BCF     PIR1,SSPIF,0                ;Borra la bandera de la interrupción
  11.     RETURN                              ;Retorna de la subrutina
  12.  
  13. ;------------------------- I2C_EnviaByte -------------------------------------------------
  14. I2C_EnviaByte
  15.     MOVWF   SSPBUF,0                     ;Lo carga en el Buffer de salida
  16. Write_I2C                                ;Llama a la subrutina de escritura
  17.     BTFSC   SSPSTAT,R_W,0                ;Verifica que se ponga a cero el bit R/W
  18.     BRA     Write_I2C                    ;Espera a que termine de enviar el dato
  19. W2
  20.     BTFSC   SSPCON2,ACKSTAT,0            ;Espera a que reciba el bit de ACKNOWLEDGE
  21.     BRA     W2
  22.     BCF     PIR1,SSPIF,0                 ;borra la bandera de la interrupción
  23.     RETURN                               ;Retorna de la subrutina
  24.  
  25. ;------------------------- I2C_EnviaStop -------------------------------------------------
  26. I2C_EnviaStop
  27.     BSF     SSPCON2,PEN,0                ;Genera la condición de STOP poniendo a 1 el bit PEN
  28. P2
  29.     BTFSC   SSPCON2,PEN,0                ;Espera a que se ponga a cero el bit PEN
  30.     BRA     P2
  31.     BTFSS   PIR1,SSPIF,0                 ;Espera a que la condicion de Stop haya sido completada
  32.     BRA     Rea4                         ;cuando se ponga a 1 la bandera de interrupción
  33.     BCF     PIR1,SSPIF,0                 ;Borra la bandera de la interrupción
  34.     RETURN                               ;Retorna de la subrutina
  35.  
  36. ;---------------------------------------------------------------------------------------
  37. Restart_I2C
  38.     BSF     SSPCON2,RSEN,0               ;Pone a uno el bit de RESTART
  39. R2
  40.     BTFSC   SSPCON2,RSEN,0               ;Espera a que se ponga a cero el bit de RESTART
  41.     BRA     R2
  42. R3  
  43.     BTFSS   PIR1,SSPIF,0                 ;Espera a que la condicion de RESTART haya sido completada
  44.     BRA     R3                           ;cuando se ponga a 1 la bandera de interrupción
  45.     BCF     PIR1,SSPIF,0                 ;Borra la bandera de la interrupción
  46.     RETURN                               ;Retorna de la subrutina
  47.  
  48. ;-------------------------------------------------------------------------------------------------------------------
  49. Send_I2C_Ack
  50.     BCF     SSPCON2,ACKDT,0              ;Pone a cero el bit de ACKNOWLEDGE DATA
  51.     BSF     SSPCON2,ACKEN,0              ;Genera la condición de ACKNOWLEDGE Poniendo a 1 el bit ACKEN
  52.     BTFSS   PIR1,SSPIF,0                 ;Espera a que la condicion de ACK haya sido completada
  53.     BRA     Rea4                         ;cuando se ponga a 1 la bandera de interrupción
  54.     BCF     PIR1,SSPIF,0                 ;Borra la bandera de la interrupción
  55.     RETURN                               ;Retorna de la subrutina
  56.  
  57. ;-------------------------------------------------------------------------------------------------------------------
  58. Send_I2C_NoAck  
  59.     BSF     SSPCON2,ACKDT,0              ;Pone a 1 el bit de ACKNOWLEDGE DATA
  60.     BSF     SSPCON2,ACKEN,0              ;Genera la condición de NO ACKNOWLEDGE Poniendo a 1 el bit ACKEN
  61.     BTFSS   PIR1,SSPIF,0                 ;Espera a que la condicion de No ACK haya sido completada
  62.     BRA     Rea4                         ;cuando se ponga a 1 la bandera de interrupción
  63.     BCF     PIR1,SSPIF,0                 ;Borra la bandera de la interrupción
  64.     RETURN                               ;Retorna de la subrutina
  65.  
  66. ;-------------------------------------------------------------------------------------------------------------------
  67. I2C_LeeByte
  68.     BSF     SSPCON2,RCEN,0               ;Habilita la recepción de datos mediante el bit RCEN
  69. Rea2
  70.     BTFSC   SSPCON2,RCEN,0               ;Espera a que se ponga a cero el bit RCEN
  71.     BRA     Rea2
  72. Rea3
  73.     BTFSS   SSPSTAT,BF,0                 ;Dato disponible en SSPBUF para ser leidos?
  74.     BRA     Rea3                         ;No, esperar
  75. Rea4
  76.     BTFSS   PIR1,SSPIF,0                 ;Espera a que la condicion de Lectura haya sido completada
  77.     BRA     Rea4                         ;cuando se ponga a 1 la bandera de interrupción
  78.     BCF     PIR1,SSPIF,0                 ;Borra la bandera de la interrupción
  79.     RETURN                               ;Retorna de la subrutina

Les digo como seteo el pic, tengo des habilitadas todas las interrupciones y pregunto como tienen que estar los pines de SDA y SCL, como entrada o como salida?
La verdad se me terminaron las opciones y no se que mas hacer ya que debería de andar, una opcion es cambiar el cristal no?, otra vi en otro esquema que el cristal lleva dos cap. de 15pf a masa en cada una de sus patas, podría ser eso?
Como puedo saber si el pic esta comunicando bien por I2C?

Código: ASM
  1. CFG_MSSP       
  2.         movlw   b'00101000'         ; I2C Config   0X28
  3.         movwf   SSPCON1             ; WCOL  = 0 No collision
  4.                                 ; SSPOV = 0 No overflow
  5.                                 ; SSPEN = 1 Enables the serial port and configures the SDA and SCL pins as the serial port pins          
  6.                                 ; CKP   = 0 Hold Clock Low
  7.                                 ; SSPM3:SSPM0 = 1000 Clock =Fosc/(4*(SSPADD+1)) MASTER MODE I2C!!!
  8.  
  9.     movlw   B'00000000'         ; Set up I2C port, I2C master,
  10.     movwf       SSPSTAT             ; SMP  = 0 Slew rate control enabled for High-Speed mode (400 kHz)
  11.                                 ; CKE  = 0 Disable SMBus specific inputs
  12.                                 ; D/A  = 0 Data/Address bit
  13.                                 ; P    = 0 Stop bit was not detected last
  14.                                 ; S    = 0 Start bit was not detected last
  15.                                 ; R/W  = 0 ITransmit is not in progress
  16.                                 ; UA   = 0 Address does not need to be updated
  17.                                 ; BF   = 0 SSPBUF is empty
  18.  
  19.     MOVLW    0x44               ; Clock=Fosc/(4*(SSPADD+1))
  20.     MOVWF    SSPADD,0           ; SSPADD = ((Fosc/BitRate)/4)-1          100KHz @ 20Mhz
  21.  
  22.     bcf        UCON,USBEN,ACCESS        ; Desactiva el modulo USB
  23.     CLRF     PIR1

Espero que me puedan ayudar
Saludos

Desconectado Mauricio.Jancic

  • PIC10
  • *
  • Mensajes: 3
Re: DS1307 y Pic2550
« Respuesta #1 en: 25 de Septiembre de 2012, 08:37:17 »
Hola,
   Estás encendiendo el oscilador del DS1307? El datasheet dice:

Bit 7 of register 0 is the clock halt (CH) bit.  When this bit is set to a 1, the oscillator is disabled.  When cleared to a 0, the
oscillator is enabled.

   Tambien deberias configurar el registro de control (07h). Este registro deberia valer: 00010000

Saludos,
Mauricio

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Re: DS1307 y Pic2550
« Respuesta #2 en: 25 de Septiembre de 2012, 08:54:57 »
Hola, si coloco el bit CH a "0" aca:
Código: ASM
  1. call    I2C_EnviaStart                  ; Envía condición de Start.
  2.         movlw   DS1307_DireccionEscritura       ; 0XD0 Indica al DS1307 que el byte a escribir,
  3.         call    I2C_EnviaByte               ; al control de la señal cuadrada.
  4.         movlw   0x00                        ; está en la posición 07h, que corresponde
  5.         call    I2C_EnviaByte               ; al control de la señal cuadrada.
  6.         movlw   b'00000000'                 ; Escribe en el registro de control para
  7.         call    I2C_EnviaByte               ; configurar onda cuadrada del DS1307 a 1 Hz.
  8.         call    I2C_EnviaStop               ; Termina de enviar datos.

en "DS1307_Inicializa" es donde lo hago, la dirección que cargo es "0x00" y envió un "0x00" también, no se si esta bien lo que ya que no se si comunica y en la parte de "SEND_SQ" esta la carga de la configuración, pero como te dije no se si se logran comunicar entre ambos
Saludos

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Re: DS1307 y Pic2550
« Respuesta #3 en: 28 de Septiembre de 2012, 15:22:26 »
Bueno les comento lo que hice, cambie de cristal, cambie de DS, cambie de PIC pero nada se comporta igual, cambie mil veces el programa pero nada, la unica forma que por ahora tengo para ver si anda es el led en la salida que esta programada para 1hz, supuesta mente, le coloque un osciloscopio en SCL y SDA y se ve la transmicion del pic al DS pero este no responde, tambien vi la oscilacion del cristal y no me gusta ya que varia, sera el PCB que mete ruido? o el cristal que no va?, en el datasheet dice con capacitancia de 12,5pf pero como se cuales son?
Este otro cod lo saque de la web y estaba funcionando
Código: ASM
  1. DS1307_Inicializa1
  2.    movlw   0x11
  3.    movwf   Dia
  4.    movlw   0x09
  5.    movwf   Mes
  6.    movlw   0x03
  7.    movwf   DiaSemana
  8.    movlw   0x12
  9.    movwf   Anho
  10.    movlw   0x60      ;configuro formato de 12 horas bit 6 y bit 5 del registro 02h (horas)
  11.    movwf   Hora
  12.    movlw   0x59
  13.    movwf   Minuto
  14.    movlw   0X00
  15.    movwf   Segundo
  16.  
  17. ;escribo en el ds1307
  18.  
  19.    call   I2C_EnviaStart
  20.    movlw  DS1307_DireccionEscritura
  21.    call   I2C_EnviaByte
  22.    movlw  0x00
  23.    call   I2C_EnviaByte
  24.    movf   Segundo,W
  25.    call   I2C_EnviaByte
  26.    movf   Minuto,W
  27.    call   I2C_EnviaByte
  28.    movf   Hora,W
  29.    call   I2C_EnviaByte
  30.    movf   DiaSemana,W
  31.    call   I2C_EnviaByte
  32.    movf   Dia,W
  33.    call   I2C_EnviaByte
  34.    movf   Mes,W
  35.    call   I2C_EnviaByte
  36.    movf   Anho,W
  37.    call   I2C_EnviaByte
  38.    call   I2C_EnviaStop
  39. ;reingreso el valor de las horas como dice el datasheet
  40.    movlw   0x72    ;las 12 pm
  41.    movwf   Hora
  42.    call    I2C_EnviaStart
  43.    movlw   DS1307_DireccionEscritura
  44.    call    I2C_EnviaByte
  45.    movlw   0x02
  46.    call    I2C_EnviaByte
  47.    movf   Hora,W
  48.    call   I2C_EnviaByte
  49.    call   I2C_EnviaStop
  50.    return



espero que me puedan ayudar
saludos

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Re: DS1307 y Pic2550
« Respuesta #4 en: 29 de Septiembre de 2012, 12:10:30 »
Hola el PIC me mantiene la linea de SDA en estado alto y la de SCL en bajo hasta que se envía el dato y la vuelve a dejar en un estado bajo (0v) tiene que ser así?

Desconectado juancomcel

  • PIC10
  • *
  • Mensajes: 4
Re: DS1307 y Pic2550
« Respuesta #5 en: 30 de Octubre de 2012, 14:07:59 »
Hola el PIC me mantiene la linea de SDA en estado alto y la de SCL en bajo hasta que se envía el dato y la vuelve a dejar en un estado bajo (0v) tiene que ser así?

oye note que en el circuito estas compartiendo lasresistencias delpull-up  r6 y r7 del ds1307 y de la memoria que aparece debajo del ds1307 esto creo que generaria un  divisor de tension entre ambos dispositivos y por lo tanto un conflicto???

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Re: DS1307 y Pic2550
« Respuesta #6 en: 10 de Noviembre de 2012, 12:25:37 »
Son resistencias de PULL-UPs para las vías del I2C, las deja siempre en High para que funcione.
saludos

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Re: DS1307 y Pic2550
« Respuesta #7 en: 16 de Noviembre de 2012, 11:02:44 »
Hola, volvi a retomar este proyecto que tengo despues de un tiempo y descubri que interpretaba mal el cod. de inicio, primero le conecte a mi pcb un osciloscopio:



Se ve la trama pero iba a ser muy dificil averiguar que pasaba.
Entonces me acorde que tenia un analizador logico de Gwinstek, el GLA-1016, y todo se aclaro:

 start=celeste, adress=naranja, write=rojo, FUCSIA=A-ACK, VERDE=DATA, VERDE CLARO=D-ACK, AZUL=READ





El cod. de inicio seria asi:
Código: ASM
  1. DS1307_Inicializa
  2.     CALL    I2C_EnviaStart                      ; Envía condición de Start.
  3.     movlw   DS1307_DireccionEscritura   ; 0XD0 Indica al DS1307 que el byte a escribir, e ID del RTC
  4.     call        I2C_EnviaByte               ;
  5.     ; A-ACK                             ; Respuesta del SLAVE
  6.     MOVLW   0X00                        ; Direccion de la RAM
  7.     CALL      I2C_EnviaByte               ;
  8.     ; D-ACK                             ; Respuesta del SLAVE
  9.     MOVLW   B'00000000'                 ; RAM Segundos, enciendo o apago el oscilador el BIT7 CH.
  10.     CALL        I2C_EnviaByte               ; 1= off; 0= on
  11.     ; D-ACK                             ; Respuesta del SLAVE
  12.  
  13. SEND_SQ
  14.         call    Restart_I2C                 ; Envía condición de Start.
  15.         movlw   DS1307_DireccionEscritura       ; 0XD0 Indica al DS1307 que el byte a escribir,
  16.         call    I2C_EnviaByte
  17.     ; A-ACK                             ; Respuesta del SLAVE
  18.         movlw   b'00000111'                 ; Posición 07h, que corresponde  
  19.         call    I2C_EnviaByte               ; al control de la señal cuadrada.
  20.     ; D-ACK                             ; Respuesta del SLAVE
  21.         movlw   b'10010000'                 ; 0X90 Escribe en el registro de control para  
  22.         call    I2C_EnviaByte               ; Configurar onda cuadrada del DS1307 a 1 Hz.
  23.     ; D-ACK                             ; Respuesta del SLAVE
  24.         call    I2C_EnviaStop               ; Termina de enviar datos.
  25.    RETURN

Y subo todo el cod. para manejar al DS.
Saludos


 

anything