Autor Tema: Problemas con I2C y DS1307  (Leído 3903 veces)

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

Desconectado Mario

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 873
Problemas con I2C y DS1307
« en: 31 de Octubre de 2004, 17:14:00 »
Hola,

soy yo de nuevo (con mas dudas).loco

Quiero agregarle tiempo real a un proyecto y adquirí el DS1307 para ello.

En alguna ocasión aquí bajé un código para este dispositivo (en ensamblador) y hasta ahora me dí a la tarea de usarlo.

Le modifiqué unas cosas para acomdarlo a mi proyecto pero no pasa nada.

Intenté luego utilizar el I2CREAD y WRITE del PBP para lo mismo y no funciono.

Lo que se intenta hacer es configurar el dispositivo y luego leer de él para posteriormente desplegar el resultado en un LCD.

El LCD trabaja bien ya que con el mismo µicro y con otro programa, el LCD despliega lo que debe (el LCD no es).

Al intentar con ambos (para software y hardware) el LCD despliega puros cuadros negros (muy raro).

Se colocaron resistencias de jalón de 4.7K para las líneas SDA y SCL.

El Miércoles 3 de Noviembre regresaré a la escuela (2 de Noviembre es día de Muertos y es festivo) y me pondré a analizar el BUS, su información (sé cómo trabaja el protocolo de PHILLIPS), mientras tanto dejo en sus manos el código para que lo vean y me digan si está mal o bien.

En el código incluyo la conversión que use para transformar la información del DS1307 a una más dijerible (espero con esto contribuir en algo ya que siempre ando pidiendo favores).Sonrisa Gigante

Se adjuntan los dos archivos, el de software y hardware.

Gracias de antemano.

Bueno, no los adjunto porque me dice que hay errores, se los voy a meter aquí:

por SOFTWARE

CONTA       VAR BYTE    $32 SYSTEM

RTR_SEG     var byte    $33 SYSTEM
RTR_MINT    VAR BYTE    $34 SYSTEM
RTR_HRS     VAR BYTE    $35 SYSTEM
RTR_DIA     VAR BYTE    $36 SYSTEM
RTR_FECHA   VAR BYTE    $37 SYSTEM
RTR_MES     VAR BYTE    $38 SYSTEM
RTR_MESX12  VAR BYTE    $39 SYSTEM

DECE        VAR BYTE    $40 SYSTEM
UNID        VAR BYTE    $41 SYSTEM

CONV1       VAR BYTE    $42 SYSTEM
CONV2       VAR BYTE    $43 SYSTEM



I2CWrite Portc.4,Portc.3,$D0,$00,[RTR_SEG,RTR_MINT,RTR_HRS,RTR_DIA,RTR_FECHA,RTR_MES,RTR_MESX12,control]


actual:

asm

x

btfss   portb,7
goto   x

endasm

I2CRead Portc.4,Portc.3,$D0,$00,[RTR_SEG,RTR_MINT,RTR_HRS,RTR_DIA,RTR_FECHA,RTR_MES,RTR_MESX12,control]


    "iniciando conversión para segundos  
    CONV1 = RTR_SEG         " Pasando RTR_SEG binario a CONV1
    Gosub   conversion      " Llamando a la conversión de BCD a Binario
    RTR_SEG = CONV2         " Colocando el resultado de la conversión (BIN)
                                     
    "iniciando conversión para minutos    
    CONV1 = RTR_MINT        " Pasando RTR_MINT binario a CONV1
    gosub   conversion      " Llamando a la conversión de BCD a Binario
    RTR_MINT = CONV2        " Colocando el resultado de la conversión (BIN)

    "iniciando conversión para horas      
    asm

    clrf    CONTA
    movfw   RTR_HRS
    andlw   0x30,W
    movwf   CONV1
    btfsc   CONV1,5     ; 0 = AM
    infc    CONTA       ; 1 = PM
    movlw   0x1F
    andwf   RTR_HRS,F

    endasm

    CONV1 = RTR_hrs        " Pasando RTR_HRS binario a CONV1
    gosub   conversion     " Llamando a la conversión de BCD a Binario
    RTR_HRS = CONV2        " Colocando el resultado de la conversión (BIN)
   
    "iniciando conversión para días (no lo ocupa ya que días es de 7 bits)

    "iniciando conversión para fecha
    CONV1 = RTR_fecha       " Pasando RTR_FECHA binario a CONV1
    gosub   conversion      " Llamando a la conversión de BCD a Binario
    RTR_FECHA = CONV2       " Colocando el resultado de la conversión (BIN)

    "iniciando conversión para mes
    CONV1 = RTR_mes         " Pasando RTR_MES binario a CONV1
    gosub   conversion      " Llamando a la conversión de BCD a Binario
    RTR_MES = CONV2         " Colocando el resultado de la conversión (BIN)

    "iniciando conversión para año
    CONV1 = RTR_mesx12      " Pasando RTR_MESX12 binario a CONV1
    gosub   conversion      " Llamando a la conversión de BCD a Binario
    RTR_MESX12 = CONV2      " Colocando el resultado de la conversión (BIN)


CONVERSION:
    UNID = CONV1&$0F
    asm
    SWAPF   CONV1,F
    endasm
    DECE = CONV1
    DECE = (DECE&$0F)*10
    CONV2 = DECE+UNID
    return

lcdout   $FE,1, "TIEMPO = ",dec RTR_FECHA,"-",DEC RTR_MES,"-",DEC RTR_MESX12
pause 1000

lcdout   $FE,1,   DEC RTR_HRS,":",DEC RTR_MINT,":",DEC RTR_SEG," "]
 IF CONTA==1 THEN
        lcdout $FE,$80+17 "PM"
      ELSE
   lcdout $FE,$80+17 "AM"
    ENDIF

pause 1000

goto actual

Donde RTR_XXX es el valor de configuración


Por Hardware 1


"************************************************************************
"*  Nombre  : DS1307_PIC_I²C.BAS                                        *
"*  Autor   : Mario Alberto Camarillo Ramos                             *
"*  Fecha   : 14/Sep/2004                                          *
"*  Versión : 1.6                                                      *
"*  Modelo  : PIC_16F872                            *
"*  Notas   : implementación de LCDOUT en lugar de DEBUG                *
"************************************************************************



DEFINE NO_CLRWDT 1
DEFINE OSC 4             " Con un oscilador de 4 MHz


COMM        var PORTC.0

ESCLAVO     VAR BYTE    $30 SYSTEM
TXBUF       VAR BYTE    $31 SYSTEM
CONTA       VAR BYTE    $32 SYSTEM

RTR_SEG     var byte    $33 SYSTEM
RTR_MINT    VAR BYTE    $34 SYSTEM
RTR_HRS     VAR BYTE    $35 SYSTEM
RTR_DIA     VAR BYTE    $36 SYSTEM
RTR_FECHA   VAR BYTE    $37 SYSTEM
RTR_MES     VAR BYTE    $38 SYSTEM
RTR_MESX12  VAR BYTE    $39 SYSTEM

DECE        VAR BYTE    $40 SYSTEM
UNID        VAR BYTE    $41 SYSTEM

CONV1       VAR BYTE    $42 SYSTEM
CONV2       VAR BYTE    $43 SYSTEM


asm
;Esta es la configuración

I2C_SETUP
   BANKSEL   SSPADD         ; Selecciona el Banco 1 y el registro
   movlw    0x09         ; Carga 0x09 para baud rate 100KHZ@4MHZ
   movwf    SSPADD       ; Inicializa velocidad de transferencia
   bcf    SSPSTAT,6   ; Selecciona niveles para bus I2C
   bsf   SSPSTAT,7    ; Desabilita el slew rate
   movlw     0x14       ; Programa las lineas del I2C
   movwf   TRISC         ; como entradas.
   bcf    STATUS,RP0   ; Selecciona el BANCO 0
   movlw    0x24       ; Programa el modulo SSP
   movwf    SSPCON        ; Modo maestro y habilitando el I2C


; PONE EN HORA EL DS1307 DESDE UNA TABLA

   clrf   CONTA               ; Borrando el contador
   movlw    0xD0                ; Dirección del esclavo                                  
      movwf    ESCLAVO             ; Preparando esclavo
   call   WRITE_I2C_BYTE_INI
LOOP_WRITE
   movfw    CONTA               ; Primera dirección del DS1307 (SEG)
   call   TABLA               ; seg,min,hrs,dia,mes,año
   movwf    TXBUF               ; Para ser transmitidos
   call    WRITE_I2C_BYTE      ; y escritos
   incf    CONTA               ; incrementando la dirección
   movfw    CONTA               ; Aquí se pregunta si ya se mandó toda
   xorlw    .8                  ; la información.
   btfss    STATUS,Z            ; Z=1 si
   goto    LOOP_WRITE          ; Z=0 no
   call    WRITE_I2C_BSTOP
   return

; TABLA DE DATOS PARA PUESTA EN HORA Y FUNCIONAMIENTO DEL DS1307
TABLA
   addwf PCL,F
   DT 0x00,0x00,0x49,0x01,0x13,0x09,0x04,0x90

; SEGUNDOS,MINUTOS,HORA,DIA DE LA SEMANA, DIA DEL MES, MES, AÑO, CONFIGURACION


; LECTURA DEL DS1307

READ_RTC_I2C          ; Lectura del DS1307 y se carga en RAM
   movlw    0x09       ; Carga el numero de Bytes a leer
   movwf    CONTA       ;
   movlw    0xD0      ; Direccion de esclavo del DS 1307
   movwf    ESCLAVO      ;
   call   READ_I2C_INI; Inicializa el modulo I2C para lectura
   movlw    0x33         ; Direccion inicial de RAM para transferir
   movwf    FSR         ; a la RAM del micro en modo indirecto

RBYTE_RTC
   call   READ_I2C_PAGE       ; Inicia lectura secuencial del DS1307
   movfw    SSPBUF              ;
   movwf   INDF              ; Y lo transfiere a un registro de la RAM del micro
   incf    FSR                ; Incrementa 1 el puntero de direccion indirecta
   decfsz    CONTA                   ; Verifica si lleyo todos los BYTES
   goto    RBYTE_RTC           ; Si no lee otro BYTE
   call    READ_I2C_PAGE_BSTOP
   return




; RUTINAS USANDO MSSP

; Escritura al DS1307


WRITE_I2C_BYTE_INI
   call   I2C_BSTART      ; Genera el bit de START
   movfw    ESCLAVO         ; Direccion del esclavo en modo escritura
   movwf    SSPBUF         ; y al cargarlo en SSPBUF lo transmite
   call    WAIT_I2C_INT   ; Espera por interrupcion del modulo
   call    I2C_ACK         ; Verifica si hubo ACK del esclavo
   movlw   0x00         ; Direccion de memoria a grabar
   movwf   SSPBUF          ; Al cargar SSPBUF se inicia la transmision
   call    WAIT_I2C_INT   ; Espera por interrupcion del modulo
   call    I2C_ACK         ; Verifica si hubo ACK del esclavo
   return                ; Y retorna

WRITE_I2C_BYTE
   movfw    TXBUF          ; Carga en W el dato a Grabar
   movwf    SSPBUF          ; y al cargarlo en SSPBUF lo transmite
   call    WAIT_I2C_INT   ; Espera por interrupcion del modulo
   call    I2C_ACK         ; Verifica si hubo ACK del esclavo
   return                 ; Y retorna

WRITE_I2C_BSTOP
   call   I2C_BSTOP       ; Genera el bit de STOP
   return                 ; Y retorna

; Lectura del DS1307

READ_I2C_INI
   call    I2C_BSTART      ; Genera el bit de START
   bsf    ESCLAVO,0    ; Selecciona el modo lectura del esclavo
   movfw    ESCLAVO          ; Direccion del esclavo en modo lectura
   movwf    SSPBUF           ; y al cargarlo en SSPBUF lo transmite
   call    WAIT_I2C_INT   ; Espera por interrupcion del modulo
   call    I2C_ACK        ; Verifica si hubo ACK del esclavo
   movlw   0x00           ; Direccion de memoria a leer
   movwf    SSPBUF           ; Al cargar SSPBUF se inicia la transmision
   call    WAIT_I2C_INT    ; Espera por interrupcion del modulo
   call    I2C_ACK        ; Verifica si hubo ACK del esclavo
   call    I2C_RX       ; Inicia recepcion I2C
   return

READ_I2C_PAGE
   bsf    STATUS,RP0      ; selecciona el banco SSPCON2
   bcf    SSPCON2,ACKDT  ; responder al esclavo con un ack
   bsf    SSPCON2,ACKEN  ; Incia la secuencia de ACK maestro a esclavo
   btfsc    SSPCON2,ACKEN  ; ¿ack enviado?
   goto    $-1          ; no, intenta de nuevo
   bsf    SSPCON2,RCEN   ; Lo mandó, prepararse para recepción de ACK
   bcf    STATUS,RP0       ; Moviéndose al banco  
   call    WAIT_I2C_INT   ; Espera por interrupción del módulo
   return                 ; Y retorna

READ_I2C_PAGE_BSTOP
   bsf    STATUS,RP0       ; Selecciona el banco
   bsf    SSPCON2,ACKDT  ; Final de la lectura, enviando un /ACK
   bsf    SSPCON2,ACKEN  ; Incia la secuencia de ACK maestro a esclavo
   bcf    STATUS,RP0       ; Moviéndonos de banco
   call    WAIT_I2C_INT   ; Espera por interrupción del módulo
   call    I2C_BSTOP       ; Genera el bit de paro (STOP)
   return                 ; Y retorna

;==================RUTINAS AUXILIARES PARA I2C===============================

I2C_BSTART
   bsf    STATUS,RP0    ; Seleccionamos banco 1
   bsf    SSPCON2,SEN ; Iniciando bit de inicio (START)
   btfsc    SSPCON2,SEN ; Asegurándonos que se mandó
   goto    $-1       ;
   bcf    STATUS,RP0    ; Regresando a banco 0
   return

I2C_BSTOP
   bsf    STATUS,RP0    ; Seleccionando banco 1
   bsf    SSPCON2,PEN ; Generando el bit de paro (STOP)
   btfsc    SSPCON2,PEN ; Asegurándose que se mandó
   goto    $-1      ;
   bcf    STATUS,RP0    ; Regresando al banco 0
   return

I2C_RX
   bsf    STATUS,RP0      ; Seleccionando SSPCON2
   bsf    SSPCON2,RCEN  ; para habilitar al maestro como
   bcf    STATUS,RP0      ; receptor y regresando al banco 0
   return

I2C_ACK
   bsf    STATUS,RP0       ; Seleccionando SSPCON2
   btfsc    SSPCON2,ACKSTAT ; Esclavo = ACK
   goto    $-1           ; Esperando
   bcf    STATUS,RP0        ; Regresando al banco 0
   return

WAIT_I2C_INT          ; Espera por señal de interrupción del
   bcf    PIR1,SSPIF    ; modulo, recordemos que el módulo genera
   btfss    PIR1,SSPIF    ; por cada operación una interrupción, en
   goto    $-1       ; este caso se revisa la bandera a tal fin
   return

;=========================FIN RUTINAS AUXILIARES I2C====================


end

endasm


ACTUAL:

    "iniciando conversión para segundos  
    CONV1 = RTR_SEG         " Pasando RTR_SEG binario a CONV1
    Gosub   conversion      " Llamando a la conversión de BCD a Binario
    RTR_SEG = CONV2         " Colocando el resultado de la conversión (BIN)
                                     
    "iniciando conversión para minutos    
    CONV1 = RTR_MINT        " Pasando RTR_MINT binario a CONV1
    gosub   conversion      " Llamando a la conversión de BCD a Binario
    RTR_MINT = CONV2        " Colocando el resultado de la conversión (BIN)

    "iniciando conversión para horas      
    asm

    clrf    CONTA
    movfw   RTR_HRS
    andlw   0x30,W
    movwf   CONV1
    btfsc   CONV1,5     ; 0 = AM
    infc    CONTA       ; 1 = PM
    movlw   0x1F
    andwf   RTR_HRS,F

    endasm

    CONV1 = RTR_hrs        " Pasando RTR_HRS binario a CONV1
    gosub   conversion     " Llamando a la conversión de BCD a Binario
    RTR_HRS = CONV2        " Colocando el resultado de la conversión (BIN)
   
    "iniciando conversión para días (no lo ocupa ya que días es de 7 bits)

    "iniciando conversión para fecha
    CONV1 = RTR_fecha       " Pasando RTR_FECHA binario a CONV1
    gosub   conversion      " Llamando a la conversión de BCD a Binario
    RTR_FECHA = CONV2       " Colocando el resultado de la conversión (BIN)

    "iniciando conversión para mes
    CONV1 = RTR_mes         " Pasando RTR_MES binario a CONV1
    gosub   conversion      " Llamando a la conversión de BCD a Binario
    RTR_MES = CONV2         " Colocando el resultado de la conversión (BIN)

    "iniciando conversión para año
    CONV1 = RTR_mesx12      " Pasando RTR_MESX12 binario a CONV1
    gosub   conversion      " Llamando a la conversión de BCD a Binario
    RTR_MESX12 = CONV2      " Colocando el resultado de la conversión (BIN)


CONVERSION:
    UNID = CONV1&$0F
    asm
    SWAPF   CONV1,F
    endasm
    DECE = CONV1
    DECE = (DECE&$0F)*10
    CONV2 = DECE+UNID
    return

lcdout   $FE,1, "TIEMPO = ",dec RTR_FECHA,"-",DEC RTR_MES,"-",DEC RTR_MESX12
pause 1000

lcdout   $FE,1,   DEC RTR_HRS,":",DEC RTR_MINT,":",DEC RTR_SEG," "]
 IF CONTA==1 THEN
        lcdout $FE,$80+17 "PM"
      ELSE
   lcdout $FE,$80+17 "AM"
    ENDIF

pause 1000

GOTO ACTUAL


Por Hardware 2

"************************************************************************
"*  Nombre  : DS1307_PIC_I²C.BAS                                        *
"*  Autor   : Mario Alberto Camarillo Ramos                            *
"*  Fecha   : 4/OCT/2004                                              *
"*  Versión : 1.7                                                      *
"*  Modelo  : PIC_16F872                                          *
"*  Notas   : Esta es solo para cuando ya está configurado el DS1307    *
"************************************************************************



DEFINE NO_CLRWDT 1
DEFINE OSC 4             " Con un oscilador de 4 MHz


COMM        var PORTC.0

ESCLAVO     VAR BYTE    $30 SYSTEM
TXBUF       VAR BYTE    $31 SYSTEM
CONTA       VAR BYTE    $32 SYSTEM

RTR_SEG     var byte    $33 SYSTEM
RTR_MINT    VAR BYTE    $34 SYSTEM
RTR_HRS     VAR BYTE    $35 SYSTEM
RTR_DIA     VAR BYTE    $36 SYSTEM
RTR_FECHA   VAR BYTE    $37 SYSTEM
RTR_MES     VAR BYTE    $38 SYSTEM
RTR_MESX12  VAR BYTE    $39 SYSTEM

DECE        VAR BYTE    $40 SYSTEM
UNID        VAR BYTE    $41 SYSTEM

CONV1       VAR BYTE    $42 SYSTEM
CONV2       VAR BYTE    $43 SYSTEM


asm
;Esta es la configuración

I2C_SETUP
   BANKSEL   SSPADD         ; Selecciona el Banco 1 y el registro
   movlw    0x09         ; Carga 0x09 para baud rate 100KHZ@4MHZ
   movwf    SSPADD       ; Inicializa velocidad de transferencia
   bcf    SSPSTAT,6   ; Selecciona niveles para bus I2C
   bsf       SSPSTAT,7    ; Desabilita el slew rate
   movlw     0x14       ; Programa las lineas del I2C
   movwf   TRISC         ; como entradas.
   bcf    STATUS,RP0   ; Selecciona el BANCO 0
   movlw    0x24       ; Programa el modulo SSP
   movwf    SSPCON        ; Modo maestro y habilitando el I2C



; LECTURA DEL DS1307

READ_RTC_I2C          ; Lectura del DS1307 y se carga en RAM
   movlw    0x09       ; Carga el numero de Bytes a leer
   movwf    CONTA       ;
   movlw    0xD0      ; Direccion de esclavo del DS 1307
   movwf    ESCLAVO      ;
   call   READ_I2C_INI; Inicializa el modulo I2C para lectura
   movlw    0x33         ; Direccion inicial de RAM para transferir
   movwf    FSR         ; a la RAM del micro en modo indirecto

RBYTE_RTC
   call   READ_I2C_PAGE       ; Inicia lectura secuencial del DS1307
   movfw    SSPBUF              ;
   movwf   INDF              ; Y lo transfiere a un registro de la RAM del micro
   incf    FSR                ; Incrementa 1 el puntero de direccion indirecta
   decfsz    CONTA                   ; Verifica si lleyo todos los BYTES
   goto    RBYTE_RTC           ; Si no lee otro BYTE
   call    READ_I2C_PAGE_BSTOP
   return

