TODOPIC
Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: Sacahe en 05 de Septiembre de 2006, 13:31:38
-
Hola amigos me ha atacado unas dudas en cuanto a la escritura y lectura de un rtc ds1307 que estoy haciendo con un 16f877a.
En cuanto a la escritura, lo que no entiendo muy bien, porque en la trama que muestra el datasheet del ds1307 (ds1307 modo
receptor)se envia muchos datos consecutivos despues de la direccion que se va a escribir:
S+ slave address + 0 + A + word address + A + data1 + A +
data2 + A + data3....+ A + P
en este caso estos tres datos se estan escribiendo en esa misma word address o que quiere decir?...o el ds1307 tiene
internamente una especie de puntero que va seleccionando las direcciones incrementandose por si solo al detectar que llega
nuevo dato ?
me explico?, bueno veamos un caso: por ejemplo cuando quiero escribir en una localidad de memoria del RTC, por ejemplo en la
00h (segundos), lo que tengo que hacer es:
1.mandar el bit de inicio
2.mandar la dirreccion del ds1307 (1101000) + bit de escritura
3.esperar el ACK del rtc (esclavo)
4.mandar la direccion 00h (segundos, localidad del rtc a escribir)
5.esperar el ACK del rtc (esclavo)
6.mandar el dato a grabar en el registro 00 (segundos).
7.esperar el ACK del rtc (esclavo)
y si despues de esto quiero escribir otro dato en la direccion 01h (minutos), que hago luego?...mi logica me dice que tengo
que poner un bit de STOP en la trama anterior y comenzar una nuevamente trama parecida tambien a la anterior pero atacando a
01h...o simplemente continuo escribiendo el nuevo dato y se guarda por si solo en 01h gracias al puntero que me imagine y ya
comente?
En cuanto a la lectura, no entiendo tampoco algo en cuanto a la trama que se muestra en el datasheet del ds1307 (ds1307 modo
transmisor):
S+ slave address + 1 + A + data1 + A + data2 + A +
data3....+ Anot + P
La trama no muestra la ubicacion de la direccion del registro del rtc (word address) que deseo leer...como
hago para accesar o leer una X localidad de memoria.
Bueno amigos necesito su mas pronta ayuda ya que apenas comienzo a cacharear con este chip y necesito entregar este proyecto
para mañana :mrgreen: GRACIAS :mrgreen:
-
:-/ :-/ :-/ :-/ :-/ :-/ Si alguno me ayudara...Se lo agradeceria mucho :-/ :-/ :-/ :-/ :-/ :-/
-
Hola Sacahe
En qué lenguaje estás programando?
Yo usé para manejar un 1307 el Protón+ y es algo muy sencillo, tanto para escribirlo, como para leerlo.
Los problemas comienzan al momento de sincronizarlo a la hora actual y al graficar o representar los datos leídos del mismo.
En mi caso tuve que crear caracteres para representarlos en una matriz de leds. (public, scroll text, etc)
Para escribirlo no esperé , ni envié ningún ACK, tampoco para leerlo.
Para escribirlo, el datasheet es muy claro:
Start >>>Slave Address + R/W>>>>Word Address (Puntero) >>>>>Data>>>>Stop
Esto sería :
Enviás Start , que en Protón+ es BSTART.
Luego enviás Slave Address + R/W>>>>Word Address (Puntero) >>>>>Data,
que en Protón+ sería BUSOUT %11010000,0,[%00000000] .........(segundos)
de igual forma vas incrementando el puntero y escribís los demás datos (minutos, horas, etc.)
BUSOUT %11010000,1,[%00000000] .........(minutos)
BUSOUT %11010000,2,[%00000000] ........(horas)
Una vez que terminás de grabar los datos, terminás con el Stop, que en Protón+ es BSTOP
Para leerlo es igual o más fácil, ya que podés elegir qué querés leer, o sea, podés hacer una lectura parcial de sólo algunos datos.
"Acá tenés que definir con anterioridad, en que variables vas a colocar los datos que leas".
Otra vez Start,
y luego otra vez
Slave Address + R/W>>>>Word Address (Puntero) >>>>>Data
que en Protón+ sería BUSIN %11010001,0,[SEG]
BUSIN %11010001,1,[MIN]
BUSIN %11010001,2,[HORA]
BUSIN %11010001,3,[DIAP] ......(en esa variable te carga el día en palabra :Sunday, Monday ...)
y así hasta completar los siete punteros, o bien sólo leés los que quieras, en el orden que quieras.
Terminás con BSTOP, y listo ! :mrgreen:
Luego de esto usás lo almacenado En las variables como te plazca.
Espero primero que lo entiendas, segundo que te saques una buena nota.
Saludos
Mario
-
Real Time Clock o el DS1307 desatado (http://www.todopic.com.ar/foros/index.php?topic=13282.0)
-
Mario solo se programar en ASM ..asi que lo del proton paila, pero entiendo muy bien tu explicacion y me ha sido de gran ayuda ya que no me atrevia a continuar por esta dudilla...ahora tengo con que volver a arrancar...Te pongo la rutina de lectura y decirme si esta bien.....Sopongamos que quiero leer la posicion de los segundos (00h), ahora te pregunto si la manera correcta de hacerlo es la siguiente?:
CALL I2C_INICIO ;SE GENERA EL BIT DE INICIO
MOVLW B'11010001' ;DIRECCIONA EL DS1307 EN MODO LECTURA
MOVWF SSPBUF ;AL CARGARLO EN SSPBUF LO TRANSMITE
CALL ESPERA_I2C ;ESPERA POR INTERRUPCION DEL MODULO
CALL I2C_ACK ;VERIFICA SI HUBO ACK DEL ESCLAVO
MOVLW H'00' ;LOCALIDAD DE MEMORIA (DEL DS1307) A LEER: 00h SEGUNDOS
MOVWF SSPBUF ;AL CARGARLO EN SSPBUF LO TRANSMITE
CALL ESPERA_I2C ;ESPERA POR INTERRUPCION DEL MODULO
CALL I2C_ACK ;VERIFICA SI HUBO ACK DEL ESCLAVO
.
.
.
aqui recibo el dato de 00h
guardado en SSPBUF y lo guardo
en cualquier variable
-
TE mando las subrritunas del DS1307 en asm
;Esta es una subbrutina que se encarga de leer y escibir los registros del
;reloj de tiempo real DS1307 de la empresa DALLAS SEMICONDUCTORS
;Se debe conectar SCL - RC3 y SDA -RC4 del pic 16f87x
;se deben definir los siguientes registros
;--------------------------------------------------------------------------------------------------------------
;SEGUNDOS,MINUTOS,HORAS,DIA,DATOD,MES,ANO ¡
;UNIDAD_SEG,DECENA_SEG,UNIDAD_MIN,DECENA_MIN ¡
;UNIDAD_HO,DECENA_HO,UNIDAD_DD,DECENA_DD ¡
;UNIDAD_MES,DECENA_MES,UNIDAD_ANO,DECENA_ANO ¡
;DATOI2C,DIRI2C ,APM ¡
;#define I2CCLOCK D'100000' ; Baud Rate in bps ¡
;#define FOSC D'4000000' ; Frecuencia del cristal ¡
;--------------------------------------------------------------------------------------------------------------
;Se debe configurar el modulo MSSP despues del inicio del programa
;Copiar lo siguiente despues de INICIO
;------------------------------------------------------------------------------------------
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,RP0; ¡
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 ANO
;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
;--------------------------------------------------
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 ANO,W
ANDLW 0X0F
MOVWF UNIDAD_ANO
SWAPF ANO,W
ANDLW 0X03
MOVWF DECENA_ANO
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,RP0
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 0X02 ;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
-
Hola Sacahe
......Mario solo se programar en ASM ..asi que lo del proton paila, pero entiendo muy bien tu explicacion ......
Por lo que te digo Amigo Sacahe ..... solo sé programar en Protón+ , así que lo del ASM paila ....... :D
Pero de todas formas... , primero el enlace que te ha dejado el amigo Diego, que está formidable y segundo PICmouse te ha dejado (creo yo), el problema resuelto y servido en bandeja.
Lo que no puedo dejar de mencionar es mi admiración por Uds. y por todos los que manejan ASM.
Yo creo que ya estoy un poco grande para eso y mi pobre neurona, no alcanzaría para eso. :D
No me quejo de lo que hago ya que yo hago
BUSIN %11010001,0,[SEG]
Y pongo en la variable SEG los segundos leídos desde el 1307, siendo que Uds. tienen que hacer
BANKSEL DIRI2C
CLRF DIRI2C
CALL READDS
MOVF DATOI2C,W
MOVWF SEGUNDOS
Para mandarle Stop
BSTOP
contra
BANKSEL PIE1
BCF PIE1,SSPIE
BSF SSPCON2,PEN
BTFSC SSPCON2,PEN
GOTO $-1
BCF STATUS,RP0
CALL RETARDO
RETLW 0
Pero la ventaja la llevan Uds., dominando el PIC, ciclo a ciclo de reloj.
Mis felicitaciones y respetos por el conocimiento.
Espero te sirva lo que han posteado los amigos, Sacahe.
Estás en muy buenas manos.
Saludos.
Mario
-
Mil gracias a todos...yo sabia que no me habia equivocado de foro por los excelentes colaboradores que no titubean al dar en ayuda sus conocimientos...
:mrgreen: :mrgreen: GRACIAS :mrgreen: :mrgreen:
-
pic mause buena por esa amigo las rutinas en asm del ds1307.
boy a intentar organizar este detalle suyo.
gracias por las rutinas
saludos y gracias
-
De nada microcom, Cualquier pregunta, no dudes.
Saludos!
-
picmause y amigos del foro disculpas por el viajao de letras que escribi.
me he puesto ha estudiar tu aporte y es mucha la informacion de apoyo y estuve organizando el programa.
solo me quedan dudas que no se si son tan presisas.
el ds1307 se estan actualizando los datos constantemente, es necesario mandar a leer los meses tambien junto can las horas,seg,min ;
¿al quitarle la alimentacion (VCC) al pic estando el ds1307 con vcc este sigue contando pero como el micro se ha resetado entonces empesara desde cero y mandará los datos iniciales al ds1307.
esto se puede solucionar, leyendo los minutos antes de iniciar el ds1307 y haci no escribir sino leer el ds1307.?
para el momento de acomodar la min,hor,seg,hor,año se deben tener mas o menos dos pulsadores que segun he leido tienen que manejarse con interrupciones para no parar eel programa preguntando por entardas.
cual esquematico (circuito) me recomendarias.
saludos y gracias por la colaboracion.
-
Bueno paisano, respecto al esquematico, seria este:
Solo es colocar SDA/I2c y SCL/I2c en los pines correspondientes del PIC.
Pero teoria, creo que RedPic, lo ha explicado de la mejor forma posible. Te recomiendo una pasadita por este hilo.
http://www.todopic.com.ar/foros/index.php?topic=13282.0
Saludos!
-
Muchas gracias por tu cita, PICMouse, te debo una :mrgreen: :mrgreen: :mrgreen:
microcom, date un vuelta por el hilo que te ha puesto el amigo PICMouse y si tienes alguna duda dímelo. :)
-
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
-
Listo, apenas tenga algo, comento!
-
:) hola microcom , bueno yo no domino tanto el assembler pero aki te he dejado una posible solucion a tu problema te dejo adjunto el circuito en proteus 6.9 y el archivo asm buena suerte :mrgreen:
-
Gueno, en bandeja de plata ta la respuesta, de todas maneras estoy revisando el codigo por ratos libres que me da el trabajo.
Saludos!
-
caballeros muchas gracias por la ayuda.
tadas la recomendaciones y concejos por parte de ustedes estará bien aceptada.
estare probando sus ayudas pa ver .
gracias y saludos.
-
Kedutpic amigo el circuito no me esta abriendo en el proteus 6.7
me sale invalido.
el programa asm si me abre pero sigo sin simular el ds1307 en elproteus 6.7 yo adapte el ds1307 al 6.7 pero no me anda sera ese el problema de la version 6.7 puesto que tu proteus es 6.9?
que sujerencia me dices.
como podre conseguir el proteus 6.9 saludos
saludos y gracias
-
:shock: que raro por si las dudas instalate la version 6.9 del proteus
-
kudep
-
:) amigo microcom las instrucciones ya te las envie en tu correo ,,, suerte,,,,, me cuentas como te fue ok
-
claro caballlero ya las observe y ademas estuve andando por instalar solo me faltan unos pocos detalles ya que el archivo enviado pesaba 1.4MB y no cabia en un disquets y no pude llevarmelo para la casa.pero si el hacha lo cual obyuve buenos resultado y creo haber instalado todo el programa. puesto que pude simular el
se circuito dds1307 que me mandastes.
mi pregunta lo ¿que pasa es que los circuitos con el 6.7 no estan andando bien con el 6.9?
asea el circuito abre pero no sedeja add archivos o sea no se deja modificar añadir otro programa asm al circuito del 6.9.
¿sera que habria que hacer de nuevo los circuitos en 6.9 estuve haciendo uno nuevo ya asi si añadia archivos asm.
que tools es para asm esambler ya que aveces sale uno tools como en chino .
saludos y gracias