TODOPIC

Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: Miquel_S en 01 de Mayo de 2015, 19:20:54

Título: Guardar valor modulo ADC
Publicado por: Miquel_S 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.
Título: Re: Guardar valor modulo ADC
Publicado por: KILLERJC 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
Título: Re: Guardar valor modulo ADC
Publicado por: Miquel_S 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!
Título: Re: Guardar valor modulo ADC
Publicado por: KILLERJC 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
Título: Re: Guardar valor modulo ADC
Publicado por: Miquel_S 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.
Título: Re: Guardar valor modulo ADC
Publicado por: Miquel_S 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!
Título: Re: Guardar valor modulo ADC
Publicado por: KILLERJC 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.
Título: Re: Guardar valor modulo ADC
Publicado por: Miquel_S 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!
Título: Re: Guardar valor modulo ADC
Publicado por: KILLERJC 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.
Título: Re: Guardar valor modulo ADC
Publicado por: Miquel_S 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.
Título: Re: Guardar valor modulo ADC
Publicado por: Miquel_S 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.
Título: Re: Guardar valor modulo ADC
Publicado por: KILLERJC 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
Título: Re: Guardar valor modulo ADC
Publicado por: Miquel_S 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!
Título: Re: Guardar valor modulo ADC
Publicado por: KILLERJC 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.
Título: Re: Guardar valor modulo ADC
Publicado por: Miquel_S 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
Título: Re: Guardar valor modulo ADC
Publicado por: KILLERJC en 04 de Mayo de 2015, 05:08:59
Parece que la funcion LCD_Mensaje no te va a servir. Por que toma referencia desde la etiqueta Mensajes.

Podrias poner la funcion:

LCD_Caracter

Creo que es esa a la que tenes que llamar y cargar el valor en LCD_ValorCaracter
Título: Re: Guardar valor modulo ADC
Publicado por: Miquel_S en 09 de Mayo de 2015, 18:36:01
Nada que no lo consigo, solo consigo visualizar cualquier numero excepto el que debería, os dejo el código usado a ver si alguien me alumbra el camino.
Main:
Código: ASM
  1. CBLOCK 0x30
  2.         Num_Binario
  3.         Centena
  4.         Decena
  5.         Unidad
  6.     ENDC
  7.  
  8. ;------------------------------------------------------------------------------
  9. ; RESET VECTOR
  10. ;------------------------------------------------------------------------------
  11.  
  12. RESET     ORG     0x0000            ; processor reset vector
  13.           PAGESEL START
  14.           GOTO    START             ; go to beginning of program
  15.  
  16. ;Tabla para Mensajes.........................
  17. Mensajes                        ;Etiqueta obligatoria
  18.         addwf       PCL,F
  19. Mensaje0                        ;Posicion inicial del mensaje
  20.         DT "   BCD 8-bits",0x00    ;Mensaje terminado en 0x00
  21. Mensaje1
  22.         DT "DECIMAL: ",0x00
  23.  
  24. ;------------------------------------------------------------------------------
  25. ; MAIN PROGRAM
  26. ;------------------------------------------------------------------------------
  27.  
  28. START
  29. ;Configuramos el oscilador interno para 4MHz........
  30.         banksel     OSCCON          ;Banco 1
  31.         bsf         OSCCON,IRCF2
  32.         bsf         OSCCON,IRCF1
  33.         bcf         OSCCON,IRCF0
  34.  
  35. ;Configuramos los puertos del PIC........
  36.         banksel     PORTA           ;Banco 0
  37.         clrf        PORTA
  38.         clrf        PORTB
  39.         banksel     ANSEL           ;Banco 1
  40.         movlw       b'00000000'
  41.         movwf       ANSEL
  42.         clrf        TRISA
  43.         clrf        TRISB
  44.  
  45. ;Configuramos el LCD........
  46.         call        LCD_Inicializa  ;Inicializamos el LCD
  47.  
  48. ;Mensaje de Bienvenida........
  49.         pageselw    Mensaje0
  50.         movlw       Mensaje0
  51.         call        LCD_Mensaje     ;Visualizamos BCD 8-bits en la primera linea
  52.  
  53. ;Conversion a decimal........
  54.         call        LCD_Linea2      ;Visualizamos en la segunda linea del LCD
  55.         pageselw    Mensaje1
  56.         movlw       Mensaje1
  57.         call        LCD_Mensaje
  58.         movlw       0xAF            ;Cargamos W con el valor 175 en decimal
  59.         movwf       Num_Binario
  60.         call        Binario_BCD     ;Llamamos a la rutina de conversion
  61.         movlw       Unidad
  62.         call        LCD_Caracter
  63.         movlw       Decena
  64.         movwf       LCD_Caracter
  65.         movlw       Centena
  66.         movwf       LCD_Caracter
  67.         sleep                       ;Modo reposo
  68.  
  69. ;Rutinas para control del LCD........
  70. #include retardos.INC
  71. #include lcd_4bit.INC
  72. #include LCD_MENS.INC
  73. #include Bin_BCD.INC
  74.  
  75.         END
