Autor Tema: contador que genera un pulso para un contador bcd de 0 a a99 soy novato por favor una manito  (Leído 3735 veces)

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

Desconectado rooney2

  • PIC10
  • *
  • Mensajes: 10
contador que genera un pulso para un contador bcd de 0 a a99 soy novato por favor una manito[/b]

<

Desconectado Meybel

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 60
¿Donde quieres visualizarlo, en barra de LED, LCD, display, ...?, ¿de dónde vienen los pulsos de entrada?

Desconectado rooney2

  • PIC10
  • *
  • Mensajes: 10
 mira la entrada sera un sensor infrarrojo q cuando algo atraviese el sensor enviara un pulso al pic q iniciara la cuenta cada vez q se atrviese el infrarrojo y la cuenta se ira incrementando en uno para que la asalida del pic entre a dos 7447 que estaran conectados a 2 display de 7 segmentos . oye gracias no pense tan pronta respuesta y estoy tratando de hacerlo solo pero no es malo una ayudita

Desconectado antoniof

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 729
Codigo:
;HEX2BDC: Transforma el código en Hexadecimal que viene en el w,
Buenas.

Se supone ue vas ha hacer un contador de objetos con barrera infraroja.

Con el pulso de entrada desbes incrementar un contador de uno en uno y, como este contador está en hexadecimal, transformar este número a dos números en BCD.

Aqui te paso una subrrutina que transforma el un código hexadecimal en otro BCD y de paso tambien te "regalo" la inversa de BCD a HEX:

Codigo:
;HEX2BDC: Transforma el código en Hexadecimal que viene en el w,
;en dos bcd, el mas alto en los 4 MSBs y el mas bajo en los 4 LSBs del registro w

hex2bcd   movwf   contador1
   clrf   contador2
   comf   contador1,f
h2bcd1   movf   contador1,w
   addlw   0x0a
   btfsc   status,0
   goto   h2bcd2
   movwf   contador1
   incf   contador2,f
   goto   h2bcd1
h2bcd2   comf   contador1,f
   movf   contador2,w   ;Si contador2 no es cero
   btfsc   status,2
   goto   h2bcd4
h2bcd3   movf   contador1,w
   addlw   0x10      ;Se le suma a contador1 tantos 0x10 como indique
   movwf   contador1
   decfsz   contador2,f
   goto   h2bcd3
h2bcd4   movf   contador1,w
   return      

;BCD2HEX: Transforma el código en BCD que viene en w a hexadecimal
;y lo devuelve en el registro w

bcd2hex   movwf   contador1
   swapf   contador1,w
   andlw   0x0f
   movwf   contador2
   btfsc   status,2
   goto   bcd2h0
   movf   contador1,w
   andlw   0x0f
   movwf   contador1
bcd2h1   movf   contador1,w
   addlw   0x0a
   movwf   contador1
   decfsz   contador2,f
   goto   bcd2h1
bcd2h0   movf   contador1,w   
   return      


Bueno como puedes comprobar, debes definir dos registros que se llamen "contador1 y contador2"

Desconectado Meybel

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 60
Creo que este ejemplo te puede servir:


Codigo:
; Cada vez que presione el pulsador conectado al pin RA4 incrementa un contador
; visualizado en BCD en la barra de diodos LED. Cuando llegue a 99 (b"1001 1001")
; resetea y comienza de nuevo la cuenta.
;
; ZONA DE DATOS **********************************************************************

   LIST      P=16F84A
   INCLUDE  <P16F84A.INC>
   __CONFIG   _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

   CBLOCK  0x0C
   Contador         ; El contador a visualizar.
   ENDC

MAXIMO   EQU   .100      ; Máximo valor de la cuenta.
#DEFINE Pulsador   PORTA,4      ; Pulsador conectado a RA4.
#DEFINE Display      PORTB   ; El display está conectado al Puerto B.

; ZONA DE CÓDIGOS *************************************************************

   ORG   0      ; El programa comienza en la dirección 0.
Inicio
     bsf   STATUS,RP0   ; Acceso al Banco 1.
   clrf   Display      ; Estas líneas configuradas como salidas.
   bsf   Pulsador      ; Línea del pulsador configurada como entrada.
   bcf   STATUS,RP0   ; Acceso al Banco 0.
   call   InicializaContador   ; Inicializa el Contador y lo visualiza.
