Autor Tema: Mostrar en cuatro display de 7 segmentos el resultado del conversor A/D  (Leído 8018 veces)

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

Desconectado cdaiag

  • PIC10
  • *
  • Mensajes: 18
Buenos días a todos en el foro estoy trabajando con un PIC16F874A y quisiera mostrar el resultado en cuatro display de siete segmentos (catodo común) ya navegue por internet y realice intentos propios y no pude la idea es hacerlo mandando el resultado directamente en binario a un puerto porsupuesto que no quiero la solución en bandeja pero si una guía

Desde ya Gracias

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Mostrar en cuatro display de 7 segmentos el resultado del conversor A/D
« Respuesta #1 en: 27 de Febrero de 2015, 14:33:27 »
Si vas a mandar el "binario" tenes que hacerlo atraves de un decodificador como el CD4511 pero ojo... este decodificador transforma BCD a 7 segmentos.

Por si las dudas la diferencia en binario y BCD:

Suponete el valor 5789 decimal, Necesitarias 2 registros de 8 bits y pasado a hexa es 169Dh (0001 0110 1001 1101) la idea es pasarlo a BCD. es decir que en un registro tengas la unidades de mil, las centenas, las decenas y las unidades.

Quedando y esto es lo que tenes que enviar:
Miles= 5h = 0101
Centenas = 7h = 0111
Decenas = 8h = 1000
Unidades= 9h = 1001

Por ahi algunos usan lo que llaman BCD packed, si te fijas el BCD solo ocupa 4 bits como maximo ( ya que el 9 es el maximo ) y los registros son de 8 bits, por lo que hay algunos codigos que directamente te lo ubican en 2 registros a esos 4 valores:
Miles y Centenas = 57h = 0101 01111
Decenas y Unidades = 89h = 1000 1001

Ya tenes los datos en BCD sea de la forma que sea... ahora para mostrarlos en los displays tenes que multiplexarlos. Podrias poner un timer que cuando active la interrupcion cambie el display a mostrar. La multiplexacion funcionaria asi:

1era interupcion: desactivo el catodo de unidades, Envio mis datos de miles al puerto = 5h , el 4511 se encarga de pasarlo a 7 segmentos y activo el catodo de miles
2da interupcion: desactivo el catodo de miles (apago ese display), Envio mis datos de centenas al puerto = 7h y activo el catodo de las centenas
3ra interupcion: desactivo el catodo de centenas, Envio mis datos de decenas al puerto = 8h y activo el catodo de las decenas
3ra interupcion: desactivo el catodo de decenas, Envio mis datos de unidades al puerto = 9h y activo el catodo de las unidades
Vuelvo a repetir.

La velocidad de prendido y apagado (tiempo de iterrupciones) queda a tu criterio. Mientras mas rapido menos se nota el apagado y encendido de lso displays pero hay un poco menos de brillo.

Desconectado cdaiag

  • PIC10
  • *
  • Mensajes: 18
Re: Mostrar en cuatro display de 7 segmentos el resultado del conversor A/D
« Respuesta #2 en: 01 de Marzo de 2015, 17:09:36 »
Buenos días a todos en el foro estoy trabajando con un PIC16F874A y quisiera mostrar el resultado en cuatro display de siete segmentos (catodo común) ya navegue por internet y realice intentos propios y no pude la idea es hacerlo mandando el resultado directamente en binario a un puerto porsupuesto que no quiero la solución en bandeja pero si una guía

Desde ya Gracias
Si vas a mandar el "binario" tenes que hacerlo atraves de un decodificador como el CD4511 pero ojo... este decodificador transforma BCD a 7 segmentos.

Por si las dudas la diferencia en binario y BCD:

Suponete el valor 5789 decimal, Necesitarias 2 registros de 8 bits y pasado a hexa es 169Dh (0001 0110 1001 1101) la idea es pasarlo a BCD. es decir que en un registro tengas la unidades de mil, las centenas, las decenas y las unidades.

Quedando y esto es lo que tenes que enviar:
Miles= 5h = 0101
Centenas = 7h = 0111
Decenas = 8h = 1000
Unidades= 9h = 1001

Por ahi algunos usan lo que llaman BCD packed, si te fijas el BCD solo ocupa 4 bits como maximo ( ya que el 9 es el maximo ) y los registros son de 8 bits, por lo que hay algunos codigos que directamente te lo ubican en 2 registros a esos 4 valores:
Miles y Centenas = 57h = 0101 01111
Decenas y Unidades = 89h = 1000 1001

Ya tenes los datos en BCD sea de la forma que sea... ahora para mostrarlos en los displays tenes que multiplexarlos. Podrias poner un timer que cuando active la interrupcion cambie el display a mostrar. La multiplexacion funcionaria asi:

1era interupcion: desactivo el catodo de unidades, Envio mis datos de miles al puerto = 5h , el 4511 se encarga de pasarlo a 7 segmentos y activo el catodo de miles
2da interupcion: desactivo el catodo de miles (apago ese display), Envio mis datos de centenas al puerto = 7h y activo el catodo de las centenas
3ra interupcion: desactivo el catodo de centenas, Envio mis datos de decenas al puerto = 8h y activo el catodo de las decenas


3ra interupcion: desactivo el catodo de decenas, Envio mis datos de unidades al puerto = 9h y activo el catodo de las unidades
Vuelvo a repetir.

La velocidad de prendido y apagado (tiempo de iterrupciones) queda a tu criterio. Mientras mas rapido menos se nota el apagado y encendido de lso displays pero hay un poco menos de brillo.

Tal ves no me explique bien yo quiero mandar los datos del conversor A/D directamente a los display de 7 segmentos utilizando un puerto completo sin utilizar el 4511

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Mostrar en cuatro display de 7 segmentos el resultado del conversor A/D
« Respuesta #3 en: 01 de Marzo de 2015, 17:26:49 »
Entendi otra cosa cuando dijiste binario. Pero al final es lo mismo..

Tomas los datos del ADC (10 bits) -> los pasas a BCD (16bits como minimo, 4 bits por cada numero) y lo que cambia es la forma de mostrarlo ya que necesitas una conversion mas...

Te creas una tabla que haga lo mismo que el 4511 ( hasta podes copiarselo del datasheet ):

Código: ASM
  1. BCD7SEG:                        ; retlw b'gfedcba'  para display catodo comun
  2.         addwf   PCL,1           ; Se incrementa el contador del programa.-
  3.         retlw   b'0111111'      ; 0    
  4.         retlw   b'0000110'      ; 1    
  5.         retlw   b'1011011'      ; 2    
  6.         retlw   b'1001111'      ; 3    
  7.         retlw   b'1100110'      ; 4    
  8.         retlw   b'1101101'      ; 5    
  9.         retlw   b'1111101'      ; 6    
  10.         retlw   b'0000111'      ; 7    
  11.         retlw   b'1111111'      ; 8    
  12.         retlw   b'1101111'      ; 9
  13.         ;Aca seguiria para los valores de 10 a 15, podrias ponerle todos 0 por las dudas

o

Código: ASM
  1. BCD7SEG:                        ; retlw b'gfedcba'  para display catodo comun
  2.         addwf   PCL,1           ; Se incrementa el contador del programa.-
  3.         DT 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0xFF, 0x6F ; Aca tambien harias lo mismo poniendo ceros por las dudas que este mal tu codigo de BCD
  4.         clrf    Contador
  5.         retlw   0x3F

Fijate que aclare que despues del 9 podrias poner lo que ocuparia cuando entra como variable de 0x0A a 0x0F, aunque si esta bien realizada la conversion a BCD no deberia de superar 9 nunca.

Entonces una ves que tenes tu codigo en BCD, cargas el valor de las unidades/decenas/centenas o miles al registro W, llamas a la funcion, esta salta la cantidad de instrucciones segun lo cargado en W. Y lo que te devuelva en W lo pasas al puerto. Controlando con cada bit 1 de los segmentos del display. ( te queda un bit libre ya que son 7 segmentos )

Y luego es lo mismo que explique para los catodos. Me refiero a la multiplexacion.

En fin lo unico que cambio fue eso, en ves de sacarlos directamente BCD al puerto, lo pasas por un "conversor BCD / 7 segmentos" que creaste en el software y sacas directamente la salida de 7 segmentos.

El codigo fue sacado de aca:
http://www.todopic.com.ar/foros/index.php?topic=24720.msg201401#msg201401
« Última modificación: 01 de Marzo de 2015, 17:31:59 por KILLERJC »

Desconectado Daikataro

  • PIC10
  • *
  • Mensajes: 22
Re: Mostrar en cuatro display de 7 segmentos el resultado del conversor A/D
« Respuesta #4 en: 03 de Marzo de 2015, 00:18:37 »
Nos sería muy útil que mencionaras qué compilador estás usando y cómo te entrega el resultado, incluso si es posible el código para más asistencia. Esto porque por ejemplo, PSI te entrega mediante la instrucción ADCIN un word ya directamente en decimal (0 -> 1023) que desde luego, escala de acuerdo a 0-5V. Mencionas que quieres mostrar directamente así que asumiré que no quieres conversión de voltaje equivalente, sino mostrar directamente el número. Para esto nada más sencillo que sustracciones sucesivas para obtener cada dígito:

-Si es >= 1000 le restas 1000 y añades 1 a millares
-Si lo que resta es >= 100 restas 100 y añades 1 a centenas
-Si lo que resta es >= 10 restas 10 y añades 1 a decenas
-Lo que te queda son unidades

