Autor Tema: Guardar valor modulo ADC  (Leído 6929 veces)

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

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Guardar valor modulo ADC
« en: 01 de Mayo de 2015, 19:20:54 »
Hola compañeros siguiendo donde lo deje porque todavía no he abandonado, http://www.todopic.com.ar/foros/index.php?topic=44247.20 me surge una duda ¿como podría guardar el valor de los registros ADRESH y ADRESL después de la conversión en una sola variable para después visualizarla en un Lcd?
Hasta el momento tengo esto, no es gran cosa pero para mi es todo un éxito llegar a esto sin copiar  :P
Código: ASM
  1. ;******************************************************************************
  2. ;                                                                             *
  3. ;    Files Required: p16f88.inc                                               *
  4. ;                                                                             *
  5. ;******************************************************************************
  6. ;                                                                             *
  7. ;    Features of the 16F88:                                                   *
  8. ;                                                                             *
  9. ;    1 10-bit PWM                                                             *
  10. ;    8 MHz Internal Oscillator (Usamos osc externo 20MHz)                     *
  11. ;    ICD support                                                              *
  12. ;    256 bytes of EEPROM data memory                                          *
  13. ;    Capture/Compare Module                                                   *
  14. ;                                                                             *
  15. ;******************************************************************************
  16. ;                                                                             *
  17. ;    Notes:   The A/D module has five registers:                              *
  18. ;             A/D Result High Register (ADRESH)                               *
  19. ;             A/D Result Low Register (ADRESL)                                *
  20. ;             A/D Control Register 0 (ADCON0)                                 *
  21. ;             A/D Control Register 1 (ADCON1)                                 *
  22. ;             Analog Select Register (ANSEL)                                  *
  23. ;                                                                             *
  24. ;                                                                             *
  25. ;******************************************************************************
  26. ;                                                                             *
  27. ;    Revision History:                                                        *
  28. ;                                                                             *
  29. ;******************************************************************************
  30.  
  31. ;------------------------------------------------------------------------------
  32. ; PROCESSOR DECLARATION
  33. ;------------------------------------------------------------------------------
  34.  
  35.      LIST      p=16F88              ; list directive to define processor
  36.      #INCLUDE <p16f88.inc>          ; processor specific variable definitions
  37.  
  38. ;------------------------------------------------------------------------------
  39. ;
  40. ; CONFIGURATION WORD SETUP
  41. ;
  42. ; The 'CONFIG' directive is used to embed the configuration word within the
  43. ; .asm file. The lables following the directive are located in the respective
  44. ; .inc file.  See the data sheet for additional information on configuration
  45. ; word settings.
  46. ;
  47. ;------------------------------------------------------------------------------
  48.  
  49.      __CONFIG    _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_ON & _WDT_OFF & _FOSC_HS
  50.      __CONFIG    _CONFIG2, _IESO_OFF & _FCMEN_OFF
  51.  
  52.      ERRORLEVEL -302
  53. ;------------------------------------------------------------------------------
  54. ;
  55. ; VARIABLE DEFINITIONS
  56. ;
  57. ; Available Data Memory divided into Bank 0 through Bank 3.  Each Bank contains
  58. ; Special Function Registers and General Purpose Registers at the locations
  59. ; below:
  60. ;
  61. ;           SFR           GPR               SHARED GPR's
  62. ; Bank 0    0x00-0x1F     0x20-0x6F         0x70-0x7F
  63. ; Bank 1    0x80-0x9F     0xA0-0xEF         0xF0-0xFF
  64. ; Bank 2    0x100-0x10F   0x110-0x16F       0x170-0x17F
  65. ; Bank 3    0x180-0x18F   0x190-0x1EF       0x1F0-0x1FF
  66. ;
  67. ;------------------------------------------------------------------------------
  68.  
  69.     CBLOCK  0x20
  70.         ByteHigh    ;Registro para guardar byte alto de la conversion
  71.         ByteLow     ;Registro para guardar byte bajo de la conversion
  72.         Contador    ;Registro utilizado en demora de 20us
  73.     ENDC
  74.  
  75. ;------------------------------------------------------------------------------
  76. ; RESET VECTOR
  77. ;------------------------------------------------------------------------------
  78.  
  79. RESET     ORG     0x0000            ; processor reset vector
  80.           PAGESEL START
  81.           GOTO    START             ; go to beginning of program
  82.  
  83. ;------------------------------------------------------------------------------
  84. ; MAIN PROGRAM
  85. ;------------------------------------------------------------------------------
  86.  
  87. START
  88. ;Configuracion de Puertos I/O
  89.         banksel     PORTA           ; Banco 0
  90.         clrf        PORTA           ; Limpiamos latch PORTA
  91.         clrf        PORTB           ; Limpiamos latch PORTB
  92.         banksel     ANSEL           ; Banco 1
  93.         movlw       b'00000001'
  94.         movwf       ANSEL           ; Configuramos RA0 analogico
  95.         movlw       b'00000001'
  96.         movwf       TRISA           ; RA<0> entrada analogica
  97.         clrf        TRISB           ; PORTB salidas
  98.  
  99. ;Configuramos modulo A/D
  100.         movlw       b'10000000'
  101.         movwf       ADCON1          ; Justificado a la derecha, Disabled A/D Clock Divide by 2
  102.                                     ; Select bit VDD/VSS.-
  103.         banksel     ADCON0          ; Banco 0
  104.         movlw       b'10000001'
  105.         movwf       ADCON0          ; Fosc/32, Canal 0, módulo habilitado.-
  106.         call        Demora_20us     ; Demora de adquisicion.-
  107.  
  108. ;Empieza la conversion del canal RA0
  109. Conversion_RA0
  110.         bsf         ADCON0,GO       ; Empezar la conversion A/D
  111.         btfsc       ADCON0,GO       ; Espera a que termine conversion.-
  112.         goto        Conversion_RA0  ; Todavia no...
  113.         movf        ADRESH,W        ; Movemos resultado de la conversion.-
  114.         movwf       ByteHigh        ; Guardamos el valor de ADRESH en la variable ByteHigh
  115.         banksel     ADRESL          ; Banco 1
  116.         movf        ADRESL,W
  117.         movwf       ByteLow         ; Guardamos el valor de ADRESL en la variable ByteLow
  118.         call        Demora_20us
  119.         goto        Conversion_RA0
  120.  
  121. ;Rutina usada para la conversion..........
  122. Demora_20us
  123.         movlw       .23
  124.         movwf       Contador
  125. PLoop0  clrwdt              
  126.         decfsz      Contador,1
  127.         goto        PLoop0
  128. PDelL1  goto        PDelL2
  129. PDelL2  clrwdt              
  130.         return              
  131.  
  132.         END


