Saludos. lo que he intentado ha sido lo siguiente:
{configurar RTC}
{escribir RTC reg control}
{leer RTC hora primera vez}
{habilitar interrupción INTF}
{algoritmo interrumpido cada segundo}
las rutinas son de picmouse en
http://www.todopic.com.ar/foros/index.php?topic=13748.0vector interrupciones
RESET_VECTOR ORG 0x000 ; processor reset vector
nop
goto start ; go to beginning of program
INT_VECTOR ORG 0x004 ;localización del vector interrupción
BANCO_1
movwf wtemp ;guarda w en registro temporal
swapf STATUS,w ;guardar STATUS
clrf STATUS
BANCO_1
movwf stattemp
movf PCLATH,w ;guardar PCLATH
movwf pclathtemp
BANCO_0
btfss INTCON,INTF
goto fin_inte
bsf PCLATH,3
bsf PCLATH,4
call ds1307_leer
bcf PCLATH,3
bcf PCLATH,4
fin_inte bcf INTCON,INTF
BANCO_1
movf pclathtemp,w
movwf PCLATH ;recuperar PCLATH
swapf stattemp,w
movwf STATUS ;recuperar STATUS
swapf wtemp,f
swapf wtemp,w ;recuperar w
BANCO_0
retfie ;retorno de interrupción
programa principal
start bcf PCLATH,3
bcf PCLATH,4
conds1307 BANCO_0 ;configurar RTC
movlw b'00011000'
movwf TRISC ;configurar SDA y SCA
BANCO_1
movlw .49 ;(20*10^6/4*10^5)-1 =49
movwf SSPADD
movlw b'10000000'
movwf SSPSTAT
movlw b'00101000'
BANCO_0
movwf SSPCON
movlw 0x00
movwf TRISB ;INT como entrada
BANCO_1
movlw b'00010000'
movwf datoi2c ;dato para registro control RTC
movlw 0x07
movwf diri2c ;dirección del registo control RTC
bsf PCLATH,3
bsf PCLATH,4
call escri_ds ;escribir en RTC
call leer_ds ;hacer primera lectura RTC
bsf INTCON,GIE ;activa las interrupciones
bsf INTCON,INTF ;activa interrupción externa
bsf PCLATH,3
bcf PCLATH,4
{resto algoritmo}
rutinas para leer y escribir(en página 3)
ds1307_leer BANCO_1
clrf diri2c ;dirección 0
call leer_ds
movf datoi2c,w
BANCO_0
movwf segundo ;guardar segundo
movlw 0x01 ;dirección 1
BANCO_1
movwf diri2c
call leer_ds
movf datoi2c,w
BANCO_0
movwf minuto ;guardar minuto
movlw 0x02 ;dirección 2
BANCO_1
movwf diri2c
call leer_ds
movf datoi2c,w
BANCO_0
movwf hora ;guardar hora
movlw 0x03 ;dirección 3
BANCO_1
movwf diri2c
call leer_ds
movf datoi2c,w
BANCO_0
movwf segundo ;guardar en segundo, no es útil para mí
movlw 0x04 ;dirección 4
BANCO_1
movwf diri2c
call leer_ds
movf datoi2c,w
BANCO_0
movwf dia ;guardar dia
movlw 0x05 ;dirección 5
BANCO_1
movwf diri2c
call leer_ds
movf datoi2c,w
BANCO_0
movwf mes ;guardar mes
movlw 0x06 ;dirección 6
BANCO_1
movwf diri2c
call leer_ds
movf datoi2c,w
BANCO_0
movwf año ;guardar año
return
leer_ds BANCO_1 ;enviar secuencia de START
bsf SSPCON2,SEN ;bit SEN comienza secuencia
btfsc SSPCON2,SEN
goto $-1 ;permiso para escribir en DS1307
BANCO_0
movlw 0xD0 ;Carga el dato a enviar
movwf SSPBUF ;dirección esclavo + 0(bit escritura)
BANCO_1
btfsc SSPSTAT,R_W ;si es 0, se ha completado transmisión
goto $-1
btfsc SSPCON2,ACKSTAT ;Solo continua si llaga el ACK
goto stopI2C ;1=no reconocido, reinicia comunicación
movf diri2c,w ;dirección a W
BANCO_0
movwf SSPBUF ;dirección donde se va a leer
BANCO_1
btfsc SSPSTAT,R_W ;si es 0, se ha completado transmisión
goto $-1
btfsc SSPCON2,ACKSTAT ;Solo continua si llaga el ACK
goto stopI2C ;1=no reconocido, reinicia comunicación
bsf SSPCON2,RSEN ;bit RSEN para reiniciar la secuencia
btfsc SSPCON2,RSEN
goto $-1 ;Permiso para comunicación
BANCO_0
movlw 0xD1
movwf SSPBUF ;esclavo + 1(bit lectura)
BANCO_1
btfsc SSPSTAT,R_W ;si es 0, se ha completado transmisión
goto $-1
btfsc SSPCON2,ACKSTAT ;Solo continua si llaga el ACK
goto stopI2C ;1=no reconocido, reinicia comunicación
bsf SSPCON2,RCEN ;RCEN a 1 para recibir datos
btfsc SSPCON2,RCEN ;si se ha recibidotodo el byte sigue
goto $-1
BANCO_0
movf SSPBUF,w ;dato a W
BANCO_1
movwf datoi2c ;guardar dato en datoi2c
bsf SSPCON2,ACKDT ;Activa el NACK
bsf SSPCON2,ACKEN ;Envía el NACK
btfsc SSPCON2,ACKEN
goto $-1 ;continua cuando finaliza envío
stopI2C bsf SSPCON2,PEN ;condición STOP
btfsc SSPCON2,PEN
goto $-1 ;se asegura que haya acabado
BANCO_0
return
escri_ds BANCO_1 ;enviar secuencia de START
bsf SSPCON2,SEN ;bit SEN comienza secuencia
btfsc SSPCON2,SEN
goto $-1 ;permiso para escribir en DS1307
BANCO_0
movlw 0xD0 ;Carga el dato a enviar
movwf SSPBUF ;dirección esclavo + 0(bit escritura)
BANCO_1
btfsc SSPSTAT,R_W ;si es 0, se ha completado transmisión
goto $-1
btfsc SSPCON2,ACKSTAT ;Solo continua si llaga el ACK
goto stopI2C2 ;1=no reconocido, reinicia comunicación
movf diri2c,w ;dirección a W
BANCO_0
movwf SSPBUF ;dirección donde se va a escribir
BANCO_1
btfsc SSPSTAT,R_W ;si es 0, se ha completado transmisión
goto $-1
btfsc SSPCON2,ACKSTAT ;Solo continua si llaga el ACK
goto stopI2C2 ;1=no reconocido,reinicia comunicación
movf datoi2c,w
BANCO_0
movwf SSPBUF ;pasar dato a SSPBUF
BANCO_1
btfsc SSPSTAT,R_W ;si es 0, se ha completado transmisión
goto $-1
btfsc SSPCON2,ACKSTAT ;Solo continua si llaga el ACK
goto stopI2C2 ;1=no reconocido,reinicia comunicación
stopI2C2 BANCO_1
bcf PIE1,SSPIE
bsf SSPCON2,PEN ;condición STOP
btfsc SSPCON2,PEN
goto $-1 ;se asegura que haya acabado
BANCO_0
return
Dudas:En la fórmula de SSPADD que hay que poner en Fosc: 20MHz o 4Mhz?
por qué la finalizar la rutina de escribir si que tiene en cuenta el bit PIE1 y en la de leer no?
En el datasheet del reloj, para leer no pone nada de escribir una dirección, sin embargo después de direccionar al esclavo la rutina sí lo hace. Supogo que funcionará, no?
He descargado proteus lite 6.9 Esta conexión se podría simular?
Gracias