Lógicamente iteras hasta obtener cada dígito, y luego de eso la clásica tabla de conversiones case de decimal a BCD dependiendo de si es cátodo común o ánodo común. Un multiplexado a cada display y ya estás hecho.

Desconectado cdaiag

  • PIC10
  • *
  • Mensajes: 18
Re: Mostrar en cuatro display de 7 segmentos el resultado del conversor A/D
« Respuesta #5 en: 05 de Marzo de 2015, 21:47:33 »
Entendi otra cosa cuando dijiste binario. Pero al final es lo mismo..

Tomas los datos del ADC (10 bits) -> los pasas a BCD (16bits como minimo, 4 bits por cada numero) y lo que cambia es la forma de mostrarlo ya que necesitas una conversion mas...

Te creas una tabla que haga lo mismo que el 4511 ( hasta podes copiarselo del datasheet ):

Código: ASM
  1. BCD7SEG:                        ; retlw b'gfedcba'  para display catodo comun
  2.         addwf   PCL,1           ; Se incrementa el contador del programa.-
  3.         retlw   b'0111111'      ; 0    
  4.         retlw   b'0000110'      ; 1    
  5.         retlw   b'1011011'      ; 2    
  6.         retlw   b'1001111'      ; 3    
  7.         retlw   b'1100110'      ; 4    
  8.         retlw   b'1101101'      ; 5    
  9.         retlw   b'1111101'      ; 6    
  10.         retlw   b'0000111'      ; 7    
  11.         retlw   b'1111111'      ; 8    
  12.         retlw   b'1101111'      ; 9
  13.         ;Aca seguiria para los valores de 10 a 15, podrias ponerle todos 0 por las dudas

o

Código: ASM
  1. BCD7SEG:                        ; retlw b'gfedcba'  para display catodo comun
  2.         addwf   PCL,1           ; Se incrementa el contador del programa.-
  3.         DT 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0xFF, 0x6F ; Aca tambien harias lo mismo poniendo ceros por las dudas que este mal tu codigo de BCD
  4.         clrf    Contador
  5.         retlw   0x3F

Fijate que aclare que despues del 9 podrias poner lo que ocuparia cuando entra como variable de 0x0A a 0x0F, aunque si esta bien realizada la conversion a BCD no deberia de superar 9 nunca.

Entonces una ves que tenes tu codigo en BCD, cargas el valor de las unidades/decenas/centenas o miles al registro W, llamas a la funcion, esta salta la cantidad de instrucciones segun lo cargado en W. Y lo que te devuelva en W lo pasas al puerto. Controlando con cada bit 1 de los segmentos del display. ( te queda un bit libre ya que son 7 segmentos )

Y luego es lo mismo que explique para los catodos. Me refiero a la multiplexacion.

En fin lo unico que cambio fue eso, en ves de sacarlos directamente BCD al puerto, lo pasas por un "conversor BCD / 7 segmentos" que creaste en el software y sacas directamente la salida de 7 segmentos.

El codigo fue sacado de aca:
http://www.todopic.com.ar/foros/index.php?topic=24720.msg201401#msg201401

Que tal buenas noches te paso el programa en ASM con la tabla incluida, realice la prueba de cargar el registro W con un codigo BCD y no me funciono
;*****************************************************************************************************************************
;ESTE PROGRAMA MANEJA UN TECLADO DE 4 FILAS Y TRES COLUMNAS MATRICIAL POR EL CUAL SE INGRESA UN VALOR Y LO MUESTRA EN CUATRO
;DISPLAYS DE 7 SEGMENTOS, TAMBIÉN MEDIANTE UN PULSADOR GRABA EL VALOR MOSTRADO EN LOS DISPLAY EN MEMORIA EPROM Y CON OTRO
;PULSADOR RECUPERA DICHO VALOR, LA PARTE DEL CONVERSOR A/D EN ESTE PROGRAMA NO FUNCIONA SOLAMENTE FIGURAN LAS SUBRUTINAS
;*****************************************************************************************************************************

         LIST     P= 16F874A
         INCLUDE "P16F874A.INC"                                                           
;*****************************************************VARIABLES****************************************************************
REG1   EQU   H'20'                  ;VARIABLE PARA SUBRUTINA DE RETARDO
REG2   EQU   H'21'                  ;VARIABLE PARA SUBRUTINA DE RETARDO
DIGI1   EQU   H'22'                  ;VARIABLE PARA ALMACENAR EL VALOR DE DIGITO 1
DIGI2   EQU   H'23'                  ;VARIABLE PARA ALMACENAR EL VALOR DE DIGITO 2
DIGI3   EQU   H'24'                  ;VARIABLE PARA ALMACENAR EL VALOR DE DIGITO 3   
DIGI4   EQU   H'25'                  ;VARIABLE PARA ALMACENAR EL VALOR DE DIGITO 4
TECPUL   EQU   H'26'                  ;VARIABLE PARA ALMACENAR EL VALOR DE LA TECLA PULSADA
REG3   EQU   H'27'                  ;VARIABLE PARA SUBRUTINA DE RETARDO1
REG4   EQU   H'28'                  ;VARIABLE PARA SUBRUTINA DE RETARDO1
REG5   EQU   H'29'                  ;VARIABLE PARA SUBRUTINA DE RETARDO CONVERSOR A/D   
LSD      EQU   H'2A'                  ;VARIABLE PARA SUBRUTINA BINBCD
MSD      EQU   H'2B'                  ;VARIABLE PARA SUBRUTINA BINBCD   
VSD      EQU   H'2C'                  ;VARIABLE PARA SUBRUTINA BINBCD         
HSD      EQU   H'2D'                  ;VARIABLE PARA SUBRUTINA BINBCD   
ADRESA   EQU   H'2E'                  ;VALOR ALTO DE LA CONVERSION=ADRESH
ADRES   EQU   H'2F'                  ;VALOR BAJO DE LA CONVERSION=ADRESL   

   

;*****************************************************CONSTANTES***************************************************************
VALOR1   EQU   .74                     ;VALORES PARA EL RETARDO
VALOR2   EQU   .2                     ;VALORES PARA EL RETARDO
VALOR3   EQU   .150                  ;VALORES PARA EL RETARDO1
VALOR4   EQU   .4                     ;VALORES PARA EL RETARDO1
;*****************************************************DEFINICIONES*************************************************************

         #DEFINE BANCO0      BCF      STATUS,RP0
         #DEFINE BANCO1      BSF      STATUS,RP0 
;***************************************************OTRAS DEFINICIONES********************************************************

         #DEFINE TRD1   PORTD,7      ;DEFINO LA SALIDA DE TRD1
         #DEFINE TRD2   PORTD,6      ;DEFINO LA SALIDA DE TRD2         
         #DEFINE TRD3   PORTD,5      ;DEFINO LA SALIDA DE TRD3      
         #DEFINE TRD4   PORTD,4      ;DEFINO LA SALIDA DE TRD4

      
         #DEFINE LED1   PORTB,5      ;DEFINO LED PRUEBA
         #DEFINE GRABO   PORTB,7      ;DEFINO PULSADOR CONVERSOR ANALOGICO DIGITAL
         #DEFINE LED2   PORTB,4      ;DEFINO LED PRUEBA
         #DEFINE RECU   PORTB,6      ;DEFINO PULSADOR GRABAR
         

         #DEFINE COL1   PORTE,0      ;DEFINO COLUMNA TECLADO
         #DEFINE COL2   PORTE,1      ;DEFINO COLUMNA TECLADO   
         #DEFINE COL3   PORTE,2      ;DEFINO COLUMNA TECLADO

         #DEFINE FIL1   PORTD,0      ;DEFINO TECLADO FILAS
         #DEFINE FIL2   PORTD,1      ;DEFINO TECLADO FILAS
         #DEFINE FIL3   PORTD,2      ;DEFINO TECLADO FILAS
         #DEFINE FIL4   PORTD,3      ;DEFINO TECLADO FILAS

         #DEFINE COL1E   BSF   TRISE,0   ;DEFINO COL1 COMO ENTRADA
         #DEFINE COL1S   BCF   TRISE,0   ;DEFINO COL1 COMO SALIDA

         
         #DEFINE COL2E   BSF   TRISE,1   ;DEFINO COL2 COMO ENTRADA   
         #DEFINE COL2S   BCF   TRISE,1 ;DEFINO COL2 COMO SALIDA
   
         #DEFINE COL3E   BSF   TRISE,2   ;DEFINO COL3 COMO ENTRADA   
         #DEFINE COL3S   BCF   TRISE,2   ;DEFINO COL3 COMO SALIDA

            
;********************************************************PROGRAMA*************************************************************

         ORG      H'0000'   
         GOTO    INICIO               ;IR AL INICIO DEL PROGRAMA

         ORG      H'0004'               ;ATENCION A LAS INTERUPCIONES
         RETFIE
;*********************************SUBRUTINA TABLA CONVERSION BCD A 7 SEGMENTOS*************************************************
TABLA      ADDWF   PCL,F
               ; GFBADEPC
         RETLW   B'01111101'      ;0   
         RETLW   B'00100001'      ;1   
         RETLW   B'10111100'      ;2   
         RETLW   B'10111001'      ;3   
         RETLW   B'11100001'      ;4   
         RETLW   B'11011001'      ;5   
         RETLW   B'11011101'      ;6   
         RETLW   B'00110001'      ;7   
         RETLW   B'11111101'      ;8   
         RETLW   B'11110001'      ;9               
