DS1307 con PIC

¿Alguien a conectado un PIC 16F873 con el reloj DS1307?
¿Tengo el programa en VB y funciona bien pero no se porque no quiere en el PIC Alguien tiene algun ejemplo?

1 respuesta

Respuesta
1
Alguien alguna vez me dio una rutina para ese RTC. La copio acá a ver si te sirve.
Es para el HT1380 que es similar. Alguna rutina te puede servir u orientar. Suerte
;*****************************1*****+******************************************
; USO DEL RELOJ HT1380
;LA IDEA ES PONER EN HORA EL RELOJ POR SOFT INTERNO DEL MICRO (12:00:00 Y
;LA FECHA XX XX XX
; LUEGO CUANDO SE LO SOLICITE MEDIANTE UNA INTERRUPCIÓN, QUE ENVÍE LOS DATOS
;A LA PC.
;
; OSC,XT WDT,OFF
;
;
;******************************************************************************
;----Definiciones de RAM-------
LIST P=16F84, R=HEX ;
Porta equ 05h ;real time clock counter
PORTB EQU 06H
Trisa equ 85h
TRISB EQU 86H
INDF EQU 00H
FSR EQU 04H
Intcon equ 0bh
TMR0 EQU 01H
Status equ 03h
RXREG EQU 0CH
Cuenta8 equ 0dh
Time equ 0eh
FLAG EQU 0FH
MSB EQU 10H
TGRAL EQU 11H
Unid equ 12h
Dece equ 13h
Cente equ 14h
BUF232 EQU 15H
R11 EQU 16H
R12 EQU 17H
Num equ 18h
Cocinte equ 19h
BUFTRX EQU 1BH
DIA_L EQU 1CH
A#O_L EQU 1DH
MES_L EQU 1EH
FECHA EQU 1FH
HORA_L EQU 20H
MINUTO_L EQU 21H
SEGUNDO_L EQU 22H
SEGUNDO_H EQU 23H
MINUTO_H EQU 24H
HORA_H EQU 25H
DIA_H EQU 26H
MES_H EQU 27H
A#O_H EQU 28H
Dia equ 29h
Flag1 equ 2ah
Aux equ 2bh
Tato equ 2ch
D1 EQU 30H
D2 EQU 31H
D3 EQU 32H
D4 EQU 33H
D5 EQU 34H
Z EQU 2
C EQU 0
;**************************************************************************
;MACROS DE PAGINA
Bank0 macro
BCF STATUS, 5
ENDM
Bank1 macro
BSF STATUS, 5
ENDM
;***************************************************************************
#DEFINE CLOCK PORTB,1
#DEFINE DATA PORTB,2
#DEFINE RESET PORTB,3
#DEFINE io_sclk
#DEFINE io_rst
#DEFINE io_io
#DEFINE LED PORTA,1
;*****************************************************************************
START ORG 0X00
GOTO SETUP
ORG 0X04
BCF INTCON,1
GOTO RX
SETUP MOVLW B'00000001' ;PONER in/out SALIDA=(0)
TRIS PORTB ;
MOVLW B'00000000'
TRIS PORTA
MOVLW B'00000000'
OPTION
CLRF PORTA
CLRF PORTB
CLRF FLAG1
CLRF FLAG
MOVLW .12 ;LIMPIA LA RAM
MOVWF FSR
NEXT CLRF INDF
INCF FSR, F
BTFSS FSR, 5
GOTO NEXT
MOVLW .12
MOVWF HORA_L
MOVLW .0
MOVWF MINUTO_L
movlw .3
MOVWF MINUTO_H
MOVLW B'10010000'
MOVWF INTCON
CALL DELAY2
CALL init_clk
CALL ESCRIBCLK
PAPO BSF INTCON,7
GOTO PAPO
;***********************************************************************************************
;RUTINA DE LECTURA/ESCRITURA DE CLOCK HT1380. PARA ESCRIBIR PRIMERO HAY QUE LLENAR LOS REGISTROS
;CON LOS DATOS Y LUEGO LLAMAR *ESCRIBCLK* LOS REGISTROS A LLENAR SON: DIA_L, DIA_H, MES_L, MES_H,
;A#O_L, A#O_H, SEGUNDO_L, SEGUNDO_H, MINUTO_L, MINUTO_H, HORA_L, HORA_H, FECHA, DIA (14 REGISTROS)
;
;PARA LEER HAY QUE LLAMAR A *READCLK* Y COMO RESULTADO LOS REGISTROS ANTERIORES CONTENDRÁN LOS
;DATOS REQUERIDOS.
;***********************************************************************************************
INITW
BANK1
MOVLW B'00000001'
MOVWF TRISB
; BCF io_sclk ;configuro salida clk ???
; BCF io_rst ;configuro salida reset ???
; BCF io_io ;configuro salida datos ???
BANK0
BCF RESET
BCF DATA
BCF CLOCK
RETLW 0
w_clk
MOVLW .8
MOVWF CUENTA8
loop_wclk BCF CLOCK
NOP
BSF RESET
NOP
BCF DATA
BTFSC BUFTRX, 0
BSF DATA
NOP
NOP
BSF CLOCK
NOP
NOP
NOP
RRF BUFTRX, F
DECFSZ CUENTA8
GOTO loop_wclk
RETLW 0
Initr
BANK1
MOVLW B'00000101' ;B,0 INTERRUPCION. B,2 I/O
MOVWF TRISB
; BSF io_io
; BCF io_sclk
; BCF io_rst
BANK0
RETLW 0
RCLK
MOVLW .8
Movwf cuenta8
NOP
loop_rclk
NOP
BSF CLOCK
NOP
NOP
NOP
NOP
NOP
BCF CLOCK
BCF STATUS, C
BTFSC DATA
BSF STATUS, C
RRF BUFTRX, F
DECFSZ CUENTA8
GOTO loop_rclk
RETLW 0
init_clk
CALL INITW
MOVLW B'10001110' ;8E , 8,14
MOVWF BUFTRX
BSF RESET
CALL w_clk
MOVLW .0
MOVWF BUFTRX
CALL w_clk
BCF RESET
MOVLW B'10000000' ;0x80 ,8,0
MOVWF BUFTRX
BSF RESET
CALL w_clk
CLRF BUFTRX
CALL w_clk ;???
BCF RESET
RETLW 0
READCLK
CALL read_segundo
CALL read_minuto
CALL read_hora
CALL read_fecha
CALL read_mes
CALL read_a#o
CALL read_dia
RETLW 0
read_segundo
CALL INITW
MOVLW B'10000001' ;0x81 , 8 , 1
MOVWF BUFTRX
BSF RESET
CALL w_clk
CALL INITR
CALL RCLK
BCF RESET
MOVF BUFTRX, W
ANDLW b'00001111'
MOVWF SEGUNDO_L
SWAPF BUFTRX, W
ANDLW b'00001111'
MOVWF SEGUNDO_H
RETLW 0
read_minuto
CALL INITW
MOVLW B'10000011' ;0x83 , 8 , 3
MOVWF BUFTRX
BSF RESET
CALL w_clk
CALL INITR
CALL RCLK
BCF RESET
MOVF BUFTRX, W
ANDLW b'00001111'
MOVWF MINUTO_L
SWAPF BUFTRX, W
ANDLW b'00001111'
MOVWF MINUTO_H
RETLW 0
read_hora
CALL INITW
MOVLW B'10000101' ;0x85 8 , 5
MOVWF BUFTRX
BSF RESET
CALL w_clk
CALL INITR
CALL RCLK
BCF RESET
MOVF BUFTRX, W
ANDLW b'00001111'
MOVWF HORA_L
SWAPF BUFTRX, W
ANDLW b'00001111'
MOVWF HORA_H
RETLW 0
read_fecha
CALL INITW
MOVLW B'10000111' ;0x87 , 8 , 7
MOVWF BUFTRX
BSF RESET
CALL w_clk
CALL INITR
CALL RCLK
BCF RESET
MOVF BUFTRX, W
ANDLW b'00001111'
MOVWF DIA_L
SWAPF BUFTRX, W
ANDLW b'00001111'
MOVWF DIA_H
RETLW 0
read_mes
CALL INITW
MOVLW B'10001001' ;0x89 , 8 , 9
MOVWF BUFTRX
BSF RESET
CALL w_clk
CALL INITR
CALL RCLK
BCF RESET
MOVF BUFTRX, W
ANDLW b'00001111'
MOVWF MES_L
SWAPF BUFTRX, W
ANDLW b'00001111'
MOVWF MES_H
RETLW 0
read_a#o
CALL INITW
MOVLW B'10001101' ;0x8D , 8 , 13= 80+13= 93
MOVWF BUFTRX
BSF RESET
CALL w_clk
CALL INITR
CALL RCLK
BCF RESET
MOVF BUFTRX, W
ANDLW b'00001111'
MOVWF A#O_L
SWAPF BUFTRX, W
ANDLW b'00001111'
MOVWF A#O_H
RETLW 0
read_dia
CALL INITW
MOVLW B'10001011' ;0x8B , 8 , 11
MOVWF BUFTRX
BSF RESET
CALL w_clk
CALL INITR
CALL RCLK
BCF RESET
MOVF BUFTRX, W
ANDLW b'00001111'
Movwf dia
RETLW 0
;***********************************************************************************************
ESCRIBCLK
CALL write_segundo
CALL write_minuto
CALL write_hora
CALL write_fecha
CALL write_mes
CALL write_a#o
CALL write_dia
RETLW 0
write_segundo
CLRF SEGUNDO_H
CLRF SEGUNDO_L
CALL INITW
MOVLW B'10000000' ;0x80 COMANDO
MOVWF BUFTRX
BSF RESET
CALL w_clk
SWAPF SEGUNDO_H,W
ANDLW b'11110000'
IORWF SEGUNDO_L,W
MOVWF BUFTRX
CALL w_clk
BCF RESET
RETLW 0
write_minuto
CALL INITW
MOVLW B'10000010' ;0x82 , COMANDO
MOVWF BUFTRX
BSF RESET
CALL w_clk
SWAPF MINUTO_H,W
ANDLW b'11110000'
IORWF MINUTO_L,W
MOVWF BUFTRX
CALL w_clk
BCF RESET
RETLW 0
write_hora
CALL INITW
MOVLW B'10000100' ;0x84 COMANDO
MOVWF BUFTRX
BSF RESET
CALL w_clk
SWAPF HORA_H,W
ANDLW b'11110000'
IORWF HORA_L,W
MOVWF BUFTRX
BCF BUFTRX,7 ;24 hs
CALL w_clk
BCF RESET
RETLW 0
write_fecha
CALL INITW
MOVLW B'10000110' ;0x86 COMANDO
MOVWF BUFTRX
BSF RESET
CALL w_clk
SWAPF DIA_H,W
ANDLW b'11110000'
IORWF DIA_L,W
MOVWF BUFTRX
CALL w_clk
BCF RESET
RETLW 0
write_mes
CALL INITW
MOVLW B'10001000' ;0x88 COMANDO
MOVWF BUFTRX
BSF RESET
CALL w_clk
SWAPF MES_H,W
ANDLW b'11110000'
IORWF MES_L,W
MOVWF BUFTRX
CALL w_clk
BCF RESET
RETLW 0
write_a#o
CALL INITW
MOVLW B'10001100' ;0x8C COMANDO
MOVWF BUFTRX
BSF RESET
CALL w_clk ;UNO CARGA EN ANIOL Y ANIOH DIRECTAMENTE CON MOVWF
Swapf a#o_h, w ;esta rutina lo que hace es pasar la parte alta
Andlw b'11110000' ;a la parte alta del buftrx y agregarle la parte baja, arma
IORWF A#O_L,W ;EL BYTE.
MOVWF BUFTRX
CALL w_clk
BCF RESET
RETLW 0
write_dia
CALL INITW
MOVLW B'10001010' ;0x8A COMANDO
MOVWF BUFTRX
BSF RESET
CALL w_clk
MOVF DIA, W
MOVWF BUFTRX
CALL w_clk
BCF RESET
RETLW 0
;***********************************************************************************************
RX BTFSC PORTB,0 ;RX DE DATOS SERIALES DESDE PC
GOTO RX ;LUEGO DE LA INTERRUPCION
MOVLW .5
Movwf aux
RXNM MOVLW .8
Movwf cuenta8
CLRF RXREG
CALL DELAY2 ; delay
RXNEXT CALL DELAY1 ;mediodelay
BCF STATUS, 0
RRF RXREG, F
BTFSC PORTB, 0
BSF RXREG, 7
Decfsz cuenta8
GOTO RXNEXT
CACA BTFSC FLAG1,6
GOTO NEXTW
MOVLW 0X30
MOVWF FSR
NEXTW MOVF RXREG, W
MOVWF INDF
INCF FSR, F
BSF FLAG1, 6 ;DETECTAR FIN DE TX. Buscar el bit de stop
YE BTFSS PORTB, 0
GOTO YE
EY BTFSC PORTB,0
GOTO EY
DECFSZ AUX,F
GOTO RXNM
AL MOVLW .49
SUBWF D1,W
BTFSS STATUS,Z
GOTO MAS
GOTO QUIEN
MAS MOVF D2,W
MOVWF HORA_H
MOVF D3,W
MOVWF HORA_L
MOVF D4,W
MOVWF MINUTO_H
MOVF D5,W
MOVWF MINUTO_L
call init_clk
CALL write_hora
call write_minuto
clrf FLAG1
GOTO PAPO
;QUIEN MOVLW .49
; SUBWF RXREG,W
; BTFSS STATUS,Z
; GOTO PAPO ; GOTO VERDOS
QUIEN CALL READCLK
BSF FLAG,0 ;FLAG PARA ENVIAR MAS O MENOS CARACTERES
CLRF FLAG1
; MOVF HORA_H,W
; CALL CONVERT
; CALL TRANSMIT
MOVF HORA_L,W
CALL CONVERT
CALL TRANSMIT
BCF FLAG,0
MOVF MINUTO_H,W
CALL CONVERT
CALL TRANSMIT
MOVF MINUTO_L,W
CALL CONVERT
CALL TRANSMIT
MOVF SEGUNDO_H,W
CALL CONVERT
CALL TRANSMIT
MOVF SEGUNDO_L,W
CALL CONVERT
CALL TRANSMIT
GOTO PAPO
;**********************************************************************************************
DELAY2 MOVLW .9; .9 ;.19 ;166,120000,836 MICROSEG PARA 1200,N 8,1
MOVWF R12 ;40 PARA 2400
REDO1 NOP ;18 PA 9600,18,19 y un nop
NOP ;8 para 19200 Y RETOQUE DE 3 NOPS, QUITADOS FINALMENTE
DECFSZ R12
GOTO REDO1
; NOP
; NOP
; NOP
RETLW 0
;**********************************************************************************************
;**********************************************************************************************
; RUTINA DE CONVERSION BCD ==> UNIDAD, DECENA Y CENTENA
;**********************************************************************************************
CONVERT MOVWF NUM
MOVLW . 100
CALL BCD
MOVF COCINTE, W
MOVWF CENTE
MOVLW . 10
CALL BCD
MOVF COCINTE, W
Movwf dece
MOVF NUM, W
Movwf unid
RETLW 0
BCD CLRF COCINTE
Repite subwf num, f
BTFSS STATUS, 0
GOTO SUM1
INCF COCINTE
GOTO REPITE
SUM1 ADDWF NUM
RETLW 0
;**********************************************************************************************
; RUTINA DE CONVERSION UNIDAD Y DECENA EN ASCII Y TRANSMISION
;**********************************************************************************************
TRANSMIT ;MOVLW .48
;ADDWF CENTE,W
;MOVWF BUF232
;CALL TRANS
BTFSS FLAG,0
GOTO AS
MOVLW . 48
ADDWF DECE, W
MOVWF BUF232
CALL TRANS
AS MOVLW . 48
ADDWF UNID, W
MOVWF BUF232
CALL TRANS
RETLW 0
;**********************************************************************************************
; RUTINA DE TRANSMISION RS232
;**********************************************************************************************
TRANS MOVWF BUF232
MOVLW .8
MOVWF R11
BCF PORTA, 0
CALL DELAY1
XNEXT BCF PORTA, 0
BCF STATUS, 0
RRF BUF232
BTFSC STATUS, 0
BSF PORTA, 0
CALL DELAY1
DECFSZ R11
GOTO XNEXT
BSF PORTA,0
CALL DELAY1
RETLW 0
;**********************************************************************************************
DELAY1 MOVLW .19 ;.19 ;166,120000,836 MICROSEG PARA 1200,N 8,1
MOVWF R12 ;40 PARA 2400
REDO NOP ;18 PA 9600,18,19 y un nop
Nop ;8 para 19200 y retoque de 3 nops, quitados finalmente
DECFSZ R12
GOTO REDO
NOP
NOP
NOP
RETLW 0
END;

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas