Autor Tema: PROBLEMAS CON EL DS1307  (Leído 2432 veces)

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

Desconectado GAWAIN0701

  • PIC10
  • *
  • Mensajes: 1
PROBLEMAS CON EL DS1307
« en: 14 de Abril de 2016, 22:48:26 »
Hola a todos.

Me encuentro programando en Pic Basic Pro un reloj digital con un PIC 16F877A y un integrado DS1307. Al correr el circuito en el simulador PROTEUS, en los primeros segundos en la pantalla LCD aparece funcionando todo perfectamente, mostrando la hora, minutos, segundos, dia, fecha, mes y año, pero posteriormente muestra ceros y otros caracteres sin sentido.

Entonces, les agradeceria me indicaran cual es el error que estoy cometiendo, y como solucionarlo, ya que a pesar de haberle dado muchas vueltas no logro detectar el problema.

El programa es el siguiente:

'RELOJ

@ device xt_osc ; oscilador externo XT
define osc 20 ; especifica que se va a utilizar uno de 4 Mhz




' Configuración de Puertos:

TRISD = %00000000
TRISB = %11111000

TRISA = %010000
TRISE = %000
TRISC = %11111111

' DEFINICION CONEXION LCD
DEFINE LCD_DREG PORTD ' Indica que el Bus estará conectado en el Puerto D
DEFINE LCD_BITS 4 ' El bus será de cuatro bits.
DEFINE LCD_DBIT 4 ' Selección del Bit de inicio del puerto en el uC para el
' bus de datos de la LCD
DEFINE LCD_RSREG PORTD ' Indica al uC que el pin "RS" estará en el Puerto D
DEFINE LCD_RSBIT 2 ' "RS" estará conectado en RD2
DEFINE LCD_EREG PORTD ' Indica al uC que el pin "E" estará en el Puerto D
DEFINE LCD_EBIT 3 ' "E" estará conectado en RD3
DEFINE LCD_LINES 4 ' Define el número de líneas de la pantalla

DEFINE I2C_SLOW 1

DEFINE I2C_SCLOUT 1 ;para que no necesite resistencia pull-up en SCL

'DEFINICION VARIABLES

CPIN VAR Portb.7 ;pin señal de reloj I2C
DPIN VAR Portb.6 ;pin de datos I2C
segu VAR BYTE ;definir tamaño de variable segundos 1 a 255
minu VAR BYTE ;variable para los minutos
hora VAR BYTE ;variable para las horas
diaS VAR BYTE ;variable día de la semana
diaF VAR BYTE ;variable día fecha del mes
mes VAR BYTE ;variable mes
anio VAR BYTE ;variable año de 2 dígitos

SEM VAR BYTE    'SELECCION DE SEMANA PARA PROGRAMACION

HORAAPAGA1 VAR BYTE 'SELECCION DE HORA DE APAGADO 1

MINAPAGA1 VAR BYTE 'SELECCION DE MINUTO DE APAGADO 1

REPITACICLO VAR BYTE 'VARIABLE PARA REPETIR PANTALLAS DE PROGRAMACION


INICIO:

I2CREAD DPIN,CPIN,%11010000,0,[segu] ;leer los datos de mem. 0,
 I2CREAD DPIN,CPIN,%11010000,1,[minu] ;1,2,..y guardarlos en sus
 I2CREAD DPIN,CPIN,%11010000,2,[hora] ;respectivas variables
 I2CREAD DPIN,CPIN,%11010000,3,[diaS]
 I2CREAD DPIN,CPIN,%11010000,4,[diaF]
 I2CREAD DPIN,CPIN,%11010000,5,[mes]
 I2CREAD DPIN,CPIN,%11010000,6,[anio]


lcdout $fe,1," ",hex2 hora,":",hex2 minu,":",hex2 segu  ;mostrar la hora
 ; min y segs. en 2 dígitos (HEX2)
LCDOUT $fe,$c0 ;saltar a la 2da línea del LCD
 ;mostrar día de la semana



 IF diaS=$1 THEN LCDOUT "Dom."
 IF diaS=$2 THEN LCDOUT "Lun."
 IF diaS=$3 THEN LCDOUT "Mar."
 IF diaS=$4 THEN LCDOUT "Mie."
 IF diaS=$5 THEN LCDOUT "Jue."
 IF diaS=$6 THEN LCDOUT "Vie."
 IF diaS=$7 THEN LCDOUT "Sab."