;*********************************************SUBRUTINA DE RETARDO*************************************************************
RETARDO      MOVLW   VALOR1
         MOVWF   REG1
         MOVLW   VALOR2   
         MOVWF   REG2
LOOP      DECFSZ   REG1,F
         GOTO   LOOP
         DECFSZ   REG2,F
         GOTO   LOOP
         RETURN   

;*********************************************SUBRUTINA DE RETARDO1*************************************************************
RETARDO1   MOVLW   VALOR3
         MOVWF   REG3
         MOVLW   VALOR4   
         MOVWF   REG4
LOOP1      DECFSZ   REG1,F
         GOTO   LOOP1
         DECFSZ   REG2,F
         GOTO   LOOP
         RETURN   
;***********************************************SUBRUTINA DE MUESTREO*********************************************************
MUESTRO      
H         MOVF   DIGI1,W            ;MUEVO EL VALOR DE DIGI1 A W
         MOVWF   PORTC            ;MUEVO W AL PORT D PARA VISUALIZARLO
         BSF      TRD1   
         BCF      TRD2
         BCF      TRD3
         BCF      TRD4
         CALL   RETARDO
      

         MOVF   DIGI2,W            ;MUEVO EL VALOR DE DIGI2 A W
         MOVWF   PORTC            ;MUEVO W AL PORT D PARA VISUALIZARLO
         BCF      TRD1   
         BSF      TRD2
         BCF      TRD3
         BCF      TRD4
         CALL   RETARDO

         MOVF   DIGI3,W            ;MUEVO EL VALOR DE DIGI3 A W
         MOVWF   PORTC            ;MUEVO W AL PORT D PARA VISUALIZARLO
         BCF      TRD1   
         BCF      TRD2
         BSF      TRD3
         BCF      TRD4
         CALL   RETARDO
         

         MOVF   DIGI4,W            ;MUEVO EL VALOR DE DIGI4 A W
         MOVWF   PORTC            ;MUEVO W AL PORT D PARA VISUALIZARLO
         BCF      TRD1   
         BCF      TRD2
         BCF      TRD3
         BSF      TRD4
         CALL   RETARDO
         BTFSC   GRABO
         GOTO   AAA
         CALL   GD1
         BSF      LED1
AAA         BTFSC   RECU
         GOTO   H
         GOTO   RECUPE
         RETURN
;*********************************************RECUPERACION DE VALORES***********************************************************

RECUPE   
      
         CLRF   DIGI1
         CLRF   DIGI2
         CLRF   DIGI3
         CLRF   DIGI4
         CALL   RECUP1
         CALL   RECUP2
         CALL   RECUP3
         CALL   RECUP4
         CALL   MUESTRO1

;***********************************************SUBRUTINA DE MUESTREO VALOR RECUPERADO*********************************************
MUESTRO1   
X2      
         MOVF   DIGI1,W            ;MUEVO EL VALOR DE DIGI1 A W
         MOVWF   PORTC            ;MUEVO W AL PORT D PARA VISUALIZARLO
         BSF      TRD1   
         BCF      TRD2
         BCF      TRD3
         BCF      TRD4
         CALL   RETARDO
      

         MOVF   DIGI2,W            ;MUEVO EL VALOR DE DIGI2 A W
         MOVWF   PORTC            ;MUEVO W AL PORT D PARA VISUALIZARLO
         BCF      TRD1   
         BSF      TRD2
         BCF      TRD3
         BCF      TRD4
         CALL   RETARDO

         MOVF   DIGI3,W            ;MUEVO EL VALOR DE DIGI3 A W
         MOVWF   PORTC            ;MUEVO W AL PORT D PARA VISUALIZARLO
         BCF      TRD1   
         BCF      TRD2
         BSF      TRD3
         BCF      TRD4
         CALL   RETARDO
         

         MOVF   DIGI4,W            ;MUEVO EL VALOR DE DIGI4 A W
         MOVWF   PORTC            ;MUEVO W AL PORT D PARA VISUALIZARLO
         BCF      TRD1   
         BCF      TRD2
         BCF      TRD3
         BSF      TRD4
         CALL   RETARDO
         GOTO   X2
         RETURN
;******************************************SUBRUTINA DE LECTURA DE TECLADO *****************************************************
LEETEC            BANCO1            ;PASO AL BANCO CERO PARA CONFIGURAR
               COL1E            ;CONFIGURO COL1 COMO ENTRADA
               COL2E            ;CONFIGURO COL2 COMO ENTRADA
               COL3E            ;CONFIGURO COL3 COMO ENTRADA
                  
               BANCO0            ;PASAO AL BANCO CERO
         CLRF   TECPUL            ;LIMPIO LA VARIABLE TECPUL
         BSF      FIL1            ;PONGO A 1 FIL1
         BCF      FIL2            ;PONGO A 0 FIL2
         BCF      FIL3            ;PONGO A 0 FIL3   
         BCF     FIL4            ;PONGO A 0 FIL4
         CALL    RETARDO
         CALL    RETARDO
         CALL   RETARDO
         CALL    RETARDO
         CALL   RETARDO
         CALL   RETARDO   
         CALL   RETARDO
         CALL   RETARDO
         CALL   RETARDO
         CALL   RETARDO
         BTFSC   COL1            ;COL1=0?
         GOTO   LEE1            ;NO ES 0 VOY A LEE1
         MOVLW   B'00100001'         ;Nº 1 A W FILA 1 COLUMNA1
         MOVWF   TECPUL            ;MUEVO Nº1 A TECPUL

LEE1      CALL    RETARDO
         CALL    RETARDO
         CALL   RETARDO
         CALL    RETARDO
         CALL   RETARDO   
         CALL   RETARDO
         CALL   RETARDO
         CALL   RETARDO
         CALL   RETARDO
         CALL   RETARDO   
         BTFSC   COL2            ;COL2=0?
         GOTO    LEE2            ;NO ES 0 VOY A LEE2
         MOVLW   B'10111100'         ;Nº 2 A W FILA1 COLUMNA2
         MOVWF   TECPUL            ;MUEVO Nº2 A TECPUL

LEE2      CALL    RETARDO
         CALL    RETARDO
         CALL   RETARDO
         CALL    RETARDO
         CALL   RETARDO   
         CALL   RETARDO
         CALL   RETARDO
         CALL   RETARDO
         CALL   RETARDO
         CALL   RETARDO
         BTFSC   COL3            ;COL3=0?
         GOTO   LEE3            ;NO ES CERO VOY A LEE3
         MOVLW   B'10111001'         ;Nº 3 A W FILA1 COLUMNA 3
         MOVWF   TECPUL            ;MUEVO Nº 3 A TECPUL      

LEE3      BCF      FIL1
         BSF      FIL2
         CALL    RETARDO
         CALL    RETARDO
         CALL   RETARDO
         CALL    RETARDO
         CALL   RETARDO   
         CALL   RETARDO   
         CALL   RETARDO
         CALL   RETARDO
         CALL   RETARDO
         CALL   RETARDO
         BTFSC   COL1            ;COL1=0?
         GOTO   LEE4            ;NO ES 0 VOY A LEE4
         MOVLW   B'11100001'         ;Nº 4 A W FILA2 COLUMNA1
         MOVWF   TECPUL            ;MUEVO Nº 4 A TECPUL

LEE4      CALL    RETARDO
         CALL    RETARDO
         CALL   RETARDO
         CALL    RETARDO
         CALL   RETARDO   
         CALL   RETARDO
         CALL   RETARDO
         CALL   RETARDO   
         CALL   RETARDO
         CALL   RETARDO
         BTFSC   COL2            ;COL2=0?
         GOTO   LEE5            ;NO ES 0 VOY A LEE5
         MOVLW   B'11011001'         ;Nº 5 A W FILA2 COLUMNA2
         MOVWF   TECPUL            ;MUEVO Nº 5 A TECPUL

LEE5      CALL    RETARDO
         CALL    RETARDO
         CALL   RETARDO
         CALL    RETARDO
         CALL   RETARDO   
         CALL   RETARDO   
         CALL   RETARDO   
         CALL   RETARDO
         CALL   RETARDO
         CALL   RETARDO
         BTFSC   COL3            ;COL3=0?
         GOTO   LEE6            ;NO ES 0 VOY A LEE6
         MOVLW   B'11011101'         ;Nº 6 A W FILA2 COLUMNA3
         MOVWF   TECPUL            ;MUEVO Nº 6 A TECPUL


LEE6      BCF      FIL2   
         BSF      FIL3
         CALL    RETARDO
         CALL    RETARDO
         CALL   RETARDO
         CALL    RETARDO
         CALL   RETARDO   
         CALL   RETARDO   
         CALL   RETARDO   
         CALL   RETARDO
         CALL   RETARDO
         CALL   RETARDO
         BTFSC   COL1            ;COL1=0?
         GOTO   LEE7            ;NO ES 0 VOY A LEE7
         MOVLW   B'00110001'         ;Nº 7 A W FILA3 COLUMNA1
         MOVWF   TECPUL            ;MUEVO Nº 7 A TECPUL      

