Hola
El código de abajo son un par de procedimientos que los llamo para inicializar el timer de 16 bits ( Inicializa_Timer1 ) y para verificar el estado del timer cuando salta una interrupción ( Verifica_Timer1 )
El timer hace saltar la int cada 1/2 seg y el procedimiento Verifica_Timer1 invierte el bit 7 de contador, al completarse 1 segundo se pone en bajo y en ese momento incrementa contador. Cuando contador es igual a seg_a_contar, contador se pone en 0x00.
Tengo un grupo de procedimientos, y antes que contador se ponga en 0x00, quiero que llame a uno de los procedimientos de ese grupo, pero no se a cuál hasta el momento de la llamada a Verifica_Timer1 ¿como puedo hacer?
;---- Inicializa el Timer1 ----------------------
; pasar en W la cantidad de segundos a contar
Inicializa_Timer1
Banco_0
movwf seg_a_contar ; almacena la cantidad de segundos a contar
Banco_1 ; El par TMR1H:TTMR1L y TMR1IF deben limpiarse antes de habilitar las interrupciones
bsf PIE1, TMR1IE ; habilita la interrupción por desbordamiento del Timer1
bsf INTCON, PEIE ; habilita la interrupción de perifericos
bsf INTCON, GIE ; habilita las interrupciones generales
Banco_0
bcf T1CON, TMR1CS ; reloj interno como origen del timer
movlw 0xDD ;
movwf TMR1L ; valores para
movlw 0x0B ; 500.007 mSeg
movwf TMR1H ;
bsf T1CON, T1CKPS1 ; prescaler
bsf T1CON, T1CKPS0 ; 1:1
bsf T1CON, TMR1ON ; arranca el timer
clrf contador
return
;--- Verifica el estado del Timer1 --------------
Verifica_Timer1
btfss PIR1, TMR1IF
return
movlw 0xDD ;
movwf TMR1L ; valores para
movlw 0x0B ; 500,007 mSeg
movwf TMR1H ;
bcf PIR1, TMR1IF ; borra la bandera de la int del timer
movlw 0x80 ; 10000000
xorwf contador, F ; invierte el bit indicador de 1/2 segundo
btfss contador, 7 ; ¿se completó el segundo?
goto Verifica_Timer1_IncCont ; SI, entonces incrementa el contador
return ; NO, entonces sale
Verifica_Timer1_IncCont
incf contador ; incrementa el contador
movf seg_a_contar, W ; almacena en W los segundos a contar
subwf contador, W ; compara W con contador
btfsc STATUS, Z ; ¿son iguales?
goto Verifica_Timer1_Alarma ; llegó a los segundos indicados en seg_a_contar
return
Verifica_Timer1_Alarma
;----------------------------------------------
; aca colocar el código a ejectar ;
; cuando se cumpla el tiempo establecido ;
;----------------------------------------------
clrf contador
return
Muchas gracias.
Saludos.
Darío.-