pic mause usted que maneja el esambler y ademas ya estuve probando el programa que adapte y no me esta funcionando en proteus al meno me debe estar mostrando un pequeña rutina para provar.
para ver si me hace el favor de mirar este.
ADJUNTO EL CIRCUITO EN PROTEUS
LIST P=16F877A
#INCLUDE<P16F877A.INC>
;DECRARACION DE VARIABLES
TRISC EQU 87
TRISB EQU 86
TRISA EQU 85
TIMER0 EQU 01
PCL EQU 02
STATUS EQU 03
PORTA EQU 05
PORTB EQU 06
PORTC EQU 07
PORTD EQU 08
PORTE EQU 09
ADCON0 EQU 1F
TMRO_OPT EQU 81
SSPADD EQU 93
SSPSTAT EQU 94
SSPCON EQU 14
SSPCON2 EQU 91
SSPBUF EQU 13
PIE1 EQU 8C
;REGISTROS DS1307
UNIDAD_SEG EQU 20
DECENA_SEG EQU 21
UNIDAD_MIN EQU 22
DECENA_MIN EQU 23
UNIDAD_HO EQU 24
DECENA_HO EQU 25
UNIDAD_DIA EQU 26
DECENAS_DIA EQU 27
UNIDAD_AÑO EQU 28
DECENA_AÑO EQU 29
DATOI2C EQU 2A
DIRI2C EQU 2B
APM EQU 2C
PDel0 EQU 2D
PDel1 EQU 2E
SEGUNDOS EQU 2F
MINUTOS EQU 30
HORAS EQU 31
DIA EQU 32
MES EQU 33
AÑO EQU 34
DATOD EQU 35
UNIDAD_DD EQU 36
DECENA_DD EQU 37
UNIDAD_MES EQU 38
DECENA_MES EQU 39
;DATOI2C,DIRI2C ,APM
#define I2CCLOCK D'100000' ; Baud Rate in bps ¡
#define FOSC D'4000000' ; Frecuencia del cristal
;BITS DE I2C
R_W EQU 2
SEN EQU 0
ACKSTAT EQU 6
RSEN EQU 1
RCEN EQU 3
ACKDT EQU 5
ACKEN EQU 4
PEN EQU 2
SSPIE EQU 3
RS EQU 0
E EQU 1
INTF EQU 1
ORG 00
GOTO INICIO
ORG 04
GOTO SERVICIOINTERUPCION
SERVICIOINTERUPCION
BANKSEL INTCON
BTFSS INTCON,INTF
GOTO FIN_INTERRPCION
CALL DS1307_LEER
FIN_INTERRPCION
BCF INTCON,RBIF
BCF INTCON,INTF
BCF STATUS,5
RETFIE
;RELOJ BANKSEL FLAGSAJUSTE
;MOVF FLAGSAJUSTE,F
; BTFSC STATUS,Z
; GOTO DS1307_LEER
; BANKSEL OPTION_REG
; MOVLW B'01000000'
; XORWF OPTION_REG,1
; BCF STATUS,5
; COMF INTERMITENCIA,1
; GOTO ACTUALIZA_RELOJ
DS1307_LEER
CALL LEER_DS1307
ACTUALIZA_RELOJ
CALL VISUALIZACION_RELOJ
RETLW 00
RETARDO
; Code generated by PDEL ver 1.0 on 24/01/2007 at 10:33:51 p.m.
; Description: Waits 20000 cycles
;-------------------------------------------------------------
PDelay movlw .21 ; 1 set number of repetitions (B)
movwf PDel0 ; 1 |
PLoop1 movlw .237 ; 1 set number of repetitions (A)
movwf PDel1 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
decfsz PDel1, 1 ; 1 + (1) is the time over? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) is the time over? (B)
goto PLoop1 ; 2 no, loop
PDelL1 goto PDelL2 ; 2 cycles delay
PDelL2 clrwdt ; 1 cycle delay
return ; 2+2 Done
TABLA ADDWF PCL,1 ;TABLA DE DATOS A MOSTRAR EN LCD.
RETLW "0"
RETLW "1"
RETLW "2"
RETLW "3"
RETLW "4"
RETLW "5"
RETLW "6"
RETLW "7"
RETLW "8"
RETLW "9"
;TABLA ADDWF PCL,1
DT "0123456789",0X00
DATOS
BSF PORTA,RS
BSF PORTA,E
MOVWF PORTD
CALL RETARDO
BCF PORTA,E
RETURN
INSTRUC
BCF PORTA,RS ;COLOCA EN CERO RAO
BSF PORTA,E
MOVWF PORTD
CALL RETARDO
BCF PORTA,E
RETURN
INICIO
MOVLW 00
MOVWF STATUS
BSF STATUS,5
BCF STATUS,6
MOVLW 07
MOVWF ADCON0
MOVLW B'00011000'
MOVWF PORTC
MOVLW B'00000001'
MOVWF PORTB
CLRF PORTA
CLRF PORTD
BCF STATUS,5
LCDINI MOVLW B'00111000' ;INTERFACE DE 8BITS 2 LINEAS
CALL INSTRUC
MOVLW B'00000110' ;DIRECCION A LA DERECHA
CALL INSTRUC
MOVLW B'00001101' ;PRENDE PANTALLA
CALL INSTRUC
MOVLW B'00000001' ;LIMPIA PANTALLA
CALL INSTRUC
CALL CONFIG_DS1307;
CALL INI_DS1307
BANKSEL INTCON
MOVLW B'10010000'
MOVWF INTCON
PRINC
SLEEP
GOTO PRINC
;FUNCION_BATERIA
; BANKSEL INTCON
; MOVLW B'10010000'
; MOVWF INTCON
CONFIG_DS1307; ¡
;CONFIGURO BUD RATE ¡
BANKSEL SSPADD; ¡
MOVLW (((FOSC/I2CCLOCK)/4)-1) ; ¡
MOVWF SSPADD ; ¡
;CONFIGURO NIVELES DE VOLTAJE PARA I2C ¡
MOVLW B'10000000' ; ¡
MOVWF SSPSTAT ; ¡
;PREAMBULO PARA ESCRITURA I2C ¡
;CONFIGURA PUERTO PARA I2C ¡
BANKSEL SSPCON ; ¡
MOVLW B'00101000'; ¡
MOVWF SSPCON; ¡
BANKSEL TRISC; ¡
MOVLW B'00011000'; ¡
IORWF TRISC,F; ¡
BCF STATUS,5; ¡
RETLW 0; ¡
;------------------------------------------------------------------------------------------
;-------------------------------------------------------------------------------------------------------------------------------------------------
READDS; ¡
;Envia secuencia de START ¡
BANKSEL SSPCON2 ;Selecciona banco del SSPCON2 ¡
BSF SSPCON2,SEN ;Activa el bit SEN para iniciar la secuencia ¡
BTFSC SSPCON2,SEN ; ¡
GOTO $-1; ¡
;Envia el permiso para escribir la memoria del DS1307 ¡
movlw 0XD0 ;Carga el dato a enviar ¡
BANKSEL SSPBUF ;Selecciona el banco del SSPBUF ¡
MOVWF SSPBUF ;Carga el valor a enviar en el buffer y se inicia el envio de los datos ¡
BANKSEL SSPSTAT ;Cambia de banco ¡
BTFSC SSPSTAT,R_W ;Continua con el programa solo si es completada la transmision ¡
GOTO $-1 ; ¡
;Espera respuesta del DS1307 que indica que ha recivido el dato y esta listo para recivir la direccion a leer ¡
BANKSEL SSPCON2 ; ¡
BTFSC SSPCON2,ACKSTAT ;Solo continua si llaga el ACK ¡
GOTO stopI2C ;1=NO RECONOCIDO REINICIA LA COMUNICACION ¡
;0=RECONOCIDO ¡
;Envia direccion del registro del DS1307 que se quiere leer ¡
BANKSEL DIRI2C
MOVF DIRI2C,W ;Carga el dato a enviar ¡
BANKSEL SSPBUF ;Selecciona el banco del SSPBUF ¡
MOVWF SSPBUF ;Carga el valor a enviar en el buffer y se inicia el envio de los datos ¡
BANKSEL SSPSTAT ;Cambia de banco ¡
BTFSC SSPSTAT,R_W ;Continua con el programa solo si es completada la transmision ¡
GOTO $-1 ; ¡
;Espera respuesta del DS1307 que indica que ha recivido el dato y esta listo para enviar datos ¡
BANKSEL SSPCON2 ; ¡
BTFSC SSPCON2,ACKSTAT ;Solo continua si llaga el ACK ¡
GOTO stopI2C ;1=NO RECONOCIDO REINICIA LA COMUNICACION ¡
;0=RECONOCIDO ¡
;Envia secuencia de RESTART ¡
BANKSEL SSPCON2 ;Selecciona banco del SSPCON2 ¡
BSF SSPCON2,RSEN ;Activa el bit RSEN para iniciar la secuencia ¡
BTFSC SSPCON2,RSEN; ¡
GOTO $-1; ¡
;Envia direccion del CI DS1307 y la indicacion que se quiere leer ¡
movlw 0XD1 ;Carga el dato a enviar ¡
BANKSEL SSPBUF ;Selecciona el banco del SSPBUF ¡
MOVWF SSPBUF ;Carga el valor a enviar en el buffer y se inicia el envio de los datos ¡
BANKSEL SSPSTAT ;Cambia de banco ¡
BTFSC SSPSTAT,R_W ;Continua con el programa solo si es completada la transmision ¡
GOTO $-1; ¡
;Espera respuesta del DS1307 que indica que ha recivido el dato y esta listo para enviar los datos (ACK) ¡
BANKSEL SSPCON2; ¡
BTFSC SSPCON2,ACKSTAT ;Solo continua si llaga el ACK ¡
GOTO stopI2C ;1=NO RECONOCIDO REINICIA LA COMUNICACION ¡
;0=RECONOCIDO ¡
;Se prepara para recivir los datos ¡
BANKSEL SSPCON2 ;Selecciona banco ¡
BSF SSPCON2,RCEN ;Activa bit RCEN para iniciar la recepcion de datos ¡
BTFSC SSPCON2,RCEN ;Solo continua si ya se ha recivido todo el byte ¡
GOTO $-1; ¡
;Saca el byte recivido y lo guarda ¡
BANKSEL SSPBUF ;Saca del buffer el valor leido y lo lleva a la varible ¡
MOVF SSPBUF,W ;de dato leido ¡
BANKSEL DATOI2C; ¡
MOVWF DATOI2C; ¡
;Envia secuencia de NOT ACKNOWLEDGE para terminar la comunicacion ¡
BANKSEL SSPCON2 ; ¡
BSF SSPCON2,ACKDT ;Selecciona el NACK ¡
BSF SSPCON2,ACKEN ;Envia el NACK ¡
BTFSC SSPCON2,ACKEN ; ¡
GOTO $-1 ;Solo continua hasta que se halla terminado de enviar ¡
;Envia secuencia de STOP ¡
stopI2C; ¡
BANKSEL SSPCON2; ¡
BSF SSPCON2,PEN ; ¡
BTFSC SSPCON2,PEN; ¡
GOTO $-1;
BANKSEL DATOI2C; ¡
RETLW 0
LEER_DS1307
BANKSEL DIRI2C
CLRF DIRI2C
CALL READDS
MOVF DATOI2C,W
MOVWF SEGUNDOS
MOVLW 0X01
MOVWF DIRI2C
CALL READDS
MOVF DATOI2C,W
MOVWF MINUTOS
MOVLW 0X02
MOVWF DIRI2C
CALL READDS
MOVF DATOI2C,W
MOVWF HORAS
MOVLW 0X03
MOVWF DIRI2C
CALL READDS
MOVF DATOI2C,W
MOVWF DIA
MOVLW 0X04
MOVWF DIRI2C
CALL READDS
MOVF DATOI2C,W
MOVWF DATOD
MOVLW 0X05
MOVWF DIRI2C
CALL READDS
MOVF DATOI2C,W
MOVWF MES
MOVLW 0X06
MOVWF DIRI2C
CALL READDS
MOVF DATOI2C,W
MOVWF AÑO
;Decodifica los datos leidos y los pasa a un registro unico
BANKSEL SEGUNDOS
MOVF SEGUNDOS,W
ANDLW 0X0F
MOVWF UNIDAD_SEG
SWAPF SEGUNDOS,W
ANDLW 0X0F
MOVWF DECENA_SEG
MOVF MINUTOS,W
ANDLW 0X0F
MOVWF UNIDAD_MIN
SWAPF MINUTOS,W
ANDLW 0X07
MOVWF DECENA_MIN
MOVF HORAS,W
ANDLW 0X0F
MOVWF UNIDAD_HO
SWAPF HORAS,W
ANDLW 0X01
MOVWF DECENA_HO
BTFSS HORAS,5
GOTO AAM
MOVLW "p"
MOVWF APM
GOTO SIGU
AAM MOVLW "a"
MOVWF APM
;--------------------------------------------------
SIGU MOVLW 0X0F
ANDWF DIA,F ;LUNES,MARTES....1 A 7
;--------------------------------------------------
MOVF DATOD,W
ANDLW 0X0F
MOVWF UNIDAD_DD
SWAPF DATOD,W
ANDLW 0X03
MOVWF DECENA_DD
;--------------------------------------------------
MOVF MES,W
ANDLW 0X0F
MOVWF UNIDAD_MES
SWAPF MES,W
ANDLW 0X01
MOVWF DECENA_MES
;--------------------------------------------------
MOVF AÑO,W
ANDLW 0X0F
MOVWF UNIDAD_AÑO
SWAPF AÑO,W
ANDLW 0X03
MOVWF DECENA_AÑO
RETLW 0; ¡
;-------------------------------------------------------------------------------------------------------------------------------------------------
;
;
;
;-------------------------------------------------------------------------------------------------------------------------------------------------
ESCRIBIR_DS1307
BANKSEL SSPCON2
BSF SSPCON2,SEN
BTFSC SSPCON2,SEN
GOTO $-1
;Envia direccion del CI DS1307 y la indicacion que se quiere escribir
movlw 0XD0 ;Carga el dato a enviar
BANKSEL SSPBUF ;Selecciona el banco del SSPBUF
MOVWF SSPBUF ;Carga el valor a enviar en el buffer y se inicia el envio de los datos
BANKSEL SSPSTAT ;Cambia de banco
BTFSC SSPSTAT,R_W ;Continua con el programa solo si es completada la transmision
GOTO $-1
;Espera respuesta del DS1307 que indica que ha recivido el dato y esta listo para enviar los datos (ACK)
BANKSEL SSPCON2 ;
BTFSC SSPCON2,ACKSTAT ;Solo continua si llaga el ACK
GOTO stopI2C2 ;1=NO RECONOCIDO REINICIA LA COMUNICACION
;0=RECONOCIDO
;Envia direccion del registro del DS1307 que quiere escribir
BANKSEL DIRI2C
MOVF DIRI2C,W
BANKSEL SSPBUF
MOVWF SSPBUF
BANKSEL SSPSTAT
BTFSC SSPSTAT,R_W
GOTO $-1
;Espera respuesta del DS1307 que indica que ha recivido el dato y esta listo para enviar los datos (ACK)
BANKSEL SSPCON2 ;
BTFSC SSPCON2,ACKSTAT ;Solo continua si llaga el ACK
GOTO stopI2C2 ;1=NO RECONOCIDO REINICIA LA COMUNICACION
;0=RECONOCIDO
;Envio dato
BANKSEL DATOI2C
MOVF DATOI2C,W
BANKSEL SSPBUF
MOVWF SSPBUF
BANKSEL SSPSTAT
BTFSC SSPSTAT,R_W
GOTO $-1
;Espera respuesta del DS1307 que indica que ha recivido el dato y esta listo para enviar los datos (ACK)
BANKSEL SSPCON2 ;
BTFSC SSPCON2,ACKSTAT ;Solo continua si llaga el ACK
GOTO stopI2C2 ;1=NO RECONOCIDO REINICIA LA COMUNICACION
;0=RECONOCIDO
;Inicia secuencia de STOP-------------------------
stopI2C2
BANKSEL PIE1
BCF PIE1,SSPIE
BSF SSPCON2,PEN
BTFSC SSPCON2,PEN
GOTO $-1
BCF STATUS,5
CALL RETARDO
RETLW 0
INI_DS1307
MOVF SEGUNDOS,W
MOVWF DATOI2C
CLRF DIRI2C ;CARGO SEGUNDOS 00
CALL ESCRIBIR_DS1307
MOVF MINUTOS,W
MOVWF DATOI2C
INCF DIRI2C,F
CALL ESCRIBIR_DS1307
MOVF HORAS,W
MOVWF DATOI2C
INCF DIRI2C,F
CALL ESCRIBIR_DS1307
INCF DIRI2C,F
MOVLW 0X01 ;CARGO DIA lunes
MOVWF DATOI2C
CALL ESCRIBIR_DS1307
INCF DIRI2C,F
MOVLW 0X02 ;CARGO DATO DEL DIA 02
MOVWF DATOI2C
CALL ESCRIBIR_DS1307
INCF DIRI2C,F
MOVLW 0X08 ;CARGO MES FEBRERO
MOVWF DATOI2C
CALL ESCRIBIR_DS1307
INCF DIRI2C,F
MOVLW 0X05 ;CARGO AÑO 2005
MOVWF DATOI2C
CALL ESCRIBIR_DS1307
MOVLW 0X07
MOVWF DIRI2C
MOVLW 0X10 ;ENCIENDO EL OSCILADOR A 1Hz
MOVWF DATOI2C
CALL ESCRIBIR_DS1307
RETLW 0
VISUALIZACION_RELOJ
BCF STATUS,5
MOVLW B'10000010
CALL INSTRUC
MOVF DECENA_DD,0
CALL TABLA
CALL DATOS
MOVF UNIDAD_DD,0
CALL TABLA
CALL DATOS
MOVLW B'10000110
CALL INSTRUC
MOVF DECENA_MES,0
CALL TABLA
CALL DATOS
MOVF UNIDAD_MES,0
CALL TABLA
CALL DATOS
MOVLW B'10001101'
CALL INSTRUC
MOVF UNIDAD_AÑO,0
CALL TABLA
CALL DATOS
MOVF DECENA_AÑO,0
CALL TABLA
CALL DATOS
RETURN
RETURN
END