LEE7      CALL    RETARDO
         CALL    RETARDO
         CALL   RETARDO
         CALL    RETARDO
         CALL   RETARDO   
         CALL   RETARDO   
         CALL   RETARDO   
         CALL   RETARDO
         CALL   RETARDO
         CALL   RETARDO
         BTFSC   COL2            ;COL2=0?
         GOTO   LEE8            ;NO ES 0 VOY A LEE8
         MOVLW   B'11111101'         ;Nº 8 A W FILA3 COLUMNA2
         MOVWF   TECPUL            ;MUEVO Nº 8 A TECPUL

LEE8      CALL    RETARDO
         CALL    RETARDO
         CALL   RETARDO
         CALL    RETARDO
         CALL   RETARDO   
         CALL   RETARDO   
         CALL   RETARDO   
         CALL   RETARDO
         CALL   RETARDO
         CALL   RETARDO   
         BTFSC   COL3            ;COL3=0?
         GOTO   LEE9            ;NO ES 0 VOY A LEE9
         MOVLW   B'11110001'         ;Nº 9 A W FILA3 COLUMNA3
         MOVWF   TECPUL            ;MUEVO Nº 9 A TECPUL


LEE9      BCF      FIL3
         BSF      FIL4
         CALL    RETARDO
         CALL    RETARDO
         CALL   RETARDO
         CALL    RETARDO
         CALL   RETARDO   
         CALL   RETARDO   
         CALL   RETARDO   
         CALL   RETARDO   
         CALL   RETARDO
         CALL   RETARDO   
         BTFSC   COL1            ;COL2=0?
         GOTO   LEE10            ;NO ES 0 VOY A LEE10
         MOVLW   B'11110100'         ;LETRA P A W FILA4 COLUMNA1
         MOVWF   TECPUL            ;MUEVO P A TECPUL

LEE10      CALL    RETARDO
         CALL    RETARDO
         CALL   RETARDO
         CALL    RETARDO
         CALL   RETARDO   
         CALL   RETARDO   
         CALL   RETARDO   
         CALL   RETARDO
         CALL   RETARDO
         CALL   RETARDO   
         BTFSC   COL2            ;COL2=0?
         GOTO   LEE11            ;NO ES 0 VOY A LEE11
         MOVLW   B'01111101'         ;Nº 0 A W FILA4 COLUMNA2
         MOVWF   TECPUL            ;Nº 0 A TECPUL

LEE11      CALL    RETARDO
         CALL    RETARDO
         CALL   RETARDO
         CALL    RETARDO
         CALL   RETARDO   
         CALL   RETARDO   
         CALL   RETARDO   
         CALL   RETARDO
         CALL   RETARDO
         CALL   RETARDO   
         BTFSC   COL3            ;COL3=0?
         GOTO   LEE12            ;NO ES 0 VOY A LEE12
         MOVLW   B'11100101'            ;LETRA H A W FILA4 COLUMNA3
         MOVWF   TECPUL            ;LETRA H A TECPUL


LEE12      BCF    FIL4
         BANCO1
         COL1S
         COL2S
         COL3S
         BANCO0
         RETURN
         
      
;*********************************************SUBRUTINA PARA DISPLAY 1*********************************************************
DISPLAY1   CALL   RETARDO1
               
      
         CLRF   TECPUL            ;BORRO TECPUL
         CALL   LEETEC            ;LLAMO A LA SUBRUTINA DE LECTURA DE TECLADO
         MOVF   TECPUL,W         ;MUEVO EL VALOR DE TECPUL A W
         XORLW   .0               ;VERIFICO SI TECPUL ES CERO   
         BTFSC   STATUS,Z         ;VERIFICO SI Z=0
         GOTO   DISPLAY1         ;SI NO ES CERO VUELVO A DISPLAY1
         MOVF   TECPUL,W         ;PASO EL VALOR DE TECPUL A W
         MOVWF   DIGI1            ;PASO W A DIGI1
         RETURN

;*********************************************SUBRUTINA PARA DISPLAY 2*********************************************************
DISPLAY2   CALL   RETARDO1
      


         CLRF   TECPUL            ;BORRO TECPUL
         CALL   LEETEC            ;LLAMO A LA SUBRUTINA DE LECTURA DE TECLADO
         MOVF   TECPUL,W         ;MUEVO EL VALOR DE TECPUL A W
         XORLW   .0               ;VERIFICO SI TECPUL ES CERO   
         BTFSC   STATUS,Z         ;VERIFICO SI Z=0
         GOTO   DISPLAY2         ;SI NO ES CERO VUELVO A DISPLAY1
         MOVF   TECPUL,W         ;PASO EL VALOR DE TECPUL A W
         MOVWF   DIGI2            ;PASO W A DIGI2
         RETURN
;*********************************************SUBRUTINA PARA DISPLAY 3*********************************************************

DISPLAY3   CALL   RETARDO1
      

         CLRF   TECPUL            ;BORRO TECPUL
         CALL   LEETEC            ;LLAMO A LA SUBRUTINA DE LECTURA DE TECLADO
         MOVF   TECPUL,W         ;MUEVO EL VALOR DE TECPUL A W
         XORLW   .0               ;VERIFICO SI TECPUL ES CERO   
         BTFSC   STATUS,Z         ;VERIFICO SI Z=0
         GOTO   DISPLAY3         ;SI NO ES CERO VUELVO A DISPLAY1
         MOVF   TECPUL,W         ;PASO EL VALOR DE TECPUL A W
         MOVWF   DIGI3            ;PASO W A DIGI3
         RETURN

;*********************************************SUBRUTINA PARA DISPLAY 4*********************************************************

DISPLAY4   CALL   RETARDO1
         


         CLRF   TECPUL            ;BORRO TECPUL
         CALL   LEETEC            ;LLAMO A LA SUBRUTINA DE LECTURA DE TECLADO
         MOVF   TECPUL,W         ;MUEVO EL VALOR DE TECPUL A W
         XORLW   .0               ;VERIFICO SI TECPUL ES CERO   
         BTFSC   STATUS,Z         ;VERIFICO SI Z=0
         GOTO   DISPLAY4         ;SI NO ES CERO VUELVO A DISPLAY1
         MOVF   TECPUL,W         ;PASO EL VALOR DE TECPUL A W
         MOVWF   DIGI4            ;PASO W A DIGI4
         RETURN

;*********************************************SUBRUTINA GRABACION DIGITO 1 (GD1)***********************************************

GD1         BSF      STATUS,RP1
         BCF      STATUS,RP0         ;BANCO2
         MOVLW   0X00            ;MUEVO A W LA DIRECCION DE MEMORI A GRABAR
         MOVWF   EEADR            ;MUEVO LA DIRECION 0X01 A EEADR
         MOVF   DIGI1,W            ;MUEVO DIGI1 A W
         MOVWF   EEDATA            ;DIGI1 A EEDATA
         BSF      STATUS,RP0         ;BANCO3
         BCF      EECON1,EEPGD      
         BSF      EECON1,WREN         ;HABILITO ESCRITURA
         BCF      INTCON,GIE         ;DESHABILITO TODAS LAS INTERUPCIONES
         MOVLW   H'55'            ;REQUERIDO
         MOVWF   EECON2            ;REQUERIDO
         MOVLW   H'AA'            ;REQUERIDO
         MOVWF   EECON2            ;REQUERIDO
         BSF      EECON1,WR         ;DESHABILITO ESCRITURA
VERIF1      BTFSC   EECON1,WR
         GOTO   VERIF1
         BCF      EECON1,WREN
         BCF      STATUS,RP1
         BCF      STATUS,RP0   
   

;*********************************************SUBRUTINA GRABACION DIGITO 2 (GD2)***********************************************

         BSF      STATUS,RP1
         BCF      STATUS,RP0
         MOVLW   0X01
         MOVWF   EEADR
         MOVF   DIGI2,W
         MOVWF   EEDATA
         BSF      STATUS,RP0
         BCF      EECON1,EEPGD
         BSF      EECON1,WREN
         BCF      INTCON,GIE
         MOVLW   H'55'
         MOVWF   EECON2
         MOVLW   H'AA'
         MOVWF   EECON2
         BSF      EECON1,WR
VERIF2      BTFSC   EECON1,WR
         GOTO   VERIF2
         BCF      EECON1,WREN
         BCF      STATUS,RP1
         BCF      STATUS,RP0   
      

;*********************************************SUBRUTINA GRABACION DIGITO 3 (GD3)***********************************************

         BSF      STATUS,RP1
         BCF      STATUS,RP0
         MOVLW   0X02
         MOVWF   EEADR
         MOVF   DIGI3,W
         MOVWF   EEDATA
         BSF      STATUS,RP0
         BCF      EECON1,EEPGD
         BSF      EECON1,WREN
         BCF      INTCON,GIE
         MOVLW   H'55'
         MOVWF   EECON2
         MOVLW   H'AA'
         MOVWF   EECON2
         BSF      EECON1,WR
VERIF3      BTFSC   EECON1,WR
         GOTO   VERIF3
         BCF      EECON1,WREN
         BCF      STATUS,RP1
         BCF      STATUS,RP0   
         

;*********************************************SUBRUTINA GRABACION DIGITO 4 (GD4)***********************************************

         BSF      STATUS,RP1
         BCF      STATUS,RP0
         MOVLW   0X03
         MOVWF   EEADR
         MOVF   DIGI4,W
         MOVWF   EEDATA
         BSF      STATUS,RP0
         BCF      EECON1,EEPGD
         BSF      EECON1,WREN
         BCF      INTCON,GIE
         MOVLW   H'55'
         MOVWF   EECON2
         MOVLW   H'AA'
         MOVWF   EECON2
         BSF      EECON1,WR
