SoloCodigo
Programación Específica => Microcontroladores => Mensaje iniciado por: gonza2004 en Jueves 8 de Abril de 2004, 20:25
-
Hola al foro,
Estoy realizando un proyecto con el PIC 16F877 basado en una estación domótica, que implementa diversas funciones tales como control de calefacción del hogar, control de temperatura, sensor de humos, y conexión vía modem para realizar una llamada telefónica en caso de intrusión. El proyecto se divide en módulos, el problema me surgió cuando tuve que desarrollar el módulo para la gestión del reloj en tiempo real. Este está formado basicamente por dos rutinas, una urgente, y una menos urgente. La rutina urgente esta mapeada como interrupción, y se ejecuta con cada interrupción de 1mseg por timer0. En esta se incrementa un contador de mseg y cuando este llega a 60000 (ahi esta el problema, que no se como comparar una variable con 60000!!!) es decir, un minuto, activa un flag que será usado en la rutina principal para incrementar los minutos y las horas (esta es la parte no urgente, en el lazo principal). No sé si se abrá entendido algo, si es así, les pido que me ayuden con el tema de la comparación con un valor tan alto.
Bueno, otra cosa, si alguien me dice que por qué no aumento al máximo el prescaler, le diré que en ese caso tendría que comparar con 923, ya que el máximo valor del prescaler es de 65mseg.
Otro problema que también se me plantea es cómo mostrar esto por el LCD. El programa lleva una subrutina aparte en el lazo principal que se encarga de mostrar por pantalla lo que le llega en base a una máquina de estados. Ahora bien, si a esta le paso dos registros, uno con las horas (0-24) y otro con los minutos (0-60), como puedo mostrar estos valores por el lcd (las rutinas de mostrar las tengo), si los tengo en dos registros de 8 bits cada uno?
Muchísimas gracias de antemano, aceptaré cualquier sugerencia incluso si supone dar un cambio de 180º a la realización del reloj.
Gonzalo :blink:
-
Para la gestión del tiempo real te sugiero utilizar un circuito integrado como el DS1307 que te facilita mucho el trabajo. Este chip proporciona directamente los segundos, minutos, horas, dia de la semana, dia del mes, mes y año, además, necesita muy pocos componentes externos pero trabaja en bus I2C.
Tengo un CDROM de un libro con el programa del reloj digital completo con representación en LCD con DS1307 y un PIC16F84. Si te viene bien te lo paso.
Saludos.
Setha.
-
Hola, estoy de acuerdo, utiliza el DS1307, no es muy costoso es pequeño y con las rutinas es fácil de usar, además te ofrece la gran ventaja de que mantiene la información aún si pierdes la energía por cualquier motivo.
En pocas palabras, el consejo de setha...muy bueno :smartass:
lmarte
-
hola yo me encuentro realizando un reloj de tiempo real pero con otro lenguaje recien estoy empezando con assembler
me gustaria si me dicen como se programa el ds1307 porque por todas las paginas que anduve lo recomiendan para el reloj de tiempo real.
mi correo soft_mon@hotmail.com
-
yo una rutina para el reloj en tiempo real en ensamblador para el 80c51. se les sirve de algo... al igual que rutinas para conectar el lcd al mismo micro si les sirve un correo a ivan.galicia@gmail.com
-
HOlA a todos, veo que este foro tiene buenas cosas felicito a todos los que hacen esto posible, escribo aqui pues, apesar de que no puedo (aun) ayudar a gonza2004, tambien estoy trabajando en un proyecto en el que necesito accionar un piston en tiempo real, para lo cual pensaba trabajar con el DS1307, veo que es muy usado, mi problema es que no se muy bien como usar el bus I2C, para poder obtener los datos necesarios, si alguien me pocria ayudar se los agradeceria.
Tambien quiero pedir a Setha si me puedes pasar ese libro que mencionas pues estoy usando el micro xx84 , mi correo es carlos.uno@gmail.com
Gracias
-
El libro es "Microcontrolador PIC16F84. Desarrollo de proyectos" de la Editorial Ra-ma. Es muy bueno, con la única pega que trabaja solo en ensamblador.
Saludos.
-
y alguien sabe como conectar el pic16f877 con uun ds1302?
programacion assembler
-
Para la gestión del tiempo real te sugiero utilizar un circuito integrado como el DS1307 que te facilita mucho el trabajo. Este chip proporciona directamente los segundos, minutos, horas, dia de la semana, dia del mes, mes y año, además, necesita muy pocos componentes externos pero trabaja en bus I2C.
Tengo un CDROM de un libro con el programa del reloj digital completo con representación en LCD con DS1307 y un PIC16F84. Si te viene bien te lo paso.
Saludos.
Setha.
:huh: holaaaaaaaa les cuento que quisira poder implentar el reloj de tiempo real y mi pregunta es si pueden ayudarme, les estaria muy agradecido, es mi primera vez que estoy en un foro y lo encuentro genial, un lugar donde todos se pueden ayudar y ojala yo tb pueda acerlo. que esten bien rodrigo, rodrigover@gmail.com
De antemano muchas gracias.-
-
señores, en mi humildeopinion no puede ser mas facil conectar un 1307 a un pic siempre y cuando se haga con PBP (pic basic pro ) y la razon es que este programa ya tiene todas las librerias necesarias incluidas.
ejemplo:
rutina de programacion del 1307 a travez de un pic
memorizar:
datos = %00000000 ;segundos
addr = 0 ' Set address to 1
I2CWRITE PORTC.6,PORTC.7,cont,addr,[datos]
PAUSE 10 ' Wait 10ms for write to complete
;minutos
addr = 1 ' Set address to 2
I2CWRITE PORTC.6,PORTC.7,cont,addr,[minutos]
PAUSE 10 ' Wait 10ms for write to complete
;hora
addr =2 ' Set address to 2
I2CWRITE PORTC.6,PORTC.7,cont,addr,[hora]
PAUSE 10 ' Wait 10ms for write to complete
;hora
addr =3 ' Set address to 2
I2CWRITE PORTC.6,PORTC.7 ,cont,addr,[diasem]
PAUSE 10 ' Wait 10ms for write to complete
;dia
addr = 4 ' Set address to 1
I2CWRITE PORTC.6,PORTC.7,cont,addr,[dia]
PAUSE 10 ' Wait 10ms for write to complete
;mes
addr = 5 ' Set address to 2
I2CWRITE PORTC.6,PORTC.7,cont,addr,[mes]
PAUSE 10 ' Wait 10ms for write to complete
;year
addr = 6 ' Set address to 2
I2CWRITE PORTC.6,PORTC.7,cont,addr,[year]
PAUSE 10 ' Wait 10ms for write to complete
datos=%00000000 ;year
addr = 7 ' Set address to 2
I2CWRITE PORTC.6,PORTC.7 ,cont,addr,[datos]
PAUSE 10 ' Wait 10ms for write to complete
return
filtro:
base=0
complemento=0
base.0 = comun.4
base.1 = comun.5
base.2 = comun.6
complemento.0 = comun.0
complemento.1 = comun.1
complemento.2 = comun.2
complemento.3 = comun.3
comun = base*10+complemento
return
rutina de lectura de datos del 1307 a travez de un pic
leeclock:
addr = 0 ; segundos
I2CREAD PORTC.6,PORTC.7,cont,addr,[segundos]
comun=segundos
gosub filtro
segundos=comun
addr = 1 ; minutos
I2CREAD PORTC.6,PORTC.7,cont,addr,[minutos]
comun=minutos
gosub filtro
minutos=comun
addr = 2 ; horas
I2CREAD PORTC.6,PORTC.7,cont,addr,[hora]
comun=hora
gosub filtro
hora=comun
addr = 3 ; dia del asemana
I2CREAD PORTC.6,PORTC.7,cont,addr,[diasem]
addr = 4 ; dia
I2CREAD PORTC.6,PORTC.7,cont,addr,[dia]
comun=dia
gosub filtro
dia=comun
addr = 5 ;mes
I2CREAD PORTC.6,PORTC.7,cont,addr,[mes]
comun=mes
gosub filtro
mes=comun
addr = 6 ; año
I2CREAD PORTC.6,PORTC.7,cont,addr,[year]
return
Estas rutinas funcionan OK y son validas para la mayoria de los pic.
yo las empleo en el 16f84, el 16f873 y el 16f876.
Cordial saludo.
Daniel :hola:
-
Todo muy lindo Daniel...pero en donde metiste la direccion del dispositivo que en el caso del DS1307 es 0xD1 y 0XD0????.
¿Cómo sabes cuando es lectura o escritura sin estos códigos?.
Bye!.
Kilo
-
Hola a todos:
Mi nombre es Maximiliano Olivera estoy trabajando en un proyecto y estoy utilizando un Real Time Clock, el DS1337, mi problema es que no lo puedo hacer funcionar por interrupciones, es decir puedo leer los registros del integrado pero hacieno sucesivas lecturas. Lo que yo necesito es que el RTC interrumpa al PIC cada 1 minuto para que este lea los registros del reloj y actualize los registros en el PIC. Si alguien tiene alguan idea para ayudarme estare agradecido. Mi direccion de correo es mjolivera@yahoo.com
Saludos.
Maximiliano Olivera
-
y alguien sabe como conectar el pic16f877 con uun ds1302?
programacion assembler
Estmados amigos estoy teniendo problemas para conectar el reloj ds1307 con el PIC f877... si bien estudié el asm del pic f84 no pude.. supongo hay alguna diferencia. Si alguno de Ustedestiene algún dato de interés me será de utilidad como así algún asm de referencia.
Muchas Gracias
-
;DS1302 CONEXIONES SON RB1 A IO RB2 A RST RB3 A SCLK
list p=16F876
radix hex
INCLUDE <P16F876.INC>
__config H'3F79'
IO EQU 1; Son los pines del puerto donde están conectadas las terminales de comunicación
RST EQU 2; Estas pueden variar según el circuito y la disposición de pines
SCLK EQU 3;
ROTA EQU 23;
ALFA EQU 24;
UNDATO EQU 25; Localidad de memoria donde se almacenará temporalmente el dato recibido del DS1302
SEGUN EQU 26; Localidad que almacena los segundos, leídos del DS1302
MIN EQU 27; Localidad que almacena los minutos, leídos del DS1302
HOR EQU 28; Localidad que almacena las horas, leídos del DS1302
DELAY EQU 29;
ORG 0
BSF STATUS,RP0
MOVLW D'207'
MOVWF SPBRG
CLRF TXSTA
CLRF TRISB
BCF STATUS,RP0
MOVLW 0XA0
MOVWF RCSTA
CLRF PORTB
;Deshabilita el Write Protect
ESCRITURA
MOVLW 0X8E ;Comando que apunta al registro de control para una escritura
CALL COMRTC ;Llama a la rutina que envía el comando hacia el DS1302
MOVLW 0X00 ;Este dato deshabilita el Write Protect para permitir futuras escrituras
CALL ENVIARTC1;Llama a la rutina que envía el dato hacia el DS1302
;***************************************************
;ESCRIBE el numero 0x35 a al registro correspondiente de los segundos del DS1302
MOVLW 0X80 ; POSICIONA LA LOCALIDAD DE LOS SEGUNDOS PARA ESCRITURA
CALL COMRTC; Llama la rutina que envía el comando
MOVLW 0X35 ;ENVIA EL DATO 0X35 A LOS SEGUNDOS
CALL ENVIARTC1; Llama a la rutina que envía el dato hacia el DS1302
;****************************************************
;ESCRIBE el numero 0x22 a al registro correspondiente de los minutos del DS1302
MOVLW 0X82 ; POSICIONA LA LOCALIDAD DE LOS MINUTOS PARA ESCRITURA
CALL COMRTC; Llama la rutina que envía el comando
MOVLW 0X22 ;ENVIA EL DATO 0X22 A LOS MINUTOS
CALL ENVIARTC1; Llama a la rutina que envía el dato hacia el DS1302
;****************************************************
;ESCRIBE el numero 0x13 al registro correspondiente de las horas del DS1302
MOVLW 0X84 ; POSICIONA LA LOCALIDAD DE LAS HORAS PARA ESCRITURA
CALL COMRTC; Llama la rutina que envía el comando
MOVLW 0X13 ;ENVIA EL DATO 0X13 A LAS HORAS
CALL ENVIARTC1; Llama a la rutina que envía el dato hacia el DS1302
BCF PORTB,RST ;Deshabilita las comunicaciones
;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
LECTURA
;OPERACIONES DE LECTURA
;***************************************************
;Lee el registro correspondiente de los segundos del DS1302
MOVLW 0X81 ; POSICIONA LA LOCALIDAD DE LOS SEGUNDOS PARA LECTURA
CALL COMRTC; Llama la rutina que envía el comando
CALL RECIBRTC1; Llama a la rutina que recibe el dato enviado desde el DS1302
MOVF UNDATO,W; Mueve el dato recibido a W
MOVWF SEGUN ; Guarda el dato en la variable SEGUN
;***************************************************
;Lee el registro correspondiente de los minutos del DS1302
MOVLW 0X83 ; POSICIONA LA LOCALIDAD DE LOS MINUTOS PARA LECTURA
CALL COMRTC; Llama la rutina que envía el comando
CALL RECIBRTC1; Llama a la rutina que recibe el dato enviado desde el DS1302
MOVF UNDATO,W; Mueve el dato recibido a W
MOVWF MIN ; Guarda el dato en la variable MIN
;***************************************************
;Lee el registro correspondiente de las horas del DS1302
MOVLW 0X85 ; POSICIONA LA LOCALIDAD DE LAS HORAS PARA LECTURA
CALL COMRTC; Llama la rutina que envía el comando
CALL RECIBRTC1; Llama a la rutina que recibe el dato enviado desde el DS1302
MOVF UNDATO,W; Mueve el dato recibido a W
MOVWF HOR ; Guarda el dato en la variable HOR
BSF STATUS,RP0
BSF TXSTA,TXEN
BCF STATUS,RP0
MOVF SEGUN,W
MOVWF TXREG
CALL Retardo_1
GOTO LECTURA
;DE ESTA MANERA ES COMO SE ESCRIBEN Y SE LEEN LOS REGISTROS DEL DS1302. USTED PUEDE MANIPULAR
;LOS DATOS RECIBIDOS, QUE SE HAN GUARDADO EN LA RAM, PARA MOSTRARLOS EN UN DISPLAY
FIN GOTO FIN
COMRTC MOVWF ALFA
BSF STATUS,RP0
BCF TRISB,IO ;CONFIGURA EL PUERTO COMO SALIDA
BCF STATUS,RP0
BSF PORTB,RST ;HABILITA LA COMUNICACIÓN
MOVLW 0X08
MOVWF ROTA ;ESTE ES UN CONTADOR
COMRTC1 BSF PORTB,IO ;PONE A 0 O A 1 EL PIN IO DEL PUERTO
BTFSS ALFA,0 ;DEPENDIENDO EL VALOR DEL BIT 0 DEL DATO A ENVIAR
BCF PORTB,IO
BSF PORTB,SCLK; FLANCO DE SUBIDA DE SCLK
CALL RETARDO
BCF PORTB,SCLK; FLANCO DE BAJADA DE SCLK
DECFSZ ROTA,F ;
GOTO FALTAN
RETURN
FALTAN RRF ALFA,F ;ROTA EL DATO A ENVIAR
GOTO COMRTC1
;*************************************************
;RUTINA QUE ENVIA UN DATO AL DS1302 DESPUES DEL COMANDO
ENVIARTC1
MOVWF ALFA
MOVLW 0X08
MOVWF ROTA
BSF STATUS,RP0
BCF TRISB,IO
BCF STATUS,RP0
OTRO2 BSF PORTB,IO;PONE A 0 O A 1 EL PIN IO DEL PUERTO
BTFSS ALFA,0 ;DEPENDIENDO EL VALOR DEL BIT 0 DEL DATO A ENVIAR
BCF PORTB,IO;
BSF PORTB,SCLK; FLANCO DE SUBIDA DE SCLK
CALL RETARDO
BCF PORTB,SCLK; FLANCO DE BAJADA DE SCLK
DECFSZ ROTA,F
GOTO FALTAN12
BCF PORTB,RST
RETURN
FALTAN12 RRF ALFA,F
GOTO OTRO2
;*******************************************************
;RUTINA QUE RECIBE UN DATO DESDE EL DS1302
RECIBRTC1 BSF STATUS,RP0
BSF TRISB,IO
BCF STATUS,RP0
MOVLW 0X08
MOVWF ROTA
OTRO22 BSF UNDATO,7 ;Registro donde se guarda bit a bit el dato proveniente del DS1302
BTFSS PORTB,IO
BCF UNDATO,7
BSF PORTB,SCLK
CALL RETARDO
BCF PORTB,SCLK; SEÑAL DE RELOJ
DECFSZ ROTA,F
GOTO FALTAN22
BCF PORTB,RST
RETURN
FALTAN22 BCF STATUS,C
RRF UNDATO,F
GOTO OTRO22
;.......................................................
RETARDO
CLRF DELAY
BUCLE INCF DELAY
BTFSS DELAY,5
GOTO BUCLE
RETURN
INCLUDE <RETARDOS.INC>
END
-
EL PASADO PROGRAMA QUE PUSE ES PARA MANDAR LOS SEGUNDOS POR SERIAL A 300BSP PERO EN EL CICLO DE LECTURA PUEDES USAR LAS VARIABLES DE HOR MIN Y SEGUN PARA ALTERARLO COMO TU QUIERAS.
A TAMBIEN RETARDO.INC ES EL SIGUIENTE
;........................................................................
R_ContA equ 20
R_ContB equ 21
R_ContC equ 22
Retardo_1
clrf R_ContA
bug incf R_ContA
clrf R_ContB
bug2 incf R_ContB
clrf R_ContC
bug3 incf R_ContC
btfss R_ContC,7
goto bug3
btfss R_ContB,7
goto bug2
btfss R_ContA,4
goto bug
return
;COPIALO EN NOTE PAD GUARDALO COMO RETARDOS.INC Y PEGALO EN MPAST SUITE