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

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

Desconectado nahum182

  • PIC10
  • *
  • Mensajes: 4
Contador de pulsos
« en: 29 de Marzo de 2011, 20:40:38 »
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 codificarlo para 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
« Última modificación: 30 de Marzo de 2011, 13:32:43 por nahum182 »

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Contador de pulsos
« Respuesta #1 en: 29 de Marzo de 2011, 21:10:36 »
Hola.

Asi como lo pides, no lo hay ... pero hay unos los cuales despliegan el valor de los pulsos en display's y LCD's ... solo habría que modificar con un if(pulsos=10) y asignar la salida al pin del PIC ....  :?

Saludos
El papel lo aguanta todo

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Contador de pulsos
« Respuesta #2 en: 29 de Marzo de 2011, 22:04:43 »
Nahum182:
              Intentaste hacerlo por tu cuenta al código? Hasta donde llegaste en su caso?
              Se un poco más específico en cuanto al pic que utilizas, cristal, etc. Etc . Y que versión de lenguaje c utilizas. C18, ccs, mikroc. Etc, etc.
                Si te das por vencido no aprenderás.
                En donde te trabes avisá y aquí estaré para ayudarte.
                                    Saludos.
                                            Jukinch
« Última modificación: 29 de Marzo de 2011, 22:14:00 por jukinch »
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado nahum182

  • PIC10
  • *
  • Mensajes: 4
Re: Contador de pulsos
« Respuesta #3 en: 30 de Marzo de 2011, 13:36:38 »
Este es el programa que quiero modificar este solo cuenta 10 y prende el led, cuenta otros 10 y lo apaga.

quiero codificarlo para 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 jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Contador de pulsos
« Respuesta #4 en: 30 de Marzo de 2011, 14:58:42 »
Nahum182: eso es assembler y estás dentro del foro de lenguaje c. Si de c se trata te puedo ayudar. Pero en assembler ni un poquito . :(
           Si quieres lo hacemos en c.
                  Saludos
                         Jukinch
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado nahum182

  • PIC10
  • *
  • Mensajes: 4
Re: Contador de pulsos
« Respuesta #5 en: 30 de Marzo de 2011, 20:19:22 »
 :( amigo lo que pasa es que de c  ahora yo soy el que no sabe, nada.  :oops:

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Contador de pulsos
« Respuesta #6 en: 30 de Marzo de 2011, 20:27:02 »
Estimado nahum182:
        postea tu código en el almacén del Assembler http://www.todopic.com.ar/foros/index.php?board=3.0 y seguro te van a dar una mano.
            Si algún día necesitas una mano en C pasá por aquí que estaré para ayudarte.
             Comete un chile habanero en nombre mio!!!! son mis favoritos.
               Saludos.
                   Jukinch
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes