• Sábado 21 de Diciembre de 2024, 11:11

Autor Tema:  Ayuda Reloj 16f877  (Leído 16304 veces)

gonza2004

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Ayuda Reloj 16f877
« en: Jueves 8 de Abril de 2004, 20:25 »
0
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:

Setha

  • Nuevo Miembro
  • *
  • Mensajes: 15
    • Ver Perfil
Re: Ayuda Reloj 16f877
« Respuesta #1 en: Viernes 9 de Abril de 2004, 21:18 »
0
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.

lmarte

  • Miembro activo
  • **
  • Mensajes: 73
    • Ver Perfil
Re: Ayuda Reloj 16f877
« Respuesta #2 en: Sábado 10 de Abril de 2004, 17:36 »
0
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
Si no se intenta, ... no se hace

rAm0n23

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Ayuda Reloj 16f877
« Respuesta #3 en: Jueves 30 de Diciembre de 2004, 00:28 »
0
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

reptil

  • Nuevo Miembro
  • *
  • Mensajes: 16
    • Ver Perfil
Re: Ayuda Reloj 16f877
« Respuesta #4 en: Domingo 2 de Enero de 2005, 22:01 »
0
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

atila_uni

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Re: Ayuda Reloj 16f877
« Respuesta #5 en: Domingo 8 de Mayo de 2005, 08:11 »
0
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

Setha

  • Nuevo Miembro
  • *
  • Mensajes: 15
    • Ver Perfil
Re: Ayuda Reloj 16f877
« Respuesta #6 en: Martes 10 de Mayo de 2005, 16:04 »
0
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.

piolex

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Re: Ayuda Reloj 16f877
« Respuesta #7 en: Jueves 23 de Junio de 2005, 23:10 »
0
y alguien sabe como conectar el pic16f877 con uun ds1302?
programacion assembler

rodrigover

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Re: Ayuda Reloj 16f877
« Respuesta #8 en: Martes 9 de Agosto de 2005, 15:43 »
0
Cita de: "Setha"
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.-

DANIEL RODRIGUEZ

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Re: Ayuda Reloj 16f877
« Respuesta #9 en: Sábado 20 de Agosto de 2005, 01:24 »
0
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:

kilopondio

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Ayuda Reloj 16f877
« Respuesta #10 en: Jueves 4 de Mayo de 2006, 19:29 »
0
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

maxi

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Re: Ayuda Reloj 16f877
« Respuesta #11 en: Miércoles 12 de Julio de 2006, 21:59 »
0
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

pichone

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Re: Ayuda Reloj 16f877
« Respuesta #12 en: Martes 25 de Julio de 2006, 17:06 »
0
Cita de: "piolex"
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

kenshinkof

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re:DS1302
« Respuesta #13 en: Domingo 10 de Agosto de 2008, 20:28 »
0
;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

kenshinkof

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re:DS1302
« Respuesta #14 en: Domingo 10 de Agosto de 2008, 20:32 »
0
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