; RUTINAS USANDO MSSP


; Lectura del DS1307

READ_I2C_INI
   call    I2C_BSTART      ; Genera el bit de START
   bsf    ESCLAVO,0    ; Selecciona el modo lectura del esclavo
   movfw    ESCLAVO          ; Direccion del esclavo en modo lectura
   movwf    SSPBUF           ; y al cargarlo en SSPBUF lo transmite
   call    WAIT_I2C_INT   ; Espera por interrupcion del modulo
   call    I2C_ACK        ; Verifica si hubo ACK del esclavo
   movlw   0x00           ; Direccion de memoria a leer
   movwf    SSPBUF           ; Al cargar SSPBUF se inicia la transmision
   call    WAIT_I2C_INT    ; Espera por interrupcion del modulo
   call    I2C_ACK        ; Verifica si hubo ACK del esclavo
   call    I2C_RX       ; Inicia recepcion I2C
   return

READ_I2C_PAGE
   bsf    STATUS,RP0      ; selecciona el banco SSPCON2
   bcf    SSPCON2,ACKDT  ; responder al esclavo con un ack
   bsf    SSPCON2,ACKEN  ; Incia la secuencia de ACK maestro a esclavo
   btfsc    SSPCON2,ACKEN  ; ¿ack enviado?
   goto    $-1          ; no, intenta de nuevo
   bsf    SSPCON2,RCEN   ; Lo mandó, prepararse para recepción de ACK
   bcf    STATUS,RP0       ; Moviéndose al banco  
   call    WAIT_I2C_INT   ; Espera por interrupción del módulo
   return                 ; Y retorna

READ_I2C_PAGE_BSTOP
   bsf    STATUS,RP0       ; Selecciona el banco
   bsf    SSPCON2,ACKDT  ; Final de la lectura, enviando un /ACK
   bsf    SSPCON2,ACKEN  ; Incia la secuencia de ACK maestro a esclavo
   bcf    STATUS,RP0       ; Moviéndonos de banco
   call    WAIT_I2C_INT   ; Espera por interrupción del módulo
   call    I2C_BSTOP       ; Genera el bit de paro (STOP)
   return                 ; Y retorna

;==================RUTINAS AUXILIARES PARA I2C===============================

I2C_BSTART
   bsf    STATUS,RP0    ; Seleccionamos banco 1
   bsf    SSPCON2,SEN ; Iniciando bit de inicio (START)
   btfsc    SSPCON2,SEN ; Asegurándonos que se mandó
   goto    $-1       ;
   bcf    STATUS,RP0    ; Regresando a banco 0
   return

I2C_BSTOP
   bsf    STATUS,RP0    ; Seleccionando banco 1
   bsf    SSPCON2,PEN ; Generando el bit de paro (STOP)
   btfsc    SSPCON2,PEN ; Asegurándose que se mandó
   goto    $-1      ;
   bcf    STATUS,RP0    ; Regresando al banco 0
   return

I2C_RX
   bsf    STATUS,RP0      ; Seleccionando SSPCON2
   bsf    SSPCON2,RCEN  ; para habilitar al maestro como
   bcf    STATUS,RP0      ; receptor y regresando al banco 0
   return

I2C_ACK
   bsf    STATUS,RP0       ; Seleccionando SSPCON2
   btfsc    SSPCON2,ACKSTAT ; Esclavo = ACK
   goto    $-1           ; Esperando
   bcf    STATUS,RP0        ; Regresando al banco 0
   return

WAIT_I2C_INT          ; Espera por señal de interrupción del
   bcf    PIR1,SSPIF    ; modulo, recordemos que el módulo genera
   btfss    PIR1,SSPIF    ; por cada operación una interrupción, en
   goto    $-1       ; este caso se revisa la bandera a tal fin
   return

;=========================FIN RUTINAS AUXILIARES I2C====================


end

endasm


ACTUAL:

    "iniciando conversión para segundos  
    CONV1 = RTR_SEG         " Pasando RTR_SEG binario a CONV1
    Gosub   conversion      " Llamando a la conversión de BCD a Binario
    RTR_SEG = CONV2         " Colocando el resultado de la conversión (BIN)
                                     
    "iniciando conversión para minutos    
    CONV1 = RTR_MINT        " Pasando RTR_MINT binario a CONV1
    gosub   conversion      " Llamando a la conversión de BCD a Binario
    RTR_MINT = CONV2        " Colocando el resultado de la conversión (BIN)

    "iniciando conversión para horas      
    asm

    clrf    CONTA
    movfw   RTR_HRS
    andlw   0x30,W
    movwf   CONV1
    btfsc   CONV1,5     ; 0 = AM
    infc    CONTA       ; 1 = PM
    movlw   0x1F
    andwf   RTR_HRS,F

    endasm

    CONV1 = RTR_hrs        " Pasando RTR_HRS binario a CONV1
    gosub   conversion     " Llamando a la conversión de BCD a Binario
    RTR_HRS = CONV2        " Colocando el resultado de la conversión (BIN)
   
    "iniciando conversión para días (no lo ocupa ya que días es de 7 bits)

    "iniciando conversión para fecha
    CONV1 = RTR_fecha       " Pasando RTR_FECHA binario a CONV1
    gosub   conversion      " Llamando a la conversión de BCD a Binario
    RTR_FECHA = CONV2       " Colocando el resultado de la conversión (BIN)

    "iniciando conversión para mes
    CONV1 = RTR_mes         " Pasando RTR_MES binario a CONV1
    gosub   conversion      " Llamando a la conversión de BCD a Binario
    RTR_MES = CONV2         " Colocando el resultado de la conversión (BIN)

    "iniciando conversión para año
    CONV1 = RTR_mesx12      " Pasando RTR_MESX12 binario a CONV1
    gosub   conversion      " Llamando a la conversión de BCD a Binario
    RTR_MESX12 = CONV2      " Colocando el resultado de la conversión (BIN)