VERIF4      BTFSC   EECON1,WR
         GOTO   VERIF4
         BCF      EECON1,WREN
         BCF      STATUS,RP1
         BCF      STATUS,RP0
         RETURN

;*********************************************SUBRUTINA RECUPERACION DIGITO1 (RECUP1)******************************************

RECUP1      BSF      STATUS,RP1
         BCF      STATUS,RP0
         MOVLW   0X00
         MOVWF   EEADR
         BSF      STATUS,RP0
         BCF      EECON1,EEPGD
         BSF      EECON1,RD
         BCF      STATUS,RP0
         MOVF   EEDATA,W
         BCF      STATUS,RP1
         BCF      STATUS,RP0
         MOVWF   DIGI1
         RETURN   

;*********************************************SUBRUTINA RECUPERACION DIGITO2 (RECUP2)******************************************

RECUP2      BSF      STATUS,RP1
         BCF      STATUS,RP0
         MOVLW   0X01
         MOVWF   EEADR
         BSF      STATUS,RP0
         BCF      EECON1,EEPGD
         BSF      EECON1,RD
         BCF      STATUS,RP0
         MOVF   EEDATA,W
         BCF      STATUS,RP1
         BCF      STATUS,RP0
         MOVWF   DIGI2
         RETURN   

;*********************************************SUBRUTINA RECUPERACION DIGITO3 (RECUP3)******************************************

RECUP3      BSF      STATUS,RP1
         BCF      STATUS,RP0
         MOVLW   0X02
         MOVWF   EEADR
         BSF      STATUS,RP0
         BCF      EECON1,EEPGD
         BSF      EECON1,RD
         BCF      STATUS,RP0
         MOVF   EEDATA,W
         BCF      STATUS,RP1
         BCF      STATUS,RP0
         MOVWF   DIGI3
         RETURN   

;*********************************************SUBRUTINA RECUPERACION DIGITO4 (RECUP4)******************************************

RECUP4      BSF      STATUS,RP1
         BCF      STATUS,RP0
         MOVLW   0X03
         MOVWF   EEADR
         BSF      STATUS,RP0
         BCF      EECON1,EEPGD
         BSF      EECON1,RD
         BCF      STATUS,RP0
         MOVF   EEDATA,W
         BCF      STATUS,RP1
         BCF      STATUS,RP0
         MOVWF   DIGI4
         RETURN

;*****************************************SUBRUTINA BIN A BCD 10 BIT***********************************************************

STAR      CLRF   HSD
         CLRF   VSD
         CALL   BINBCD
OUT         BTFSC   ADRESA,0
         CALL   PRIM
         BTFSC   ADRESA,1
         CALL   SEGU
         RETURN

BINBCD      MOVF   ADRES,W
         CLRF   MSD
         MOVWF   LSD
GTENTH      MOVLW   0X0A
         SUBWF   LSD,W
         BTFSS   STATUS,C
         GOTO   OVER
         MOVWF   LSD
         INCF   MSD,F
         GOTO   GTENTH
OVER
TENTH      MOVLW   0X0A
         SUBWF   MSD,W
         BTFSS   STATUS,C
         RETLW   0
         MOVWF   MSD
         INCF   VSD,F
         GOTO   TENTH
PRIM      MOVF   LSD,W
         ADDLW   0X06
         MOVWF   LSD
         CALL   ADJDEC
         MOVF   MSD,W
         ADDLW   0X05
         MOVWF   MSD
         CALL   ADJDEC
         MOVF   VSD,W
         ADDLW   0X02
         MOVWF   VSD
         RETURN

SEGU      MOVF   LSD,W
         ADDLW   0X02
         MOVWF   LSD
         CALL   ADJDEC
         MOVF   MSD,W
         ADDLW   0X01
         MOVWF   MSD
         CALL   ADJDEC
         MOVF   VSD,W
         ADDLW   0X05
         MOVWF   VSD
         CALL   ADJDEC
         RETURN

ADJDEC      MOVLW   0X0A
         SUBWF   LSD,0
         BTFSS   STATUS,C
         GOTO   DEC
         MOVLW   0X06
         ADDWF   LSD,1
         MOVLW   0X0F
         ANDWF   LSD,1
         INCF   MSD,1

DEC         MOVLW   0X0A
         SUBWF   MSD,0
         BTFSS   STATUS,C
         GOTO   CEN
         MOVLW   0X06
         ADDWF   MSD,1
         MOVLW   0X0F
         ANDWF   MSD,1
         INCF   VSD,1

CEN         MOVLW   0X0A
         SUBWF   VSD,0
         BTFSS   STATUS,C
         GOTO   MIL
         MOVLW   0X06
         ADDWF   VSD,1
         MOVLW   0X0F
         ANDWF   VSD,1
         INCF   HSD,1

MIL         RETURN

;*************************************SUBRUTINA LECTURA ENTRADA ANALOGICA A0***************************************************

MEDIR      MOVLW   B'10000001'
         MOVWF   ADCON0            ;SELECCIONO RA0
         MOVLW   .75               ;RETARDO NECESARIO ANTES DE LA CONVERSION
         MOVWF   REG5
MEDIR1      NOP
         DECFSZ   REG5,F
         GOTO   MEDIR1
         BSF      ADCON,GO         ;COMIENZA LA CONVERSION
         NOP
MEDIR2      BTFSC   ADCON,GO         ;¿ES EL FIN DE LA CONVERSION?
         GOTO   MEDIR2
         MOVF   ADRESH,W
         MOVWF   ADRESA
         
         BANCO1
         MOVF   ADRESL,W
         BANCO0
         MOVWF   ADRES
         RETURN
            
;************************************************INICIALIZACION****************************************************************

INIPIC      BANCO1

         MOVLW  B'10110100'    
         MOVWF  ADCON1            ;CONFIGURO A0, A1 Y A3 COMO ENTRADAS ANALOGICAS
         MOVLW  B'001011'    
         MOVWF  TRISA            ;CONFIGURO EL PUERTO A

         MOVLW  B'11000000'
         MOVWF  TRISB            ;CONFIGURO EL PUERTO B COMO SALIDA (B7 Y B6 ENTRADAS)

         MOVLW  B'00000000'
         MOVWF  TRISC            ;CONFIGURO EL PUERTO C COMO SALIDA

         MOVLW  B'00000000'
         MOVWF  TRISD            ;CONFIGURO EL PUERTO D COMO SALIDA

         MOVLW  B'000'
         MOVWF  TRISE            ;CONFIGURO EL PUERTO E COMO SALIDA

      
         MOVLW  B'00000000'
         MOVWF  INTCON            ;DESHABILITO LAS INTERRUPCIONES

   

         BANCO0

         CLRF   PORTA
         CLRF   PORTB
         CLRF    PORTC
         CLRF   PORTD
         CLRF   PORTE
         RETURN

;**************************************************PROGRAMA PRINCIPAL**********************************************************

INICIO      CALL   INIPIC            ;LLAMO A LA RUTINA DE INICIALIZACION

      
      

         CALL   DISPLAY1         ;LLAMO A LA SUBRUTINA DE LECTURA DE DISPLAY1
         CALL   DISPLAY2         ;LLAMO A LA SUBRUTINA DE LECTURA DE DISPLAY2
         CALL   DISPLAY3         ;LLAMO A LA SUBRUTINA DE LECTURA DE DISPLAY3   
         CALL   DISPLAY4         ;LLAMO A LA SUBRUTINA DE LECTURA DE DISPLAY4
HHH         CALL   MUESTRO
         GOTO   HHH
      

         
         

      
         END

Desconectado Daikataro

  • PIC10
  • *
  • Mensajes: 22
Re: Mostrar en cuatro display de 7 segmentos el resultado del conversor A/D
« Respuesta #6 en: 06 de Marzo de 2015, 02:28:07 »
Uy... ensamblador... Definitivamente poderoso, pero fácilmente quintuplica la cantidad de líneas que tendrías con cualquier otro lenguaje, sin mencionar que hace el código mucho más difícil y tedioso de leer.

Mi recomendación personal es que migres y aprendas un lenguaje de alto nivel (C, BASIC, etc.) para que sea más sencillo trabajar; para los proyectos comunes no es necesario el dominio de bajo nivel de asm, y muchos compiladores incluso te permiten incluir código asm como subrutina a llamar en caso de necesitarla.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Mostrar en cuatro display de 7 segmentos el resultado del conversor A/D
« Respuesta #7 en: 06 de Marzo de 2015, 03:36:22 »
Si poderoso cuando esta bien usado... Pero esta bien que aprenda ASM.

El tema es que trato de hacer tantas cosas que cada una tiene su error y hace que todo ande mal.
Uno de los temas es, ojo con ponerle nombre a las salidas, especialmente si se lo vas a dar a alguien para que lo revise, en ese caso trata de tener un formato:

Out_Teclado_Columna1
Out_Teclado_Columna2
In_Teclado_Fila1

etc etc etc.. Sino estas complicandote mas que ayudandote. cuando tenes que debuggear el programa.

No se que necesidad de hacer esto:

Código: [Seleccionar]
        #DEFINE COL1E   BSF   TRISE,0   ;DEFINO COL1 COMO ENTRADA
         #DEFINE COL1S   BCF   TRISE,0   ;DEFINO COL1 COMO SALIDA

Cuando lo podrias haber dejado como entrada y listo.

Estas cosas:

Código: [Seleccionar]
        BSF      TRD1  
         BCF      TRD2
         BCF      TRD3
         BCF      TRD4

no se hacen cuando son puertos, mejor un MOVWF 0x80. Por varios motivos ademas de ahorrar lineas.

La rutina de lectura de teclado... Tiene sus fallas y es extremadamente larga deberia existir una solucion mucho mas corta. Las fallas que veo son que utilizas retardos para "detectar" si es otra pulsacion + el largo codigo....
Ademas metiste Tooooodooos esos retardos afectando luego a la muestra del display, ya que entre muestra y muestra tenes todos esos retardos. Podes hacerlo con interrupciones. RB4 a Rb7 tienen interrupcion por cambio.

Aqui entramos en un problema, si vas a quedarte esperando que alguien presione una tecla para tomar los datos entonces no podes mostrar asi los datos del display. Ya que mientras este esperando nunca va a ocurrir la multiplexacion de los mismo.

La rutina de grabacion/lectura de EEPROM podrias haber realizado una sola y pasarle los parametros por un registro, asi era mucho mas simple y no que lleve todas esas lineas por cada numero a guardar.

Aca tenes otro error:

Código: [Seleccionar]
        BSF      LED1
AAA         BTFSC   RECU
         GOTO   H
         GOTO   RECUPE
         RETURN

Imagino que intentaste poner CALL RECUPE, sino no funcionaria como queres, ya que ese GOTO jaams volveria para ese return.

Tenes 2 funciones para mostrar los displays.... cuando podrias realizar una..

Tenes las funciones para pasar los numeros a BCD (no se si anda) y para luego hacer la busqueda en la tabla pero esto no lo estas usando por que imagino que eso es para el ADC que tampoco lo estas utilizando, y hasta que no termines de arreglar y que funcione lo de arriba no recomiendo que sigas con eso



Un ejemplo de lo que dije arriba... Rutina de lectura de la EEPROM:

Código: [Seleccionar]
RECUPERAR
         BCF     STATUS,IRP      ;Pongo a 0 el bit mas significativo del direccionamiento indirecto, por si alguien lo cambio, aunque de reset esta con 0
MOVLW  DIGI4           ; Cargo direccion de Digi4
MOVWF    FSR
         MOVLW    0x04              ; Cargo mi contador
         MOVWF    REG_TEMPORAL
LOOP
         BSF      STATUS,RP1
         BCF      STATUS,RP0
         DECF  REG_TEMPORAL,W   ; Cargo W con Contador - 1, asi la direcciones van desde 0x00 a 0x03
         MOVWF    EEADR
         BSF      STATUS,RP0
         BCF      EECON1,EEPGD
         BSF      EECON1,RD
         BCF      STATUS,RP0
         MOVF     EEDATA,W
         BCF      STATUS,RP1
         BCF      STATUS,RP0
         MOVWF    INDF
         DECF  FSR,F          ;Decremetno la direccion apuntando a Digi3, digi2, digi1
         DECFSZ  REG_TEMPORAL,F    ; Decremento mi contador, cuando llega a 0x00 sale
         GOTO LOOP
         RETURN  

El registro indirecto comienza apuntando a DIGI4, toma el valor de la pocision de memoria 0x03 de la EEPROM y lo guarda en DIGI4. luego decrementa el direccionamiento indirecto y el "contador de digitos" (REG_TEMPORAL) , y ahora apunta a DIGI3 y la pocision de memoria 0x02. asi consecutivamente hasta que llega al 0x00 y en ese momento sale. Todo es una sola funcion. de la misma forma podes hacer la grabacion, pero necesitas saber como funciona el acceso indirecto.

Lo que esta en FSR es la direccion. Yo cargue DIGI4 que vale 0x25, el registro INDF me permite leer/escribir lo que apunta el registro FSR, es decir la direccion 0x25.
Imaginate funciones asi para : lectura del teclado, mostrar el display, escribir eeprom. y tu programa seria mucho mas lindo de leer.



Como cnosejo trata de que cada una de las partes que hagas funcionen perfectamente ante cualquier situacion, luego las vas juntando. Los delays son malos, pero a veces necesarios en algunos casos.
« Última modificación: 06 de Marzo de 2015, 04:16:01 por KILLERJC »

Desconectado cdaiag

  • PIC10
  • *
  • Mensajes: 18
Re: Mostrar en cuatro display de 7 segmentos el resultado del conversor A/D
« Respuesta #8 en: 06 de Marzo de 2015, 08:03:45 »
Uy... ensamblador... Definitivamente poderoso, pero fácilmente quintuplica la cantidad de líneas que tendrías con cualquier otro lenguaje, sin mencionar que hace el código mucho más difícil y tedioso de leer.

Mi recomendación personal es que migres y aprendas un lenguaje de alto nivel (C, BASIC, etc.) para que sea más sencillo trabajar; para los proyectos comunes no es necesario el dominio de bajo nivel de asm, y muchos compiladores incluso te permiten incluir código asm como subrutina a llamar en caso de necesitarla.

Buen día entiendo lo que me comentás y voy a trabajar en las modificaciones, actualmente el programa funciona, la duda mía es si cuando utilizo la tabla esta va a interpretar el código BCD para buscar el calor osea si cargo en W 1000 que es en decimal 8 que busque esa posición en la tabla. Este programa que pase en realidad es para poner en marcha diferentes partes para luego si realizar un proyecto final por eso por ejemplo tengo la rutina para grabar un valor y recuperarlo pero nada más.

Desde ya muchas gracias por tu atención

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Mostrar en cuatro display de 7 segmentos el resultado del conversor A/D
« Respuesta #9 en: 06 de Marzo de 2015, 13:51:45 »
Si tu ADC lee 1000 en decimal = 0x3E8
Con tu programa de BCD deberias tener a la salida 4 registros con los valores: 0x01 , 0x00 , 0x00 , 0x00  (seria lo mas simple si tenes espacio)
O... 2 registros con los valores: 0x10 y 0x00 , que luego tenes que separar y se complica mas el codigo.

Podrias probar tu conversor Binario-> BCD poniendo un valor fijo en los registros de entrada (creo que son ADRES y ADRESA) y probar que efectivamente sale eso. De alli es cargar esos valores a W y hacer un CALL a la tabla.
Lo unico que noto es que la tabla usas los 8 bits, pero para un display deberias tener 7 bits + 1bit que siempre estaria en 0.

Podes observar tambien que el 0 esta mal hecho, segun como tenes definido arriba en el comment los pines :
 ;            GFBADEPC
RETLW   B'01111101'      ;0

Para el 0 el unico segmento apagado es el G, y como dije antes tenes 8 bits y no 7 ( o 7 + 1 siempre en 0 ).

RETLW   B'01111110'      ;0          

Ahi le puse a 1 el segmento que falta y dejo siempre el ultimo bit a 0, todo eso depende de como tengas hecho tu HW.

Pero bueno veo que usaste esos valores para tu otra parte del codigo y te anduvo bien, si asi te anda seguilo asi.. aunque como dije solo necesitas 7 bits para un display 7 segmentos



PD:

Jugando anoche hice esto:

Código: ASM
  1. ;Salida: TECPUL = 0x00 a 0x0C , 0x00 indica nada presionado, 0x01 a 0x0C , teclas de 1 al 12
  2.  
  3. LEE_TECLADO          
  4.                  
  5.          BANCO0            ;PASAO AL BANCO CERO
  6.          CLRF   TECPUL            ;LIMPIO LA VARIABLE TECPUL
  7.          CLRF   REG_TEMPORAL,F
  8.          INCF   REG_TEMPORAL,F
  9.  
  10. LOOP_lecura
  11.  
  12.          MOVF   REG_TEMPORAL,W
  13.          MOVWF  PORTD
  14.          MOVF   PORTE,W
  15.          BTFSZ  STATUS,Z        ; Si no detecto nada sumo 3 y vuelvo a cambiar de fila
  16.          GOTO   TECLA_DETECTADA ; Si detecto algo voy a ver que es
  17.          MOVF   TECPUL,W
  18.          ADDLW  0x03            ; Sumo 3 por cada vez que no detecto nada
  19.          MOVWF  TECPUL          ; Guardo el valor temporalmente
  20.          BCF    STATUS,C
  21.          RLF    REG_TEMPORAL,; Roto a la otra fila, pongo en 0 el carry para que no exista un 1 de algun otro carry ( que no deberia ya que TECPUL no pasaria de 12 )
  22.          BTFSS  REG_TEMPORAL,4  ; Si esta en 0 entonces quiere decir que tengo que seguir rotando
  23.          GOTO   LOOP_lectura
  24.          CLRF   TECPUL,F        ; Limpio TECPUL, no detecte nada
  25.          RETURN
  26.  
  27. TECLA_DETECTADA
  28.  
  29.          MOVF   TECPUL,W
  30.          BTFSS  COL1
  31.          GOTO   COLUMNA2
  32.          ADDLW  0x01
  33.          MOVWF  TECPUL
  34.          RETURN
  35. COLUMNA2
  36.          BTFSS  COL2
  37.          GOTO   COLUMNA3
  38.          ADDLW  0x02
  39.          MOVWF  TECPUL
  40.          RETURN
  41. COLUMNA3
  42.          ADDLW  0x03
  43.          MOVWF  TECPUL
  44.          RETURN
  45.  
  46. ; Cuando vuelva llamas a la tabla asi devuelve el valor que deberia, a la tabla tendrias que agregarle los demas valores. o puede que tengas que cambiar un poco la tabla/o hacer otra.