lcd_4bits.INC:
Código: ASM
  1. ; ZONA DE DATOS *********************************************************************
  2.  
  3.  
  4.  
  5.         CBLOCK  0x20
  6.  
  7.         LCD_Dato
  8.  
  9.         LCD_GuardaDato
  10.  
  11.         LCD_GuardaTRISB
  12.  
  13.         LCD_Auxiliar1
  14.  
  15.         LCD_Auxiliar2
  16.  
  17.         ENDC
  18.  
  19.  
  20.  
  21. LCD_CaracteresPorLinea  EQU     .16     ; Número de caracteres por línea de la pantalla.
  22.  
  23.  
  24.  
  25. #DEFINE  LCD_PinRS      PORTA,2
  26.  
  27. #DEFINE  LCD_PinRW      PORTA,1
  28.  
  29. #DEFINE  LCD_PinEnable  PORTA,3
  30.  
  31. #DEFINE  LCD_BusDatos   PORTB
  32.  
  33.  
  34.  
  35. ; Subrutina "LCD_Inicializa" ------------------------------------------------------------
  36.  
  37. ;
  38.  
  39. ; Inicialización del módulo LCD: Configura funciones del LCD, produce reset por software,
  40.  
  41. ; borra memoria y enciende pantalla. El fabricante especifica que para garantizar la
  42.  
  43. ; configuración inicial hay que hacerla como sigue:
  44.  
  45. ;
  46.  
  47. LCD_Inicializa
  48.  
  49.         ;bsf    STATUS,RP0              ; Configura las líneas conectadas al pines RS,
  50.  
  51.         bcf     LCD_PinRS               ; R/W y E.
  52.  
  53.         bcf     LCD_PinEnable
  54.  
  55.         bcf     LCD_PinRW
  56.  
  57.         bcf     STATUS,RP0
  58.  
  59.         bcf     LCD_PinRW               ; En caso de que esté conectado le indica
  60.  
  61.                                         ; que se va a escribir en el LCD.
  62.  
  63.         bcf     LCD_PinEnable           ; Impide funcionamiento del LCD poniendo E=0.
  64.  
  65.         bcf     LCD_PinRS               ; Activa el Modo Comando poniendo RS=0.
  66.  
  67.         call    Retardo_20ms
  68.  
  69.         movlw   b'00110000'    
  70.  
  71.         call    LCD_EscribeLCD          ; Escribe el dato en el LCD.
  72.  
  73.         call    Retardo_5ms    
  74.  
  75.         movlw   b'00110000'    
  76.  
  77.         call    LCD_EscribeLCD
  78.  
  79.         call    Retardo_200micros
  80.  
  81.         movlw   b'00110000'    
  82.  
  83.         call    LCD_EscribeLCD
  84.  
  85. ;call Retardo_20micros ; Retardo necesario para simular en PROTEUS.
  86.  
  87.         movlw   b'00100000'             ; Interface de 4 bits.
  88.  
  89.         call    LCD_EscribeLCD
  90.  
  91. ;call Retardo_20micros ; Retardo necesario para simular en PROTEUS.
  92.  
  93. ; Ahora configura el resto de los parámetros:
  94.  
  95.  
  96.  
  97.         call    LCD_2Lineas4Bits5x7     ; LCD de 2 líneas y caracteres de 5x7 puntos.
  98.  
  99.         call    LCD_Borra               ; Pantalla encendida y limpia. Cursor al principio
  100.  
  101.         call    LCD_CursorOFF           ; de la línea 1. Cursor apagado.
  102.  
  103.         call    LCD_CursorIncr          ; Cursor en modo incrementar.
  104.  
  105.         return
  106.  
  107.  
  108.  
  109. ; Subrutina "LCD_EscribeLCD" -----------------------------------------------------------
  110.  
  111. ;
  112.  
  113. ; Envía el dato del registro de trabajo W al bus de dato y produce un pequeño pulso en el pin
  114.  
  115. ; Enable del LCD. Para no alterar el contenido de las líneas de la parte baja del Puerto B que
  116.  
  117. ; no son utilizadas para el LCD (pines RB3:RB0), primero se lee estas líneas y después se
  118.  
  119. ; vuelve a enviar este dato sin cambiarlo.
  120.  
  121.  
  122.  
  123. LCD_EscribeLCD
  124.  
  125.         andlw   b'11110000'             ; Se queda con el nibble alto del dato que es el
  126.  
  127.         movwf   LCD_Dato                ; que hay que enviar y lo guarda.
  128.  
  129.         movf    LCD_BusDatos,W          ; Lee la información actual de la parte baja
  130.  
  131.         andlw   b'00001111'             ; del Puerto B, que no se debe alterar.
  132.  
  133.         iorwf   LCD_Dato,F              ; Enviará la parte alta del dato de entrada
  134.  
  135.                                         ; y en la parte baja lo que había antes.
  136.  
  137.         bsf     STATUS,RP0              ; Acceso al Banco 1.
  138.  
  139.         movf    TRISB,W         ; Guarda la configuración que tenía antes TRISB.
  140.  
  141.         movwf   LCD_GuardaTRISB
  142.  
  143.         movlw   b'00001111'             ; Las 4 líneas inferiores del Puerto B se dejan
  144.  
  145.         andwf   PORTB,F                 ; como estaban y las 4 superiores como salida.
  146.  
  147.         bcf     STATUS,RP0              ; Acceso al Banco 0.
  148.  
  149. ;
  150.  
  151.         movf    LCD_Dato,W              ; Recupera el dato a enviar.
  152.  
  153.         movwf   LCD_BusDatos            ; Envía el dato al módulo LCD.
  154.  
  155.         bsf     LCD_PinEnable           ; Permite funcionamiento del LCD mediante un pequeño
  156.  
  157.         bcf     LCD_PinEnable           ; pulso y termina impidiendo el funcionamiento del LCD.
  158.  
  159.         bsf     STATUS,RP0              ; Acceso al Banco 1. Restaura el antiguo valor en
  160.  
  161.         movf    LCD_GuardaTRISB,W       ; la configuración del Puerto B.
  162.  
  163.         movwf   PORTB                   ; Realmente es TRISB.
  164.  
  165.         bcf     STATUS,RP0              ; Acceso al Banco 0.
  166.  
  167.         return
  168.  
  169.  
  170.  
  171. ; Subrutinas variadas para el control del módulo LCD -----------------------------------------
  172.  
  173. ;
  174.  
  175. ;Los comandos que pueden ser ejecutados son:
  176.  
  177. ;
  178.  
  179. LCD_CursorIncr                          ; Cursor en modo incrementar.
  180.  
  181.         movlw   b'00000110'
  182.  
  183.         goto    LCD_EnviaComando
  184.  
  185. LCD_Linea1                              ; Cursor al principio de la Línea 1.
  186.  
  187.         movlw   b'10000000'             ; Dirección 00h de la DDRAM
  188.  
  189.         goto    LCD_EnviaComando
  190.  
  191. LCD_Linea2                              ; Cursor al principio de la Línea 2.
  192.  
  193.         movlw   b'11000000'             ; Dirección 40h de la DDRAM
  194.  
  195.         goto    LCD_EnviaComando
  196.  
  197. LCD_PosicionLinea1                      ; Cursor a posición de la Línea 1, a partir de la
  198.  
  199.         iorlw   b'10000000'             ; dirección 00h de la DDRAM más el valor del
  200.  
  201.         goto    LCD_EnviaComando        ; registro W.
  202.  
  203. LCD_PosicionLinea2                      ; Cursor a posición de la Línea 2, a partir de la
  204.  
  205.         iorlw   b'11000000'             ; dirección 40h de la DDRAM más el valor del
  206.  
  207.         goto    LCD_EnviaComando        ; registro W.
  208.  
  209. LCD_OFF                         ; Pantalla apagada.
  210.  
  211.         movlw   b'00001000'
  212.  
  213.         goto    LCD_EnviaComando
  214.  
  215. LCD_CursorON                            ; Pantalla encendida y cursor encendido.
  216.  
  217.         movlw   b'00001110'
  218.  
  219.         goto    LCD_EnviaComando
  220.  
  221. LCD_CursorOFF                           ; Pantalla encendida y cursor apagado.
  222.  
  223.         movlw   b'00001100'
  224.  
  225.         goto    LCD_EnviaComando
  226.  
  227. LCD_Borra                               ; Borra toda la pantalla, memoria DDRAM y pone el
  228.  
  229.         movlw   b'00000001'             ; cursor a principio de la línea 1.
  230.  
  231.         goto    LCD_EnviaComando
  232.  
  233. LCD_2Lineas4Bits5x7                     ; Define la pantalla de 2 líneas, con caracteres
  234.  
  235.         movlw   b'00101000'             ; de 5x7 puntos y conexión al PIC mediante bus de
  236.  
  237. ;       goto    LCD_EnviaComando        ; 4 bits.
  238.  
  239.  
  240.  
  241. ; Subrutinas "LCD_EnviaComando" y "LCD_Caracter" ------------------------------------
  242.  
  243. ;
  244.  
  245. ; "LCD_EnviaComando". Escribe un comando en el registro del módulo LCD. La palabra de
  246.  
  247. ; comando ha sido entregada a través del registro W.  Trabaja en Modo Comando.
  248.  
  249. ; "LCD_Caracter". Escribe en la memoria DDRAM del LCD el carácter ASCII introducido a
  250.  
  251. ; a través del registro W. Trabaja en Modo Dato.
  252.  
  253. ;
  254.  
  255. LCD_EnviaComando
  256.  
  257.         bcf     LCD_PinRS               ; Activa el Modo Comando, poniendo RS=0.
  258.  
  259.         goto    LCD_Envia
  260.  
  261. LCD_Caracter
  262.  
  263.         bsf     LCD_PinRS               ; Activa el "Modo Dato", poniendo RS=1.
  264.  
  265.         call    LCD_CodigoCGROM ; Obtiene el código para correcta visualización.
  266.  
  267. LCD_Envia
  268.  
  269.         movwf   LCD_GuardaDato          ; Guarda el dato a enviar.
  270.  
  271.         call    LCD_EscribeLCD          ; Primero envía el nibble alto.
  272.  
  273.         swapf   LCD_GuardaDato,W        ; Ahora envía el nibble bajo. Para ello pasa el
  274.  
  275.                                         ; nibble bajo del dato a enviar a parte alta del byte.
  276.  
  277.         call    LCD_EscribeLCD          ; Se envía al visualizador LCD.
  278.  
  279.         btfss   LCD_PinRS               ; Debe garantizar una correcta escritura manteniendo
  280.  
  281.         call    Retardo_2ms             ; 2 ms en modo comando y 50 µs en modo cáracter.
  282.  
  283.         call    Retardo_50micros
  284.  
  285.         return 
  286.  
  287.  
  288.  
  289. ; Subrutina "LCD_CodigoCGROM" -----------------------------------------------------------
  290.  
  291. ;
  292.  
  293. ; A partir del carácter ASCII número 127 los códigos de los caracteres definidos en la
  294.  
  295. ; tabla CGROM del LM016L no coinciden con los códigos ASCII. Así por ejemplo, el código
  296.  
  297. ; ASCII de la "Ñ" en la tabla CGRAM del LM016L es EEh.
  298.  
  299. ;
  300.  
  301. ; Esta subrutina convierte los códigos ASCII de la "Ñ", "º" y otros, a códigos CGROM para que
  302.  
  303. ; que puedan ser visualizado en el módulo LM016L.
  304.  
  305. ;
  306.  
  307. ; Entrada:      En (W) el código ASCII del carácter que se desea visualizar.
  308.  
  309. ; Salida:       En (W) el código definido en la tabla CGROM.
  310.  
  311.  
  312.  
  313. LCD_CodigoCGROM
  314.  
  315.         movwf   LCD_Dato                ; Guarda el valor del carácter y comprueba si es
  316.  
  317. LCD_EnheMinuscula                       ; un carácter especial.
  318.  
  319.         sublw   'ñ'                    ; ¿Es la "ñ"?
  320.  
  321.         btfss   STATUS,Z
  322.  
  323.         goto    LCD_EnheMayuscula       ; No es "ñ".
  324.  
  325.         movlw   b'11101110'             ; Código CGROM de la "ñ".
  326.  
  327.         movwf   LCD_Dato
  328.  
  329.         goto    LCD_FinCGROM
  330.  
  331. LCD_EnheMayuscula
  332.  
  333.         movf    LCD_Dato,W              ; Recupera el código ASCII de entrada.
  334.  
  335.         sublw   'Ñ'                    ; ¿Es la "Ñ"?
  336.  
  337.         btfss   STATUS,Z
  338.  
  339.         goto    LCD_Grado               ; No es "Ñ".
  340.  
  341.         movlw   b'11101110'             ; Código CGROM de la "ñ". (No hay símbolo para
  342.  
  343.         movwf   LCD_Dato                ; la "Ñ" mayúscula en la CGROM).
  344.  
  345.         goto    LCD_FinCGROM   
  346.  
  347. LCD_Grado
  348.  
  349.         movf    LCD_Dato,W              ; Recupera el código ASCII de entrada.
  350.  
  351.         sublw   'º'                    ; ¿Es el símbolo "º"?
  352.  
  353.         btfss   STATUS,Z
  354.  
  355.         goto    LCD_FinCGROM            ; No es "º".
  356.  
  357.         movlw   b'11011111'             ; Código CGROM del símbolo "º".
  358.  
  359.         movwf   LCD_Dato
  360.  
  361. LCD_FinCGROM
  362.  
  363.         movf    LCD_Dato,W              ; En (W) el código buscado.
  364.  
  365.         return
  366.  
  367.  
  368.  
  369. ; Subrutina "LCD_DosEspaciosBlancos" y "LCD_LineaBlanco" --------------------------------
  370.  
  371. ;
  372.  
  373. ; Visualiza espacios en blanco.
  374.  
  375.  
  376.  
  377. LCD_LineaEnBlanco
  378.  
  379.         movlw   LCD_CaracteresPorLinea
  380.  
  381.         goto    LCD_EnviaBlancos
  382.  
  383. LCD_UnEspacioBlanco
  384.  
  385.         movlw   .1
  386.  
  387.         goto    LCD_EnviaBlancos
  388.  
  389. LCD_DosEspaciosBlancos
  390.  
  391.         movlw   .2
  392.  
  393.         goto    LCD_EnviaBlancos
  394.  
  395. LCD_TresEspaciosBlancos
  396.  
  397.         movlw   .3
  398.  
  399. LCD_EnviaBlancos
  400.  
  401.         movwf   LCD_Auxiliar1           ; (LCD_Auxiliar1) se utiliza como contador.
  402.  
  403. LCD_EnviaOtroBlanco    
  404.  
  405.         movlw   ' '                     ; Esto es un espacio en blanco.
  406.  
  407.         call    LCD_Caracter            ; Visualiza tanto espacios en blanco como se
  408.  
  409.         decfsz  LCD_Auxiliar1,F         ; haya cargado en (LCD_Auxiliar1).
  410.  
  411.         goto    LCD_EnviaOtroBlanco
  412.  
  413.         return
  414.  
  415.  
  416.  
  417. ; Subrutinas "LCD_ByteCompleto" y "LCD_Byte" --------------------------------------------
  418.  
  419. ;
  420.  
  421. ; Subrutina "LCD_ByteCompleto", visualiza el byte que almacena el registro W en el
  422.  
  423. ; lugar actual de la pantalla. Por ejemplo, si (W)=b'10101110' visualiza "AE".
  424.  
  425. ;
  426.  
  427. ; Subrutina "LCD_Byte" igual que la anterior, pero en caso de que el nibble alto sea cero
  428.  
  429. ; visualiza en su lugar un espacio en blanco. Por ejemplo si (W)=b'10101110' visualiza "AE"
  430.  
  431. ; y si (W)=b'00001110', visualiza " E" (un espacio blanco delante).
  432.  
  433. ;
  434.  
  435. ; Utilizan la subrutina "LCD_Nibble" que se analiza más adelante.
  436.  
  437. ;
  438.  
  439. LCD_Byte
  440.  
  441.         movwf   LCD_Auxiliar2           ; Guarda el valor de entrada.
  442.  
  443.         andlw   b'11110000'             ; Analiza si el nibble alto es cero.
  444.  
  445.         btfss   STATUS,Z                ; Si es cero lo apaga.
  446.  
  447.         goto    LCD_VisualizaAlto               ; No es cero y lo visualiza.
  448.  
  449.         movlw   ' '                     ; Visualiza un espacio en blanco.
  450.  
  451.         call    LCD_Caracter
  452.  
  453.         goto    LCD_VisualizaBajo
  454.  
  455.  
  456.  
  457. LCD_ByteCompleto
  458.  
  459.         movwf   LCD_Auxiliar2           ; Guarda el valor de entrada.
  460.  
  461. LCD_VisualizaAlto
  462.  
  463.         swapf   LCD_Auxiliar2,W         ; Pone el nibble alto en la parte baja.
  464.  
  465.         call    LCD_Nibble              ; Lo visualiza.
  466.  
  467. LCD_VisualizaBajo
  468.  
  469.         movf    LCD_Auxiliar2,W         ; Repite el proceso con el nibble bajo.
  470.  
  471. ;       call    LCD_Nibble              ; Lo visualiza.
  472.  
  473. ;       return
  474.  
  475.  
  476.  
  477. ; Subrutina "LCD_Nibble" ----------------------------------------------------------------
  478.  
  479. ;
  480.  
  481. ; Visualiza en el lugar actual de la pantalla, el valor hexadecimal que almacena en el nibble
  482.  
  483. ; bajo del registro W. El nibble alto de W no es tenido en cuenta. Ejemplos:
  484.  
  485. ; - Si (W)=b'01010110', se visualizará "6".
  486.  
  487. ; - Si (W)=b'10101110', se visualizará "E".
  488.  
  489. ;
  490.  
  491. LCD_Nibble
  492.  
  493.         andlw   b'00001111'             ; Se queda con la parte baja.
  494.  
  495.         movwf   LCD_Auxiliar1           ; Lo guarda.
  496.  
  497.         sublw   0x09                    ; Comprueba si hay que representarlo con letra.
  498.  
  499.         btfss   STATUS,C       
  500.  
  501.         goto    LCD_EnviaByteLetra
  502.  
  503.         movf    LCD_Auxiliar1,W
  504.  
  505.         addlw   '0'                     ; El número se pasa a carácter ASCII sumándole
  506.  
  507.         goto    LCD_FinVisualizaDigito  ; el ASCII del cero y lo visualiza.
  508.  
  509. LCD_EnviaByteLetra
  510.  
  511.         movf    LCD_Auxiliar1,W
  512.  
  513.         addlw   'A'-0x0A                        ; Sí, por tanto, se le suma el ASCII de la 'A'.
  514.  
  515. LCD_FinVisualizaDigito
  516.  
  517.         goto    LCD_Caracter            ; Y visualiza el carácter. Se hace con un "goto"
  518.  
  519.                                         ; para no sobrecargar la pila.
