Autor Tema: Ayuda contador 0.0 a 9.9 PIC16F877A  (Leído 2677 veces)

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

Desconectado NZaki

  • PIC10
  • *
  • Mensajes: 2
Ayuda contador 0.0 a 9.9 PIC16F877A
« en: 13 de Octubre de 2023, 06:37:18 »
Tengo que hacer un contador que vaya de 0.0s a 9.9s, el programa me va bien con el debugger, pero creo que la temporización para mostrar los datos en el display está mal, cuando lo probé mostraba los números incompletos y las decimas iban demasiado rápido para verse bien, esté es el programa en cuestion:
Código: ASM
  1. LIST p=16F877A                                                          ; Directiva para iniciar el tipo de PIC
  2.                         INCLUDE P16F877A.INC                                            ; Definiciones de registros internos
  3.                         __CONFIG _XT_OSC & _WDT_OFF & _LVP_OFF          ; Cristal como oscilador, WDT OFF, Modo bajo consumo OFF
  4.  
  5. ; Programa que haga un temporizador digital decimal con dos displays
  6. ; de 7 segmentos que vayan desde 0.0 a 9.9 y se reinicie
  7. ; Cada 20 veces 5ms es 0.1 s
  8.  
  9. DECIMAS     EQU 0X20 ; Parametro para seleccionar el valor de las decimas que se muestra en el display 2
  10. UNIDADES    EQU 0X21 ; Parametro para seleccionar el valor de las decimas que se muestra en el display 2
  11. CONTADOR    EQU 0X30 ; Contador de repeticiones para hacer 0.1s con 5ms
  12. DELAY1      EQU 0X31 ; Variables para la subrutina de retardo
  13. DELAY2      EQU 0X32
  14. DELAY3      EQU 0X33
  15.  
  16.                         ORG 0X00
  17.                         GOTO INICIO
  18.                         ORG 0X05 ; Salto vector de interrupciones
  19. INICIO      CLRF DECIMAS  ; Limpio por si hubiera aglún valor metido
  20.                         CLRF UNIDADES
  21.                         CLRF PORTD ; Borramos el PORTD
  22.                         CLRF PORTA
  23.                         CLRW
  24.                         BSF STATUS,RP0 ; Banco 1, poniendo a 1 el bit RP0 del STATUS
  25.                         CLRW ; Movemos al acumulador W el valor 0X00 (0000 0000)
  26.                         MOVWF TRISD ; Llevamos el valor del acumulador al TRISD, los pins
  27.                         ; puestos a 1 son Input y los puestos a 0 son Output, ponemos como salidas PORTD
  28.                         MOVLW b'00000110' ;Definimos el PORTA
  29.                         MOVWF ADCON1 ;con todas sus señales como digitales
  30.                         MOVLW 0xF0 ; Movemos al acumulador W el valor 0XF0 (1111 0000)
  31.                         MOVWF TRISA ; Llevamos el valor del acumulador al TRISA, los pins
  32.                         ; puestos a 1 son Input y los puestos a 0 son Output
  33.                         BCF STATUS,RP0 ; Banco 0, poniendo a 0 el bit RP0 del STATUS
  34.                         MOVLW 0x13     ; 19 veces tiene que pasar por el retardo de 5ms para ser 0.1s(100ms)
  35.                         MOVWF CONTADOR
  36.  
  37. CONTAR      CALL  RETARDO5ms
  38.                     DECFSZ CONTADOR,1 ; Si es 0 no ejecuta la siguiente intrucción
  39.                         GOTO  CONTAR
  40.                         MOVLW 0X13     ; 19 veces tiene que pasar por el retardo de 5ms para ser 0.1s(100ms)
  41.                         MOVWF CONTADOR 
  42.  
  43.                         MOVLW   .9              ; Se mueve el valor 10 a WREG, para ver si el número es mayor a 9
  44.                         SUBWF   DECIMAS,0       ; Se resta el valor de WREG (0x09) al valor de DECIMAS para ver si es mayor a 9
  45.                         BTFSS   STATUS,C        ; Se comprueba si C=0 del registro STATUS, si hay prestamo c=0
  46.                         ; No está bien porque haria lo de borrar decimas despúes
  47.                         GOTO    FINAL     ; Llama a la subrutina de incremento si aún no ha llegado a o
  48.                         CLRF    DECIMAS     ; Limpia decimas si ha llegado a 9
  49.                         INCF    UNIDADES    ; Incrementa las unidades
  50.                         DECF    DECIMAS
  51.                         MOVLW   .9
  52.                         SUBWF   UNIDADES,0  ; Comprueba si unidades ha llegado a 9
  53.                         BTFSS   STATUS,C    ; Se resta el valor de WREG (0x09) al valor de UNIDADES para ver si es mayor a 9
  54.                         GOTO    FINAL       ; Va al final
  55.                         CLRF    UNIDADES    ; Limpia las unidades si llega a 9      
  56. FINAL       CALL    MOSTRAR     ; Muestra valores
  57.                         GOTO    CONTAR      ; Se repite            
  58.  
  59. MOSTRAR
  60.                         INCF    DECIMAS     ; Incrementa el valor de decimas
  61.                         CALL    TABLALEDD
  62.                         CALL    RETARDO5ms
  63.                         CALL    TABLALEDU      
  64.                         CALL    RETARDO5ms
  65.                         RETURN
  66.                        
  67.                        
  68. ;******************************************************************************
  69. ; Subrutina para el control de los displays
  70. ; Manda el código del dígito al PORTD y
  71. ; el código que activa el dígito al PORTA
  72. ;******************************************************************************
  73. TABLALEDD ; Usa los valores cogidos del programa principal de decimales y unidades para representarlas con una subrutina
  74.                         BCF     PORTA,1
  75.                         BSF     PORTA,0     ; Pone a 1 el RA0 que activa el display 1
  76.                         MOVF    DECIMAS,0     ; Mueve decimas a tablaled
  77.                         CALL TABLA1  ; Vamos a la tabla para volver en W con
  78.                         MOVWF PORTD  ; lo que hay que sacar por el Puerto D
  79.                         RETURN
  80. TABLALEDU
  81.                         BCF     PORTA,0      ; Apaga RAI 0
  82.                         BSF     PORTA,1
  83.                         MOVF   UNIDADES,0    ; Mueve unidades a tablaled
  84.                         CALL TABLA1  ; Vamos a la tabla para volver en W con
  85.                         MOVWF PORTD  ; lo que hay que sacar por el Puerto D
  86.                         RETURN
  87. ;SITUAMOS LA TABLA EN LAS POSICIONES INICIALES
  88. ;PARA ASEGURAR QUE LA PARTE ALTA DEL PC NO SE CAMBIA AL REALIZAR LA SUMA
  89. TABLA1 ADDWF PCL,F ;Suma del PC con el dígito a representar (en W)
  90.                 RETLW 0xC0 ;Para el cero
  91.                 RETLW 0xF9 ;el uno
  92.                 RETLW 0xA4 ;el dos
  93.                 RETLW 0xB0 ;el tres
  94.                 RETLW 0x99 ;el cuatro
  95.                 RETLW 0x92 ;el cinco
  96.                 RETLW 0x82 ;el seis
  97.                 RETLW 0xF8 ;el siete
  98.                 RETLW 0x80 ;el ocho
  99.                 RETLW 0x98 ;el nueve
  100.  
  101. ;******************************************************************************
  102. ;* Subrutina de Espera de 5ms (aprox.) mediante 3 bucles anidados
  103. ;* Ciclos máquina = 3nmp+4mp+4p +1
  104. ;* Con p=1, m=10 y n=165 salen 5000 ciclos máquina (aprox.)
  105. ;* Como fosc = 4 MHz ? Ciclo máquina = 1 ?s
  106. ;******************************************************************************
  107. RETARDO5ms:
  108.                         MOVLW    0x01       ; Cargamos dos contadores,
  109.                         MOVWF    DELAY1     ; uno con (p = 0x01)
  110. BUCLE1      MOVLW    0x0A       ; otro
  111.                         MOVWF    DELAY2     ; con (m = 0x0A, 10)
  112. BUCLE2      MOVLW    0xA5       ; y el otro
  113.                         MOVWF    DELAY3     ; con (n= 0xA5)
  114. BUCLE3      DECFSZ   DELAY3,F
  115.                         GOTO     BUCLE3
  116.                         DECFSZ   DELAY2,F
  117.                         GOTO     BUCLE2
  118.                         DECFSZ   DELAY1,F
  119.                         GOTO     BUCLE1
  120.                         RETURN              ; Final de la subrutina de espera
  121.                         END                 ; Fin del programa fuente