CONVERSION:
    UNID = CONV1&$0F
    asm
    SWAPF   CONV1,F
    endasm
    DECE = CONV1
    DECE = (DECE&$0F)*10
    CONV2 = DECE+UNID
    return

   
lcdout   $FE,1, "TIEMPO = ",dec RTR_FECHA,"-",DEC RTR_MES,"-",DEC RTR_MESX12
pause 1000

lcdout   $FE,1,   DEC RTR_HRS,":",DEC RTR_MINT,":",DEC RTR_SEG," "]
 IF CONTA==1 THEN
        lcdout $FE,$80+17 "PM"
      ELSE
   lcdout $FE,$80+17 "AM"
    ENDIF

pause 1000

GOTO ACTUAL


Se compró el cristal para el DS1307 acoplado a 12.5 pf ya que está es la carga capacitiva requerida.

El miércoles me daré a la tarea de buscar un por qué más tangible (con osciloscopio y viendo la información).Ardiendo


Se les agradece el tiempo para leer esto y espero que la conversión sirva de algo por lo menos.Avergonzado
La buena administración es utilizar el sentido común y la regla de oro; aunque el sentido común no es tan común como quisiéramos que fuera y, quien tiene el oro, hace las reglas.
George Terry

"A loser will defeat a genius with hard work"
Rock Lee

Desconectado Tigre

  • Colaborador
  • PIC10
  • *****
  • Mensajes: 34
RE: Problemas con I2C y DS1307
« Respuesta #1 en: 01 de Noviembre de 2004, 11:34:00 »
Hola
Mira yo no tengo experiencia pero he estado peleandome con este DS1307, el primer problema que tenia es que estaba dañado Llorando y el LCD me mandaba 88:88:88 lo cambie y listo.

No vi bien tu mensaje por que no entiendo casi nada de lo que pones pero veo que lo mandas al LCD en DEC RTR_HRS y yo lo mando como HEX2 RTR_HRS, no se si por algun cambio que tengas, tambien la dirección de lectura debe ser D1 y escritura D0 segun yo.

El data dice:
The address byte is the first byte received after the start condition is generated by the
master. The address byte contains the 7-bit DS1307 address, which is 1101000, followed by the
*direction bit (R/W ) which, for a read, is a 1.

pongo un ejemplo de lo que utilice para ver si funcionaba primero y solo pone la hora por default y se ve en el LCD.


****************************************
DEVICE=16F877   
 XTAL = 4
      LCD_DTPIN = PORTD.4   
      LCD_RSPIN = PORTD.2
      LCD_ENPIN = PORTD.3
      LCD_INTERFACE = 4   " 4-bit Interface
      LCD_LINES = 2
      LCD_TYPE = 0
         

      pause 1000
      
      
      SCL_PIN   = PORTC.3
           SDA_PIN   = PORTC.4
      
      DIM SEGUNDOS    AS BYTE
      DIM MINUTOS     AS BYTE
      DIM HORA   AS BYTE

"   ++++++++++ Grabar la hora

      SEGUNDOS = $00
      MINUTOS = $00
      HORA=$12
      
" para simular con el PCF8583 utilizo la direccion   %10100000,2,
      
      BUSOUT $D0,$00,[SEGUNDOS,MINUTOS,HORA] "GRABA LA HORA PRE ESTABLECIDA
      CLS   
            


Leer_Hora:       

      BUSIN $D1,$00,[ SEGUNDOS,MINUTOS,HORA]
      
      PRINT AT 1,1,  HEX2 HORA,":", HEX2 MINUTOS, ":", HEX2 SEGUNDOS
      
   
      
GOTO Leer_Hora

END
*******************************
Espero te sirva de algo esto ya que como te comento no tengo mucha experiencia y yo solo ocupo la hora, minutos y segundos.

Saludos

Luis


Desconectado Mario

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 873
RE: Problemas con I2C y DS1307
« Respuesta #2 en: 01 de Noviembre de 2004, 14:04:00 »
Luis,

¿Mencionas que no entiendes casi nada porque no estás familiarizado con la programación en ensamblador?

Tienes razón y no me lo puedo perdonar:

Estoy escribiendo siempre y nunca leo ($D0 y $D0, nunca $D1).

El miércoles que tenga oportunidad de ir a la escuela lo intentaré como debe ser.
¿Qué compilador usas?

La sintaxis es muy parecida al PicBasic Pro pero estoy 99.92% seguro que no es.

Yo uso el PIC16F872 que también tiene I²C en hardware, si consigo utilizar el hardware, me ahorraré como 200 líneas de programación (a la hora de compilar) y será multitareas mi aplicación en lugar de esperar todo el ciclo de I2CREAD y Write.

