Autor Tema: Cronometro con 16F628A no se que estoy haciendo mal??  (Leído 3456 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado rnelson

  • PIC12
  • **
  • Mensajes: 53
Cronometro con 16F628A no se que estoy haciendo mal??
« en: 30 de Marzo de 2006, 20:15:00 »
Saludos tengan todos.

El tema es el siguiente.
Tengo un asm en un pic 16f628a donde el mismo tiene conectado 4 display catodo comun en paralelo por el puerto B y se encienden uno a la vez por medio de la multiplexacion del puerto A, el mismo debe arrancar a contar cuando ocurra una inetrrupcion en el RB0/INT y debe detenerse cuando vuelva a ocurrir otra interrupcion en el mismo pin.

el problema esta no hace nada, y ya he revisado varias veces el asm y el circuito y no encuentro la falla.
Les paso en asm para que le peguen una chequeada y me ayuden a encotrar la falla....
Codigo:

list p=16F628A
#INCLUDE <P16F628A.INC>

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
pulso   equ   1fh
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  

   org      00h      ;Indica al ensamblador la dirección de memoria de
                      ;la sig. instrucción
   goto     Inicio
   org      04h      

      btfss    intcon,1        ;es interrupción INT?
        goto     sale      ;si no lo es sale
   Movlw   d"250"
   call   retardo
   incf   pulso
   btfss   portb,0      ;espera a que se suelte el pulsador
       goto    $-1
       
sale   bcf   intcon,1
   retfie   

   org   10h
inicio  Movlw   .7
   movwf   cmcon   
   bsf     status, 5       ;selecciona el banco de memoria alto
        movlw   00h        ;configura el puerto a
        movwf   trisa           ;como salida.
        movlw   b"00000001"     ;configura el Pin RB0 como entrada
        movwf   trisb           ;el resto como salida.
        bcf     status, 5        ;selecciona el banco de memoria bajo
        movlw   b"10010000"   ;configura las interrupcion
   movwf   intcon      ;RB0/INT.
        clrf    dig1            ;inicializa acumuladores
        clrf    dig2
        clrf    dig3
        clrf    dig4
   clrf   pulso
   movlw   00              ;envia ceros a los transistores para apagar
        movwf   ptoa            ;todos los displays digito a mostrar
            ;pasa el dato a el Puerto A
   movf   pulso,w
   addwf   pcl,f
   goto   inicio         
   goto   empe
   goto   ciclo

empe      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

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"01111110"     ;genera el 0
        retlw   b"00001100"     ;genera el 1
        retlw   b"10110110"     ;genera el 2
        retlw   b"10011110"     ;genera el 3
        retlw   b"11001100"     ;genera el 4
        retlw   b"11011010"     ;genera el 5
        retlw   b"11111000"     ;genera el 6
        retlw   b"00001110"     ;genera el 7
        retlw   b"11111110"     ;genera el 8
        retlw   b"11001110"     ;genera el 9


ciclo   nop
   nop
   nop
   nop
   goto   ciclo
   
   end




mucho les agradecere lo que puedan hacer por mi.

Atte. Nelson R.
Maracaibo Vzla.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Cronometro con 16F628A no se que estoy haciendo mal??
« Respuesta #1 en: 08 de Abril de 2006, 12:40:34 »
Bueno...a esto ya te lo he corregido x privado Nelson :lol:. Espero que hayas logrado hacerlo. Saludos
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Cronometro con 16F628A no se que estoy haciendo mal??
« Respuesta #2 en: 08 de Abril de 2006, 14:33:46 »
Bueno...a esto ya te lo he corregido x privado Nelson :lol:. Espero que hayas logrado hacerlo. Saludos

BrunoF , creo que sería mas correcto postear la solucion en el foro así si alguien tiene el mismo inconveniente lo pueda resolver en el mismo hilo, sino es como que el tema queda inacabado.

Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Cronometro con 16F628A no se que estoy haciendo mal??
« Respuesta #3 en: 08 de Abril de 2006, 18:37:50 »
 :lol: :lol: che no te me pongas asi! :lol: :lol:

Código: ASM
  1. ;Programa para realizar el apagado y encendido de un LED colocado en el ;Puerto A0 basado en la interrupción externa INT (RB0)
  2. ;
  3.         list p=16F628A
  4.         #INCLUDE <P16F628A.INC>
  5.         ERRORLEVEL      -302
  6.  
  7. rota    equ     20h             ;variable para desplazamiento de display
  8. dig1    equ     21h             ;acumulador miles
  9. dig2    equ     22h             ;acumulador centenas
  10. dig3    equ     23h             ;acumulador decenas
  11. dig4    equ     24h             ;acumulador unidades
  12. loops   equ     25h             ;variables usadas en retardos
  13. loops2  equ     26h
  14. pulso   equ     27h
  15.  
  16. W_TEMP          equ     0x28
  17. STATUS_TEMP     equ     0x29
  18. PCLATH_TEMP     equ     0x2a
  19.  
  20.         org     00h             ;Indica al ensamblador la dirección de memoria de
  21.                                 ;la sig. instrucción
  22.         goto    inicio
  23.  
  24.         org     04h            
  25.  
  26.         btfss   INTCON,1        ;es interrupción RB0?
  27.         goto    sale            ;si no lo es sale
  28.  
  29.         MOVWF   W_TEMP          ;guardar copia de los registros claves
  30.         SWAPF   STATUS,W
  31.         CLRF    STATUS
  32.         MOVWF   STATUS_TEMP
  33.         MOVF    PCLATH, W
  34.         MOVWF   PCLATH_TEMP
  35.         CLRF    PCLATH
  36.  
  37.         bcf     INTCON,1
  38.  
  39.         movlw   d'250'
  40.         call    retardo
  41.  
  42.         movf    pulso,W
  43.         xorlw   0x02
  44.         btfss   STATUS,Z
  45.         incf    pulso,F
  46.  
  47.         btfss   PORTB,0         ;espera a que se suelte el pulsador
  48.         goto    $-1
  49.  
  50.         movlw   d'250'
  51.         call    retardo
  52.  
  53. sale    MOVF    PCLATH_TEMP,W   ;restaurar registros claves
  54.         MOVWF   PCLATH
  55.         SWAPF   STATUS_TEMP,W
  56.         MOVWF   STATUS
  57.         SWAPF   W_TEMP,F
  58.         SWAPF   W_TEMP,W
  59.         retfie 
  60.  
  61.  
  62. inicio  movlw   .7
  63.         movwf   CMCON
  64.  
  65.         bsf     STATUS,RP0      ;selecciona el banco de memoria alto
  66.         movlw   00h             ;configura el puerto a
  67.         movwf   PORTA           ;como salida.
  68.         movlw   b'00000001'     ;configura el Pin RB0 como entrada
  69.         movwf   PORTB           ;el resto como salida.
  70.         clrf    OPTION_REG      ;interr en bajo de RB0
  71.  
  72.         bcf     STATUS,RP0      ;selecciona el banco de memoria bajo
  73.         movlw   b'10010000'     ;configura las interrupcion
  74.         movwf   INTCON          ;RB0/INT.
  75.  
  76.         clrf    dig1            ;inicializa acumuladores
  77.         clrf    dig2
  78.         clrf    dig3
  79.         clrf    dig4
  80.         clrf    pulso
  81.                                 ;envia ceros a los transistores para apagar
  82.         clrf    PORTA           ;todos los displays digito a mostrar
  83.                                 ;pasa el dato a el Puerto A
  84.         movf    pulso,W
  85.         addwf   PCL,F
  86.         goto    $-2
  87.         goto    empe
  88.         goto    ciclo
  89.  
  90. empe    call    subir           ;llama la rutina de incremento
  91.         movlw   08h             ;iniciar un digito 1 en el registro de rotacion
  92.         movwf   rota            
  93.         movlw   dig1            ;con el registro selector (fsr) se apunta
  94.         movwf   FSR             ;al primer dato que se va a mostrar
  95. disp                            ;colocar en cero el dato del display
  96.         clrf    PORTB           ;para apagarlos
  97.         movf    rota,W          ;pasa rotacion del 1 a la variable work
  98.         movwf   PORTA           ;enciende el transistor (display)
  99.  
  100.         movf    INDF,W          ;lee el dato del registro apuntado por fsr
  101.         call    tabla           ;genera el digito de 7 segmentos
  102.         movwf   PORTB           ;envia el digito al puerto b
  103.  
  104.         movlw   03h             ;retardo de 3ms para visualizacion
  105.         call    retardo
  106.  
  107.         btfsc   rota,0          ;controla si terminaron las cuatro rotaciones
  108.         goto    empe            ;si termino, vuelve desde el comienzo
  109.  
  110.         bcf     STATUS,C        ;carry en cero para no afectar las rotaciones
  111.         rrf     rota,F          ;desplaza el 1 que enciende los displays
  112.         incf    FSR,F           ;incrementa el puntero. Apunta el proximo
  113.         goto    disp
  114.  
  115. retardo                         ;subrutina de retardo
  116.         movwf   loops           ;la variable de trabajo contiene la cant.
  117. top2    movlw   d'110'          ;de ms a demorar
  118.         movwf   loops2
  119. top     nop
  120.         nop
  121.         nop
  122.         nop
  123.         nop
  124.         nop
  125.         decfsz  loops2,F        ;controla si termina 1mS
  126.         goto    top
  127.  
  128.         decfsz  loops,F         ;controla si termina el retardo completo
  129.         goto    top2
  130.  
  131.         retlw   0
  132.  
  133. s1000                           ;rutina de incremento x 1000
  134.         clrf    dig2            ;pone a cero las centenas
  135.         incf    dig1,F          ;incrementa el contador de miles  
  136.         movf    dig1,W          ;carga en work el conteo de los miles  
  137.         xorlw   0ah             ;si work era 10, entonces quedara en cero
  138.         btfsc   STATUS,Z        ;si es cero, el flag z queda alto
  139.         clrf    dig1            ;inicializa los miles  
  140.  
  141.         return
  142. s100                            ;rutina de incremento x 100
  143.         clrf    dig3            ;pone a cero las decenas
  144.         incf    dig2,F          ;incrementa el contador de centenas
  145.         movf    dig2,w          ;carga en work el conteo de las centenas
  146.         xorlw   0ah             ;si work era 10, entonces quedara en cero
  147.         btfsc   STATUS,Z        ;si es cero, el flag z queda alto
  148.         call    s1000           ;incrementa los miles  
  149.  
  150.         return
  151.  
  152. s10                             ;rutina de incremento x 10
  153.         clrf    dig4            ;pone a cero las unidades
  154.         incf    dig3,F          ;incrementa el contador de decenas
  155.         movf    dig3,W          ;carga en work el conteo de las decenas
  156.         xorlw   0ah             ;si work era 10, entonces quedara en cero
  157.         btfsc   STATUS,Z        ;si es cero, el flag z queda alto
  158.         call    s100            ;incrementa las centenas
  159.  
  160.         return
  161.  
  162. subir                           ;rutina de incremento
  163.         incf    dig4,F          ;incrementa el contador de unidades
  164.         movf    dig4,W          ;carga en work el conteo de las unidades
  165.         xorlw   0ah             ;si work era 10, entonces quedara en cero
  166.         btfsc   STATUS,Z        ;si es cero, el flag z queda alto
  167.         call    s10             ;incrementa las decenas
  168.  
  169.         movlw   d'250'          ;retardo de 100ms
  170.         call    retardo
  171.         return
  172.  
  173. tabla                           ;genera los numeros sobre el display
  174.         addwf   PCL,F           ;agrega al cont. programa el valor de work
  175.         retlw   b'01111111'     ;genera el 0
  176.         retlw   b'00001101'     ;genera el 1
  177.         retlw   b'10110111'     ;genera el 2
  178.         retlw   b'10011111'     ;genera el 3
  179.         retlw   b'11001101'     ;genera el 4
  180.         retlw   b'11011011'     ;genera el 5
  181.         retlw   b'11111001'     ;genera el 6
  182.         retlw   b'00001111'     ;genera el 7
  183.         retlw   b'11111111'     ;genera el 8
  184.         retlw   b'11001111'     ;genera el 9
  185.  
  186.  
  187. ciclo   nop
  188.         goto    $-1
  189.        
  190.         end

El mayor problema era la declaracion de las variables en posiciones incorrectas, ya que los GPR en este PIC comienzan en los 0x20h.
Tambien agregue antirebote al pulsador, y limite el programa para que cuando se presione el pulsador, comienze la cuenta, y cuando se presione nuevamente, se detenga.
Exitos...
« Última modificación: 12 de Abril de 2006, 15:39:25 por BrunoF »
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Cronometro con 16F628A no se que estoy haciendo mal??
« Respuesta #4 en: 09 de Abril de 2006, 14:54:35 »
:lol: :lol: che no te me pongas asi! :lol: :lol:


Lo decia de buena onda ;)

Es que a mi entender el foro es para poner las soluciones aqui, de nada serviria que las soluciones sean en privado, para eso sería mas efectivo que creemos un canal de chat :)

A menud me preguntan cosas en privado y les pido que posteen un tema y les respondo en el foro, asi si otro tiene una duda similar la lee y listo.

Es solo mi opinión, no un reproche ni nada :)

Considero que si solucionaste el tema, tu esfuerzo vale y sería bueno que alguno lo viera y te pueda agradecer por tu gesto

Un abrazo
s
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado rnelson

  • PIC12
  • **
  • Mensajes: 53
Re: Cronometro con 16F628A no se que estoy haciendo mal??
« Respuesta #5 en: 06 de Mayo de 2006, 13:34:20 »
Saludos a todos y disculpen la tardanza.

Tienes toda la Razon Maunix, pero desde hace mucho tiempo estaba este tema en el foro y nadie le habia prestado atencion es por eso que acudi a Bruno en Privado.

Les prometo que no volvera suceder.

Saludos y gracias por todo.

Rnelson


 

anything