Autor Tema: Contador de pulsos  (Leído 7587 veces)

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

Desconectado nahum182

  • PIC10
  • *
  • Mensajes: 4
Contador de pulsos
« en: 30 de Marzo de 2011, 20:52:08 »
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

Desconectado mtristan

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 395
Re: Contador de pulsos
« Respuesta #1 en: 30 de Marzo de 2011, 21:19:20 »
.


Este código te va a servir para contar pulsos, siempre y cuando la señal de entrada esté libre de ruidos. Por ejemplo, si la entrada es un pulsador como en el diagrama, lo más probable es que cuente cualquier cosa :?  Para que cuente otra cantidad, tendrías que cambiar los valores que se cargan en el timer 0 en las líneas:

Código: ASM
  1. ; ...
  2.    movlw   0xFB      ; Cargamos 251 en TMR0 para contar 10 pulsos en RA4/TOCKI.-
  3. ; ...
  4.    movlw   d'251'      ; d'251'
  5. ; ...

Si querés que cuente X pulsos, cargalo con 256-X/2, en ambos casos, ya que cada dos pulsos aumenta en 1 la cuenta del timer y este produce la interrupción al pasar de 255 a 0 (es decir, se desborda). Si querés que aumente 1 la cuenta con cada pulso, tendrás que configurar el prescaler en 1:1 (viene explicado cómo hacerlo en el datasheet), modificando el valor que se ingresa en el OPTION_REG, en las líneas:

Código: ASM
  1. movlw   b'00100000'      ; Se selecciona TMR0 modo Contador, transicion positiva  
  2.    movwf   OPTION_REG      ; y preescaler de 1/2.-

Saludos.


When you see a good move, look for a better one (Emanuel Lasker)

Desconectado verag123

  • PIC10
  • *
  • Mensajes: 4
Re: Contador de pulsos
« Respuesta #2 en: 25 de Febrero de 2014, 19:25:33 »
buenas yo necesito algo muy parecido, 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. PERO LO NECESITO EN LENGUAJE CCS PIC C. he  intentado con el timer1 pero no lo he logrado, si alguien tiene el codigo o pueda ayudarme se lo agradeceria mucho.

GRACIAS

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Contador de pulsos
« Respuesta #3 en: 26 de Febrero de 2014, 11:25:48 »
buenas yo necesito algo muy parecido, 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. PERO LO NECESITO EN LENGUAJE CCS PIC C. he  intentado con el timer1 pero no lo he logrado, si alguien tiene el codigo o pueda ayudarme se lo agradeceria mucho.

GRACIAS

este post ya es algo viejo, y es para assembler, podrias abrir un nuevo hilo y poner tus avances para poderte ayudar.
"Nada es imposible, no si puedes imaginarlo"