:?

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:Ayuda contador 0.0 a 9.9 PIC16F877A
« Respuesta #1 en: 14 de Octubre de 2023, 16:10:25 »
Tengo que hacer un contador que vaya de 0.0s a 9.9s, el programa me va bien con el debugger, pero creo que la temporización para mostrar los datos en el display está mal, cuando lo probé mostraba los números incompletos y las decimas iban demasiado rápido para verse bien, esté es el programa en cuestion:
Código: ASM
  1. LIST p=16F877A                                                          ; Directiva para iniciar el tipo de PIC
  2.                         INCLUDE P16F877A.INC                                            ; Definiciones de registros internos
  3.                         __CONFIG _XT_OSC & _WDT_OFF & _LVP_OFF          ; Cristal como oscilador, WDT OFF, Modo bajo consumo OFF
  4.  
  5. ; Programa que haga un temporizador digital decimal con dos displays
  6. ; de 7 segmentos que vayan desde 0.0 a 9.9 y se reinicie
  7. ; Cada 20 veces 5ms es 0.1 s
  8.  
  9. DECIMAS     EQU 0X20 ; Parametro para seleccionar el valor de las decimas que se muestra en el display 2
  10. UNIDADES    EQU 0X21 ; Parametro para seleccionar el valor de las decimas que se muestra en el display 2
  11. CONTADOR    EQU 0X30 ; Contador de repeticiones para hacer 0.1s con 5ms
  12. DELAY1      EQU 0X31 ; Variables para la subrutina de retardo
  13. DELAY2      EQU 0X32
  14. DELAY3      EQU 0X33
  15.  
  16.                         ORG 0X00
  17.                         GOTO INICIO
  18.                         ORG 0X05 ; Salto vector de interrupciones
  19. INICIO      CLRF DECIMAS  ; Limpio por si hubiera aglún valor metido
  20.                         CLRF UNIDADES
  21.                         CLRF PORTD ; Borramos el PORTD
  22.                         CLRF PORTA
  23.                         CLRW
  24.                         BSF STATUS,RP0 ; Banco 1, poniendo a 1 el bit RP0 del STATUS
  25.                         CLRW ; Movemos al acumulador W el valor 0X00 (0000 0000)
  26.                         MOVWF TRISD ; Llevamos el valor del acumulador al TRISD, los pins
  27.                         ; puestos a 1 son Input y los puestos a 0 son Output, ponemos como salidas PORTD
  28.                         MOVLW b'00000110' ;Definimos el PORTA
  29.                         MOVWF ADCON1 ;con todas sus señales como digitales
  30.                         MOVLW 0xF0 ; Movemos al acumulador W el valor 0XF0 (1111 0000)
  31.                         MOVWF TRISA ; Llevamos el valor del acumulador al TRISA, los pins
  32.                         ; puestos a 1 son Input y los puestos a 0 son Output
  33.                         BCF STATUS,RP0 ; Banco 0, poniendo a 0 el bit RP0 del STATUS
  34.                         MOVLW 0x13     ; 19 veces tiene que pasar por el retardo de 5ms para ser 0.1s(100ms)
  35.                         MOVWF CONTADOR
  36.  
  37. CONTAR      CALL  RETARDO5ms
  38.                     DECFSZ CONTADOR,1 ; Si es 0 no ejecuta la siguiente intrucción
  39.                         GOTO  CONTAR
  40.                         MOVLW 0X13     ; 19 veces tiene que pasar por el retardo de 5ms para ser 0.1s(100ms)
  41.                         MOVWF CONTADOR 
  42.  
  43.                         MOVLW   .9              ; Se mueve el valor 10 a WREG, para ver si el número es mayor a 9
  44.                         SUBWF   DECIMAS,0       ; Se resta el valor de WREG (0x09) al valor de DECIMAS para ver si es mayor a 9
  45.                         BTFSS   STATUS,C        ; Se comprueba si C=0 del registro STATUS, si hay prestamo c=0
  46.                         ; No está bien porque haria lo de borrar decimas despúes
  47.                         GOTO    FINAL     ; Llama a la subrutina de incremento si aún no ha llegado a o
  48.                         CLRF    DECIMAS     ; Limpia decimas si ha llegado a 9
  49.                         INCF    UNIDADES    ; Incrementa las unidades
  50.                         DECF    DECIMAS
  51.                         MOVLW   .9
  52.                         SUBWF   UNIDADES,0  ; Comprueba si unidades ha llegado a 9
  53.                         BTFSS   STATUS,C    ; Se resta el valor de WREG (0x09) al valor de UNIDADES para ver si es mayor a 9
  54.                         GOTO    FINAL       ; Va al final
  55.                         CLRF    UNIDADES    ; Limpia las unidades si llega a 9      
  56. FINAL       CALL    MOSTRAR     ; Muestra valores
  57.                         GOTO    CONTAR      ; Se repite            
  58.  
  59. MOSTRAR
  60.                         INCF    DECIMAS     ; Incrementa el valor de decimas
  61.                         CALL    TABLALEDD
  62.                         CALL    RETARDO5ms
  63.                         CALL    TABLALEDU      
  64.                         CALL    RETARDO5ms
  65.                         RETURN
  66.                        
  67.                        
  68. ;******************************************************************************
  69. ; Subrutina para el control de los displays
  70. ; Manda el código del dígito al PORTD y
  71. ; el código que activa el dígito al PORTA
  72. ;******************************************************************************
  73. TABLALEDD ; Usa los valores cogidos del programa principal de decimales y unidades para representarlas con una subrutina
  74.                         BCF     PORTA,1
  75.                         BSF     PORTA,0     ; Pone a 1 el RA0 que activa el display 1
  76.                         MOVF    DECIMAS,0     ; Mueve decimas a tablaled
  77.                         CALL TABLA1  ; Vamos a la tabla para volver en W con
  78.                         MOVWF PORTD  ; lo que hay que sacar por el Puerto D
  79.                         RETURN
  80. TABLALEDU
  81.                         BCF     PORTA,0      ; Apaga RAI 0
  82.                         BSF     PORTA,1
  83.                         MOVF   UNIDADES,0    ; Mueve unidades a tablaled
  84.                         CALL TABLA1  ; Vamos a la tabla para volver en W con
  85.                         MOVWF PORTD  ; lo que hay que sacar por el Puerto D
  86.                         RETURN
  87. ;SITUAMOS LA TABLA EN LAS POSICIONES INICIALES
  88. ;PARA ASEGURAR QUE LA PARTE ALTA DEL PC NO SE CAMBIA AL REALIZAR LA SUMA
  89. TABLA1 ADDWF PCL,F ;Suma del PC con el dígito a representar (en W)
  90.                 RETLW 0xC0 ;Para el cero
  91.                 RETLW 0xF9 ;el uno
  92.                 RETLW 0xA4 ;el dos
  93.                 RETLW 0xB0 ;el tres
  94.                 RETLW 0x99 ;el cuatro
  95.                 RETLW 0x92 ;el cinco
  96.                 RETLW 0x82 ;el seis
  97.                 RETLW 0xF8 ;el siete
  98.                 RETLW 0x80 ;el ocho
  99.                 RETLW 0x98 ;el nueve
  100.  
  101. ;******************************************************************************
  102. ;* Subrutina de Espera de 5ms (aprox.) mediante 3 bucles anidados
  103. ;* Ciclos máquina = 3nmp+4mp+4p +1
  104. ;* Con p=1, m=10 y n=165 salen 5000 ciclos máquina (aprox.)
  105. ;* Como fosc = 4 MHz ? Ciclo máquina = 1 ?s
  106. ;******************************************************************************
  107. RETARDO5ms:
  108.                         MOVLW    0x01       ; Cargamos dos contadores,
  109.                         MOVWF    DELAY1     ; uno con (p = 0x01)
  110. BUCLE1      MOVLW    0x0A       ; otro
  111.                         MOVWF    DELAY2     ; con (m = 0x0A, 10)
  112. BUCLE2      MOVLW    0xA5       ; y el otro
  113.                         MOVWF    DELAY3     ; con (n= 0xA5)
  114. BUCLE3      DECFSZ   DELAY3,F
  115.                         GOTO     BUCLE3
  116.                         DECFSZ   DELAY2,F
  117.                         GOTO     BUCLE2
  118.                         DECFSZ   DELAY1,F
  119.                         GOTO     BUCLE1
  120.                         RETURN              ; Final de la subrutina de espera
  121.                         END                 ; Fin del programa fuente
