Autor Tema: hacer un reloj  (Leído 2057 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado alexlarrain

  • PIC10
  • *
  • Mensajes: 44
hacer un reloj
« en: 14 de Diciembre de 2007, 14:22:01 »
buscando en el foro no he encontrado como hacer un reloj
necesito contar 2 horas , para que realice una función.

si alguien sabe me puede ayudar...

gracias...

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: hacer un reloj
« Respuesta #1 en: 14 de Diciembre de 2007, 14:56:47 »
Hola, una cosa sencilla es usar un timer como base de tiempo, ejemplo, programas un timer para que interrumpa sistematicamente cada 10 ms ( puede ser otro valor ), dentro del handler de interrupcion colocas un contador que se incremente y levantas un flag cuando ese contador llege a 720.000 ( 10 ms x 120 minutos x 60 segundos = 720.000 iteracciones ). Dentro del loop principal del programa unicamente preguntas cuando ese flag este levantado. Es una forma rapida y sencilla.
Salu2!

Desconectado c4_esp_VR

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
    • www.muchotrasto.com
Re: hacer un reloj
« Respuesta #2 en: 14 de Diciembre de 2007, 15:17:21 »
Existen en el mercado temporizadores para realizar la función que tu dices sin necesidad de usar un microcontrolador, el problema es que ahora mismo no me acuerdo pero en el foro se ha hablado alguna vez de estos componentes si mal no recuerdo.

Un saludete.

Desconectado Enrique_86

  • PIC12
  • **
  • Mensajes: 62
Re: hacer un reloj
« Respuesta #3 en: 28 de Febrero de 2008, 16:53:34 »
Hola!
Otra forma de hacerlo es implementando un reloj con el PIc, para ello te ayudas de un timer de 16 bits (timer1 en caso de los 16FXXXX o un timer0 en caso de 18FXXXX), yo lo he hecho en asm con 16f628 y con el 16F877 ahora lo he implementado en C para un 18F4550, ojala te sirva de algo, aqui te dejo el codigo  :-) :



#include<p18f4550.h>
#include<delays.h>
#include<stdlib.h>
#include "D:\Enrique\curso_pic\codigoC\lcd.h"

#pragma config PLLDIV=5//CONFIG1L
#pragma config FCMEN = OFF,IESO = OFF,FOSC=HS //CONFIG1H
#pragma config PWRT = OFF,BORV = 0 //CONFIG2L
#pragma config WDT = OFF,WDTPS = 32768 //CONFIG2H
#pragma config MCLRE = ON,LPT1OSC = OFF,PBADEN = OFF, CCP2MX = OFF//CONFIG3H
#pragma config STVREN = OFF,LVP = OFF,XINST = OFF,DEBUG = OFF//CONFIG4L
#pragma config CP0 = OFF,CP1 = OFF,CP2 = OFF//CONFIG5L
#pragma config CPB = OFF,CPD = OFF//CONFIG5H
#pragma config WRT0 = OFF,WRT1 = OFF,WRT2 = OFF//CONFIG6L
#pragma config WRTB = OFF,WRTC = OFF,WRTD = OFF//CONFIG6H
#pragma config EBTR0 = OFF,EBTR1 = OFF,EBTR2 = OFF//CONFIG7L
#pragma config EBTRB = OFF//CONFIG7H

void interrupciones(void);//prototipo de la interrupción
static int seg=0,min=0,hor=0;
static char s,m,h;

//******************************************************//
// Vector de Interrupcion
//******************************************************//

#pragma code prioridad_nomal = 0X0008
void interrupcion_normal (void)
{
   _asm goto interrupciones _endasm
}
#pragma code   

//******************************************************//
// Rutina de Interrupcion
//******************************************************//
#pragma interrupt interrupciones
void interrupciones(void)
{
   if(INTCONbits.INT0IF=1)       //pregunta por bandera de interrupcion
   {
      TMR0H = 0X67,TMR0L = 0X69;
      PORTB=~PORTB;
      seg++;
      if(seg==60)
      {
         seg=0;   
         min++;
         if(min==60)
         {
            min=0;
            hor++;
            if(hor==10)
            {
               hor=0;
               min=0;
               seg=0;
            }
         }
      }
   }
   while(BusyXLCD());              // Wait if LCD busy
   WriteCmdXLCD(CLEAR);             // Clear display
   itoa(hor,h);
   while(BusyXLCD());
   putsXLCD(h);
   while(BusyXLCD());
   WriteDataXLCD(':');
   itoa(min,m);
   while(BusyXLCD());
   putsXLCD(m);
   while(BusyXLCD());
   WriteDataXLCD(':');
   while(BusyXLCD());
   itoa(seg,s);
   putsXLCD(s);
   INTCONbits.TMR0IF = 0;
}

//******************************************************//
// Programa Principal
//******************************************************//

void main(void)
{
   RCON = 0X00;//IPEN = 0
   T0CON = 0X86;//TMR0ON=1 config del timer 0
             //T08BIT=0 T0 a 16 bits
             //T0CS=0 clock interno
             //T0SE=0 low-to-high transition
             //PSA=0 prescaler ON
             //T0PS2=1 Prescaler = 1:128 (110)
             //T0PS1=1
             //T0PS0=0
   TMR0H = 0X67,TMR0L = 0X69;//inicializamos registros del timer0
   RCONbits.IPEN=0;//IPEN = 0 prioridad de interrupciones deshabilitada
   INTCON = 0XA0;//configuramos la interrupcion del timer0

   OpenXLCD(FOUR_BIT & LINES_5X7);
   while(BusyXLCD());             
   WriteCmdXLCD(BLINK_OFF);
   while(BusyXLCD());             
   WriteCmdXLCD(CLEAR);             
   itoa(hor,h);
   while(BusyXLCD());
   putsXLCD(h);
   while(BusyXLCD());
   WriteDataXLCD(':');
   itoa(min,m);
   while(BusyXLCD());
   putsXLCD(m);
   while(BusyXLCD());
   WriteDataXLCD(':');
   while(BusyXLCD());
   itoa(seg,s);
   putsXLCD(s);
   while(1);
}



En el codigo anterior utilice un cristal de 20MHz y la libreria lcd.h la puedes encontrar en el foro  :-) jeje
Pero te adelanto que las conexiones son al puerto D: E=RD0,RS=RD1, R/W=RD2, D4=RD4....D7=RD7 si lo piensas simular en proteus.. espero que te sirva de ayuda :mrgreen:
 

...enrique  :-)

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: hacer un reloj
« Respuesta #4 en: 01 de Marzo de 2008, 13:12:37 »
En el primer post, encontrarás varias nociones para lo que buscas.


Suerte!!! ;)
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte