Autor Tema: "Puntero a procedimiento" con 16Fxxx  (Leído 1343 veces)

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

Desconectado LucasBols

  • PIC16
  • ***
  • Mensajes: 129
    • Desarrollos y Servicios Digitales
"Puntero a procedimiento" con 16Fxxx
« en: 11 de Abril de 2009, 10:11:31 »
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?

Código: [Seleccionar]
;---- 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.-
Un experto es alguien que te explica algo sencillo de forma confusa de tal manera que te hace pensar que la confusión sea culpa tuya.

DSD http://www.dysd.com.ar/