y

Código: ASM
  1. GRABAR
  2.          BANKSEL PORTA          ;Banco 0
  3.          BCF    INTCON,GIE      ;DESHABILITO TODAS LAS INTERUPCIONES
  4.          BCF     STATUS,IRP      ;Pongo a 0 el bit mas significativo del direccionamiento indirecto, por si alguien lo cambio, aunque de reset esta con 0
  5.          MOVLW    DIGI4           ; Cargo direccion de Digi4
  6.          MOVWF    FSR
  7.          MOVLW    0x04              ; Cargo mi contador
  8.          MOVWF    REG_TEMPORAL
  9.  
  10. LOOP_GRABAR
  11.  
  12.          BANKSEL PORTA          ;Banco 0
  13.          DECF   REG_TEMPORAL,W  ;Direccion a escribir, comienza con 0x03 ( 0x04 - 1 )
  14.          BSF    STATUS,RP1
  15.          BCF    STATUS,RP0      ;BANCO2
  16.          MOVWF  EEADR          
  17.          MOVF   INDF,W          ;MUEVO lo que me apunta FSR, comenzando por Digi4
  18.          MOVWF  EEDATA         
  19.          BSF    STATUS,RP0      ;BANCO3
  20.          BCF    EECON1,EEPGD      
  21.          BSF    EECON1,WREN     ;HABILITO ESCRITURA
  22.          MOVLW  H'55'           ;REQUERIDO
  23.          MOVWF  EECON2          ;REQUERIDO
  24.          MOVLW  H'AA'           ;REQUERIDO
  25.          MOVWF  EECON2          ;REQUERIDO
  26.          BSF    EECON1,WR       ;DESHABILITO ESCRITURA
  27. VERIF
  28.          BTFSC  EECON1,WR
  29.          GOTO   VERIF
  30.          DECF     FSR,F          ;Decremetno la direccion apuntando a Digi3, digi2, digi1
  31.          DECFSZ   REG_TEMPORAL,F    ; Decremento mi contador, cuando llega a 0x00 sale
  32.          GOTO LOOP_GRABAR
  33.  
  34.          ;BSF   INTCON,GIE      ; Habilito interrupciones por si hace falta, por eso esta comentado
  35.          BCF    EECON1,WREN
  36.          BCF    STATUS,RP1
  37.          BCF    STATUS,RP0
  38.          RETURN
« Última modificación: 06 de Marzo de 2015, 13:58:51 por KILLERJC »

Desconectado cdaiag

  • PIC10
  • *
  • Mensajes: 18
Re: Mostrar en cuatro display de 7 segmentos el resultado del conversor A/D
« Respuesta #10 en: 06 de Marzo de 2015, 14:08:32 »
Si tu ADC lee 1000 en decimal = 0x3E8
Con tu programa de BCD deberias tener a la salida 4 registros con los valores: 0x01 , 0x00 , 0x00 , 0x00  (seria lo mas simple si tenes espacio)
O... 2 registros con los valores: 0x10 y 0x00 , que luego tenes que separar y se complica mas el codigo.

Podrias probar tu conversor Binario-> BCD poniendo un valor fijo en los registros de entrada (creo que son ADRES y ADRESA) y probar que efectivamente sale eso. De alli es cargar esos valores a W y hacer un CALL a la tabla.
Lo unico que noto es que la tabla usas los 8 bits, pero para un display deberias tener 7 bits + 1bit que siempre estaria en 0.

Podes observar tambien que el 0 esta mal hecho, segun como tenes definido arriba en el comment los pines :
 ;            GFBADEPC
RETLW   B'01111101'      ;0

Para el 0 el unico segmento apagado es el G, y como dije antes tenes 8 bits y no 7 ( o 7 + 1 siempre en 0 ).

RETLW   B'01111110'      ;0          

Ahi le puse a 1 el segmento que falta y dejo siempre el ultimo bit a 0, todo eso depende de como tengas hecho tu HW.

Pero bueno veo que usaste esos valores para tu otra parte del codigo y te anduvo bien, si asi te anda seguilo asi.. aunque como dije solo necesitas 7 bits para un display 7 segmentos



PD:

Jugando anoche hice esto:

Código: ASM
  1. ;Salida: TECPUL = 0x00 a 0x0C , 0x00 indica nada presionado, 0x01 a 0x0C , teclas de 1 al 12
  2.  
  3. LEE_TECLADO          
  4.                  
  5.          BANCO0            ;PASAO AL BANCO CERO
  6.          CLRF   TECPUL            ;LIMPIO LA VARIABLE TECPUL
  7.          CLRF   REG_TEMPORAL,F
  8.          INCF   REG_TEMPORAL,F
  9.  
  10. LOOP_lecura
  11.  
  12.          MOVF   REG_TEMPORAL,W
  13.          MOVWF  PORTD
  14.          MOVF   PORTE,W
  15.          BTFSZ  STATUS,Z        ; Si no detecto nada sumo 3 y vuelvo a cambiar de fila
  16.          GOTO   TECLA_DETECTADA ; Si detecto algo voy a ver que es
  17.          MOVF   TECPUL,W
  18.          ADDLW  0x03            ; Sumo 3 por cada vez que no detecto nada
  19.          MOVWF  TECPUL          ; Guardo el valor temporalmente
  20.          BCF    STATUS,C
  21.          RLF    REG_TEMPORAL,; Roto a la otra fila, pongo en 0 el carry para que no exista un 1 de algun otro carry ( que no deberia ya que TECPUL no pasaria de 12 )
  22.          BTFSS  REG_TEMPORAL,4  ; Si esta en 0 entonces quiere decir que tengo que seguir rotando
  23.          GOTO   LOOP_lectura
  24.          CLRF   TECPUL,F        ; Limpio TECPUL, no detecte nada
  25.          RETURN
  26.  
  27. TECLA_DETECTADA
  28.  
  29.          MOVF   TECPUL,W
  30.          BTFSS  COL1
  31.          GOTO   COLUMNA2
  32.          ADDLW  0x01
  33.          MOVWF  TECPUL
  34.          RETURN
  35. COLUMNA2
  36.          BTFSS  COL2
  37.          GOTO   COLUMNA3
  38.          ADDLW  0x02
  39.          MOVWF  TECPUL
  40.          RETURN
  41. COLUMNA3
  42.          ADDLW  0x03
  43.          MOVWF  TECPUL
  44.          RETURN
  45.  
  46. ; Cuando vuelva llamas a la tabla asi devuelve el valor que deberia, a la tabla tendrias que agregarle los demas valores. o puede que tengas que cambiar un poco la tabla/o hacer otra.

y

Código: ASM
  1. GRABAR
  2.          BANKSEL PORTA          ;Banco 0
  3.          BCF    INTCON,GIE      ;DESHABILITO TODAS LAS INTERUPCIONES
  4.          BCF     STATUS,IRP      ;Pongo a 0 el bit mas significativo del direccionamiento indirecto, por si alguien lo cambio, aunque de reset esta con 0
  5.          MOVLW    DIGI4           ; Cargo direccion de Digi4
  6.          MOVWF    FSR
  7.          MOVLW    0x04              ; Cargo mi contador
  8.          MOVWF    REG_TEMPORAL
  9.  
  10. LOOP_GRABAR
  11.  
  12.          BANKSEL PORTA          ;Banco 0
  13.          DECF   REG_TEMPORAL,W  ;Direccion a escribir, comienza con 0x03 ( 0x04 - 1 )
  14.          BSF    STATUS,RP1
  15.          BCF    STATUS,RP0      ;BANCO2
  16.          MOVWF  EEADR          
  17.          MOVF   INDF,W          ;MUEVO lo que me apunta FSR, comenzando por Digi4
  18.          MOVWF  EEDATA         
  19.          BSF    STATUS,RP0      ;BANCO3
  20.          BCF    EECON1,EEPGD      
  21.          BSF    EECON1,WREN     ;HABILITO ESCRITURA
  22.          MOVLW  H'55'           ;REQUERIDO
  23.          MOVWF  EECON2          ;REQUERIDO
  24.          MOVLW  H'AA'           ;REQUERIDO
  25.          MOVWF  EECON2          ;REQUERIDO
  26.          BSF    EECON1,WR       ;DESHABILITO ESCRITURA
  27. VERIF
  28.          BTFSC  EECON1,WR
  29.          GOTO   VERIF
  30.          DECF     FSR,F          ;Decremetno la direccion apuntando a Digi3, digi2, digi1
  31.          DECFSZ   REG_TEMPORAL,F    ; Decremento mi contador, cuando llega a 0x00 sale
  32.          GOTO LOOP_GRABAR
  33.  
  34.          ;BSF   INTCON,GIE      ; Habilito interrupciones por si hace falta, por eso esta comentado
  35.          BCF    EECON1,WREN
  36.          BCF    STATUS,RP1
  37.          BCF    STATUS,RP0
  38.          RETURN

