Hola amigos!
He estado buscando pero la verdad no encuentro lo que quiero, lo que necesito es un contador de pulsos, que después de cierto numero de pulsos en una entrada del pic, esta envíen una señal de salida para encender un led ó un pulso de salida.
Por ejemplo, conecto un sensor a una entrada del pic y después de que envié 10 pulsos, que me envié una señal a una de las salidas del pic.
De antemano Gracias.
Este es el programa que quiero modificar este solo cuenta 10 y prende el led, cuenta otros 10 y lo apaga.
quiero modificarlo para que cuente los pulsos que yo quiera.
; **** Encabezado ****
list p=16F84A
#include P16F84A.inc
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
;**** Definicion de variables ****
Contador equ 0x0C ; Contador para detectar 4 desbordes de TMR0.-
W_Temp equ 0x0D ; Registro para guardar temporalmente W.-
STATUS_Temp equ 0x0E ; Registro para guardar temporalmete STATUS
Led equ 0 ; Definimos Led como el bit cero de un registro, en este caso PORTB.-
;**** Inicio del Micro ****
Reset
org 0x00 ; Aquí comienza el micro.-
goto Inicio ; Salto a inicio de mi programa.-
;**** Vector de Interrupcion ****
org 0x04 ; Atiendo Interrupcion.-
goto Inicio_ISR
; **** Programa Principal ****
;**** Configuracion de puertos ***
org 0x05 ; Origen del código de programa.-
Inicio
bsf STATUS,RP0 ; Pasamos de Banco 0 a Banco 1.-
movlw b'11111110' ; RB0 como salida.-
movwf TRISB
movlw b'00100000' ; Se selecciona TMR0 modo Contador, transicion positiva
movwf OPTION_REG ; y preescaler de 1/2.-
bcf STATUS,RP0 ; Paso del Banco 1 al Banco 0
bcf PORTB,Led ; El Led comienza apagado.-
movlw 0xFB ; Cargamos 251 en TMR0 para contar 10 pulsos en RA4/TOCKI.-
movwf TMR0
movlw b'10100000' ; Habilitamos GIE y T0IE (interrupción del TMR0)
movwf INTCON
;**** Bucle ****
Bucle
nop ; Aqui el micro puede ejecutar cualquier otra tarea
goto Bucle ; sin necesidad de utilizar tiempo en un bucle de demora.-
;**** Rutina de servicio de Interrupcion ****
;---> Aqui haremos copia de respaldo para mostrar como se hace aunque no es
; necesario ya que el micro no hace otra tarea mientras tanto <---
; Guardado de registro W y STATUS.-
Inicio_ISR
movwf W_Temp ; Copiamos W a un registro Temporario.-
swapf STATUS, W ;Invertimos los nibles del registro STATUS.-
movwf STATUS_Temp ; Guardamos STATUS en un registro temporal.-
;**** Interrupcion por TMR0 ****
ISR
btfss INTCON,T0IF ; Consultamos si es por TMR0.-
goto Fin_ISR ; No, entonces restauramos valores.-
btfss PORTB,Led ; Si, Controlamos Led.Si esta apagado, prendo y viseversa.-
goto Prendo_led
bcf PORTB,Led ; Apago Led.-
Actualizo_TMR0 ; Cargamos 251 en TMR0 para contar 10 pulsos en RA4/TOCKI.-
movlw d'251' ; d'251'
movwf TMR0
bcf INTCON,T0IF ; Borro bandera de control de Interrupcion.-
goto Fin_ISR ; Restauro valores.-
Prendo_led
bsf PORTB,Led ; prendo Led.-
goto Actualizo_TMR0
; Restauramos los valores de W y STATUS.-
Fin_ISR
swapf STATUS_Temp,W ; Invertimos lo nibles de STATUS_Temp.-
movwf STATUS
swapf W_Temp, f ; Invertimos los nibles y lo guardamos en el mismo registro.-
swapf W_Temp,W ; Invertimos los nibles nuevamente y lo guardamos en W.-
retfie ; Salimos de interrupción.-
;..........................................
end