Te mantendré informado.

Oye, cómo le haces para desplegar la hora, ya ves que el resultado te lo da en BCD pero debes acomodarlo, es por eso que se tiene la subrutina Conversion para acomodarlo como debe ser.

Muchísisisisimas gracias, lo antes mencionado (lectura-escritura) tiene grandes posibilidades de ser cierto (¡y eso que se supone me sé el comportamiento del protocolo!), no sé cómo lo pasé por alto.

Mario Alberto Camarillo Ramos
La buena administración es utilizar el sentido común y la regla de oro; aunque el sentido común no es tan común como quisiéramos que fuera y, quien tiene el oro, hace las reglas.
George Terry

"A loser will defeat a genius with hard work"
Rock Lee

Desconectado Tigre

  • Colaborador
  • PIC10
  • *****
  • Mensajes: 34
RE: Problemas con I2C y DS1307
« Respuesta #3 en: 01 de Noviembre de 2004, 15:36:00 »
Hola

Exacto no entiendo el ensamblador ni el basic Muchas risas, pero le estoy haciendo la lucha.

Utilizo el proton+ o Pic Basic Plus (segun alguien me comento jeje)

lo utilizo tal cual lo puse mando un print at 1,1, hex2 hora y me despliega la hora como debe ser, esto lo saque de la siguiente liga que esta en PBpro pero a mi no servia todo asi que lo cambie, aparte que le entendia al PBP menoa que al Proton+

Para lo que si realize cambios de BCD=>DEC y DEC=>BCD fue para cambiar por medio de botones la hora y minutos

Esto lo puso alguna vez MarquesSalsero  
 
http://www.melabs.com/resources/samples.htm

encontraras un archivo llamado MN1307.txt



Saludos

Luis

Desconectado khasistos

  • PIC18
  • ****
  • Mensajes: 493
RE: Problemas con I2C y DS1307
« Respuesta #4 en: 01 de Noviembre de 2004, 17:56:00 »
HOLA:

Disculpa pero no se porque mezclas tanto asm y codigo basic  ,aqui te pongo un ejemplo en plus para un 1302,creo que no hay enormes diferencias......
espero te sirva auque sea de ejemplo...como manejarlo sin asm...

Saludos
khasitos

" LCD clock program using Dallas1202/1302 RTC

          Device 16F877
      XTAL = 20
       
" Graphic LCD pin Assignments        
        Declare   LCD_DTPIN      PORTD.0
        Declare   LCD_RSPIN      PORTE.0
        Declare   LCD_ENPIN      PORTE.1
        Declare LCD_LINES      2
        Declare LCD_INTERFACE   8

" Alias pins
      Symbol RST  = PORTA.2
      Symbol IO   = PORTC.1
      Symbol SCLK   = PORTC.3

" Allocate variables
      Dim rtcyear as     byte
      Dim rtcday  as     byte
      Dim rtcmonth as    byte
      Dim rtcdate as     byte
      Dim rtchr   as     byte
      Dim rtcmin  as     byte
      Dim rtcsec  as     byte
      Dim rtccontrol as  byte
       
"-------------------------------------------------------------------------------        
        Low RST                        " Reset RTC
        Low SCLK
        ADCON1 = 7                     " PORTA and E digital
        Low PORTE.2                    " LCD R/W low = write
        Delayms 100                      " Wait for LCD to startup

" Set initial time to 8:00:00AM 07/16/99
        rtcyear = $99
        rtcday = $06
        rtcmonth = $07
        rtcdate = $16
        rtchr = $08
        rtcmin = 0
        rtcsec = 0
        Gosub settime                  " Set the time
        Goto mainloop                  " Skip subroutines
"-------------------------------------------------------------------------------
" Subroutine to write time to RTC
Settime:
        RST = 1                        " Ready for transfer
        Shout IO,SCLK,LSBFIRST,[$8e,0]      " Enable write
        RST = 0                        " Reset RTC
        RST = 1                        " Ready for transfer
" Write all 8 RTC registers in burst mode
        Shout IO,SCLK,LSBFIRST,[$be,rtcsec,rtcmin,rtchr,rtcdate,rtcmonth,rtcday,rtcyear,0]
        RST = 0                        " Reset RTC
        Return
"-------------------------------------------------------------------------------
" Subroutine to read time from RTC
gettime:
        RST = 1                        " Ready for transfer
        Shout IO,SCLK,LSBFIRST,[$bf]        " Read all 8 RTC registers in burst mode
        Shin IO,SCLK,LSBPRE,[rtcsec,rtcmin,rtchr,rtcdate,rtcmonth,rtcday,rtcyear,rtccontrol]
        RST = 0                        " Reset RTC
        Return
"-------------------------------------------------------------------------------
" Main program loop - updates the LCD with the time
Mainloop:
        Gosub gettime                  " Read the time from the RTC

" Display time on LCD
        Print at 1,1, hex2 rtcmonth,"/",hex2 rtcdate,"/",hex2 rtcyear,"  ",hex2 rtchr,":",hex2 rtcmin,":",hex2 rtcsec
        Delayms 300                      " Do it approx 3 times a second
        Goto Mainloop                  " Do it forever


Desconectado Mario

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 873
RE: Problemas con I2C y DS1307
« Respuesta #5 en: 01 de Noviembre de 2004, 21:46:00 »
khasistos y Luis:

khasistos
La razón por la cual de la "mezcla" es porque requiero mayor velocidad en la adquicisión de la información (tengo contadores en hardware y convertidores analógicos/digitales en hardware). Es de vital importancia que el programa fuente no se cargue de "cosas" adicionales. Es por ello el ensamblador para activar el hardware de I²C.

Luis
Ese archivo fue el que me basé para realizar el programa en software, es de Melanie Newman y lo usa para el 16F628 (el cual también lo tengo).

Gracia a ambos.
La buena administración es utilizar el sentido común y la regla de oro; aunque el sentido común no es tan común como quisiéramos que fuera y, quien tiene el oro, hace las reglas.
George Terry

"A loser will defeat a genius with hard work"
Rock Lee

Desconectado lager

  • PIC18
  • ****
  • Mensajes: 258
RE: Problemas con I2C y DS1307
« Respuesta #6 en: 03 de Noviembre de 2004, 11:51:00 »
Hola Reppuken
Veo que usas comandos como movwf que no son necesarios en asm(con x=y es suficiente ya que es lomismo en compilacion), y btfss y clrf, y muchos otros, un IF trabaja igual que un btfss(solo un ejemplo) deberias de probar con el codigo propuesto por el pana KHASISTOS, se que usaste el de pbpro pero te aseguro que el codigo que genere proton tendra menos  " cosas " que te a generado el pbpro, si no funciona, entonces se tendria que ver la sintaxis del codigo, no poner en linea varios comandos, etc... solo es cosa de que poco a poco vayas recortando detalles para Maximizar codigo.
si no quieres que se te carge de codigo pana quita esas EXTENSAS lineas de tu codigo fuentecomo:
I2CWrite Portc.4,Portc.3,$D0,$00,[RTR_SEG,RTR_MINT,RTR_HRS,RTR_DIA,RTR_FECHA,RTR_MES,RTR_MESX12,control]

esta mas que conocido y comprobado, que no es bueno cargar en LINEa tanto(estas generadno mucho codigo asi y eso es lo que quieres evitar no????????)
Yo creo que corrigiendo la sintaxis, o hasta usando el codigo en proton te funcionaria, solo es cosa de que pruebes y si no, maximizar codigo, es decir, genera el codigo en proton, compilalo,y abre con F2 el ensamblado(veras que es muy eficiente) despues abres el pbp y eliminas comandos extras (lo cual lo hace por defaul el compilador  " eliminacion y optimizacion de codigo " ) que encuentres.
Usando adecuadamente un compilador te generara mucho menos codigo que usandolo por defaul.

Salu2 pana

Desconectado Mario

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 873
RE: Problemas con I2C y DS1307
« Respuesta #7 en: 03 de Noviembre de 2004, 14:36:00 »
Lager,

Hoy me daré a la tarea de ver el por qué no funciona el programa.

Tienes mucha razón en lo de las instrucciones I2CWRITE Y READ, simplemente se implementaron para saber si el µicro funcionaba pero, falló igual que el programa en ensamblador.

Con lo que respecta a los movimientos en ensamblador, es porque no había visualizado el código del PBP muy bien:

LUIS propuso una alternativa más viable (creo) al presentar la información como HEX, ya que el DS1307 pone la información en BCD pero en el mismo BYTE (decenas con unidades ej: 27= 0010 0111) por eso la conversión pero creo que utilizaré esta propuesta de pedir sólo el HEX correspondiente, al fin que esta es la rutina de conversión y si esto me genera menos código, mejor.

Gracias por la sugerencia y espero dar una respuesta (satisfactoria preferentemente) a este problema.

Mario
La buena administración es utilizar el sentido común y la regla de oro; aunque el sentido común no es tan común como quisiéramos que fuera y, quien tiene el oro, hace las reglas.
George Terry

"A loser will defeat a genius with hard work"
Rock Lee

Desconectado Mario

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 873
RE: Problemas con I2C y DS1307
« Respuesta #8 en: 03 de Noviembre de 2004, 14:42:00 »
Una cosa mas:

No uso el "Protón" porque no dispongo de él, con el PicBasic Pro no he tenido problemas (tengo problemas al hacer el programa, pero no de compilador).

Aparte, quiero dominar el PBP para (si es necesario) porder mudarme a otro compilador y no batallar tanto.

Me han mencionado de algo llamado OOPIC pero busqué información y no creo que este dentro de mis necesidades (¡y presupuesto!).

Atentamente

Mario
La buena administración es utilizar el sentido común y la regla de oro; aunque el sentido común no es tan común como quisiéramos que fuera y, quien tiene el oro, hace las reglas.
George Terry

"A loser will defeat a genius with hard work"
Rock Lee

Desconectado DavidPayaso

  • PIC10
  • *
  • Mensajes: 3
RE: Problemas con I2C y DS1307
« Respuesta #9 en: 05 de Noviembre de 2004, 13:32:00 »
Hola oye yo quisiera hacer un proyecto similar, y no se si me podrias pasar el cto de tu programa que pones aqui, y el programa completo ya que la verdad medio sé programar pero solo en ensamblador, en Basic no, sino es mucha molestia, mi mail es david_payaso@hotmail.com Gracias.
Por cierto en este link hay un ejercicio con el PIC16F628, en Basic Talvez te sirva:

http://www.melabs.com/resources/samples/submitted/MN1307.txt


 

anything