Gracias.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Guardar valor modulo ADC
« Respuesta #1 en: 02 de Mayo de 2015, 00:29:37 »
El micro posee registros de 8 bits, si tu conversion es de 12/10 bits. vas a tener que usar SI o SI 2 registros para guardarlo, tal y cual lo estas haciendo.,
Luego cuando lo vas a mandar a tu LCD, mandas de a digitos, por ejemplo si quieras pasar esos 10 bits a un numero decimal, deberias pasarlo a BCD y luego enviar cada digito al LCD por separado


Una cosa que note fue:

Código: Microchip Assembler
  1. Conversion_RA0
  2.         bsf         ADCON0,GO       ; Empezar la conversion A/D
  3.         btfsc       ADCON0,GO       ; Espera a que termine conversion.-
  4.         goto        Conversion_RA0  ; Todavia no...


Código: Microchip Assembler
  1. bsf         ADCON0,GO       ; Empezar la conversion A/D
  2. Conversion_RA0
  3.         btfsc       ADCON0,GO       ; Espera a que termine conversion.-
  4.         goto        Conversion_RA0  ; Todavia no...

Imaginate si justo se pone a 0 cuando haces el GOTO, estarias comenzando nuevamente otra conversion sin guardar los resultados.
Y para que funcione como antes le agregas un nuevo bsf ADCON0,GO luego del call Demora_20us
« Última modificación: 02 de Mayo de 2015, 03:10:03 por KILLERJC »

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Guardar valor modulo ADC
« Respuesta #2 en: 02 de Mayo de 2015, 04:48:17 »
Gracias KILLERJC por tu respuesta voy a intentar lo que comentas y si no me va bien pregunto, creía que seria posible guardar la lectura del ADC dentro de las variables ByteHigh y ByteLow para luego pasarlo dentro de una variable de 16 bits y leer dicha variable.

Saludos!
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Guardar valor modulo ADC
« Respuesta #3 en: 02 de Mayo de 2015, 04:58:28 »
En ASM tu "variable de 16 bits" esta formada por 2 registros de 8, En tu cabeza uno es la parte alta y otra la parte baja.

En C normalmente no te preocupas de eso, se define el nombre y el tipo, el compilador define la primera posicion de la memoria RAM, y el registro que le sigue es parte de la "variable" pero sigue siendo 2 registros.

Supongamos que empiezan en 0x20 los registros

uint_16t  prueba;

El compilador haria se referiria en ASM a eso como

prueba equ 0x20

Y al momento de acceder lo hace con prueba y prueba+1
« Última modificación: 02 de Mayo de 2015, 05:04:28 por KILLERJC »

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Guardar valor modulo ADC
« Respuesta #4 en: 02 de Mayo de 2015, 05:47:42 »
 A eso me refiero KILLERJC la idea era usar dos registros para la variable, por ejemplo si empieza en la 0x20 pues la próxima empezaría en 0x22, el problema que tengo es guardar las dos de 8 bits dentro de la de 16 bits y me quede ordenada.

Gracias KILLERJC.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Guardar valor modulo ADC
« Respuesta #5 en: 02 de Mayo de 2015, 07:46:59 »
No se si seria correcto hacerlo de esta manera o pude dar problemas a lo largo de su funcionamiento.
Código: ASM
  1. CBLOCK  0x20
  2.         ByteHigh    ;Registro para guardar byte alto de la conversion
  3.         ByteLow     ;Registro para guardar byte bajo de la conversion
  4.         Contador    ;Registro utilizado en demora de 20us
  5.         LecturaADC  ;Registro para guardar 16 bits (La proxima variable
  6.                     ;empezara en 0x25)
  7.     ENDC
  8.  
  9. ;------------------------------------------------------------------------------
  10. ; RESET VECTOR
  11. ;------------------------------------------------------------------------------
  12.  
  13. RESET     ORG     0x0000            ; processor reset vector
  14.           PAGESEL START
  15.           GOTO    START             ; go to beginning of program
  16.  
  17. ;------------------------------------------------------------------------------
  18. ; MAIN PROGRAM
  19. ;------------------------------------------------------------------------------
  20.  
  21. START
  22. ;Configuracion de Puertos I/O..........
  23.         banksel     PORTA           ; Banco 0
  24.         clrf        PORTA           ; Limpiamos latch PORTA
  25.         clrf        PORTB           ; Limpiamos latch PORTB
  26.         banksel     ANSEL           ; Banco 1
  27.         movlw       b'00000001'
  28.         movwf       ANSEL           ; Configuramos RA0 analogico
  29.         movlw       b'00000001'
  30.         movwf       TRISA           ; RA<0> entrada analogica
  31.         clrf        TRISB           ; PORTB salidas
  32.  
  33. ;Configuramos modulo A/D..........
  34.         movlw       b'10000000'     ; Justificado a la derecha, Disabled A/D Clock Divide by 2
  35.         movwf       ADCON1          ; Select bit VDD/VSS.-
  36.         banksel     ADCON0          ; Banco 0
  37.         movlw       b'10000001'
  38.         movwf       ADCON0          ; Fosc/32, Canal 0, módulo habilitado.-
  39.         call        Demora_20us     ; Demora de adquisicion.-
  40.         bsf         ADCON0,GO       ; Empezar la conversion
  41.  
  42. ;Empieza la conversion del canal RA0.........
  43. Conversion_RA0
  44.         btfsc       ADCON0,GO       ; Espera a que termine conversion.-
  45.         goto        Conversion_RA0  ; Todavia no...
  46.         movf        ADRESH,W        ; Movemos resultado de la conversion.-
  47.         movwf       ByteHigh        ; Guardamos el valor de ADRESH en la variable ByteHigh
  48.         banksel     ADRESL          ; Banco 1
  49.         movf        ADRESL,W
  50.         movwf       ByteLow         ; Guardamos el valor de ADRESL en la variable ByteLow
  51.         movf        ByteHigh,W
  52.         movwf       LecturaADC
  53.         movf        ByteLow,W
  54.         movwf       LecturaADC+1
  55.         call        Demora_20us
  56.         bsf         ADCON0,GO       ; Empezar la conversion
  57.         goto        Conversion_RA0
  58.  
  59. ;Rutina usada para la conversion..........
  60. Demora_20us
  61.         movlw       .23
  62.         movwf       Contador
  63. PLoop0  clrwdt              
  64.         decfsz      Contador,1
  65.         goto        PLoop0
  66. PDelL1  goto        PDelL2
  67. PDelL2  clrwdt              
  68.         return              
  69.  
  70.         END