Gracias por la informacion que me pasaste, el tema es el siguiente la rutina BINBCD que utilizo en el programa que en algún momento hace tiempo la probé entrega por ejemplo los valores con los códigos que hay que ponerle a un 4511 en A B C D esos códigos si por ejemplo cargo uno como 1000  en W y llamo a la tabla esta mostraría el 8 no se si me explico bien

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Mostrar en cuatro display de 7 segmentos el resultado del conversor A/D
« Respuesta #11 en: 06 de Marzo de 2015, 14:37:56 »
Exactametne, tiene su salida en binario ( BCD ya que no superaria el 9 ), Cada digito tiene registro de salida.

Tu codigo BCD funciona de la siguiente forma...

Ingresas el codigo por ADRES y ADRESA (10 bit diretamente desde el ADC asi como lo tenes)
(Lo simule y ADRES me cuenta como una palabra reservada o un registro, por eso en mi caso le puse ADRESB el nombre por las dudas)

Salida:

    LSD  : unidades
    MSD : decenas
    VSD  : centenas
    HSD  : miles

De ahi tenes que cargar cada valor de esos a W.. llamar a la tabla .. ahi el nuevo valor se carga en W nuevamente y ese valor va a al puerto segun el display que sea.

Ejemplo:

Código: ASM
  1. MOSTRAR_DISPLAY_UNIDADES
  2.      MOVF  LSD,W       ;Cargo mi valor en binario/BCD
  3.      CALL TABLA          ;Lo transformo de BCD a 7 segmentos
  4.      BCF TRD4,F          ; Apago catodo de los miles
  5.      MOVWF PORTC      ; Cambio el puerto C por el nuevo valor
  6.      BSF TRD1,F          ; enciendo el display de las unidades
  7.      CALL DEMORA       ; Puse la demora para que este parecido al tuyo.
  8.  
  9. MOSTRAR_DISPLAY_DECENAS
  10.      MOVF  MSD,W       ; Repito lo mismo que arriba nomas que para las decenas y deberia repetirlo para todos los demas.
  11.      CALL TABLA
  12.      BCF TRD1,F
  13.      MOVWF PORTC
  14.      BSF TRD2,F
  15.      CALL DEMORA
  16.  
  17. ; etc para los demas. es solo un ejemplo
« Última modificación: 06 de Marzo de 2015, 14:45:21 por KILLERJC »

Desconectado cdaiag

  • PIC10
  • *
  • Mensajes: 18
Re: Mostrar en cuatro display de 7 segmentos el resultado del conversor A/D
« Respuesta #12 en: 06 de Marzo de 2015, 14:49:39 »
Exactametne, tiene su salida en binario ( BCD ya que no superaria el 9 ), Cada digito tiene registro de salida.

Tu codigo BCD funciona de la siguiente forma...

Ingresas el codigo por ADRES y ADRESA (10 bit diretamente desde el ADC asi como lo tenes)
(Lo simule y ADRES me cuenta como una palabra reservada o un registro, por eso en mi caso le puse ADRESB el nombre por las dudas)

Salida:

    LSD  : unidades
    MSD : decenas
    VSD  : centenas
    HSD  : miles

De ahi tenes que cargar cada valor de esos a W.. llamar a la tabla .. ahi el nuevo valor se carga en W nuevamente y ese valor va a al puerto segun el display que sea.

Ejemplo:

Código: ASM
  1. MOSTRAR_DISPLAY_UNIDADES
  2.      MOVF  LSD,W       ;Cargo mi valor en binario/BCD
  3.      CALL TABLA          ;Lo transformo de BCD a 7 segmentos
  4.      BCF TRD4,F          ; Apago catodo de los miles
  5.      MOVWF PORTC      ; Cambio el puerto C por el nuevo valor
  6.      BSF TRD1,F          ; enciendo el display de las unidades
  7.      CALL DEMORA       ; Puse la demora para que este parecido al tuyo.
  8.  
  9. MOSTRAR_DISPLAY_DECENAS
  10.      MOVF  MSD,W       ; Repito lo mismo que arriba nomas que para las decenas y deberia repetirlo para todos los demas.
  11.      CALL TABLA
  12.      BCF TRD1,F
  13.      MOVWF PORTC
  14.      BSF TRD2,F
  15.      CALL DEMORA
  16.  
  17. ; etc para los demas. es solo un ejemplo

Ok lo voy a probar como vos decís y te paso el programa como quedó y vemos si hay algo mal, desde ya gracias por tu ayuda

Desconectado cdaiag

  • PIC10
  • *
  • Mensajes: 18
Re: Mostrar en cuatro display de 7 segmentos el resultado del conversor A/D
« Respuesta #13 en: 06 de Marzo de 2015, 21:02:19 »
Exactametne, tiene su salida en binario ( BCD ya que no superaria el 9 ), Cada digito tiene registro de salida.

Tu codigo BCD funciona de la siguiente forma...

Ingresas el codigo por ADRES y ADRESA (10 bit diretamente desde el ADC asi como lo tenes)
(Lo simule y ADRES me cuenta como una palabra reservada o un registro, por eso en mi caso le puse ADRESB el nombre por las dudas)

Salida:

    LSD  : unidades
    MSD : decenas
    VSD  : centenas
    HSD  : miles

De ahi tenes que cargar cada valor de esos a W.. llamar a la tabla .. ahi el nuevo valor se carga en W nuevamente y ese valor va a al puerto segun el display que sea.

Ejemplo:

Código: ASM
  1. MOSTRAR_DISPLAY_UNIDADES
  2.      MOVF  LSD,W       ;Cargo mi valor en binario/BCD
  3.      CALL TABLA          ;Lo transformo de BCD a 7 segmentos
  4.      BCF TRD4,F          ; Apago catodo de los miles
  5.      MOVWF PORTC      ; Cambio el puerto C por el nuevo valor
  6.      BSF TRD1,F          ; enciendo el display de las unidades
  7.      CALL DEMORA       ; Puse la demora para que este parecido al tuyo.
  8.  
  9. MOSTRAR_DISPLAY_DECENAS
  10.      MOVF  MSD,W       ; Repito lo mismo que arriba nomas que para las decenas y deberia repetirlo para todos los demas.
  11.      CALL TABLA
  12.      BCF TRD1,F
  13.      MOVWF PORTC
  14.      BSF TRD2,F
  15.      CALL DEMORA
  16.  
  17. ; etc para los demas. es solo un ejemplo

Ok lo voy a probar como vos decís y te paso el programa como quedó y vemos si hay algo mal, desde ya gracias por tu ayuda

Que tal buenas noches te copio la prueba que realice directamente le cargo a W B'1000' que sería 8 en BCD llamo a la tabla y luego lo paso al puerto C y lo dejo en un Loop y no funciona es más si funciona el resto lo cual no tendría que pasar por dejar el Loop puesto

INICIO      CALL   INIPIC            ;LLAMO A LA RUTINA DE INICIALIZACION
OCHO              MOVLW    B'1000'
         CALL            TABLA
         MOVWF   PORTC
         BSF      TRD1
         GOTO    OCHO
         
      
      

         CALL   DISPLAY1         ;LLAMO A LA SUBRUTINA DE LECTURA DE DISPLAY1
         CALL   DISPLAY2         ;LLAMO A LA SUBRUTINA DE LECTURA DE DISPLAY2
         CALL   DISPLAY3         ;LLAMO A LA SUBRUTINA DE LECTURA DE DISPLAY3   
         CALL   DISPLAY4         ;LLAMO A LA SUBRUTINA DE LECTURA DE DISPLAY4
HHH         CALL   MUESTRO
         GOTO   HHH

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Mostrar en cuatro display de 7 segmentos el resultado del conversor A/D
« Respuesta #14 en: 07 de Marzo de 2015, 01:39:24 »
Yo simule tu BCD al cual le agregue la llamada a la tabla y funciona perfecto...

Código: ASM
  1. TABLA      ADDWF   PCL,F
  2.                ; GFBADEPC
  3.          RETLW   B'01111101'      ;0
  4.          RETLW   B'00100001'      ;1
  5.          RETLW   B'10111100'      ;2
  6.          RETLW   B'10111001'      ;3
  7.          RETLW   B'11100001'      ;4
  8.          RETLW   B'11011001'      ;5
  9.          RETLW   B'11011101'      ;6
  10.          RETLW   B'00110001'      ;7
  11.          RETLW   B'11111101'      ;8 = 0xFD ese binario
  12.          RETLW   B'11110001'      ;9
  13.  
  14.  
  15. MAIN
  16.     ; AQUI CONVERSION BCD
  17.     MOVLW 0x08
  18.     MOVWF ADRESB
  19.     MOVLW 0x00
  20.     MOVWF ADRESA
  21.         CALL STAR   ;; LLamada a BCD pero si te fijas arriba solo puse el valor 0x008, dando por resultado LSD = 0x8 y HSD=VSD=MSD=0x0
  22.     ; FIN CONVERSION BCD
  23.  
  24.     ;MUESTRO, en realidad lo guardo en un registro, fue para poder debuggearlo
  25.  
  26.     BANKSEL PORTA
  27.     MOVF LSD,W    ; Muevo el 0x8 a W
  28.     CALL TABLA      ; Llamo a la tabla
  29.     MOVWF TEMP   ; En TEMP me queda guardado el valor 1111 1101 o que es igual a 0xFD
  30.         GOTO MAIN

Por lo tanto funciona.