LCD_MENS.INC
Código: ASM
  1. Librería de subrutinas para el manejo de mensajes a visualizar en un visualizador LCD.
  2.  
  3.  
  4.  
  5.         CBLOCK  0x25
  6.  
  7.         LCD_ApuntaCaracter              ; Indica la posición del carácter a visualizar
  8.  
  9.                                         ; respecto del comienzo de todos los mensajes,
  10.  
  11.                                         ; (posición de la etiqueta "Mensajes").
  12.  
  13.         LCD_ValorCaracter               ; Código ASCII del carácter a visualizar
  14.  
  15.         ENDC                           
  16.  
  17.  
  18.  
  19. ; Los mensajes tienen que estar situados dentro de las 256 primeras posiciones de la
  20.  
  21. ; memoria de programa, es decir, no pueden superar la dirección 0FFh.
  22.  
  23.  
  24.  
  25. ; Subrutina "LCD_Mensaje" ---------------------------------------------------------------
  26.  
  27. ;
  28.  
  29. ; Visualiza por pantalla el mensaje apuntado por el registro W.
  30.  
  31. ;
  32.  
  33. ; Los mensajes deben localizarse dentro de una zona encabezada por la etiqueta "Mensajes" y que
  34.  
  35. ; tenga la siguiente estructura:
  36.  
  37. ;
  38.  
  39. ; Mensajes                              ; ¡Etiqueta obligatoria!
  40.  
  41. ;       addwf   PCL,F
  42.  
  43. ; Mensaje0                              ; Posición inicial del mensaje.
  44.  
  45. ;       DT ".. ..", 0x00                        ; Mensaje terminado en 0x00.
  46.  
  47. ; Mensaje1
  48.  
  49. ;       ...    
  50.  
  51. ;       ...
  52.  
  53. ; FinMensajes
  54.  
  55. ;
  56.  
  57. ; La llamada a esta subrutina se realizará siguiendo este ejemplo:
  58.  
  59. ;
  60.  
  61. ;       movlw   Mensaje0                        ; Carga la posición del mensaje.
  62.  
  63. ;       call    LCD_Mensaje             ; Visualiza el mensaje.
  64.  
  65. ;
  66.  
  67. LCD_Mensaje
  68.  
  69.         movwf   LCD_ApuntaCaracter      ; Posición del primer carácter del mensaje.
  70.  
  71.         movlw   Mensajes                        ; Halla la posición relativa del primer carácter
  72.  
  73.         subwf   LCD_ApuntaCaracter,F    ; del mensaje respecto de etiqueta "Mensajes".
  74.  
  75.         decf    LCD_ApuntaCaracter,F    ; Compensa la posición que ocupa "addwf PCL,F".
  76.  
  77. LCD_VisualizaOtroCaracter
  78.  
  79.         movf    LCD_ApuntaCaracter,W
  80.  
  81.         call    Mensajes                        ; Obtiene el código ASCII del carácter apuntado.
  82.  
  83.         movwf   LCD_ValorCaracter               ; Guarda el valor de carácter.
  84.  
  85.         movf    LCD_ValorCaracter,F     ; Lo único que hace es posicionar flag Z. En caso
  86.  
  87.         btfsc   STATUS,Z                ; que sea "0x00", que es código indicador final       
  88.  
  89.         goto    LCD_FinMensaje          ; de mensaje, sale fuera.
  90.  
  91. LCD_NoUltimoCaracter
  92.  
  93.         call    LCD_Caracter            ; Visualiza el carácter ASCII leído.
  94.  
  95.         incf    LCD_ApuntaCaracter,F    ; Apunta a la posición del siguiente carácter
  96.  
  97. ;-----------------------------------------------------------------
  98.  
  99.         btfss   STATUS,C        ;Si hay acarreo al incrementar LCD_ApuntaCaracter es por
  100.  
  101.         incf    PCLATH          ;haber cambiado de página por lo que hay que sumar 1 al PCLATH
  102.  
  103. ;----------------------------------------------------------------
  104.  
  105.         goto    LCD_VisualizaOtroCaracter       ; dentro del mensaje.
  106.  
  107. LCD_FinMensaje
  108.  
  109.         return                          ; Vuelve al programa principal.
  110.  
  111.  
  112.  
  113. ; Subrutina "LCD_MensajeMovimiento" -----------------------------------------------------
  114.  
  115. ;
  116.  
  117. ; Visualiza un mensaje de mayor longitud que los 16 caracteres que pueden representarse
  118.  
  119. ; en una línea, por tanto se desplaza a través de la pantalla.
  120.  
  121. ;
  122.  
  123. ; En el mensaje debe dejarse 16 espacios en blanco, al principio y al final para
  124.  
  125. ; conseguir que el desplazamiento del mensaje sea lo más legible posible.
  126.  
  127. ;
  128.  
  129.         CBLOCK
  130.  
  131.         LCD_CursorPosicion              ; Contabiliza la posición del cursor dentro de la
  132.  
  133.         ENDC                            ; pantalla LCD
  134.  
  135.  
  136.  
  137. LCD_MensajeMovimiento
  138.  
  139.         movwf   LCD_ApuntaCaracter      ; Posición del primer carácter del mensaje.
  140.  
  141.         movlw   Mensajes                        ; Halla la posición relativa del primer carácter
  142.  
  143.         subwf   LCD_ApuntaCaracter,F    ; del mensaje respecto de la etiqueta "Mensajes".
  144.  
  145.         decf    LCD_ApuntaCaracter,F    ; Compensa la posición que ocupa "addwf PCL,F".
  146.  
  147. LCD_PrimeraPosicion
  148.  
  149.         clrf    LCD_CursorPosicion      ; El cursor en la posición 0 de la línea.
  150.  
  151.         call    LCD_Borra               ; Se sitúa en la primera posición de la línea 1 y
  152.  
  153. LCD_VisualizaCaracter                   ; borra la pantalla.
  154.  
  155.         movlw   LCD_CaracteresPorLinea  ; ¿Ha llegado a final de línea?
  156.  
  157.         subwf   LCD_CursorPosicion,W
  158.  
  159.         btfss   STATUS,Z
  160.  
  161.         goto    LCD_NoEsFinalLinea
  162.  
  163. LCD_EsFinalLinea
  164.  
  165.         call    Retardo_200ms           ; Lo mantiene visualizado durante este tiempo.
  166.  
  167.         call    Retardo_200ms
  168.  
  169.         movlw   LCD_CaracteresPorLinea-1; Apunta a la posición del segundo carácter visualizado
  170.  
  171.         subwf   LCD_ApuntaCaracter,F    ; en pantalla, que será el primero en la siguiente
  172.  
  173.         goto    LCD_PrimeraPosicion      ; visualización de línea, para producir el efecto
  174.  
  175. LCD_NoEsFinalLinea                      ; de desplazamiento hacia la izquierda.
  176.  
  177.         movf    LCD_ApuntaCaracter,W
  178.  
  179.         call    Mensajes                        ; Obtiene el ASCII del carácter apuntado.
  180.  
  181.         movwf   LCD_ValorCaracter               ; Guarda el valor de carácter.
  182.  
  183.         movf    LCD_ValorCaracter,F     ; Lo único que hace es posicionar flag Z. En caso
  184.  
  185.         btfsc   STATUS,Z                ; que sea "0x00", que es código indicador final       
  186.  
  187.         goto    LCD_FinMovimiento       ; de mensaje, sale fuera.
  188.  
  189. LCD_NoUltimoCaracter2
  190.  
  191.         call    LCD_Caracter            ; Visualiza el carácter ASCII leído.
  192.  
  193.         incf    LCD_CursorPosicion,F    ; Contabiliza el incremento de posición del
  194.  
  195.                                         ; cursor en la pantalla.
  196.  
  197.         incf    LCD_ApuntaCaracter,F    ; Apunta a la siguiente posición por visualizar.
  198.  
  199.         goto    LCD_VisualizaCaracter   ; Vuelve a visualizar el siguiente carácter
  200.  
  201. LCD_FinMovimiento                       ; de la línea.
  202.  
  203.         return                          ; Vuelve al programa principal.