Gracias!
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Guardar valor modulo ADC
« Respuesta #6 en: 02 de Mayo de 2015, 08:22:25 »
Es correcto el programa, siempre y cuando tomes las precauciones necesarias.

Y cuando me refiero a las precauciones necesarias es a la declaracion de las "variables", no declaras variables simplemente estas dandole un nombre a un numero.

Si agregas una nueva "variable" abajo de LecturaADC , este va a comenzar del 0x24 y no del 0x25!
Es decir esto:

Código: Microchip Assembler
  1. CBLOCK  0x20
  2.         ByteHigh    ; 0x20
  3.         ByteLow     ; 0x21
  4.         Contador    ; 0x22
  5.         LecturaADC  ; 0x23
  6.         VariableNueva   ; 0x24    
  7.     ENDC

LecturaADC+1 es igual que VariableNueva
Seria un error.


Distinto si tomas esa precaucion:

Código: Microchip Assembler
  1. ByteHigh EQU 0x20
  2.         ByteLow  EQU 0x21
  3.         Contador EQU 0x22
  4.         LecturaADC EQU 0x23
  5.         VariableNueva EQU 0x25
  6.     ENDC
=
Código: Microchip Assembler
  1. ByteHigh EQU 0x20
  2.         ByteLow  EQU 0x21
  3.         Contador EQU 0x22
  4.         LecturaADC EQU 0x23
  5.         VariableNueva EQU LecturaADC+2
  6.     ENDC

--------------------

Pienso yo que es complicarsela de esta forma, el poner el +1 y no definir ese registro con un nombre, poner un +1 es la misma tarea que ponerle una H o una L al otro nombre de la variable. Y tambien no exige que esten seguidos los registros.
A lo que voy, para mi no te ahorras nada.
« Última modificación: 02 de Mayo de 2015, 08:31:15 por KILLERJC »

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Guardar valor modulo ADC
« Respuesta #7 en: 02 de Mayo de 2015, 09:14:19 »
Hola KILLERJC entiendo lo que me estas diciendo a lo mejor soy yo que me estoy liando, haciendo lo que tu me dices de no usar +1 y usar nombres diferentes de esta manera tendría dos variables una con 2 bits y la otra con los 8 restantes:
b'00000010'
b'10011100'
y lo que quería hacer y a lo mejor no es posible es eso:
b'0000001010011100'
juntar las dos variables dentro de una sola y esta visualizarla en el LCD.

Gracias!
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Guardar valor modulo ADC
« Respuesta #8 en: 02 de Mayo de 2015, 09:48:10 »
En ASM no tenes "variables", no existen, solamente registros, asi que para hacer esto:

b'0000001010011100'

SI o SI es hacer esto (por que son de 8 bits, no hay nada que pueda almacenar mas de 8 bits en la RAM):

b'00000010'
b'10011100'


Asi que siempre vas a desperdiciar esos 6 bits. Los registros no tienen tipos, no es que ahi tenes dos "variables" de 8 bits enteros, son 2 registros, como vos lo interpretes es lo distinto.
Por ejemplo:

Decime la diferencia entre esto:

b'00000010'
b'10010011'

y esto

b'00000010'
b'10010011'

Viendo 0 y 1 no hay ninguna, pero puede ser:

2 numeros de 8 bits (2 y 147 )
4 numeros BCD (0,2,9,3)
1 numero de 16 bits (659)
Punto fijo! (0.0078 y 0.5742) si pongo el punto al comiezo de los bytes
Un registro parte entera y la otra parte fraccional (2.5742)
etc.

Ves, no tiene un "tipo" es lo que yo quiero que sea.

Si queres vizualizarlo en un LCD, Y queres mostrar el numero en decimal, entonces deberias pasarlo a BCD (esos 16 bits), esto requiere que lo almacenes en 4 "variables"(registros) aunque puede ir en 2 registros (bcd packed, ya que decimal va de 0 a 9 y bastan 4 bits para representarlos)
Siguiendo tu ejemplo:

b'0000001010011100' = 668


BCD: 00000000 00000110 00000110 00001000  o juntarlo en 2 bytes      0000-0110 0110-1000
              0              6             6             8                                             0      6        6     8

El el codigo de tu LCD harias:

movfw  MILES
call enviar_dato_lcd
movfw  CENTENAS
call enviar_dato_lcd
movfw  DECENAS
call enviar_dato_lcd
movfw  UNIDADES
call enviar_dato_lcd

Y se va a ir escribiendo en tu LCD, caracter a caracter, no podes enviar eso de 10 bits como un printf("%d",prueba);
Destras de ese printf hay una conversion de hexa a BCD, envio de cada letra/numero al LCD, uno por uno.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Guardar valor modulo ADC
« Respuesta #9 en: 02 de Mayo de 2015, 09:54:07 »
Gracias KILLERJC por la explicación, como yo decía me estaba liando,  ahora que lo tengo un poco mas claro de lo que puedo o no puedo hacer voy a intentarlo.

Muchas Gracias.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Guardar valor modulo ADC
« Respuesta #10 en: 03 de Mayo de 2015, 14:39:11 »
Yo de nuevo otra vez molestando  :oops: llevo la tarde intentando visualizar por el LCD el valor b'10101111' pero en decimal y no consigo visualizarlo, excepto el mensaje fijo este si me funciona, por lo cual es fallo en la rutina BCD y seguro es una tontería pero no lo veo si alguien puede ayudarme lo agradecería.
Código: ASM
  1. CBLOCK 0x30
  2.         Centena
  3.         Decena
  4.         Unidad
  5.     ENDC
  6.         Num_Binario     equ  b'10101111'
  7. ;------------------------------------------------------------------------------
  8. ; RESET VECTOR
  9. ;------------------------------------------------------------------------------
  10.  
  11. RESET     ORG     0x0000            ; processor reset vector
  12.           PAGESEL START
  13.           GOTO    START             ; go to beginning of program
  14.  
  15. ;Tabla para Mensajes.........................
  16. Mensajes                        ;Etiqueta obligatoria
  17.         addwf       PCL,F
  18. Mensaje0                        ;Posicion inicial del mensaje
  19.         DT "   BCD 8-bits",0x00    ;Mensaje terminado en 0x00
  20.  
  21. ;------------------------------------------------------------------------------
  22. ; MAIN PROGRAM
  23. ;------------------------------------------------------------------------------
  24.  
  25. START
  26. ;Configuramos el oscilador interno para 4MHz
  27.         banksel     OSCCON          ;Banco 1
  28.         bsf         OSCCON,IRCF2
  29.         bsf         OSCCON,IRCF1
  30.         bcf         OSCCON,IRCF0
  31.  
  32. ;Configuramos los puertos del PIC
  33.         banksel     PORTA           ;Banco 0
  34.         clrf        PORTA
  35.         clrf        PORTB
  36.         banksel     ANSEL           ;Banco 1
  37.         movlw       b'00000000'
  38.         movwf       ANSEL
  39.         clrf        TRISA
  40.         clrf        TRISB
  41.  
  42. ;Configuramos el LCD
  43.         call        LCD_Inicializa
  44.  
  45. Principal
  46.         pageselw    Mensaje0
  47.         movlw       Mensaje0
  48.         call        LCD_Mensaje
  49.         call        LCD_Linea2
  50.         call        Binario_BCD
  51.         movfw       Centena
  52.         call        LCD_Mensaje
  53.         movfw       Decena
  54.         call        LCD_Mensaje
  55.         movfw       Unidad
  56.         call        LCD_Mensaje
  57.         goto        Principal
  58.  
  59. ;Rutinas para control del LCD
  60.     #include retardos.INC
  61.     #include lcd_4bit.INC
  62.     #include LCD_MENS.INC
  63.     #include Bin_BCD.INC
  64.  
  65.         END


