Pana Khasistos aqui t dejo un ejemplo con TMR1 de lata precision, jajajajaajjaa, me voy a volver relojero
. Espero y quede mas que claro, solo una cosa, este trabaja con compensacion de tiempo a traves de una formula de correccion de tiempo que tiene integrado, la excatitud es increible, y aun se puede mejorar.
Espero y te sea de ayuda
Un abrazo pana.
------------------------------------------------------------------------------------
DEVICE 16F628
CONFIG INTRC_OSC_NOCLKOUT,WDT_OFF,PWRTE_ON,CP_OFF,BODEN_OFF,LVP_OFF,MCLRE_OFF
ALL_DIGITAL ON
DECLARE LCD_DTPIN PORTA.0
DECLARE LCD_ENPIN PORTB.3
DECLARE LCD_RSPIN PORTA.4
DECLARE SDA_PIN PORTB.5
DECLARE SCL_PIN PORTB.1
DIM _100THS
DIM SECS
DIM MINS
DIM HOURS
DIM DAYS
DIM TEMP_100THS
DIM TEMP_SECS
DIM TEMP_MINS
DIM TEMP_HOURS
DIM TEMP_DAYS
SYMBOL GIE = INTCON.7
DIM TIEMPO AS TMR1L.WORD
SYMBOL MARGEN = 7 " VARIABLE PARA MEJORAR EXACTITUD
SYMBOL TMR1_VAL =((65536)-(XTAL*2500))+MARGEN " CALCULA LOS VALORES COMPENSANDO EL OSCILADOR PARA UNA INTERRUPCIÓN A 100HZ
ON_INTERRUPT INTERRUMPIR " Interrupciones RAPIDAS!!!
GOTO INICIO " JUMP THE INTERRUPT CODE
INTERRUMPIR:
CLEAR T1CON.0 " DETIENE TMR1
TIEMPO = TIEMPO + TMR1_VAL " COMPENSA EL TMR1
SET T1CON.0 " LO ARRANCA DE NUEVO
INC _100THS " INCREMENTA LA VARIABLE CENTESIMAS
IF _100THS = 100 THEN " CHEKA SI YA LLEGO A 100
CLEAR _100THS
INC SECS " INCREMENTA SEGUNDOS
IF SECS = 60 THEN
CLEAR SECS
INC MINS " INCREMENTA MINUTOS
IF MINS = 60 THEN
CLEAR MINS
INC HOURS
IF HOURS = 24 THEN " INCREMENTA HORAS
CLEAR DAYS
INC DAYS "INCREMNTA DIAS!!!!
ENDIF
ENDIF
ENDIF
ENDIF
CLEAR PIR1.0 " LIMPIAMOS INT
CONTEXT RESTORE " A RESTAURAR!!! Y SALIR DE LA INT VELOZMENTE
INICIO:
CLEAR " LIMPIAMOS VARIABLES
T1CON = %00000000 " PREESCALER A 1:1
PIR1.0 = 0 " LIMPIAMOS BANDERA DE INT
INTCON = %11000000 " INTERUPCIONES GLOBALES Y PERIFERICAS
PIE1.0 = 1
T1CON.0 = 1 " ENCENDEMOS TMR1
CLS
WHILE 1 = 1 " BUCLE SIN FIN!!!
GIE = 0 " DESHABILITAMOS INT
WHILE GIE = 1 : GIE = 0 : WEND " RUTINA DE SEGURIDAD!!
TEMP_100THS = _100THS " SALVAMOS VARIABLES
TEMP_SECS = SECS
TEMP_MINS = MINS
TEMP_HOURS = HOURS
TEMP_DAYS = DAYS
GIE = 1 " HABILITAMOS INT
PRINT AT 1,1,DEC2 TEMP_DAYS,":",DEC2 TEMP_HOURS,":",DEC2 TEMP_MINS,":",DEC2 TEMP_SECS,":",DEC2 TEMP_100THS
DELAYMS 100
WEND
STOP