Bin_BCD.INC
Código: ASM
  1. ; REGISTROS USADOS PARA LA CONVERSION
  2.         ;Num_Binario
  3.         ;Centena
  4.         ;Decena
  5.         ;Unidad
  6.  
  7. ;Rutina de Conversion............
  8. Binario_BCD
  9.         movf    Num_Binario,W   ;Num_Binario ---> W
  10.         movwf   Unidad          ;W ---> Unidad
  11.         clrf    Decena          ;Borramos Decena
  12.         clrf    Centena         ;Borramos Centena
  13. BCD_0
  14.         movlw   d'10'           ;Movemos .10 ---> W
  15.         subwf   Unidad,W        ;Restamos Unidad - W y guardamos en W
  16.         btfss   STATUS,C        ;Preguntamos por el estado del bit Carry
  17.         goto    BCD_Fin         ;Si es 0 salimos de la Rutina
  18. BCD_1
  19.         movwf   Unidad          ;Guardamos el valor de la resta en Unidad
  20.         incf    Decena,f        ;Incrementamos Decena y guardamos en Decena
  21.         movlw   d'10'           ;Movemos .10 ---> W
  22.         subwf   Decena,W        ;Restamos Decena - W y guardamos en W
  23.         btfss   STATUS,C        ;Preguntamos por el estado del bit Carry
  24.         goto    BCD_0
  25. BCD_2
  26.     clrf        Decena          ;Borramos Decena
  27.         incf    Centena,f       ;Incrementamos Centena y guardamos en Centena
  28.         goto    BCD_0
  29. BCD_Fin
  30.        
  31.         return

Muchas Gracias.
Título: Re: Guardar valor modulo ADC
Publicado por: KILLERJC en 10 de Mayo de 2015, 11:17:27
Mirando las funciones deberias poner lo que quieras escribir en W y luego usar un CALL LCD_Caracter
Título: Re: Guardar valor modulo ADC
Publicado por: Miquel_S en 10 de Mayo de 2015, 11:30:22
Hola KILLERJC eso mismo es lo que creo que estoy haciendo, pero no me da el valor que debería dar, voy a probar a hacer las divisiones paso a paso para convertir a BCD.
Primero voy a dividir por 100 el numero binario para conseguir las centenas, luego por 10 para las decenas y luego unidades, a ver si de esta manera consigo el resultado para cargar en W y después llamar a LCD_Caracter.

Gracias.
Título: Re: Guardar valor modulo ADC
Publicado por: KILLERJC en 10 de Mayo de 2015, 11:59:05
El codigo BCD esta bien, creo que el problema esta en lo que se envia al LCD.

Proba una cosa... antes de enviar lo que esta en W, sumale 48 (0x30), que es el valor del caracter 0 en el LCD, luego si lo dejas en W al resultado de eso y llamas a la funcion.

Es decir


Código: ASM
  1. MOVLW Centena
  2. ADDLW 0x30
  3. CALL LCD_Caracter
Título: Re: Guardar valor modulo ADC
Publicado por: Miquel_S en 10 de Mayo de 2015, 19:12:41
Hola KILLERJC después de probar lo que me comentas el resultado no es el esperado:
Código: ASM
  1. ;Conversion a decimal........
  2.         call        LCD_Linea2      ;Visualizamos en la segunda linea del LCD
  3.         pageselw    Mensaje1
  4.         movlw       Mensaje1
  5.         call        LCD_Mensaje
  6.         movlw       0xAF            ;Cargamos W con el valor 175 en decimal
  7.         movwf       Num_Binario
  8.         call        Binario_BCD     ;Llamamos a la rutina de conversion
  9.         movlw       Centena
  10.         addlw       0x30
  11.         call        LCD_Caracter
  12.         sleep                       ;Modo reposo
sumando 0x30 me sale el carácter 'a' cuando el carácter 'a' debería de ser 0x61 y sumando 0x31 me sale la 'b' voy a intentar averiguar el porque.

Gracias. 
Título: Re: Guardar valor modulo ADC
Publicado por: KILLERJC en 10 de Mayo de 2015, 22:42:39
Tenes un error en tu codigo:

Cambia:

Código: ASM
  1. movlw       Centena

Por

Código: ASM
  1. movf       Centena,W

Por que si haces eso como hiciste solo cargarias el numero de la direccion de memoria de Centena
Título: Re: Guardar valor modulo ADC
Publicado por: Miquel_S en 11 de Mayo de 2015, 04:29:33
De nuevo gracias por la ayuda, ahora si funciona con cualquier numero, lo que no entiendo el porque de sumarle el valor del carácter 0.
Código: ASM
  1. ;Conversion a decimal........
  2.         call        LCD_Linea2      ;Visualizamos en la segunda linea del LCD
  3.         pageselw    Mensaje1
  4.         movlw       Mensaje1
  5.         call        LCD_Mensaje
  6.         movlw       0x64            ;Cargamos W con el valor 100 en decimal
  7.         movwf       Num_Binario
  8.         call        Binario_BCD     ;Llamamos a la rutina de conversion
  9.         movf        Centena,W
  10.         addlw       0x30
  11.         call        LCD_Caracter
  12.         movf        Decena,W
  13.         addlw       0x30
  14.         call        LCD_Caracter
  15.         movf        Unidad,W
  16.         addlw       0x30
  17.         call        LCD_Caracter
  18.         sleep                       ;Modo reposo

Gracias KILLERJC.
Título: Re: Guardar valor modulo ADC
Publicado por: KILLERJC en 11 de Mayo de 2015, 05:11:52
Por que el codigo que tenes de binario a BCD, te deja un numero de 0x00 a 0x09 , sea para Centenas,Decenas y Unidades.
El caracter del 0 en el LCD esta representado por su ASCII, 0x30. Podes ver la tabla de caracteres en el datasheet del driver del LCD o