:?

Disculpa la pregunta, es años que no trabajo con ensamblador, pero que haces al mover, por ejemplo .9 al acumulador:

Código: ASM
  1. MOVLW   .9

No debería ser así:

Código: ASM
  1. MOVLW d’9; decimal
  2. MOVLW 0x09 ; hexadecimal
  3. MOVLW b’00001001; binario

Es decir ¿Qué hace ese punto decimal?
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:Ayuda contador 0.0 a 9.9 PIC16F877A
« Respuesta #2 en: 14 de Octubre de 2023, 16:54:32 »
Es decir ¿Qué hace ese punto decimal?

Creo recordar, me parece que usar el punto decimal, es otra forma de representar un número decimal, pero no estoy seguro
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado NZaki

  • PIC10
  • *
  • Mensajes: 2
Re:Ayuda contador 0.0 a 9.9 PIC16F877A
« Respuesta #3 en: 14 de Octubre de 2023, 19:34:54 »
Si, el punto es otra forma de representar decimales

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:Ayuda contador 0.0 a 9.9 PIC16F877A
« Respuesta #4 en: 14 de Octubre de 2023, 19:38:58 »
Si, el punto es otra forma de representar decimales

Respecto a tu problema, según dicen que va muy rápido la visualización de los dígitos en el display, tal vez sea problema del oscilador que estás usando.

