Autor Tema: Contador De 5 digitos que se active por flancos ascendentes  (Leído 3133 veces)

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

Desconectado ivandef

  • PIC10
  • *
  • Mensajes: 3
Contador De 5 digitos que se active por flancos ascendentes
« en: 28 de Agosto de 2010, 00:42:44 »
Hola soy un estudiante de electronica y por el momento quiesiera saber si alguien no podria ayudarme con el assembler para programar el famoso 16f84a, lo que estoy necesitando es un contador de 5 digitos con flancos asendentes.
Por favor si lo tienen sin demoras lo necesito
Gracias atentamente ivandef
« Última modificación: 28 de Agosto de 2010, 00:45:44 por ivandef »

Desconectado todopic

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3495
    • http://www.todopicelectronica.com.ar
Re: Contador De 5 digitos que se active por flancos ascendentes
« Respuesta #1 en: 28 de Agosto de 2010, 00:58:32 »
Hola, el foro es para ayudar... no para hacer los deberes....  pero te doy una ayuda... es para 2 digitos..  :mrgreen:

Código: ASM
  1. ;  º                                                                    º
  2. ;  º        _\\|//_                                                             º
  3. ;  º       (` o-o ')                                                    º
  4. ;  º------ooO-(_)-Ooo----------------------------------------------------º
  5. ;  º                                                                     º
  6. ;  º                              www.todopic.com.ar                     º
  7. ;  º    .oooO     Oooo.                                                  º
  8. ;  º    (   )     (   )                                                  º
  9. ;  º_____\ (_______) /___________________________________________________º
  10. ;  º      \_)     (_/                                                    º
  11. ;
  12. ;        
  13.       TITLE                 "Contador doble 00-99"
  14.       SUBTITLE              "Revision Nø 2"
  15.       LIST                  F = INHX8M, MM = ON, T = ON, ST = OFF
  16.       RADIX                 HEX
  17.       ERRORLEVEL            0, -302, -306
  18.       PROCESSOR             16F84A          ;16F84A-20/P
  19.  
  20.       #INCLUDE              <P16F84A.INC>
  21.       __CONFIG              _CP_OFF & _PWRTE_OFF & _WDT_OFF & _XT_OSC
  22.       __IDLOCS              H'0000'
  23. ;
  24. ;  B'00111111' B'11111001'
  25. ;       3F         F
  26. ;           3FF9
  27. ;
  28. ; Configuration Bits     16F84A
  29. ;
  30. ; SCRAMBLER     CP       PWRTE      WDT      OSC
  31. ;
  32. ; 00 = SI    0 = SI     0 = SI    0 = NO   00 = LP
  33. ; 3F = NO    1 = NO     1 = NO    1 = SI   01 = XT
  34. ;                                          10 = HS
  35. ;                                          11 = RC
  36. ;
  37. ;****************
  38. ;Cristal utilizado
  39. ;****************
  40. ;
  41. ; 04Mhz en modo XT con 1 useg por instrucción
  42. ;
  43. ;****************
  44. ;Descripcion del uso de cada pin.
  45. ;****************
  46. ;
  47. ; DIGITO_2A   ( digito 2A )                    RA2             pin    1
  48. ; DIGITO_1A   ( digito 1A )                    RA3             pin    2
  49. ; PULSADOR_R  ( Pulsador R )                   RA4/TOCK1       pin    3
  50. ; MCLR/VPP    ( reset y voltage Vpp )          MCLR/VPP        pin    4
  51. ; VSS         ( negativo 0V )                  VSS             pin    5
  52. ; LED_F       ( led del segmento F )           RB0/INT         pin    6
  53. ; LED_E       ( led del segmento E )           RB1             pin    7
  54. ; LED_D       ( led del segmento D )           RB2             pin    8
  55. ; LED_C       ( led del segmento C )           RB3             pin    9
  56. ; LED_B       ( led del segmento B )           RB4             pin   10
  57. ; LED_A       ( led del segmento A )           RB5             pin   11
  58. ; LED_G       ( led del segmento G )           RB6             pin   12
  59. ; PULSADOR_I  ( pulsador I )                   RB7             pin   13
  60. ; VDD         ( positivo 5V )                  VDD             pin   14
  61. ; OSC         ( salida )                       OSC2/CLKOUT     pin   15
  62. ; OSC         ( entrada )                      OSC1/CLKIN      pin   16
  63. ; DIGITO_1B   ( digito 1B )                    RA0             pin   17
  64. ; DIGITO_2B   ( digito 2A )                    RA1             pin   18
  65. ;
  66. ;****************
  67. ;Definicion de RAM del usuario.
  68. ;****************
  69. ;
  70.       CBLOCK      H'0C'
  71.       Dig1A                     ;acumulador decenas para el contador A
  72.       Dig2A                     ;acumulador unidades para el contador A
  73.       Dig1B                     ;acumulador decenas para el contador B
  74.       Dig2B                     ;acumulador unidades para el contador B
  75.       Rota                      ;variable para desplazamiento de display
  76.       Loops1                    ;variables usadas en retardos
  77.       Loops2
  78.       ENDC
  79. ;
  80. #define       PULSADOR_R   PORTA,4
  81. #define       PULSADOR_I   PORTB,7
  82. ;
  83. Reset
  84.   ORG         H'000'            ; Vector de inicio, o sea, desde aqui
  85.                                 ; comienza la ejecución del progrma
  86.                                 ; cuando se alimenta al pic...POR.."Power On Reset"
  87.       GOTO    Inicio            ; Salta hacia el inicio del progrma
  88.   ORG         H'004'            ; Vector de interrupción, o sea aqui salta
  89.                                 ; el PCl cuando se produce una interupción
  90.       RETURN                    ; Retorna sin habilitar las interrupciones
  91. ;
  92. ;-------------------------------------------------------------------
  93. ;-                          Subrrutinas                            -
  94. ;-------------------------------------------------------------------
  95. ;
  96. Retardo                         ;subrutina de retardo
  97.       movwf   Loops1            ;la variable de trabajo contiene la cant.
  98. Top2  movlw   D'110'            ;de ms a demorar
  99.       movwf   Loops2
  100. Top1  nop
  101.       nop
  102.       nop
  103.       nop
  104.       nop
  105.       nop
  106.       decfsz  Loops2,F          ;controla si termina 1mS
  107.       goto    Top1
  108.       decfsz  Loops1,F          ;controla si termina el retardo completo
  109.       goto    Top2
  110.       return
  111. ;
  112. ;-------------------------------------------------------------------
  113. ;
  114. IncDecenas                      ;rutina de incremento x 10
  115.       clrf    INDF              ;pone a cero las unidades
  116.       incf    FSR,F             ;selecciona el registro de las decenas
  117.       incf    INDF,F            ;incrementa el contador de decenas
  118.       movf    INDF,W            ;carga en work el conteo de las decenas
  119.       xorlw   H'0A'             ;si work era 10, entonces quedara en cero
  120.       skpnz                     ;si es cero, el flag z queda alto
  121.       clrf    INDF              ;pasa de 99 a 00            
  122.       return                    ;retorna
  123. ;
  124. ;-------------------------------------------------------------------
  125. ;
  126. IncUnidades                     ;rutina de incremento
  127.       movwf   FSR               ;seleciona el registro de las unidades
  128.       incf    INDF,F            ;incrementa el contador de unidades
  129.       movf    INDF,W            ;carga en work el conteo de las unidades
  130.       xorlw   H'0A'             ;si work era 10, entonces quedara en cero
  131.       skpnz                     ;si es cero, el flag z queda alto
  132.       call    IncDecenas        ;incrementa las decenas
  133.       movlw   D'250'            ;retardo de 100ms
  134.       call    Retardo
  135.       return
  136. ;
  137. ;-------------------------------------------------------------------
  138. ;
  139. ; entrada : W            Valor bcd a convertir         (H'00' a H'09').
  140. ; salida  : W            Valor 7 segmentos
  141. ;
  142. ;La codificacion de los siete segmentos es la siguiente.
  143. ;
  144. ;   GABCDEF
  145. ;B'xxxxxxxx'
  146. ;
  147. ;        A
  148. ;      ----
  149. ;   F |    | B
  150. ;     |  G |
  151. ;      ----
  152. ;   E |    | C
  153. ;     |    |
  154. ;      ---- o
  155. ;        D
  156. Tabla                           ;genera los numeros sobre el display
  157.       andlw   B'00001111'       ;solo H'0F'
  158.       addwf   PCL,F             ;agrega al cont. programa el valor de work
  159.       retlw   B'00111111'       ;genera el 0
  160.       retlw   B'00011000'       ;genera el 1
  161.       retlw   B'01110110'       ;genera el 2
  162.       retlw   B'01111100'       ;genera el 3
  163.       retlw   B'01011001'       ;genera el 4
  164.       retlw   B'01101101'       ;genera el 5
  165.       retlw   B'01101111'       ;genera el 6
  166.       retlw   B'00111000'       ;genera el 7
  167.       retlw   B'01111111'       ;genera el 8
  168.       retlw   B'01111101'       ;genera el 9
  169. ;
  170. ;Los siguientes debuelven E de "error", esto es por si se pasa
  171. ;un valor a la tabla desde H'0A' hasta H'0F'.
  172. ;
  173.       retlw   B'01100111'       ;genera la E
  174.       retlw   B'01100111'       ;genera la E
  175.       retlw   B'01100111'       ;genera la E
  176.       retlw   B'01100111'       ;genera la E
  177.       retlw   B'01100111'       ;genera la E
  178.       retlw   B'01100111'       ;genera la E
  179. ;
  180. ;-------------------------------------------------------------------
  181. ;-                      Programa Principal                         -
  182. ;-------------------------------------------------------------------
  183. ;
  184. Inicio                          ;programa principal
  185.       bsf     STATUS,RP0        ;selecciona el banco de memoria alto
  186.       movlw   B'00010000'       ;configura RA0~RA3 como salidas
  187.       movwf   TRISA             ;y RA4 como entrada
  188.       movlw   B'10000000'       ;configura RB0~RB6 como salidas
  189.       movwf   TRISB             ;y RB7 como entrada
  190.       bcf     STATUS,RP0        ;selecciona el banco de memoria bajo
  191.       clrf    Dig1A             ;inicializa acumuladores
  192.       clrf    Dig2A
  193.       clrf    Dig1B
  194.       clrf    Dig2B
  195.       movlw   H'00'             ;envia ceros a los transistores para apagar
  196.       movwf   PORTA             ;todos los displays
  197. ;
  198. Empe  btfss   PULSADOR_R        ;¿ Esta presionado el pulsador R ?
  199.       goto    Mostrar           ;No
  200.       movlw   Dig1A             ;Carga el puntero para el primer contador
  201.       call    IncUnidades       ;llama la rutina de incremento para el contador A
  202. ;      
  203.       btfss   PULSADOR_I        ;¿ Esta presionado el pulsador I ?
  204.       goto    Mostrar           ;No
  205.       movlw   Dig1B             ;para cargar el puntero
  206.       call    IncUnidades       ;llama la rutina de incremento para el contador B
  207. Mostrar
  208.       movlw   H'08'             ;iniciar un 1 en el registro de rotacion
  209.       movwf   Rota            
  210.       movlw   Dig1A             ;con el registro selector (fsr) se apunta
  211.       movwf   FSR               ;al primer dato que se va a mostrar
  212. Disp  movlw   H'00'             ;colocar en cero el dato del display
  213.       movwf   PORTB             ;para apagarlos
  214.       movf    Rota,W            ;pasa rotacion del 1 a la variable work
  215.       movwf   PORTA             ;enciende el transistor (display)
  216.       movf    INDF,W            ;lee el dato del registro apuntado por fsr
  217.       call    Tabla             ;genera el digito de 7 segmentos
  218.       movwf   PORTB             ;envia el digito al puerto b
  219.       movlw   H'03'             ;retardo de 3ms para visualizacion
  220.       call    Retardo
  221.       btfsc   Rota,0            ;controla si terminaron las cuatro rotaciones
  222.       goto    Empe              ;si termino, vuelve desde el comienzo
  223.       bcf     STATUS,C          ;carry en cero para no afectar las rotaciones
  224.       rrf     Rota,F            ;desplaza el 1 que enciende los displays
  225.       incf    FSR,F             ;incrementa el puntero. Apunta el proximo
  226.       goto    Disp              ;digito a mostrar
  227.  
  228.       END

Norberto
Firmat - Santa Fe - Argentina

www.TodoPic.net

Solo se tiran piedras, al arbol que tiene frutos...

Desconectado ivandef

  • PIC10
  • *
  • Mensajes: 3
Re: Contador De 5 digitos que se active por flancos ascendentes
« Respuesta #2 en: 28 de Agosto de 2010, 01:04:37 »
Hola si eehhhh no es para un deber jejeje es un proyecto  :mrgreen: ya tengo un contador pero con retardos le intente de quietar eso y me sale un cialquier cosa :shock: es solo por eso que pido jeje

Aca tengo la prgramacion con demoras esta la trate de modificar y nada solo que esta es de cuatro por el momento me sirve; lo que hice fue quite los retardos y active el option con flancos y nada esta es la prgramcion original con los retardos y esta la entrada por el tock1 todo normal

;Contador de 4 digitos.

indo    equ     00h             ;registro de indireccion
pc      equ     02h             ;contador de programa
status  equ     03h             ;registro de estado
fsr     equ     04h             ;registro de seleccion
ptoa    equ     05h             ;puerto a
ptob    equ     06h             ;puerto b
rota    equ     0fh             ;variable para desplazamiento de display
trisa   equ     85h             ;configuracion puerto a
trisb   equ     86h             ;configuracion puerto b
dig1    equ     10h             ;acumulador miles
dig2    equ     11h             ;acumulador centenas
dig3    equ     12h             ;acumulador decenas
dig4    equ     13h             ;acumulador unidades
loops   equ     1dh             ;variables usadas en retardos
loops2  equ     1eh
z       equ     02h             ;flag de cero
ram     equ     05h             ;bit de seleccion de pagina de memoria
c       equ     00h             ;flag de acarreo
w       equ     00h             ;bit de destino a variable de trabajo

reset   org     00
        goto    inicio
        org     05h

retardo                         ;subrutina de retardo
        movwf   loops           ;la variable de trabajo contiene la cant.
top2    movlw   d'110'          ;de ms a demorar
        movwf   loops2
top     nop
        nop
        nop
        nop
        nop
        nop
        decfsz  loops2          ;controla si termina 1mS
        goto    top
        decfsz  loops           ;controla si termina el retardo completo
        goto    top2
        retlw   0

s1000                           ;rutina de incremento x 1000
        clrf    dig2            ;pone a cero las centenas
        incf    dig1            ;incrementa el contador de miles  
        movf    dig1, w         ;carga en work el conteo de los miles  
        xorlw   0ah             ;si work era 10, entonces quedara en cero
        btfsc   status, z       ;si es cero, el flag z queda alto
        clrf    dig1            ;inicializa los miles  
        return
s100                            ;rutina de incremento x 100
        clrf    dig3            ;pone a cero las decenas
        incf    dig2            ;incrementa el contador de centenas
        movf    dig2, w         ;carga en work el conteo de las centenas
        xorlw   0ah             ;si work era 10, entonces quedara en cero
        btfsc   status, z       ;si es cero, el flag z queda alto
        call    s1000           ;incrementa los miles  
        return

s10                             ;rutina de incremento x 10
        clrf    dig4            ;pone a cero las unidades
        incf    dig3            ;incrementa el contador de decenas
        movf    dig3, w         ;carga en work el conteo de las decenas
        xorlw   0ah             ;si work era 10, entonces quedara en cero
        btfsc   status, z       ;si es cero, el flag z queda alto
        call    s100            ;incrementa las centenas
        return

subir                           ;rutina de incremento
        incf    dig4            ;incrementa el contador de unidades
        movf    dig4, w         ;carga en work el conteo de las unidades
        xorlw   0ah             ;si work era 10, entonces quedara en cero
        btfsc   status, z       ;si es cero, el flag z queda alto
        call    s10             ;incrementa las decenas
        movlw   d'250'          ;retardo de 100ms
        call    retardo
        return

tabla                           ;genera los numeros sobre el display
        addwf   pc              ;agrega al cont. programa el valor de work
        retlw   b'00111111'     ;genera el 0
        retlw   b'00011000'     ;genera el 1
        retlw   b'01110110'     ;genera el 2
        retlw   b'01111100'     ;genera el 3
        retlw   b'01011001'     ;genera el 4
        retlw   b'01101101'     ;genera el 5
        retlw   b'01101111'     ;genera el 6
        retlw   b'00111000'     ;genera el 7
        retlw   b'01111111'     ;genera el 8
        retlw   b'01111101'     ;genera el 9

inicio                          ;programa principal
        bsf     status, ram     ;selecciona el banco de memoria alto
        movlw   b'00010000'     ;configura el puerto a
        movwf   trisa           ;bit 4 entrada, demas bits salidas.
        movlw   00h             ;configura el puerto b
        movwf   trisb           ;como salidas
        bcf     status, ram     ;selecciona el banco de memoria bajo
        clrf    dig1            ;inicializa acumuladores
        clrf    dig2
        clrf    dig3
        clrf    dig4
        movlw   00              ;envia ceros a los transistores para apagar
        movwf   ptoa            ;todos los displays

empe    btfss   ptoa, 4         ;chequea el pulsador
        call    subir           ;llama la rutina de incremento
        movlw   08h             ;iniciar un 1 en el registro de rotacion
        movwf   rota            
        movlw   dig1            ;con el registro selector (fsr) se apunta
        movwf   fsr             ;al primer dato que se va a mostrar
disp    movlw   00h             ;colocar en cero el dato del display
        movwf   ptob            ;para apagarlos
        movf    rota, w         ;pasa rotacion del 1 a la variable work
        movwf   ptoa            ;enciende el transistor (display)
        movf    indo, w         ;lee el dato del registro apuntado por fsr
        call    tabla           ;genera el digito de 7 segmentos
        movwf   ptob            ;envia el digito al puerto b
        movlw   03h             ;retardo de 3ms para visualizacion
        call    retardo
        btfsc   rota, 0         ;controla si terminaron las cuatro rotaciones
        goto    empe            ;si termino, vuelve desde el comienzo
        bcf     status, c       ;carry en cero para no afectar las rotaciones
        rrf     rota            ;desplaza el 1 que enciende los displays
        incf    fsr             ;incrementa el puntero. Apunta el proximo
        goto    disp            ;digito a mostrar

        end

« Última modificación: 28 de Agosto de 2010, 01:15:26 por ivandef »

Desconectado todopic

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3495
    • http://www.todopicelectronica.com.ar
Re: Contador De 5 digitos que se active por flancos ascendentes
« Respuesta #3 en: 28 de Agosto de 2010, 19:45:40 »
Hola, aparentemente el programa esta bien,... donde no te funciona, en algun simulador? o es en una protoboard?

Si quitas los retardos, se repetirà el proceso tan rapido que te incrementara muy velozmente...  creo que habria que colocar algun programita antirrebote, es decir, sensar cuando pulsan, realizar una pequeña demora, volver a verificar si permanece pulsado, entonces esperar a que suelte, luego si incrementar...  :mrgreen:

Norberto
Firmat - Santa Fe - Argentina

www.TodoPic.net

Solo se tiran piedras, al arbol que tiene frutos...

Desconectado ivandef

  • PIC10
  • *
  • Mensajes: 3
Re: Contador De 5 digitos que se active por flancos ascendentes
« Respuesta #4 en: 28 de Agosto de 2010, 23:27:41 »
en realidad necesito esa velocidad para contar los pulsos de un encoder y luego mostrar en un display mi problema empieza no al contar si no que para al mostrar por eso habia quitado los retardos, y mi entrada esta en el RA4 y el conteo es por el tock1 jaja, ahora el problema de la programacion es que cuando se queda en cero aun cuenta por eso necesito que solo sea con flancos   :P y asi queda en 8 como que aun cuenta


 

anything