PROBLEMA CON EL DS1307
Publicado por OMAR (1 intervención) el 15/04/2016 04:05:45
Hola a todos.
Me encuentro programando en PBP 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, mostarndo 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.
Gracias por su ayuda.
Me encuentro programando en PBP 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, mostarndo 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.
Gracias por su ayuda.
- CIRCUITO.rar(178,1 KB)
Valora esta pregunta
0