Principal
   btfsc   Pulsador      ; ¿Pulsador presionado?, ¿(Pulsador)=0?
   goto   Fin      ; No. Vuelve a leerlo.
   call   Retardo_20ms   ; Espera que se estabilicen los niveles de tensión.
   btfsc   Pulsador      ; Comprueba si es un rebote.
   goto   Fin      ; Era un rebote y sale fuera.
   call   IncrementaVisualiza   ; Incrementa el contador y lo visualiza.
EsperaDejePulsar
   btfss   Pulsador      ; ¿Dejó de pulsar?. ¿(Pulsador)=1?
   goto   EsperaDejePulsar   ; No. Espera que deje de pulsar.
Fin   goto   Principal

; Subrutina "IncrementaVisualiza" ---------------------------------------------------------

IncrementaVisualiza
   incf   Contador,F   ; Incrementa el contador y comprueba si ha
   movlw    MAXIMO      ; llegado a su valor máximo mediante una
   subwf   Contador,W   ; resta. (W)=(Contador)-MAXIMO.
   btfsc   STATUS,C      ; ¿C=0?, ¿(W) negativo?, ¿(Contador)<MAXIMO?
InicializaContador
   clrf   Contador      ; No, era igual o mayor. Por tanto, resetea.
Visualiza
   movf   Contador,W
   call   BIN_a_BCD   ; Lo pasa a BCD y
   movwf   Display      ; visualiza.
   return

   INCLUDE <BIN_BCD.INC>   ; Subrutina BIN_a_BCD.
   INCLUDE <RETARDOS.INC>   ; Subrutinas de retardo.
   END         ; Fin del programa.

Desconectado rooney2

  • PIC10
  • *
  • Mensajes: 10
Escrito originalmente por Meybel
Creo que este ejemplo te puede servir:


Codigo:
; Cada vez que presione el pulsador conectado al pin RA4 incrementa un contador
; visualizado en BCD en la barra de diodos LED. Cuando llegue a 99 (b"1001 1001")
; resetea y comienza de nuevo la cuenta.
;
; ZONA DE DATOS **********************************************************************

   LIST      P=16F84A
   INCLUDE  <P16F84A.INC>
   __CONFIG   _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

   CBLOCK  0x0C
   Contador         ; El contador a visualizar.
   ENDC

MAXIMO   EQU   .100      ; Máximo valor de la cuenta.
#DEFINE Pulsador   PORTA,4      ; Pulsador conectado a RA4.
#DEFINE Display      PORTB   ; El display está conectado al Puerto B.

; ZONA DE CÓDIGOS *************************************************************

   ORG   0      ; El programa comienza en la dirección 0.
Inicio
     bsf   STATUS,RP0   ; Acceso al Banco 1.
   clrf   Display      ; Estas líneas configuradas como salidas.
   bsf   Pulsador      ; Línea del pulsador configurada como entrada.
   bcf   STATUS,RP0   ; Acceso al Banco 0.
   call   InicializaContador   ; Inicializa el Contador y lo visualiza.
Principal
   btfsc   Pulsador      ; ¿Pulsador presionado?, ¿(Pulsador)=0?
   goto   Fin      ; No. Vuelve a leerlo.
   call   Retardo_20ms   ; Espera que se estabilicen los niveles de tensión.
   btfsc   Pulsador      ; Comprueba si es un rebote.
   goto   Fin      ; Era un rebote y sale fuera.
   call   IncrementaVisualiza   ; Incrementa el contador y lo visualiza.
EsperaDejePulsar
   btfss   Pulsador      ; ¿Dejó de pulsar?. ¿(Pulsador)=1?
   goto   EsperaDejePulsar   ; No. Espera que deje de pulsar.
Fin   goto   Principal

; Subrutina "IncrementaVisualiza" ---------------------------------------------------------

IncrementaVisualiza
   incf   Contador,F   ; Incrementa el contador y comprueba si ha
   movlw    MAXIMO      ; llegado a su valor máximo mediante una
   subwf   Contador,W   ; resta. (W)=(Contador)-MAXIMO.
   btfsc   STATUS,C      ; ¿C=0?, ¿(W) negativo?, ¿(Contador)<MAXIMO?
InicializaContador
   clrf   Contador      ; No, era igual o mayor. Por tanto, resetea.
Visualiza
   movf   Contador,W
   call   BIN_a_BCD   ; Lo pasa a BCD y
   movwf   Display      ; visualiza.
   return

   INCLUDE <BIN_BCD.INC>   ; Subrutina BIN_a_BCD.
   INCLUDE <RETARDOS.INC>   ; Subrutinas de retardo.
   END         ; Fin del programa.



 

anything