Autor Tema: reloj DS1307 con Pic 18f87k22  (Leído 2448 veces)

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

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
reloj DS1307 con Pic 18f87k22
« en: 02 de Junio de 2016, 11:11:17 »
hola a todos.he realizado un proyecto en asm con el MPLAB X para el control de un RTC con el pic 18f87k22.el RTC es el DS1307.y el proyecto lo estoy simulando con el
ISIS del Proteus.

lo he hecho con un Windows 10.y dire que todo han sido problemas.por no decir que he tenido que adaptarme al MPLAB X.que es muy diferente a su antecesor.
pero ya esta funcionando todo perfecto.

la version del ISIS es la 8.4SP0 . ya que la anterior no me funciono el VSM.

una cosa muy importante si quereis simular con el ISIS es que en el diagrama tendreis que poner resistencias PULL-UP simuladas.no sirbe poner resistencias de 4k7.
supongo que le quita velocidad a la simulacion.




El pic que esta trabajando a 64Mhz y el clock del i2c a 100Khz. esta es la configuracion del I2C para este pic:
Código: [Seleccionar]
;configura i2c para el Pic18f87k22

bsf TRISC,SCL1 ;configura pins como entrada del Pic18f87k22
bsf TRISC,SDA1 ;configura pins como entrada del Pic18f87k22
clrf ADCON0   
movlw 0x28        ; I2C Master Mode, SSPEN
movwf SSP1CON1      ; SSPEN enabled
movlw   0x80 ; 100khz
movwf   SSP1STAT ; cke = 0 (mode 1,1)
movlw .159 ; configurar I2C a 100kHz (para fosc de 64Mhz) clock=Fosc/(4*(SSPxADD+1))
movwf SSP1ADD ;
clrf SSP1CON2

En la imagen podemos ver en el i2c Debug los datos que se han leido del DS1307.

S       bit de Start
D0      byte para indicar al DS1307 que vamos a escribir en el.
A   acknowledge
00   escribimos el byte que indica la direccion donde leeremos los datos.
Sr
D1   byte para indicar al DS1307 que vamos a leer en el.
A
09   segundos
A
20   minutos
A
15   horas
A
05   dia
A
02   dia de la semana.   lunes,martes,miercoles....
A
06   mes
A
16   año
A
12   control
A
P   bit de Stop


esta es la rutina que lee del DS1307:

Código: [Seleccionar]
;Lectura de los datos internos del DS1307
READ_RTC     movwf CONT_BYTE_RTC     ;numero de bytes a leer
    rcall Start_I2C     ;Llama a la subrutina de START
    ID_WRITE     ;modo lectura del RTC
    movwf SSP1BUF,0     ;Lo carga en el Buffer de salida
    rcall Write_I2C     ;Llama a la subrutina de escritura
    movlw 0x00     ;Carga en W la primer posición de memoria
    movwf SSP1BUF,0     ;Lo carga en el Buffer de salida
    rcall Write_I2C     ;Llama a la subrutina de escritura
    rcall Restart_I2C                 ;Llama a la subrutina de RESTART
    ID_READ     ;modo escritura del RTC
    movwf SSP1BUF,0     ;Lo carga en el Buffer de salida
    rcall Write_I2C     ;Llama a la subrutina de escritura
         
Bucle_Leer     rcall Read_I2C                    ;Llama a la subrutina de lectura
    movff SSP1BUF,POSTINC2     ;Guarda el dato en la Ram e incrementa el puntero
    rcall Send_I2C_Ack                ;Llama a la subrutina de ACKNOWLEDGE
    decfsz CONT_BYTE_RTC,F     ;repite hasta que sea cero
    bra Bucle_Leer                  ;continúa leyendo
    rcall Send_I2C_NoAck              ;llama a la subrutina de ACKNOWLEDGE
    rcall Stop_I2C                    ;Llama a la subrutina de STOP
    return     ;Retorna de la subrutina
                 
Antes de llamar a esta rutina.hay que conmutar en los registros FSR la direccion de la ram donde hubicaremos los datos leidos.e indicaremos los bytes a leer.

ejemplo:

BANK15
         lfsr   FSR2,0X100      ;principio de ram donde se introduciran los datos para escribir en el RTC
         movlw   0x08         ;numero de bytes a gestinar
         call   READ_RTC      ;leer datos del DS1307 y hubicarlos en la direccion 0x100 de la ram
         
         
« Última modificación: 08 de Junio de 2016, 10:20:29 por groundman »
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:reloj DS1307 con Pic 18f87k22
« Respuesta #1 en: 02 de Junio de 2016, 13:10:25 »
Gracias por el aporte

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re:reloj DS1307 con Pic 18f87k22
« Respuesta #2 en: 02 de Junio de 2016, 16:28:39 »
ya que no tengo tiempo de ayudar.almenos pondre lo que valla aprendiendo.

Ahora pondre el codigo correspondiente al envio de unos datos para programar el reloj.

Esta imagen tiene dos lineas.la primera corresponde al envio de una trama de 8 bytes con todos los datos a cero.la segunda linea los nuemros del 1 al 8.



esta es la rutina:

Código: [Seleccionar]
 
;Escritura en el DS1307 antes de la llamada a esta rutina.cargar en FSR2 el inicio de la ram donde se leeran los datos a transferir al DS1307
; y en WREG la cantidad de datos a transferir.
   
WRITE_RTC     movwf CONT_BYTE_RTC     ;numero de bytes a escribir
    rcall Start_I2C     ;Llama a la subrutina de START
    ID_WRITE     ;modo lectura del RTC
    movwf SSP1BUF,0     ;Lo carga en el Buffer de salida
    rcall Write_I2C     ;Llama a la subrutina de escritura
    movlw 0x00     ;Carga en W la primer posición de memoria
    movwf SSP1BUF,0     ;Lo carga en el Buffer de salida
    rcall Write_I2C     ;Llama a la subrutina de escritura
               
Bucle_Escribir1     movff POSTINC2,SSP1BUF     ;Carga el dato de la Ram en SSPBUF e incrementa el puntero
                    rcall Write_I2C     ;Llama a la subrutina de escritura
    decfsz CONT_BYTE_RTC,F     ;repite hasta que sea cero
    bra Bucle_Escribir1     ;continúa enviando datos
                    rcall Stop_I2C     ;Llama a la subrutina de STOP
                    return     ;Retorna de la subrutina
   

antes de realizar la llamada a esta rutina.hay que conmutar los registros FSR y el numero de bytes a leer.ademas de introducir desde la direccion 0x110 los datos
a enviar.asi:

   lfsr   FSR2,0X110      ;principio de ram donde se introduciran los datos para escribir en el RTC
         movlw   0x08         ;numero de bytes a gestionar
         call   WRITE_RTC      ;rutina de escritura en el DS1307

espero que os sea de utilidad.ademas adjunto los archivos.
         
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re:reloj DS1307 con Pic 18f87k22
« Respuesta #3 en: 08 de Junio de 2016, 11:12:18 »
hola de nuevo.levo un par de semanas atrancado con el I2C.ya hace años estube liado con el I2C y una memoria 24c16 y todo salio perfecto.al añadir las resistencias de 4k7
claro.

ahora aunque he consegudi que con el ISIS funcione bien.no me funciona con el ICD3 que acabo de adquirir.n se si sera problema de este o del circuito.pero hay algo
que no me cuadra.segun el datasheet del pic18f87k22. el modulo I2C se activa al posicionar poner estas lineas:

bsf   TRISC,SCL1      ;configura pins como entrada del Pic18f87k22
bsf   TRISC,SDA1      ;configura pins como entrada del Pic18f87k22

pero creo que tiene que haber algo mas.pero no se que es.
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:reloj DS1307 con Pic 18f87k22
« Respuesta #4 en: 18 de Junio de 2016, 16:04:43 »
bsf   TRISC,SCL1      ;configura pins como entrada del Pic18f87k22
bsf   TRISC,SDA1      ;configura pins como entrada del Pic18f87k22

pero creo que tiene que haber algo mas.pero no se que es.

No se exactamente si SCL1 y SDA1 tienen los valores correctos en el .inc . Pero ahi unicamente lo estas poniendo como entrada
Para habilitar el I2C lo que tenes que hacer es modificar el registro SSP1CON1, y poner los bits SSPM para que sean del modo I2C que desees, hay combinaciones que son para SPI unicamente.

Mirando un poco mas tambien creo que deberias habilitar el Open Drain ( bit SSP1OD ) del registro  ODCON.

Finalmente el fuse:

MSSPMSK: MSSP V3 7-Bit Address Masking Mode Enable bit

No se si tendra efecto sobre el I2C

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re:reloj DS1307 con Pic 18f87k22
« Respuesta #5 en: 19 de Junio de 2016, 19:22:15 »
gracias por la informacion KILLERJC.en lo de la configuracion del SSP1CON1 tenias razon en que los bits SSPM son los que configuran los modos del MSSP.no me habia dado cuenta
de que son diferentes combinaciones.aun asi para configurar el pic en modo maestro.creo que las siguientes lineas estan bien configuradas:

movlw    0x28              ; I2C master mode
movwf    SSP1CON1           ; SSPEN enabled

respecto al MSSPMSK creo que es cuando de trabaja en modo esclavo.y en este caso no nos haria falta.

por el momento solo he logrado hacer funcionar memorias 24LC16 que tienen la dreccion A0 y A1.pero no he logrado comunicarme con el DS1307 direcciones(D0 y D1)
ni con una camara OV7670 direcciones(42 y 43)

solo logro hacer funcionar el DS1307 con un PIC 18f2550.pero no salen bien los datos de la hora.incluso he podido escribir en el.pero la hora no avanza.no se si se habra averiado
o hay que configurar algo.pero por lo menos puedo leer y escribir en el.cosa que en el 18f87k22 no funciona.y eso que ya lo he probado en otro chip nuevo.

lo que no me creo es que tambien tenga la OV7670 averiada.ya que he probado dos y pasa lo mismo.

sospecho que algo no esta bien configurado en el 18f87k22.
Montando mi primera impresora 3D (Raprep Prusa i3)


 

anything