(http://4.bp.blogspot.com/_04qpO0onjBc/S9sqOgy4SMI/AAAAAAAAAFc/hxgH60yIyHA/s1600/Dibujo.bmp)
Título: Re: Guardar valor modulo ADC
Publicado por: Miquel_S en 11 de Mayo de 2015, 18:49:43
Hola, lo primero quiero dar las gracias a KILLERJC por toda la ayuda ofrecida desinteresadamente, os dejo el programa completo de la conversión BCD  para 8 bits por si alguien puede interesarle:
main:
Código: ASM
  1. ;------------------------------------------------------------------------------
  2. ; PROCESSOR DECLARATION
  3. ;------------------------------------------------------------------------------
  4.  
  5.      LIST      p=16F88              ; list directive to define processor
  6.      #INCLUDE <p16f88.inc>          ; processor specific variable definitions
  7.  
  8. ;------------------------------------------------------------------------------
  9. ;
  10. ; CONFIGURATION WORD SETUP
  11. ;
  12. ; The 'CONFIG' directive is used to embed the configuration word within the
  13. ; .asm file. The lables following the directive are located in the respective
  14. ; .inc file.  See the data sheet for additional information on configuration
  15. ; word settings.
  16. ;
  17. ;------------------------------------------------------------------------------
  18.  
  19.      __CONFIG    _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_ON & _WDT_OFF & _INTRC_IO
  20.      __CONFIG    _CONFIG2, _IESO_OFF & _FCMEN_OFF
  21.  
  22.      ERRORLEVEL -207
  23.      ERRORLEVEL -302
  24.      ERRORLEVEL -305
  25.  
  26. ;------------------------------------------------------------------------------
  27. ;
  28. ; VARIABLE DEFINITIONS
  29. ;
  30. ; Available Data Memory divided into Bank 0 through Bank 3.  Each Bank contains
  31. ; Special Function Registers and General Purpose Registers at the locations
  32. ; below:
  33. ;
  34. ;           SFR           GPR               SHARED GPR's
  35. ; Bank 0    0x00-0x1F     0x20-0x6F         0x70-0x7F
  36. ; Bank 1    0x80-0x9F     0xA0-0xEF         0xF0-0xFF
  37. ; Bank 2    0x100-0x10F   0x110-0x16F       0x170-0x17F
  38. ; Bank 3    0x180-0x18F   0x190-0x1EF       0x1F0-0x1FF
  39. ;
  40. ;------------------------------------------------------------------------------
  41.  
  42.     CBLOCK 0x30
  43.         Num_Binario
  44.         Centena
  45.         Decena
  46.         Unidad
  47.     ENDC
  48.  
  49.     Valor   equ     0xFF    ;Constante para prueba de conversion
  50.  
  51. ;------------------------------------------------------------------------------
  52. ; RESET VECTOR
  53. ;------------------------------------------------------------------------------
  54.  
  55. RESET     ORG     0x0000            ; processor reset vector
  56.           PAGESEL START
  57.           GOTO    START             ; go to beginning of program
  58.  
  59. ;Tabla para Mensajes.........................
  60. Mensajes                            ;Etiqueta obligatoria
  61.         addwf       PCL,F
  62. Mensaje0                            ;Posicion inicial del mensaje
  63.         DT " CONVERSION BCD ",0x00  ;Mensaje terminado en 0x00
  64. Mensaje1                        
  65.         DT "  PARA 8-bits ",0x00    
  66. Mensaje2
  67.         DT "HEX: 0x",0x00
  68. Mensaje3
  69.         DT "DEC: .",0x00
  70.  
  71. ;------------------------------------------------------------------------------
  72. ; MAIN PROGRAM
  73. ;------------------------------------------------------------------------------
  74.  
  75. START
  76. ;Configuramos el oscilador interno para 4MHz........
  77.         banksel     OSCCON          ;Banco 1
  78.         bsf         OSCCON,IRCF2
  79.         bsf         OSCCON,IRCF1
  80.         bcf         OSCCON,IRCF0
  81.  
  82. ;Configuramos los puertos del PIC........
  83.         banksel     PORTA           ;Banco 0
  84.         clrf        PORTA
  85.         clrf        PORTB
  86.         banksel     ANSEL           ;Banco 1
  87.         movlw       b'00000000'
  88.         movwf       ANSEL
  89.         clrf        TRISA
  90.         clrf        TRISB
  91.  
  92. ;Configuramos el LCD........
  93.         call        LCD_Inicializa  ;Inicializamos el LCD
  94.  
  95. ;Mensaje de Bienvenida........
  96.         pageselw    Mensaje0
  97.         movlw       Mensaje0
  98.         call        LCD_Mensaje    
  99.         call        LCD_Linea2      
  100.         pageselw    Mensaje1
  101.         movlw       Mensaje1
  102.         call        LCD_Mensaje
  103.         call        Retardo_2s
  104.  
  105. ;Visualizamos el numero en Hexadecimal
  106.         call        LCD_Borra
  107.         pageselw    Mensaje2
  108.         movlw       Mensaje2
  109.         call        LCD_Mensaje
  110.         movlw       Valor
  111.         call        LCD_ByteCompleto
  112.  
  113. ;Conversion a decimal........
  114.         call        LCD_Linea2
  115.         pageselw    Mensaje3
  116.         movlw       Mensaje3
  117.         call        LCD_Mensaje
  118.         movlw       Valor            ;Cargamos W con el valor 121 en decimal
  119.         movwf       Num_Binario
  120.         call        Binario_BCD      ;Llamamos a la rutina de conversion
  121.         movf        Centena,W
  122.         addlw       0x30
  123.         call        LCD_Caracter
  124.         movf        Decena,W
  125.         addlw       0x30
  126.         call        LCD_Caracter
  127.         movf        Unidad,W
  128.         addlw       0x30
  129.         call        LCD_Caracter
  130.         sleep                       ;Modo reposo
  131.  
  132. ;Rutinas para control del LCD........
  133. #include retardos.INC
  134. #include lcd_4bit.INC
  135. #include LCD_MENS.INC
  136. #include Bin_BCD.INC
  137.  
  138.         END
Ahora tocara estudiar la conversión BCD a 16 bits para luego conectar el potenciómetro y el servo.

Saludos!
Título: Re: Guardar valor modulo ADC
Publicado por: KILLERJC en 12 de Mayo de 2015, 09:16:31
El BCD a 16 bits lo podes extender utilizando el mismo codigo, nomas que ahora cada operacion de la primera resta ( ya que las otras son de los registros BCD y ocupan solo 4bits de los 8 ) va a tener que ser de 16bits. Vas a tener que agregar 2 variables mas y seguir agregando bloques para tus miles y decenas de miles.

Esa es la mas simple que te queda por hacer. Si seguis con la logica de restar 10, lo que si 16bits = 65536, serian 6553 restas de 10 y suma 1 + 655 resta de 10 y sumo 1 + 65 resta de 10 y suma 1 + 6 resta de 10 y suma 1 = 7279 *2 = 14558 instrucciones sin contar que la primera resta es de 16bits, testeo de condiciones y saltos. No creo estar tan equivocado :)


Luego tenes otras formas:

Esta muy interesante, constaria de 16 dezplazamientos ( en realidad mas por que estamos limitados a 8bits ) y luego suma de a 3 y restas.
http://en.wikipedia.org/wiki/Double_dabble

Como dije esta me parecio la mas interesante, un bucle de 16 que dentro posea shifts, luego 4 restas para saber si sumar o no, y sumar si es necesario

Esta ya tiene otro enfoque completamente distinto y BASTANTE matematico, bastante loco y mucho mas corto en terminos de memoria a mi parecer.
http://www.piclist.com/techref/microchip/math/radix/b2bu-16b5d.htm

Y luego este que no analize:
http://www.piclist.com/techref/microchip/math/radix/b2bu-16b5d-jm.htm

Eso si necesitas 16 bits, si necesitas 12 o 10, entonces es mas corto,el de 12 bits utiliza el mismo enfoque matematico del que hable antes y el de 10 realiza una division por 10:
http://www.piclist.com/techref/microchip/math/radix/b2bu-10b4d-eag.htm

Si se te ocurre preguntar como es posible dividir por 10, aqui tenes la solucion:
Titulo: Approximate Multiplication by 1/10
http://homepage.cs.uiowa.edu/~jones/bcd/divide.html