Rutina Bin_BCD.inc
Código: ASM
  1. ;Rutina de Conversion............
  2. Binario_BCD
  3.         movfw   Num_Binario     ;Binario ---> W
  4.         movwf   Unidad          ;W ---> Unidad
  5.         clrf    Decena          ;Borramos Decena
  6.         clrf    Centena         ;Borramos Centena
  7. BCD_0
  8.         movlw   d'10'           ;Movemos .10 ---> W
  9.         subwf   Unidad,W        ;Restamos Unidad - W y guardamos en W
  10.         btfss   STATUS,C        ;Preguntamos por el estado del bit Carry
  11.         goto    BCD_Fin         ;Si es 0 salimos de la Rutina
  12. BCD_1
  13.         movwf   Unidad          ;Guardamos el valor de la resta en Unidad
  14.         incf    Decena,f        ;Incrementamos Decena y guardamos en Decena
  15.         movlw   d'10'           ;Movemos .10 ---> W
  16.         subwf   Decena,W        ;Restamos Decena - W y guardamos en W
  17.         btfss   STATUS,C        ;Preguntamos por el estado del bit Carry
  18.         goto    BCD_0
  19. BCD_2   clrf    Decena          ;Borramos Decena
  20.         incf    Centena,f       ;Incrementamos Centena y guardamos en Centena
  21.         goto    BCD_0
  22. BCD_Fin
  23.         nop
  24.         return

Gracias.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Guardar valor modulo ADC
« Respuesta #11 en: 04 de Mayo de 2015, 00:18:32 »
Bueno es simple... hice este programita:

Código: ASM
  1. MAIN
  2.         MOVLW   0xAF
  3.     CALL    Binario_BCD
  4.         GOTO MAIN
  5.  
  6. Binario_BCD
  7.         ;movfw  Num_Binario     ;Binario ---> W
  8.         movwf   Unidad          ;W ---> Unidad
  9.         clrf    Decena          ;Borramos Decena
  10.         clrf    Centena         ;Borramos Centena
  11. BCD_0
  12.         movlw   d'10'           ;Movemos .10 ---> W
  13.         subwf   Unidad,W        ;Restamos Unidad - W y guardamos en W
  14.         btfss   STATUS,C        ;Preguntamos por el estado del bit Carry
  15.         goto    BCD_Fin         ;Si es 0 salimos de la Rutina
  16. BCD_1
  17.         movwf   Unidad          ;Guardamos el valor de la resta en Unidad
  18.         incf    Decena,f        ;Incrementamos Decena y guardamos en Decena
  19.         movlw   d'10'           ;Movemos .10 ---> W
  20.         subwf   Decena,W        ;Restamos Decena - W y guardamos en W
  21.         btfss   STATUS,C        ;Preguntamos por el estado del bit Carry
  22.         goto    BCD_0
  23. BCD_2   clrf    Decena          ;Borramos Decena
  24.         incf    Centena,f       ;Incrementamos Centena y guardamos en Centena
  25.         goto    BCD_0
  26. BCD_Fin
  27.         nop
  28.         return

Lo simule y encontre por que no te anda la conversion a BCD
Ese codigo utiliza de entrada lo que esta en el registro "Num_Binario", como vos pasabas los datos por W, esa instruccion directamente reemplazaba con 0 a W, por lo tanto el resultado era siempre 0.
Quedaban 2 formas de arreglarlo.

Una es que antes que llames cargues el valor en Num_Binario
La otra es que quites esa instruccion y solo lo cargues a W, ahorrandote un registro utilizado sin sentido como en el caso anterior. (Asi como lo ejecutas vos)

Ahi lo de conversion binario BCD, acordate que esto es solo de 8 bits. Si apartir de aca no te funciona, puede ser las funciones del LCD

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Guardar valor modulo ADC
« Respuesta #12 en: 04 de Mayo de 2015, 03:54:10 »
Gracias KILLERJG por la ayuda, lo de cargar el valor dentro de W y llamar después a la rutina ya lo había intentado y tampoco me funciono, no se si podrá ser problema del LCD como me comentas ya que con mensajes fijos el LCD trabaja correctamente, seguiré probando a ver si doy con el problema.

Saludos!
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Guardar valor modulo ADC
« Respuesta #13 en: 04 de Mayo de 2015, 04:40:08 »
podrias poner que hace la funcion LCD_Mensaje, o tal ves la libreria, si es que no le encontras la solucion.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Guardar valor modulo ADC
« Respuesta #14 en: 04 de Mayo de 2015, 04:43:03 »
Código: ASM
  1. ;**************************** Librería "LCD_MENS.INC" ********************************
  2.  
  3. ;
  4.  
  5. ;       ===================================================================
  6.  
  7. ;         Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
  8.  
  9. ;         E. Palacios, F. Remiro y L. López.
  10.  
  11. ;         Editorial Ra-Ma.  www.ra-ma.es
  12.  
  13. ;       ===================================================================
  14.  
  15. ;
  16.  
  17. ; Librería de subrutinas para el manejo de mensajes a visualizar en un visualizador LCD.
  18.  
  19.  
  20.  
  21.         CBLOCK  0x25
  22.  
  23.         LCD_ApuntaCaracter              ; Indica la posición del carácter a visualizar
  24.  
  25.                                         ; respecto del comienzo de todos los mensajes,
  26.  
  27.                                         ; (posición de la etiqueta "Mensajes").
  28.  
  29.         LCD_ValorCaracter               ; Código ASCII del carácter a visualizar
  30.  
  31.         ENDC                           
  32.  
  33.  
  34.  
  35. ; Los mensajes tienen que estar situados dentro de las 256 primeras posiciones de la
  36.  
  37. ; memoria de programa, es decir, no pueden superar la dirección 0FFh.
  38.  
  39.  
  40.  
  41. ; Subrutina "LCD_Mensaje" ---------------------------------------------------------------
  42.  
  43. ;
  44.  
  45. ; Visualiza por pantalla el mensaje apuntado por el registro W.
  46.  
  47. ;
  48.  
  49. ; Los mensajes deben localizarse dentro de una zona encabezada por la etiqueta "Mensajes" y que
  50.  
  51. ; tenga la siguiente estructura:
  52.  
  53. ;
  54.  
  55. ; Mensajes                              ; ¡Etiqueta obligatoria!
  56.  
  57. ;       addwf   PCL,F
  58.  
  59. ; Mensaje0                              ; Posición inicial del mensaje.
  60.  
  61. ;       DT ".. ..", 0x00                        ; Mensaje terminado en 0x00.
  62.  
  63. ; Mensaje1
  64.  
  65. ;       ...    
  66.  
  67. ;       ...
  68.  
  69. ; FinMensajes
  70.  
  71. ;
  72.  
  73. ; La llamada a esta subrutina se realizará siguiendo este ejemplo:
  74.  
  75. ;
  76.  
  77. ;       movlw   Mensaje0                        ; Carga la posición del mensaje.
  78.  
  79. ;       call    LCD_Mensaje             ; Visualiza el mensaje.
  80.  
  81. ;
  82.  
  83. LCD_Mensaje
  84.  
  85.         movwf   LCD_ApuntaCaracter      ; Posición del primer carácter del mensaje.
  86.  
  87.         movlw   Mensajes                        ; Halla la posición relativa del primer carácter
  88.  
  89.         subwf   LCD_ApuntaCaracter,F    ; del mensaje respecto de etiqueta "Mensajes".
  90.  
  91.         decf    LCD_ApuntaCaracter,F    ; Compensa la posición que ocupa "addwf PCL,F".
  92.  
  93. LCD_VisualizaOtroCaracter
  94.  
  95.         movf    LCD_ApuntaCaracter,W
  96.  
  97.         call    Mensajes                        ; Obtiene el código ASCII del carácter apuntado.
  98.  
  99.         movwf   LCD_ValorCaracter               ; Guarda el valor de carácter.
  100.  
  101.         movf    LCD_ValorCaracter,F     ; Lo único que hace es posicionar flag Z. En caso
  102.  
  103.         btfsc   STATUS,Z                ; que sea "0x00", que es código indicador final       
  104.  
  105.         goto    LCD_FinMensaje          ; de mensaje, sale fuera.
  106.  
  107. LCD_NoUltimoCaracter
  108.  
  109.         call    LCD_Caracter            ; Visualiza el carácter ASCII leído.
  110.  
  111.         incf    LCD_ApuntaCaracter,F    ; Apunta a la posición del siguiente carácter
  112.  
  113. ;-----------------------------------------------------------------
  114.  
  115.         btfss   STATUS,C        ;Si hay acarreo al incrementar LCD_ApuntaCaracter es por
  116.  
  117.         incf    PCLATH          ;haber cambiado de página por lo que hay que sumar 1 al PCLATH
  118.  
  119. ;----------------------------------------------------------------
  120.  
  121.         goto    LCD_VisualizaOtroCaracter       ; dentro del mensaje.
  122.  
  123. LCD_FinMensaje
  124.  
  125.         return                          ; Vuelve al programa principal.
  126.  
  127.  
  128.  
  129. ; Subrutina "LCD_MensajeMovimiento" -----------------------------------------------------
  130.  
  131. ;
  132.  
  133. ; Visualiza un mensaje de mayor longitud que los 16 caracteres que pueden representarse
  134.  
  135. ; en una línea, por tanto se desplaza a través de la pantalla.
  136.  
  137. ;
  138.  
  139. ; En el mensaje debe dejarse 16 espacios en blanco, al principio y al final para
  140.  
  141. ; conseguir que el desplazamiento del mensaje sea lo más legible posible.
  142.  
  143. ;
  144.  
  145.         CBLOCK
  146.  
  147.         LCD_CursorPosicion              ; Contabiliza la posición del cursor dentro de la
  148.  
  149.         ENDC                            ; pantalla LCD
  150.  
  151.  
  152.  
  153. LCD_MensajeMovimiento
  154.  
  155.         movwf   LCD_ApuntaCaracter      ; Posición del primer carácter del mensaje.
  156.  
  157.         movlw   Mensajes                        ; Halla la posición relativa del primer carácter
  158.  
  159.         subwf   LCD_ApuntaCaracter,F    ; del mensaje respecto de la etiqueta "Mensajes".
  160.  
  161.         decf    LCD_ApuntaCaracter,F    ; Compensa la posición que ocupa "addwf PCL,F".
  162.  
  163. LCD_PrimeraPosicion
  164.  
  165.         clrf    LCD_CursorPosicion      ; El cursor en la posición 0 de la línea.
  166.  
  167.         call    LCD_Borra               ; Se sitúa en la primera posición de la línea 1 y
  168.  
  169. LCD_VisualizaCaracter                   ; borra la pantalla.
  170.  
  171.         movlw   LCD_CaracteresPorLinea  ; ¿Ha llegado a final de línea?
  172.  
  173.         subwf   LCD_CursorPosicion,W
  174.  
  175.         btfss   STATUS,Z
  176.  
  177.         goto    LCD_NoEsFinalLinea
  178.  
  179. LCD_EsFinalLinea
  180.  
  181.         call    Retardo_200ms           ; Lo mantiene visualizado durante este tiempo.
  182.  
  183.         call    Retardo_200ms
  184.  
  185.         movlw   LCD_CaracteresPorLinea-1; Apunta a la posición del segundo carácter visualizado
  186.  
  187.         subwf   LCD_ApuntaCaracter,F    ; en pantalla, que será el primero en la siguiente
  188.  
  189.         goto    LCD_PrimeraPosicion      ; visualización de línea, para producir el efecto
  190.  
  191. LCD_NoEsFinalLinea                      ; de desplazamiento hacia la izquierda.
  192.  
  193.         movf    LCD_ApuntaCaracter,W
  194.  
  195.         call    Mensajes                        ; Obtiene el ASCII del carácter apuntado.
  196.  
  197.         movwf   LCD_ValorCaracter               ; Guarda el valor de carácter.
  198.  
  199.         movf    LCD_ValorCaracter,F     ; Lo único que hace es posicionar flag Z. En caso
  200.  
  201.         btfsc   STATUS,Z                ; que sea "0x00", que es código indicador final       
  202.  
  203.         goto    LCD_FinMovimiento       ; de mensaje, sale fuera.
  204.  
  205. LCD_NoUltimoCaracter2
  206.  
  207.         call    LCD_Caracter            ; Visualiza el carácter ASCII leído.
  208.  
  209.         incf    LCD_CursorPosicion,F    ; Contabiliza el incremento de posición del
  210.  
  211.                                         ; cursor en la pantalla.
  212.  
  213.         incf    LCD_ApuntaCaracter,F    ; Apunta a la siguiente posición por visualizar.
  214.  
  215.         goto    LCD_VisualizaCaracter   ; Vuelve a visualizar el siguiente carácter
  216.  
  217. LCD_FinMovimiento                       ; de la línea.
  218.  
  219.         return                          ; Vuelve al programa principal.
  220.  
  221.        
  222.  
  223. ;       ===================================================================
  224.  
  225. ;         Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
  226.  
  227. ;         E. Palacios, F. Remiro y L. López.
  228.  
  229. ;         Editorial Ra-Ma.  www.ra-ma.es
  230.  
  231. ;       ===================================================================

Gracias
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.