Tal vez deberías compartir el esquemático del mismo y los fuses o bits de configuración.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Eduardo2

  • PIC24H
  • ******
  • Mensajes: 1004
Re:Ayuda contador 0.0 a 9.9 PIC16F877A
« Respuesta #5 en: 15 de Octubre de 2023, 02:03:23 »
Tengo que hacer un contador que vaya de 0.0s a 9.9s, el programa me va bien con el debugger, pero creo que la temporización para mostrar los datos en el display está mal, cuando lo probé mostraba los números incompletos y las decimas iban demasiado rápido para verse bien, esté es el programa en cuestion:

- Es que estás haciendo mal el barrido, mostrás la décima durante 5ms y el resto del tiempo la unidad --> el ojo humano no tiene sample&hold en la entrada.

- Normalmente el barrido se hace entrando por una interrupción del timer, donde van activando secuencialmente en cada interrupción.

- El incremento del conteo también es preferible por interrupción porque con retardos es muy inexacto,  aunque si no importa... dale nomás.

- El código así como está cuenta hasta 8.9s porque cuando comparás con 9, UNIDADES ya está incrementado.


Me tomé la libertad de agarrar tu código y cambiar de lugar/modificar bloques.
Así como lo dejé hace el barrido a 100Hz y cada 10 barridos incrementa DECIMAS.
Código: ASM
  1. LIST p=16F877A                          ; Directiva para iniciar el tipo de PIC
  2.             INCLUDE P16F877A.INC                    ; Definiciones de registros internos
  3.             __CONFIG _XT_OSC & _WDT_OFF & _LVP_OFF  ; Cristal como oscilador, WDT OFF, Modo bajo consumo OFF
  4.  
  5.             errorlevel -302
  6.             errorlevel -305
  7.  
  8. ; Programa que haga un temporizador digital decimal con dos displays
  9. ; de 7 segmentos que vayan desde 0.0 a 9.9 y se reinicie
  10. ; Cada 20 veces 5ms es 0.1 s
  11.  
  12. DECIMAS     EQU 0X20 ; Parametro para seleccionar el valor de las decimas que se muestra en el display 2
  13. UNIDADES    EQU 0X21 ; Parametro para seleccionar el valor de las decimas que se muestra en el display 2
  14. CONTADOR    EQU 0X30 ; Contador de repeticiones para hacer 0.1s con 5ms
  15. DELAY1      EQU 0X31 ; Variables para la subrutina de retardo
  16. DELAY2      EQU 0X32
  17. DELAY3      EQU 0X33
  18.  
  19.             ORG 0X00
  20.             GOTO INICIO    
  21.            
  22.             ORG 0X05            ; Salto vector de interrupciones
  23. INICIO      CLRF DECIMAS        ; Limpio por si hubiera aglún valor metido
  24.             CLRF UNIDADES
  25.             CLRF PORTD          ; Borramos el PORTD
  26.             CLRF PORTA
  27.             CLRW
  28.             BSF STATUS,RP0      ; Banco 1, poniendo a 1 el bit RP0 del STATUS
  29.             CLRW                ; Movemos al acumulador W el valor 0X00 (0000 0000)
  30.             MOVWF TRISD         ; Llevamos el valor del acumulador al TRISD, los pins
  31.                                 ; puestos a 1 son Input y los puestos a 0 son Output, ponemos como salidas PORTD
  32.             MOVLW b'00000110'   ;Definimos el PORTA
  33.             MOVWF ADCON1        ;con todas sus señales como digitales
  34.             MOVLW 0xF0          ; Movemos al acumulador W el valor 0XF0 (1111 0000)
  35.             MOVWF TRISA         ; Llevamos el valor del acumulador al TRISA, los pins
  36.                                 ; puestos a 1 son Input y los puestos a 0 son Output            
  37.            
  38. CONTAR      CALL    BARRIDOYRETARDO100ms
  39.  
  40.             INCF    DECIMAS
  41.             MOVLW   .10          ; Se mueve el valor 10 a WREG, para ver si el número es mayor a 9
  42.             SUBWF   DECIMAS,0   ; Se resta el valor de WREG (0x09) al valor de DECIMAS para ver si es mayor a 9
  43.             BTFSS   STATUS,C    ; Se comprueba si C=0 del registro STATUS, si hay prestamo c=0
  44.             GOTO    CONTAR      ;
  45.             CLRF    DECIMAS
  46.            
  47.             INCF    UNIDADES    
  48.             MOVLW   .10
  49.             SUBWF   UNIDADES,0  
  50.             BTFSS   STATUS,C    
  51.             GOTO    CONTAR      
  52.             CLRF    UNIDADES    
  53.             GOTO    CONTAR      
  54.  
  55.                        
  56. ;******************************************************************************
  57. ; Subrutina para el control de los displays
  58. ; Manda el código del dígito al PORTD y
  59. ; el código que activa el dígito al PORTA
  60. ;******************************************************************************
  61. TABLALEDD ; Usa los valores cogidos del programa principal de decimales y unidades para representarlas con una subrutina
  62.             BCF     PORTA,1
  63.             BSF     PORTA,0     ; Pone a 1 el RA0 que activa el display 1
  64.             MOVF    DECIMAS,0   ; Mueve decimas a tablaled
  65.             CALL TABLA1         ; Vamos a la tabla para volver en W con
  66.             MOVWF PORTD         ; lo que hay que sacar por el Puerto D
  67.             RETURN
  68. TABLALEDU
  69.             BCF     PORTA,0     ; Apaga RAI 0
  70.             BSF     PORTA,1
  71.             MOVF   UNIDADES,0   ; Mueve unidades a tablaled
  72.             CALL TABLA1         ; Vamos a la tabla para volver en W con
  73.             MOVWF PORTD         ; lo que hay que sacar por el Puerto D
  74.             RETURN
  75.  
  76. ;SITUAMOS LA TABLA EN LAS POSICIONES INICIALES
  77. ;PARA ASEGURAR QUE LA PARTE ALTA DEL PC NO SE CAMBIA AL REALIZAR LA SUMA
  78.  
  79. TABLA1      ADDWF PCL,F         ;Suma del PC con el dígito a representar (en W)
  80.             RETLW 0xC0          ;Para el cero
  81.             RETLW 0xF9          ;el uno
  82.             RETLW 0xA4          ;el dos
  83.             RETLW 0xB0          ;el tres
  84.             RETLW 0x99          ;el cuatro
  85.             RETLW 0x92          ;el cinco
  86.             RETLW 0x82          ;el seis
  87.             RETLW 0xF8          ;el siete
  88.             RETLW 0x80          ;el ocho
  89.             RETLW 0x98          ;el nueve
  90.  
  91. ;******************************************************************************
  92. ;* Subrutina de Espera de 5ms (aprox.) mediante 3 bucles anidados
  93. ;* Ciclos máquina = 3nmp+4mp+4p +1
  94. ;* Con p=1, m=10 y n=165 salen 5000 ciclos máquina (aprox.)
  95. ;* Como fosc = 4 MHz ? Ciclo máquina = 1 ?s
  96. ;******************************************************************************
  97.  
  98. BARRIDOYRETARDO100ms    
  99.  
  100.             BCF STATUS,RP0      ; Banco 0, poniendo a 0 el bit RP0 del STATUS
  101.             MOVLW .10           ; 10 veces tiene que pasar por el retardo de 2x5ms para ser 0.1s(100ms)
  102.             MOVWF CONTADOR  
  103.  
  104. BUCLE0      CALL    RETARDO5ms
  105.             CALL    TABLALEDD
  106.             CALL    RETARDO5ms
  107.             CALL    TABLALEDU      
  108.  
  109.             DECFSZ   CONTADOR,F
  110.             GOTO     BUCLE0
  111.             RETURN  
  112.  
  113.  
  114.            
  115. RETARDO5ms
  116.             MOVLW    0x01       ; Cargamos dos contadores,
  117.             MOVWF    DELAY1     ; uno con (p = 0x01)
  118. BUCLE1      MOVLW    0x0A       ; otro
  119.             MOVWF    DELAY2     ; con (m = 0x0A, 10)
  120. BUCLE2      MOVLW    0xA5       ; y el otro
  121.             MOVWF    DELAY3     ; con (n= 0xA5)
  122. BUCLE3      DECFSZ   DELAY3,F
  123.             GOTO     BUCLE3
  124.             DECFSZ   DELAY2,F
  125.             GOTO     BUCLE2
  126.             DECFSZ   DELAY1,F
  127.             GOTO     BUCLE1
  128.  
  129.             RETURN  
  130.             END                 ; Fin del programa fuente

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:Ayuda contador 0.0 a 9.9 PIC16F877A
« Respuesta #6 en: 15 de Octubre de 2023, 12:38:42 »

- Es que estás haciendo mal el barrido, mostrás la décima durante 5ms y el resto del tiempo la unidad --> el ojo humano no tiene sample&hold en la entrada.


Tal vez esté equivocado, pero 5 ms para mostrar un valor en un dígito de un display, pensaría que no tendría problemas, por ejemplo suelo usar retardos de 1 ms entre cada dígito del display.

O tal vez no estoy considerando algo del código del OP.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Eduardo2

  • PIC24H
  • ******
  • Mensajes: 1004
Re:Ayuda contador 0.0 a 9.9 PIC16F877A
« Respuesta #7 en: 15 de Octubre de 2023, 14:48:56 »
Lo que manda es el ciclo de trabajo.   Las décimas estan encendidas un 5% del tiempo y las unidades el 95%.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:Ayuda contador 0.0 a 9.9 PIC16F877A
« Respuesta #8 en: 15 de Octubre de 2023, 16:35:21 »
Lo que manda es el ciclo de trabajo.   Las décimas estan encendidas un 5% del tiempo y las unidades el 95%.

OK, gracias por l'aclaración. 
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32


 

anything