TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: Mario en 31 de Octubre de 2004, 17:14:00
-
Hola,
soy yo de nuevo (con mas dudas).![loco loco]()
Quiero agregarle tiempo real a un proyecto y adquirí el DS1307 para ello.
En alguna ocasión aquí bajé un código para este dispositivo (en ensamblador) y hasta ahora me dí a la tarea de usarlo.
Le modifiqué unas cosas para acomdarlo a mi proyecto pero no pasa nada.
Intenté luego utilizar el I2CREAD y WRITE del PBP para lo mismo y no funciono.
Lo que se intenta hacer es configurar el dispositivo y luego leer de él para posteriormente desplegar el resultado en un LCD.
El LCD trabaja bien ya que con el mismo µicro y con otro programa, el LCD despliega lo que debe (el LCD no es).
Al intentar con ambos (para software y hardware) el LCD despliega puros cuadros negros (muy raro).
Se colocaron resistencias de jalón de 4.7K para las líneas SDA y SCL.
El Miércoles 3 de Noviembre regresaré a la escuela (2 de Noviembre es día de Muertos y es festivo) y me pondré a analizar el BUS, su información (sé cómo trabaja el protocolo de PHILLIPS), mientras tanto dejo en sus manos el código para que lo vean y me digan si está mal o bien.
En el código incluyo la conversión que use para transformar la información del DS1307 a una más dijerible (espero con esto contribuir en algo ya que siempre ando pidiendo favores).![Sonrisa Gigante Sonrisa Gigante]()
Se adjuntan los dos archivos, el de software y hardware.
Gracias de antemano.
Bueno, no los adjunto porque me dice que hay errores, se los voy a meter aquí:
por SOFTWARE
CONTA VAR BYTE $32 SYSTEM
RTR_SEG var byte $33 SYSTEM
RTR_MINT VAR BYTE $34 SYSTEM
RTR_HRS VAR BYTE $35 SYSTEM
RTR_DIA VAR BYTE $36 SYSTEM
RTR_FECHA VAR BYTE $37 SYSTEM
RTR_MES VAR BYTE $38 SYSTEM
RTR_MESX12 VAR BYTE $39 SYSTEM
DECE VAR BYTE $40 SYSTEM
UNID VAR BYTE $41 SYSTEM
CONV1 VAR BYTE $42 SYSTEM
CONV2 VAR BYTE $43 SYSTEM
I2CWrite Portc.4,Portc.3,$D0,$00,[RTR_SEG,RTR_MINT,RTR_HRS,RTR_DIA,RTR_FECHA,RTR_MES,RTR_MESX12,control]
actual:
asm
x
btfss portb,7
goto x
endasm
I2CRead Portc.4,Portc.3,$D0,$00,[RTR_SEG,RTR_MINT,RTR_HRS,RTR_DIA,RTR_FECHA,RTR_MES,RTR_MESX12,control]
"iniciando conversión para segundos
CONV1 = RTR_SEG " Pasando RTR_SEG binario a CONV1
Gosub conversion " Llamando a la conversión de BCD a Binario
RTR_SEG = CONV2 " Colocando el resultado de la conversión (BIN)
"iniciando conversión para minutos
CONV1 = RTR_MINT " Pasando RTR_MINT binario a CONV1
gosub conversion " Llamando a la conversión de BCD a Binario
RTR_MINT = CONV2 " Colocando el resultado de la conversión (BIN)
"iniciando conversión para horas
asm
clrf CONTA
movfw RTR_HRS
andlw 0x30,W
movwf CONV1
btfsc CONV1,5 ; 0 = AM
infc CONTA ; 1 = PM
movlw 0x1F
andwf RTR_HRS,F
endasm
CONV1 = RTR_hrs " Pasando RTR_HRS binario a CONV1
gosub conversion " Llamando a la conversión de BCD a Binario
RTR_HRS = CONV2 " Colocando el resultado de la conversión (BIN)
"iniciando conversión para días (no lo ocupa ya que días es de 7 bits)
"iniciando conversión para fecha
CONV1 = RTR_fecha " Pasando RTR_FECHA binario a CONV1
gosub conversion " Llamando a la conversión de BCD a Binario
RTR_FECHA = CONV2 " Colocando el resultado de la conversión (BIN)
"iniciando conversión para mes
CONV1 = RTR_mes " Pasando RTR_MES binario a CONV1
gosub conversion " Llamando a la conversión de BCD a Binario
RTR_MES = CONV2 " Colocando el resultado de la conversión (BIN)
"iniciando conversión para año
CONV1 = RTR_mesx12 " Pasando RTR_MESX12 binario a CONV1
gosub conversion " Llamando a la conversión de BCD a Binario
RTR_MESX12 = CONV2 " Colocando el resultado de la conversión (BIN)
CONVERSION:
UNID = CONV1&$0F
asm
SWAPF CONV1,F
endasm
DECE = CONV1
DECE = (DECE&$0F)*10
CONV2 = DECE+UNID
return
lcdout $FE,1, "TIEMPO = ",dec RTR_FECHA,"-",DEC RTR_MES,"-",DEC RTR_MESX12
pause 1000
lcdout $FE,1, DEC RTR_HRS,":",DEC RTR_MINT,":",DEC RTR_SEG," "]
IF CONTA==1 THEN
lcdout $FE,$80+17 "PM"
ELSE
lcdout $FE,$80+17 "AM"
ENDIF
pause 1000
goto actual
Donde RTR_XXX es el valor de configuración
Por Hardware 1
"************************************************************************
"* Nombre : DS1307_PIC_I²C.BAS *
"* Autor : Mario Alberto Camarillo Ramos *
"* Fecha : 14/Sep/2004 *
"* Versión : 1.6 *
"* Modelo : PIC_16F872 *
"* Notas : implementación de LCDOUT en lugar de DEBUG *
"************************************************************************
DEFINE NO_CLRWDT 1
DEFINE OSC 4 " Con un oscilador de 4 MHz
COMM var PORTC.0
ESCLAVO VAR BYTE $30 SYSTEM
TXBUF VAR BYTE $31 SYSTEM
CONTA VAR BYTE $32 SYSTEM
RTR_SEG var byte $33 SYSTEM
RTR_MINT VAR BYTE $34 SYSTEM
RTR_HRS VAR BYTE $35 SYSTEM
RTR_DIA VAR BYTE $36 SYSTEM
RTR_FECHA VAR BYTE $37 SYSTEM
RTR_MES VAR BYTE $38 SYSTEM
RTR_MESX12 VAR BYTE $39 SYSTEM
DECE VAR BYTE $40 SYSTEM
UNID VAR BYTE $41 SYSTEM
CONV1 VAR BYTE $42 SYSTEM
CONV2 VAR BYTE $43 SYSTEM
asm
;Esta es la configuración
I2C_SETUP
BANKSEL SSPADD ; Selecciona el Banco 1 y el registro
movlw 0x09 ; Carga 0x09 para baud rate 100KHZ@4MHZ
movwf SSPADD ; Inicializa velocidad de transferencia
bcf SSPSTAT,6 ; Selecciona niveles para bus I2C
bsf SSPSTAT,7 ; Desabilita el slew rate
movlw 0x14 ; Programa las lineas del I2C
movwf TRISC ; como entradas.
bcf STATUS,RP0 ; Selecciona el BANCO 0
movlw 0x24 ; Programa el modulo SSP
movwf SSPCON ; Modo maestro y habilitando el I2C
; PONE EN HORA EL DS1307 DESDE UNA TABLA
clrf CONTA ; Borrando el contador
movlw 0xD0 ; Dirección del esclavo
movwf ESCLAVO ; Preparando esclavo
call WRITE_I2C_BYTE_INI
LOOP_WRITE
movfw CONTA ; Primera dirección del DS1307 (SEG)
call TABLA ; seg,min,hrs,dia,mes,año
movwf TXBUF ; Para ser transmitidos
call WRITE_I2C_BYTE ; y escritos
incf CONTA ; incrementando la dirección
movfw CONTA ; Aquí se pregunta si ya se mandó toda
xorlw .8 ; la información.
btfss STATUS,Z ; Z=1 si
goto LOOP_WRITE ; Z=0 no
call WRITE_I2C_BSTOP
return
; TABLA DE DATOS PARA PUESTA EN HORA Y FUNCIONAMIENTO DEL DS1307
TABLA
addwf PCL,F
DT 0x00,0x00,0x49,0x01,0x13,0x09,0x04,0x90
; SEGUNDOS,MINUTOS,HORA,DIA DE LA SEMANA, DIA DEL MES, MES, AÑO, CONFIGURACION
; LECTURA DEL DS1307
READ_RTC_I2C ; Lectura del DS1307 y se carga en RAM
movlw 0x09 ; Carga el numero de Bytes a leer
movwf CONTA ;
movlw 0xD0 ; Direccion de esclavo del DS 1307
movwf ESCLAVO ;
call READ_I2C_INI; Inicializa el modulo I2C para lectura
movlw 0x33 ; Direccion inicial de RAM para transferir
movwf FSR ; a la RAM del micro en modo indirecto
RBYTE_RTC
call READ_I2C_PAGE ; Inicia lectura secuencial del DS1307
movfw SSPBUF ;
movwf INDF ; Y lo transfiere a un registro de la RAM del micro
incf FSR ; Incrementa 1 el puntero de direccion indirecta
decfsz CONTA ; Verifica si lleyo todos los BYTES
goto RBYTE_RTC ; Si no lee otro BYTE
call READ_I2C_PAGE_BSTOP
return
; RUTINAS USANDO MSSP
; Escritura al DS1307
WRITE_I2C_BYTE_INI
call I2C_BSTART ; Genera el bit de START
movfw ESCLAVO ; Direccion del esclavo en modo escritura
movwf SSPBUF ; y al cargarlo en SSPBUF lo transmite
call WAIT_I2C_INT ; Espera por interrupcion del modulo
call I2C_ACK ; Verifica si hubo ACK del esclavo
movlw 0x00 ; Direccion de memoria a grabar
movwf SSPBUF ; Al cargar SSPBUF se inicia la transmision
call WAIT_I2C_INT ; Espera por interrupcion del modulo
call I2C_ACK ; Verifica si hubo ACK del esclavo
return ; Y retorna
WRITE_I2C_BYTE
movfw TXBUF ; Carga en W el dato a Grabar
movwf SSPBUF ; y al cargarlo en SSPBUF lo transmite
call WAIT_I2C_INT ; Espera por interrupcion del modulo
call I2C_ACK ; Verifica si hubo ACK del esclavo
return ; Y retorna
WRITE_I2C_BSTOP
call I2C_BSTOP ; Genera el bit de STOP
return ; Y retorna
; Lectura del DS1307
READ_I2C_INI
call I2C_BSTART ; Genera el bit de START
bsf ESCLAVO,0 ; Selecciona el modo lectura del esclavo
movfw ESCLAVO ; Direccion del esclavo en modo lectura
movwf SSPBUF ; y al cargarlo en SSPBUF lo transmite
call WAIT_I2C_INT ; Espera por interrupcion del modulo
call I2C_ACK ; Verifica si hubo ACK del esclavo
movlw 0x00 ; Direccion de memoria a leer
movwf SSPBUF ; Al cargar SSPBUF se inicia la transmision
call WAIT_I2C_INT ; Espera por interrupcion del modulo
call I2C_ACK ; Verifica si hubo ACK del esclavo
call I2C_RX ; Inicia recepcion I2C
return
READ_I2C_PAGE
bsf STATUS,RP0 ; selecciona el banco SSPCON2
bcf SSPCON2,ACKDT ; responder al esclavo con un ack
bsf SSPCON2,ACKEN ; Incia la secuencia de ACK maestro a esclavo
btfsc SSPCON2,ACKEN ; ¿ack enviado?
goto $-1 ; no, intenta de nuevo
bsf SSPCON2,RCEN ; Lo mandó, prepararse para recepción de ACK
bcf STATUS,RP0 ; Moviéndose al banco
call WAIT_I2C_INT ; Espera por interrupción del módulo
return ; Y retorna
READ_I2C_PAGE_BSTOP
bsf STATUS,RP0 ; Selecciona el banco
bsf SSPCON2,ACKDT ; Final de la lectura, enviando un /ACK
bsf SSPCON2,ACKEN ; Incia la secuencia de ACK maestro a esclavo
bcf STATUS,RP0 ; Moviéndonos de banco
call WAIT_I2C_INT ; Espera por interrupción del módulo
call I2C_BSTOP ; Genera el bit de paro (STOP)
return ; Y retorna
;==================RUTINAS AUXILIARES PARA I2C===============================
I2C_BSTART
bsf STATUS,RP0 ; Seleccionamos banco 1
bsf SSPCON2,SEN ; Iniciando bit de inicio (START)
btfsc SSPCON2,SEN ; Asegurándonos que se mandó
goto $-1 ;
bcf STATUS,RP0 ; Regresando a banco 0
return
I2C_BSTOP
bsf STATUS,RP0 ; Seleccionando banco 1
bsf SSPCON2,PEN ; Generando el bit de paro (STOP)
btfsc SSPCON2,PEN ; Asegurándose que se mandó
goto $-1 ;
bcf STATUS,RP0 ; Regresando al banco 0
return
I2C_RX
bsf STATUS,RP0 ; Seleccionando SSPCON2
bsf SSPCON2,RCEN ; para habilitar al maestro como
bcf STATUS,RP0 ; receptor y regresando al banco 0
return
I2C_ACK
bsf STATUS,RP0 ; Seleccionando SSPCON2
btfsc SSPCON2,ACKSTAT ; Esclavo = ACK
goto $-1 ; Esperando
bcf STATUS,RP0 ; Regresando al banco 0
return
WAIT_I2C_INT ; Espera por señal de interrupción del
bcf PIR1,SSPIF ; modulo, recordemos que el módulo genera
btfss PIR1,SSPIF ; por cada operación una interrupción, en
goto $-1 ; este caso se revisa la bandera a tal fin
return
;=========================FIN RUTINAS AUXILIARES I2C====================
end
endasm
ACTUAL:
"iniciando conversión para segundos
CONV1 = RTR_SEG " Pasando RTR_SEG binario a CONV1
Gosub conversion " Llamando a la conversión de BCD a Binario
RTR_SEG = CONV2 " Colocando el resultado de la conversión (BIN)
"iniciando conversión para minutos
CONV1 = RTR_MINT " Pasando RTR_MINT binario a CONV1
gosub conversion " Llamando a la conversión de BCD a Binario
RTR_MINT = CONV2 " Colocando el resultado de la conversión (BIN)
"iniciando conversión para horas
asm
clrf CONTA
movfw RTR_HRS
andlw 0x30,W
movwf CONV1
btfsc CONV1,5 ; 0 = AM
infc CONTA ; 1 = PM
movlw 0x1F
andwf RTR_HRS,F
endasm
CONV1 = RTR_hrs " Pasando RTR_HRS binario a CONV1
gosub conversion " Llamando a la conversión de BCD a Binario
RTR_HRS = CONV2 " Colocando el resultado de la conversión (BIN)
"iniciando conversión para días (no lo ocupa ya que días es de 7 bits)
"iniciando conversión para fecha
CONV1 = RTR_fecha " Pasando RTR_FECHA binario a CONV1
gosub conversion " Llamando a la conversión de BCD a Binario
RTR_FECHA = CONV2 " Colocando el resultado de la conversión (BIN)
"iniciando conversión para mes
CONV1 = RTR_mes " Pasando RTR_MES binario a CONV1
gosub conversion " Llamando a la conversión de BCD a Binario
RTR_MES = CONV2 " Colocando el resultado de la conversión (BIN)
"iniciando conversión para año
CONV1 = RTR_mesx12 " Pasando RTR_MESX12 binario a CONV1
gosub conversion " Llamando a la conversión de BCD a Binario
RTR_MESX12 = CONV2 " Colocando el resultado de la conversión (BIN)
CONVERSION:
UNID = CONV1&$0F
asm
SWAPF CONV1,F
endasm
DECE = CONV1
DECE = (DECE&$0F)*10
CONV2 = DECE+UNID
return
lcdout $FE,1, "TIEMPO = ",dec RTR_FECHA,"-",DEC RTR_MES,"-",DEC RTR_MESX12
pause 1000
lcdout $FE,1, DEC RTR_HRS,":",DEC RTR_MINT,":",DEC RTR_SEG," "]
IF CONTA==1 THEN
lcdout $FE,$80+17 "PM"
ELSE
lcdout $FE,$80+17 "AM"
ENDIF
pause 1000
GOTO ACTUAL
Por Hardware 2
"************************************************************************
"* Nombre : DS1307_PIC_I²C.BAS *
"* Autor : Mario Alberto Camarillo Ramos *
"* Fecha : 4/OCT/2004 *
"* Versión : 1.7 *
"* Modelo : PIC_16F872 *
"* Notas : Esta es solo para cuando ya está configurado el DS1307 *
"************************************************************************
DEFINE NO_CLRWDT 1
DEFINE OSC 4 " Con un oscilador de 4 MHz
COMM var PORTC.0
ESCLAVO VAR BYTE $30 SYSTEM
TXBUF VAR BYTE $31 SYSTEM
CONTA VAR BYTE $32 SYSTEM
RTR_SEG var byte $33 SYSTEM
RTR_MINT VAR BYTE $34 SYSTEM
RTR_HRS VAR BYTE $35 SYSTEM
RTR_DIA VAR BYTE $36 SYSTEM
RTR_FECHA VAR BYTE $37 SYSTEM
RTR_MES VAR BYTE $38 SYSTEM
RTR_MESX12 VAR BYTE $39 SYSTEM
DECE VAR BYTE $40 SYSTEM
UNID VAR BYTE $41 SYSTEM
CONV1 VAR BYTE $42 SYSTEM
CONV2 VAR BYTE $43 SYSTEM
asm
;Esta es la configuración
I2C_SETUP
BANKSEL SSPADD ; Selecciona el Banco 1 y el registro
movlw 0x09 ; Carga 0x09 para baud rate 100KHZ@4MHZ
movwf SSPADD ; Inicializa velocidad de transferencia
bcf SSPSTAT,6 ; Selecciona niveles para bus I2C
bsf SSPSTAT,7 ; Desabilita el slew rate
movlw 0x14 ; Programa las lineas del I2C
movwf TRISC ; como entradas.
bcf STATUS,RP0 ; Selecciona el BANCO 0
movlw 0x24 ; Programa el modulo SSP
movwf SSPCON ; Modo maestro y habilitando el I2C
; LECTURA DEL DS1307
READ_RTC_I2C ; Lectura del DS1307 y se carga en RAM
movlw 0x09 ; Carga el numero de Bytes a leer
movwf CONTA ;
movlw 0xD0 ; Direccion de esclavo del DS 1307
movwf ESCLAVO ;
call READ_I2C_INI; Inicializa el modulo I2C para lectura
movlw 0x33 ; Direccion inicial de RAM para transferir
movwf FSR ; a la RAM del micro en modo indirecto
RBYTE_RTC
call READ_I2C_PAGE ; Inicia lectura secuencial del DS1307
movfw SSPBUF ;
movwf INDF ; Y lo transfiere a un registro de la RAM del micro
incf FSR ; Incrementa 1 el puntero de direccion indirecta
decfsz CONTA ; Verifica si lleyo todos los BYTES
goto RBYTE_RTC ; Si no lee otro BYTE
call READ_I2C_PAGE_BSTOP
return
; RUTINAS USANDO MSSP
; Lectura del DS1307
READ_I2C_INI
call I2C_BSTART ; Genera el bit de START
bsf ESCLAVO,0 ; Selecciona el modo lectura del esclavo
movfw ESCLAVO ; Direccion del esclavo en modo lectura
movwf SSPBUF ; y al cargarlo en SSPBUF lo transmite
call WAIT_I2C_INT ; Espera por interrupcion del modulo
call I2C_ACK ; Verifica si hubo ACK del esclavo
movlw 0x00 ; Direccion de memoria a leer
movwf SSPBUF ; Al cargar SSPBUF se inicia la transmision
call WAIT_I2C_INT ; Espera por interrupcion del modulo
call I2C_ACK ; Verifica si hubo ACK del esclavo
call I2C_RX ; Inicia recepcion I2C
return
READ_I2C_PAGE
bsf STATUS,RP0 ; selecciona el banco SSPCON2
bcf SSPCON2,ACKDT ; responder al esclavo con un ack
bsf SSPCON2,ACKEN ; Incia la secuencia de ACK maestro a esclavo
btfsc SSPCON2,ACKEN ; ¿ack enviado?
goto $-1 ; no, intenta de nuevo
bsf SSPCON2,RCEN ; Lo mandó, prepararse para recepción de ACK
bcf STATUS,RP0 ; Moviéndose al banco
call WAIT_I2C_INT ; Espera por interrupción del módulo
return ; Y retorna
READ_I2C_PAGE_BSTOP
bsf STATUS,RP0 ; Selecciona el banco
bsf SSPCON2,ACKDT ; Final de la lectura, enviando un /ACK
bsf SSPCON2,ACKEN ; Incia la secuencia de ACK maestro a esclavo
bcf STATUS,RP0 ; Moviéndonos de banco
call WAIT_I2C_INT ; Espera por interrupción del módulo
call I2C_BSTOP ; Genera el bit de paro (STOP)
return ; Y retorna
;==================RUTINAS AUXILIARES PARA I2C===============================
I2C_BSTART
bsf STATUS,RP0 ; Seleccionamos banco 1
bsf SSPCON2,SEN ; Iniciando bit de inicio (START)
btfsc SSPCON2,SEN ; Asegurándonos que se mandó
goto $-1 ;
bcf STATUS,RP0 ; Regresando a banco 0
return
I2C_BSTOP
bsf STATUS,RP0 ; Seleccionando banco 1
bsf SSPCON2,PEN ; Generando el bit de paro (STOP)
btfsc SSPCON2,PEN ; Asegurándose que se mandó
goto $-1 ;
bcf STATUS,RP0 ; Regresando al banco 0
return
I2C_RX
bsf STATUS,RP0 ; Seleccionando SSPCON2
bsf SSPCON2,RCEN ; para habilitar al maestro como
bcf STATUS,RP0 ; receptor y regresando al banco 0
return
I2C_ACK
bsf STATUS,RP0 ; Seleccionando SSPCON2
btfsc SSPCON2,ACKSTAT ; Esclavo = ACK
goto $-1 ; Esperando
bcf STATUS,RP0 ; Regresando al banco 0
return
WAIT_I2C_INT ; Espera por señal de interrupción del
bcf PIR1,SSPIF ; modulo, recordemos que el módulo genera
btfss PIR1,SSPIF ; por cada operación una interrupción, en
goto $-1 ; este caso se revisa la bandera a tal fin
return
;=========================FIN RUTINAS AUXILIARES I2C====================
end
endasm
ACTUAL:
"iniciando conversión para segundos
CONV1 = RTR_SEG " Pasando RTR_SEG binario a CONV1
Gosub conversion " Llamando a la conversión de BCD a Binario
RTR_SEG = CONV2 " Colocando el resultado de la conversión (BIN)
"iniciando conversión para minutos
CONV1 = RTR_MINT " Pasando RTR_MINT binario a CONV1
gosub conversion " Llamando a la conversión de BCD a Binario
RTR_MINT = CONV2 " Colocando el resultado de la conversión (BIN)
"iniciando conversión para horas
asm
clrf CONTA
movfw RTR_HRS
andlw 0x30,W
movwf CONV1
btfsc CONV1,5 ; 0 = AM
infc CONTA ; 1 = PM
movlw 0x1F
andwf RTR_HRS,F
endasm
CONV1 = RTR_hrs " Pasando RTR_HRS binario a CONV1
gosub conversion " Llamando a la conversión de BCD a Binario
RTR_HRS = CONV2 " Colocando el resultado de la conversión (BIN)
"iniciando conversión para días (no lo ocupa ya que días es de 7 bits)
"iniciando conversión para fecha
CONV1 = RTR_fecha " Pasando RTR_FECHA binario a CONV1
gosub conversion " Llamando a la conversión de BCD a Binario
RTR_FECHA = CONV2 " Colocando el resultado de la conversión (BIN)
"iniciando conversión para mes
CONV1 = RTR_mes " Pasando RTR_MES binario a CONV1
gosub conversion " Llamando a la conversión de BCD a Binario
RTR_MES = CONV2 " Colocando el resultado de la conversión (BIN)
"iniciando conversión para año
CONV1 = RTR_mesx12 " Pasando RTR_MESX12 binario a CONV1
gosub conversion " Llamando a la conversión de BCD a Binario
RTR_MESX12 = CONV2 " Colocando el resultado de la conversión (BIN)
CONVERSION:
UNID = CONV1&$0F
asm
SWAPF CONV1,F
endasm
DECE = CONV1
DECE = (DECE&$0F)*10
CONV2 = DECE+UNID
return
lcdout $FE,1, "TIEMPO = ",dec RTR_FECHA,"-",DEC RTR_MES,"-",DEC RTR_MESX12
pause 1000
lcdout $FE,1, DEC RTR_HRS,":",DEC RTR_MINT,":",DEC RTR_SEG," "]
IF CONTA==1 THEN
lcdout $FE,$80+17 "PM"
ELSE
lcdout $FE,$80+17 "AM"
ENDIF
pause 1000
GOTO ACTUAL
Se compró el cristal para el DS1307 acoplado a 12.5 pf ya que está es la carga capacitiva requerida.
El miércoles me daré a la tarea de buscar un por qué más tangible (con osciloscopio y viendo la información).![Ardiendo Ardiendo]()
Se les agradece el tiempo para leer esto y espero que la conversión sirva de algo por lo menos.
-
Hola
Mira yo no tengo experiencia pero he estado peleandome con este DS1307, el primer problema que tenia es que estaba dañado
y el LCD me mandaba 88:88:88 lo cambie y listo.
No vi bien tu mensaje por que no entiendo casi nada de lo que pones pero veo que lo mandas al LCD en DEC RTR_HRS y yo lo mando como HEX2 RTR_HRS, no se si por algun cambio que tengas, tambien la dirección de lectura debe ser D1 y escritura D0 segun yo.
El data dice:
The address byte is the first byte received after the start condition is generated by the
master. The address byte contains the 7-bit DS1307 address, which is 1101000, followed by the
*direction bit (R/W ) which, for a read, is a 1.
pongo un ejemplo de lo que utilice para ver si funcionaba primero y solo pone la hora por default y se ve en el LCD.
****************************************
DEVICE=16F877
XTAL = 4
LCD_DTPIN = PORTD.4
LCD_RSPIN = PORTD.2
LCD_ENPIN = PORTD.3
LCD_INTERFACE = 4 " 4-bit Interface
LCD_LINES = 2
LCD_TYPE = 0
pause 1000
SCL_PIN = PORTC.3
SDA_PIN = PORTC.4
DIM SEGUNDOS AS BYTE
DIM MINUTOS AS BYTE
DIM HORA AS BYTE
" ++++++++++ Grabar la hora
SEGUNDOS = $00
MINUTOS = $00
HORA=$12
" para simular con el PCF8583 utilizo la direccion %10100000,2,
BUSOUT $D0,$00,[SEGUNDOS,MINUTOS,HORA] "GRABA LA HORA PRE ESTABLECIDA
CLS
Leer_Hora:
BUSIN $D1,$00,[ SEGUNDOS,MINUTOS,HORA]
PRINT AT 1,1, HEX2 HORA,":", HEX2 MINUTOS, ":", HEX2 SEGUNDOS
GOTO Leer_Hora
END
*******************************
Espero te sirva de algo esto ya que como te comento no tengo mucha experiencia y yo solo ocupo la hora, minutos y segundos.
Saludos
Luis
-
Luis,
¿Mencionas que no entiendes casi nada porque no estás familiarizado con la programación en ensamblador?
Tienes razón y no me lo puedo perdonar:
Estoy escribiendo siempre y nunca leo ($D0 y $D0, nunca $D1).
El miércoles que tenga oportunidad de ir a la escuela lo intentaré como debe ser.
¿Qué compilador usas?
La sintaxis es muy parecida al PicBasic Pro pero estoy 99.92% seguro que no es.
Yo uso el PIC16F872 que también tiene I²C en hardware, si consigo utilizar el hardware, me ahorraré como 200 líneas de programación (a la hora de compilar) y será multitareas mi aplicación en lugar de esperar todo el ciclo de I2CREAD y Write.
Te mantendré informado.
Oye, cómo le haces para desplegar la hora, ya ves que el resultado te lo da en BCD pero debes acomodarlo, es por eso que se tiene la subrutina Conversion para acomodarlo como debe ser.
Muchísisisisimas gracias, lo antes mencionado (lectura-escritura) tiene grandes posibilidades de ser cierto (¡y eso que se supone me sé el comportamiento del protocolo!), no sé cómo lo pasé por alto.
Mario Alberto Camarillo Ramos
-
Hola
Exacto no entiendo el ensamblador ni el basic
, pero le estoy haciendo la lucha.
Utilizo el proton+ o Pic Basic Plus (segun alguien me comento jeje)
lo utilizo tal cual lo puse mando un print at 1,1, hex2 hora y me despliega la hora como debe ser, esto lo saque de la siguiente liga que esta en PBpro pero a mi no servia todo asi que lo cambie, aparte que le entendia al PBP menoa que al Proton+
Para lo que si realize cambios de BCD=>DEC y DEC=>BCD fue para cambiar por medio de botones la hora y minutos
Esto lo puso alguna vez MarquesSalsero
http://www.melabs.com/resources/samples.htm
encontraras un archivo llamado MN1307.txt
Saludos
Luis
-
HOLA:
Disculpa pero no se porque mezclas tanto asm y codigo basic ,aqui te pongo un ejemplo en plus para un 1302,creo que no hay enormes diferencias......
espero te sirva auque sea de ejemplo...como manejarlo sin asm...
Saludos
khasitos
" LCD clock program using Dallas1202/1302 RTC
Device 16F877
XTAL = 20
" Graphic LCD pin Assignments
Declare LCD_DTPIN PORTD.0
Declare LCD_RSPIN PORTE.0
Declare LCD_ENPIN PORTE.1
Declare LCD_LINES 2
Declare LCD_INTERFACE 8
" Alias pins
Symbol RST = PORTA.2
Symbol IO = PORTC.1
Symbol SCLK = PORTC.3
" Allocate variables
Dim rtcyear as byte
Dim rtcday as byte
Dim rtcmonth as byte
Dim rtcdate as byte
Dim rtchr as byte
Dim rtcmin as byte
Dim rtcsec as byte
Dim rtccontrol as byte
"-------------------------------------------------------------------------------
Low RST " Reset RTC
Low SCLK
ADCON1 = 7 " PORTA and E digital
Low PORTE.2 " LCD R/W low = write
Delayms 100 " Wait for LCD to startup
" Set initial time to 8:00:00AM 07/16/99
rtcyear = $99
rtcday = $06
rtcmonth = $07
rtcdate = $16
rtchr = $08
rtcmin = 0
rtcsec = 0
Gosub settime " Set the time
Goto mainloop " Skip subroutines
"-------------------------------------------------------------------------------
" Subroutine to write time to RTC
Settime:
RST = 1 " Ready for transfer
Shout IO,SCLK,LSBFIRST,[$8e,0] " Enable write
RST = 0 " Reset RTC
RST = 1 " Ready for transfer
" Write all 8 RTC registers in burst mode
Shout IO,SCLK,LSBFIRST,[$be,rtcsec,rtcmin,rtchr,rtcdate,rtcmonth,rtcday,rtcyear,0]
RST = 0 " Reset RTC
Return
"-------------------------------------------------------------------------------
" Subroutine to read time from RTC
gettime:
RST = 1 " Ready for transfer
Shout IO,SCLK,LSBFIRST,[$bf] " Read all 8 RTC registers in burst mode
Shin IO,SCLK,LSBPRE,[rtcsec,rtcmin,rtchr,rtcdate,rtcmonth,rtcday,rtcyear,rtccontrol]
RST = 0 " Reset RTC
Return
"-------------------------------------------------------------------------------
" Main program loop - updates the LCD with the time
Mainloop:
Gosub gettime " Read the time from the RTC
" Display time on LCD
Print at 1,1, hex2 rtcmonth,"/",hex2 rtcdate,"/",hex2 rtcyear," ",hex2 rtchr,":",hex2 rtcmin,":",hex2 rtcsec
Delayms 300 " Do it approx 3 times a second
Goto Mainloop " Do it forever
-
khasistos y Luis:
khasistos
La razón por la cual de la "mezcla" es porque requiero mayor velocidad en la adquicisión de la información (tengo contadores en hardware y convertidores analógicos/digitales en hardware). Es de vital importancia que el programa fuente no se cargue de "cosas" adicionales. Es por ello el ensamblador para activar el hardware de I²C.
Luis
Ese archivo fue el que me basé para realizar el programa en software, es de Melanie Newman y lo usa para el 16F628 (el cual también lo tengo).
Gracia a ambos.
-
Hola Reppuken
Veo que usas comandos como movwf que no son necesarios en asm(con x=y es suficiente ya que es lomismo en compilacion), y btfss y clrf, y muchos otros, un IF trabaja igual que un btfss(solo un ejemplo) deberias de probar con el codigo propuesto por el pana KHASISTOS, se que usaste el de pbpro pero te aseguro que el codigo que genere proton tendra menos " cosas " que te a generado el pbpro, si no funciona, entonces se tendria que ver la sintaxis del codigo, no poner en linea varios comandos, etc... solo es cosa de que poco a poco vayas recortando detalles para Maximizar codigo.
si no quieres que se te carge de codigo pana quita esas EXTENSAS lineas de tu codigo fuentecomo:
I2CWrite Portc.4,Portc.3,$D0,$00,[RTR_SEG,RTR_MINT,RTR_HRS,RTR_DIA,RTR_FECHA,RTR_MES,RTR_MESX12,control]
esta mas que conocido y comprobado, que no es bueno cargar en LINEa tanto(estas generadno mucho codigo asi y eso es lo que quieres evitar no????????)
Yo creo que corrigiendo la sintaxis, o hasta usando el codigo en proton te funcionaria, solo es cosa de que pruebes y si no, maximizar codigo, es decir, genera el codigo en proton, compilalo,y abre con F2 el ensamblado(veras que es muy eficiente) despues abres el pbp y eliminas comandos extras (lo cual lo hace por defaul el compilador " eliminacion y optimizacion de codigo " ) que encuentres.
Usando adecuadamente un compilador te generara mucho menos codigo que usandolo por defaul.
Salu2 pana
-
Lager,
Hoy me daré a la tarea de ver el por qué no funciona el programa.
Tienes mucha razón en lo de las instrucciones I2CWRITE Y READ, simplemente se implementaron para saber si el µicro funcionaba pero, falló igual que el programa en ensamblador.
Con lo que respecta a los movimientos en ensamblador, es porque no había visualizado el código del PBP muy bien:
LUIS propuso una alternativa más viable (creo) al presentar la información como HEX, ya que el DS1307 pone la información en BCD pero en el mismo BYTE (decenas con unidades ej: 27= 0010 0111) por eso la conversión pero creo que utilizaré esta propuesta de pedir sólo el HEX correspondiente, al fin que esta es la rutina de conversión y si esto me genera menos código, mejor.
Gracias por la sugerencia y espero dar una respuesta (satisfactoria preferentemente) a este problema.
Mario
-
Una cosa mas:
No uso el "Protón" porque no dispongo de él, con el PicBasic Pro no he tenido problemas (tengo problemas al hacer el programa, pero no de compilador).
Aparte, quiero dominar el PBP para (si es necesario) porder mudarme a otro compilador y no batallar tanto.
Me han mencionado de algo llamado OOPIC pero busqué información y no creo que este dentro de mis necesidades (¡y presupuesto!).
Atentamente
Mario
-
Hola oye yo quisiera hacer un proyecto similar, y no se si me podrias pasar el cto de tu programa que pones aqui, y el programa completo ya que la verdad medio sé programar pero solo en ensamblador, en Basic no, sino es mucha molestia, mi mail es david_payaso@hotmail.com Gracias.
Por cierto en este link hay un ejercicio con el PIC16F628, en Basic Talvez te sirva:
http://www.melabs.com/resources/samples/submitted/MN1307.txt