LCDOUT $fe,$c5, HEX2 diaF,"/" ;mostrar el día del mes /
LCDOUT $fe,$cB,"/20", HEX2 anio ; mostrar año /20 + 04
LCDOUT $fe,$c8 ;pasar a la casilla 8
 IF mes=$1 THEN LCDOUT "ene" ;mostrar el mes
 IF mes=$2 THEN LCDOUT "feb"
 IF mes=$3 THEN LCDOUT "mar"
 IF mes=$4 THEN LCDOUT "abr"
 IF mes=$5 THEN LCDOUT "may"
 IF mes=$6 THEN LCDOUT "jun"
 IF mes=$7 THEN LCDOUT "jul"
 IF mes=$8 THEN LCDOUT "ago"
 IF mes=$9 THEN LCDOUT "sep"
 IF mes=$10 THEN LCDOUT "oct"
 IF mes=$11 THEN LCDOUT "nov"
 IF mes=$12 THEN LCDOUT "dic"


PAUSE 500 ;esperar 0,5 segundos

GOTO inicio ;volver a leer los datos


END

Y el circuito lo anexo como adjunto.

Saludos y gracias.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:PROBLEMAS CON EL DS1307
« Respuesta #1 en: 14 de Abril de 2016, 23:07:00 »
De metido nomas por que no se basic, pero le falta la resistencia de pull up a la linea de SCL del I2C

Desconectado GAWAIN

  • PIC10
  • *
  • Mensajes: 2
Re:PROBLEMAS CON EL DS1307
« Respuesta #2 en: 14 de Abril de 2016, 23:15:45 »
Gracias por tu interes Killer, sin embargo, si observas en las lineas despues de la definicion de conexiones para el LCD, se incluye la instruccion DEFINE I2C_SCLOT 1 la cual es para que el circuito no requiera esta resistencia, esta es la razon por la que no esta.

Saludos,

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:PROBLEMAS CON EL DS1307
« Respuesta #3 en: 15 de Abril de 2016, 05:00:17 »
Por eso decia que no sabia de BASIC  :D
Veo que es un I2C por software ya que los pines son RC3 y RC4 los de hardware.

Vas a tener que esperar otro que te solucione las cosas :P

Desconectado Stban

  • PIC12
  • **
  • Mensajes: 78
Re:PROBLEMAS CON EL DS1307
« Respuesta #4 en: 16 de Abril de 2016, 12:21:36 »
Hola GAWAIN,

revisé tu programa y le hice algunas midificaciones, espero que con eso se resuelva tu problema.

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [EJM]                                             *
'*  Notice  : Copyright (c) 2016 [EJM]                          *
'*          : All Rights Reserved                               *
'*  Date    : 16/04/2016                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************

define OSC 20 ; especifica que se va a utilizar uno de 4 Mhz

' Configuración de Puertos:
TRISA = %010000
TRISB = %11111000
TRISC = %11111111
TRISD = %00000000
TRISE = %000

PORTA=0: PORTB=0: PORTC=0: PORTD=0: PORTE=0

' DEFINICION CONEXION LCD
DEFINE LCD_DREG PORTD ' Indica que el Bus estará conectado en el Puerto D
DEFINE LCD_DBIT 4 ' Selección del Bit de inicio del puerto en el uC para el bus de datos de la LCD
DEFINE LCD_RSREG PORTD ' Indica al uC que el pin "RS" estará en el Puerto D
DEFINE LCD_RSBIT 2 ' "RS" estará conectado en RD2
DEFINE LCD_EREG PORTD ' Indica al uC que el pin "E" estará en el Puerto D
DEFINE LCD_EBIT 3 ' "E" estará conectado en RD3
DEFINE LCD_BITS 4 ' El bus será de cuatro bits.
DEFINE LCD_LINES 2 ' Define el número de líneas de la pantalla

DEFINE I2C_SLOW 1
DEFINE I2C_SCLOUT 1 ;para que no necesite resistencia pull-up en SCL

CPIN VAR Portb.7 ;pin señal de reloj I2C
DPIN VAR Portb.6 ;pin de datos I2C

'DEFINICION VARIABLES
segu VAR BYTE ;definir tamaño de variable segundos 1 a 255
minu VAR BYTE ;variable para los minutos
hora VAR BYTE ;variable para las horas
diaS VAR BYTE ;variable día de la semana
diaF VAR BYTE ;variable día fecha del mes
mes VAR BYTE ;variable mes
anio VAR BYTE ;variable año de 2 dígitos

SEM VAR BYTE    'SELECCION DE SEMANA PARA PROGRAMACION
HORAAPAGA1 VAR BYTE 'SELECCION DE HORA DE APAGADO 1
MINAPAGA1 VAR BYTE 'SELECCION DE MINUTO DE APAGADO 1
REPITACICLO VAR BYTE 'VARIABLE PARA REPETIR PANTALLAS DE PROGRAMACION

lcdout $fe,1
PAUSE 30

INICIO:
;leer los datos de mem. 0, 1, 2, ... y guardarlos en sus respectivas variables
I2CREAD DPIN,CPIN, %11010000, 0, [SegU, Minu, Hora, DiaS, DiaF, Mes, AnIO]

lcdout $fe,$80,hex2 hora,":",hex2 minu,":",hex2 segu  ;mostrar la hora min y segs. en 2 dígitos (HEX2)
LCDOUT $fe,$c0 ;saltar a la 2da línea del LCD mostrar día de la semana
 IF diaS=$1 THEN LCDOUT "Dom."
 IF diaS=$2 THEN LCDOUT "Lun."
 IF diaS=$3 THEN LCDOUT "Mar."
 IF diaS=$4 THEN LCDOUT "Mie."
 IF diaS=$5 THEN LCDOUT "Jue."
 IF diaS=$6 THEN LCDOUT "Vie."
 IF diaS=$7 THEN LCDOUT "Sab."
 
LCDOUT $fe,$c5, HEX2 diaF,"/" ;mostrar el día del mes /
LCDOUT $fe,$cB,"/20", HEX2 anio ; mostrar año /20 + 04
LCDOUT $fe,$c8 ;pasar a la casilla 8
 IF mes=$1 THEN LCDOUT "ene" ;mostrar el mes
 IF mes=$2 THEN LCDOUT "feb"
 IF mes=$3 THEN LCDOUT "mar"
 IF mes=$4 THEN LCDOUT "abr"
 IF mes=$5 THEN LCDOUT "may"
 IF mes=$6 THEN LCDOUT "jun"
 IF mes=$7 THEN LCDOUT "jul"
 IF mes=$8 THEN LCDOUT "ago"
 IF mes=$9 THEN LCDOUT "sep"
 IF mes=$10 THEN LCDOUT "oct"
 IF mes=$11 THEN LCDOUT "nov"
 IF mes=$12 THEN LCDOUT "dic"

PAUSE 500 ;esperar 0,5 segundos

GOTO inicio ;volver a leer los datos

END

Saludos...

Desconectado hyogadeacuario

  • PIC10
  • *
  • Mensajes: 2
Re:PROBLEMAS CON EL DS1307
« Respuesta #5 en: 28 de Julio de 2016, 00:42:05 »
Hola tengo problemas con este programa también que es del libro "microcontroladores pic programación en basic" de Carlos A Reyes.
Mi problema es que el display LCD no me muestra nada de nada y por lo que veo nunca se prende el pin que pone en enable al display.
Les paso mi código con algunas modificaciones que vi en este tema y otras que vi en youtube.

CMCON = 7
DEFINE   I2C_SCLOUT  1    ;para que no necesite resistencia pull-up en SCL
DEFINE  LCD_DREG        PORTA         ; define pines del LCD  B4  a  B7
DEFINE  LCD_DBIT          0      ; empezando desde el Puerto B4 hasta el B7
DEFINE  LCD_RSREG       PORTB    ;define el puerto B para conectar el bit RS
DEFINE  LCD_RSBIT         3      ;este es el puerto B3
DEFINE  LCD_EREG        PORTA    ;define el puerto B para conectar el bit Enable
DEFINE  LCD_EBIT          4      ;este es el puerto B2
 
CPIN  VAR Portb.7                     ;pin señal de reloj I2C
DPIN  VAR Portb.6                     ;pin de datos I2C
 
segu    VAR BYTE         ;definir tamaño de variable segundos 1 a 255
minu    VAR BYTE                      ;variable para los minutos
hora    VAR BYTE                      ;variable para las horas
diaS    VAR BYTE                      ;variable día de la semana 
diaF    VAR BYTE                      ;variable día fecha del mes
mes     VAR BYTE                      ;variable mes 
anio    VAR BYTE                       ;variable año de 2 dígitos
 
actualizado VAR BIT                  ;variable para almacenar un 1 o 0
 
EEPROM 0,[0]              ;memoria 0 con el valor inicial 0, sirve para
                                ;indicar que nunca ha corrido este programa
READ 0,actualizado         ;carga el valor de la memoria EEPROM dirección 0
 
IF actualizado =0 THEN grabarRTC     ;si es la 1ra vez que corre ir a grabar RTC
                                         ;caso contrario sólo leer el RTC
INICIO:
    LCDOUT $fe,1

TIEMPO:
       
    I2CREAD DPIN,CPIN,%11010000,0,[segu]     ;leer los datos de mem. 0,             
    I2CREAD DPIN,CPIN,%11010000,1,[minu]     ;1,2,..y guardarlos en sus
    I2CREAD DPIN,CPIN,%11010000,2,[hora]     ;respectivas variables
    I2CREAD DPIN,CPIN,%11010000,3,[diaS] 
    I2CREAD DPIN,CPIN,%11010000,4,[diaF]             
    I2CREAD DPIN,CPIN,%11010000,5,[mes] 
    I2CREAD DPIN,CPIN,%11010000,6,[anio]
           
Lcdout $fe,$80,HEX2 hora,":",HEX2 minu,":",HEX2 segu     ;mostrar la hora 
                                     ; min y segs. en 2 dígitos (HEX2)
LCDOUT $fe,$c0             ;saltar a la 2da línea del LCD
                             ;mostrar día de la semana
    IF diaS=$1 THEN LCDOUT "Dom."         
    IF diaS=$2 THEN LCDOUT "Lun."
    IF diaS=$3 THEN LCDOUT "Mar."
    IF diaS=$4 THEN LCDOUT "Mie."
    IF diaS=$5 THEN LCDOUT "Jue."
    IF diaS=$6 THEN LCDOUT "Vie."
    IF diaS=$7 THEN LCDOUT "Sab."
 
LCDOUT $fe,$c5, HEX2 diaF , "/"              ;mostrar el día del mes /
LCDOUT $fe,$cB, "/20" , HEX2 anio            ; mostrar año /20 + 04
 
LCDOUT $fe,$c8                             ;pasar a la casilla 8
    IF mes=$1 THEN LCDOUT "ene"           ;mostrar el mes
    IF mes=$2 THEN LCDOUT "feb"
    IF mes=$3 THEN LCDOUT "mar"
    IF mes=$4 THEN LCDOUT "abr"
    IF mes=$5 THEN LCDOUT "may"
    IF mes=$6 THEN LCDOUT "jun"
    IF mes=$7 THEN LCDOUT "jul"
    IF mes=$8 THEN LCDOUT "ago"
    IF mes=$9 THEN LCDOUT "sep"
    IF mes=$10 THEN LCDOUT "oct"
    IF mes=$11 THEN LCDOUT "nov"
    IF mes=$12 THEN LCDOUT "dic"
PAUSE 500                                    ;esperar 0,5 segundos
     
GOTO tiempo                                 ;volver a leer los datos
 
; ************************ subrutina grabar *********************
grabarRTC:
       
I2CWRITE DPIN,CPIN,%11010000,0,[$00]      ;setear 00 segundos
    PAUSE 10                             ;retardo para finalizar grabación
I2CWRITE DPIN,CPIN,%11010000,1,[$52]      ;setear 52 minutos
    PAUSE 10   
I2CWRITE DPIN,CPIN,%11010000,2,[$22]      ;setear las 22 horas
    PAUSE 10   
I2CWRITE DPIN,CPIN,%11010000,3,[$3]        ;setear día lunes, D=1,L=2
    PAUSE 10                                    ;M=3, M=4, J=5, V=6, S=7
I2CWRITE DPIN,CPIN,%11010000,4,[$27]      ;setear día 27 del mes
    PAUSE 10   
I2CWRITE DPIN,CPIN,%11010000,5,[$07]        ;setear mes julio
    PAUSE 10   
I2CWRITE DPIN,CPIN,%11010000,6,[$16]      ;setear año  16
    PAUSE 10 
I2CWRITE DPIN,CPIN,%11010000,7,[$10]      ;control %00010000 para 
    PAUSE 10                                  ;encender el led cada 1 seg.
 
WRITE 0,1             ;escribe en la memoria 0 el valor de 1 para que no     
                        ;se vuelva a grabar otra vez estos datos en el RTC
GOTO inicio                     ;ir a presentar los datos en el LCD
END

Yo como en el libro estoy usando un microcontrolador pic 16F628A

Espero me puedan ayudar por que ya no se que vuelta mas darle.

Desde ya muchas gracias ((:-)) ((:-)) ((:-))


Desconectado Stban

  • PIC12
  • **
  • Mensajes: 78
Re:PROBLEMAS CON EL DS1307
« Respuesta #6 en: 28 de Julio de 2016, 08:19:40 »
Hola,

el problema está en que el puerto A.4 es de colector abierto, y lo solucionas colocando una resistencia pull-up, o cambiar de puerto.

Saludos.

Desconectado hyogadeacuario

  • PIC10
  • *
  • Mensajes: 2
Re:PROBLEMAS CON EL DS1307
« Respuesta #7 en: 28 de Julio de 2016, 14:26:54 »
Hola,

el problema está en que el puerto A.4 es de colector abierto, y lo solucionas colocando una resistencia pull-up, o cambiar de puerto.

Saludos.

SIIIIIIIIIIIIIIIIII ((:-)) ((:-)) ((:-)) ((:-)) ((:-))
Gracias gracias gracias gracias :D :D :D :D :D
Estuve renegando toda la tarde con esto y no lo podía hacer funcionar, pensé que el único puerto con colector abierto era el A5, es mas en el ejemplo del libro lo saca del puerto A4 sin resistencia ni nada.
Muchas gracias che, ahora puedo seguir avanzando con mi proyecto ;-) ;-) ;-)
Ahora la simulación esta corriendo perfecta cambie el "enable" al puerto B1.