Sisco, ¿pero no ibas a calcular los tiempos usando el desbordamiento del TMR0? eso te entendí ayer, pero por lo que veo en este código estás usando el otro registro, el PIR1, para comtrolar la interrupción por desborbamiento del TMR1, ¿no?
Si usas el TMR0, tendrías que hacer una rutina de interrupción, por ejemplo:
Configuras OPTION, por ejemplo 0000 0110 en binario, donde
OPTION.7 = 0 Resistencias de polarización deshabilitadas
OPTION.6 = 0 Interrupción externa por flanco bajada deshabilitada
OPTION.5 = 0 Fuente de reloj interna
OPTION.4 = 0 Flanco de señal externa
OPTION.3 = 0 Divisor asignado al TMR0
OPTION.2 = 1 OPTION.1= 1 OPTION.0= 0 División por 128
Vale, entonces ten en cuenta que el tiempo que tarda en desbordarse el TIMER0 será:
Tiempo = S * valor predivisor * ciclo instrucción
Si el cristal es de 4MH, verdad?, en ese caso el ciclo de instrucción dura 1 microsegundo.
S es el número con que cargas inicialmente el registro TMR0, el "Start". Normalmente se carga con el valor 78, porque así
tienes S= 256-78=178.
Entonces
TIEMPO = 178 * 128 * 1 microsegundo = casi casi 10 milisegundos
Entonces, se produce una interrupción CADA 10 MILISEGUNDOS, y no tienes más que poner un contador que incremente cada vez que se produce la interrupción, y contar... si el contador llega a 100, es que ha pasado 1 segundo justito.
Entonces, primero configuras el PIC
***************************
..... bla bla bla... los puertos... etc
CLRF cuenta ; variable "cuenta" = 0 inicialmente
MOVLW 0xB2 ; Carga el timer con 78 decimal (0xB2)
MOVWF tmr0
MOVLW 0xA0 ; 1010 0000 en binario, máscara de interrup.
MOVWF intcon; Habilita GIE y T0IE (global e interrupción del timer0)
Segundo la rutina que lleva las cuentas
****************** Mira si hay 100 cuentas de 10 ms
contador
MOVF cuenta,w ; Se incrementa cada 10 ms al producirse la interr.
XORLW 0x64 ; Ha llegado a 1s si llevamos 100 (0x64) cuentas
BTFSS estado,Z ; Si es así, salta para hacer algo.....
GOTO contador ; Si no es así, sigue contando
CLRF cuenta ; Iniciar el nuevo ciclo
.... hacer algo..... ha llegado al segundo...
GOTO Bucle
Y ya, lo último, la rutina de interrupción
*******************************
INTER
BTFSS intcon,t0if ; Salta si la interrupción es por el TMR0
RETFIE ; Interrupción "rara rara rara", regresar
INCF cuenta,f ; El contador es incrementado cada 10 ms, sip
MOVLW 0xB2 ; Recarga el valor inicial del TMR0, recuerda 78
MOVWF tmr0
BCF intcon,t0if ; Borra el flag de interrupción
BSF INTCON,t0ie ; Habilita la interrupción otra vez
RETFIE
¿Lo ves?... espero que haya sido clara... Dime, anda, que si no le puedo dar una vuelta a TMR1, si quieres utilizar ese periférico, valeeeeeeeeeeeeeeeee?
besotes!