Gracias por responder. Últimamente no he tenido mucho tiempo estuve haciendo la rutina, pero al momento de simularla en la pantalla el ADC me muestra solo 0000, me deberia mostrar 1024 si con un potenciometro que tengo en RA0 lee 5v, al momento de realizar la practica en fisico, el valor de adc de da 345 y el valor va disminuyendo hasta 000 y luego vuelve a subir y baja otra vez a 000. En relaidad no se que estoy haciendo mal. Agradezco a quien me pueda ayudar.
;******************************************************************************************************************************************
; PRACTICA PARA EL ADC, UTILIZO UN POTENCIOMETRO EN RA0 Y EL VALOR EN BINARIO LO VISUALIZO EN LA LCD
;
;
;
;******************************************************************************************************************************************
INCLUDE <P16F877A.INC>
LIST P=16F877A
__CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF & _BOREN_ON & _LVP_OFF
;REDIFINICION DE NOMBRE
#DEFINE PUERTO_A PORTA
#DEFINE PUERTO_B PORTB
#DEFINE PUERTO_C PORTC
#DEFINE LCD_RS PORTC,7
#DEFINE LCD_RW PORTC,6
#DEFINE LCD_E PORTC,5
#DEFINE LCD_PUERTO PORTB
CBLOCK H'20' ;BLOQUE DE VARIABLES O REGISTROS
CONT1
CONT2
CONT3
CONTX
LOOPS
LOOPS1
LOOPS2
REGA0 ;lsb
REGA1
REGA2
REGA3 ;msb
REGB0 ;lsb
REGB1
REGB2
REGB3 ;msb
REGC0 ;lsb
REGC1
REGC2
REGC3 ;msb
DSIGN ;Digit Sign. 0=positive,1=negative
DIGIT1 ;MSD
DIGIT2
DIGIT3
DIGIT4
DIGIT5 ;Decimal (BCD) digits
DIGIT6
DIGIT7
DIGIT8
DIGIT9
DIGIT10 ;LSD
MTEMP
MCOUNT
CONTA
ENDC
ORG H'00'
GOTO COMIENZO
ORG H'100'
COMIENZO CALL PUERTO ;LLAMDA A PUERTO.
CALL CONFIG_LCD ;LLAMO A CONFIGURACION DE LCD
CALL RETARDO3 ;ESPERA DE 3 SEGUNDOS
CALL VISUALIZAR_LCD ;VISUALIZO EN LA L1 "ING. MECATRONICA"
CALL CONFIG_ADC ;CONFIGURACION DE ADCON 0
CICLO CALL ADC ;CONFIGURO
CALL VALOR_ADC
CALL RETARDO2
GOTO CICLO
;*****************************************************************************************************************************************
; BLOQUE DE RUTINAS BLOQUE DE RUTINAS
;*****************************************************************************************************************************************
PUERTO BSF STATUS,RP0
BCF STATUS,RP1
MOVLW B'111111'
MOVWF TRISA
MOVLW B'00000000'
MOVWF TRISB
MOVLW B'00000000'
MOVWF TRISC
MOVLW B'00000000'
MOVWF TRISD
MOVLW B'111'
MOVWF TRISE
CLRF OPTION_REG
NOP
MOVLW B'10000000'
MOVWF ADCON1 ;1PARA ADRSH=2 Y ADRESL=8,0 OSCILADO/8,1110= TODOS D MENOS RAO=a
BSF PIE1,ADIE ; HABILITADA LA CONVERSION
BCF STATUS,RP0
MOVLW B'00000000'
MOVWF INTCON
RETURN
;******************************************************************************************************************************************
;RUTINA PARA LA CONFIGURACION DE LAS OPERACIONES DE LA LCD
CONFIG_LCD MOVLW 0X01 ;EQUIVALENTE A BORRAR LA LCD
CALL CONTROL_LCD ;LLAMO LA HABILITACION DE CONTROL
MOVLW 0X02 ;EQUIVALENTE A RETORDAR EL CURSOR AL INICIO
CALL CONTROL_LCD ;LLAMO LA HABILITACION DE CONTROL
MOVLW 0X06 ;CONFIGURA EL MODO DE ENTRADA COMO EL INCREMENTO DEL CURSOR Y MODO NORMAL(AQUIPUEDOACTIVAR DESZPLAZAMIENTO)
CALL CONTROL_LCD ;LLAMO LA HABILITACION DE CONTROL
MOVLW 0X0F ;COFIG DISPLAY CONTROL: DISPALY=ON,CURSOR=ON,PARPADEO DEL CURSOR=ON
CALL CONTROL_LCD ;LLAMO LA HABILITACION DE CONTROL
MOVLW 0X38 ;FUNCTION SET:BUS DE 8 BIT,LCD DE 2 LINEAS,CARACTER DE 5X7 PUNTOS
CALL CONTROL_LCD ;LLAMO LA HABILITACION DE CONTROL
MOVLW 0X01 ;EQUIVALENTE A BORRAR LA LCD
CALL CONTROL_LCD ;LLAMO LA HABILITACION DE CONTROL
RETURN
;******************************************************************************************************************************************
;RUTINIA DE HABILATACION DE CONTROL Y DATOS PARA LA CONFIGURACION DEL LCD
CONTROL_LCD MOVWF LCD_PUERTO ;MUEVO EL VALOR DE W QUE POSEE EL CONTROL AL PUERTO PARA CONFIGURARLO
BCF LCD_RW ;COLOCO RW=0 PARA ACTIVAR LA ESCRITURA
BCF LCD_RS ;COLOCO RS=0 PARA ACTIVAR EL CONTROL
SALTOX BSF LCD_E ;COLOCO E=0 PARA DAR EL PULSO
NOP
NOP
BCF LCD_E ;PARA DAR POR TERMINADO EL PULSO
BCF LCD_RW ;PARA LIMPIARLO
BCF LCD_RS ;PARA LIMPIARLO
GOTO RETARDO1 ;VOY AL RETARDO DE 5m SEGUNDOS PARA LA ESPERA DE LA LCD
DATO_LCD MOVWF LCD_PUERTO ;MUEVO EL VALOR DE W QUE POSEE EL DATO A VISUALIZAR EN LA LCD
BCF LCD_RW ;COLOCO RW=0 PARA LA ESCRITURA
BSF LCD_RS ;COLOCO RS=1 PARA ACTIVAR EL MODO DE DATOS
GOTO SALTOX ;ME VOY A SALTOX PARA DAR EL PULSO DE ACTIVACION Y LIMPIAR LOS REGISTROS
;******************************************************************************************************************************************
VISUALIZAR_LCD CALL BORRAR_LCD ;BORRO LA LCD POR SI TENGO ALGO EN ELLA
MOVLW 'I' ;SEGMENTO 1 LINEA 1
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW 'N' ;SEGMENTO 2 LINEA 1
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW 'G' ;SEGMENTO 3 LINEA 1
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW '.' ;SEGMENTO 4 LINEA 1
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW ' ' ;SEGMENTO 5 LINEA 1
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW 'M' ;SEGMENTO 6 LINEA 1
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW 'E' ;SEGMENTO 7 LINEA 1
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW 'C' ;SEGMENTO 8 LINEA 1
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW 'A' ;SEGMENTO 9 LINEA 1
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW 'T' ;SEGMENTO 10 LINEA 1
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW 'R' ;SEGMENTO 11 LINEA 1
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW 'O' ;SEGMENTO 12 LINEA 1
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW 'N' ;SEGMENTO 13 LINEA 1
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW 'I' ;SEGMENTO 14 LINEA 1
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW 'C' ;SEGMENTO 15 LINEA 1
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW 'A' ;SEGMENTO 16 LINEA 1
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW 0XC0 ;LO UTILIZO PARA MOVERME A LA LINEA 2
CALL CONTROL_LCD ;HABILITACION DE CONTROL
MOVLW 'A' ;SEGMENTO 1 LINEA 2
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW 'D' ;SEGMENTO 2 LINEA 2
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW 'C' ;SEGMENTO 3 LINEA 2
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW '=' ;SEGMENTO 4 LINEA 2
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW ' ' ;SEGMENTO 5 LINEA 2
CALL DATO_LCD ;LLAMO LA HABILITAION DE DATOS
RETURN
;******************************************************************************************************************************************
;RUTINA PARA BORRAR LA LCD
BORRAR_LCD MOVLW 0X01 ;EQUIVALENTE AL CONTROL BORRAR LCD
GOTO CONTROL_LCD ;LLAMO LA HABILITACION DE CONTROL
;******************************************************************************************************************************************
;RUTINA PARA REGRESAR EL CURSOR AL INICIO
REGRESAR_LCD MOVLW 0X02 ;EQUIVALENTE A RETORDAR EL CURSOR AL INICIO
GOTO CONTROL_LCD ;LLAMO LA HABILITACION DE CONTROL
;******************************************************************************************************************************************
CONFIG_ADC MOVWF B'01000000'
MOVWF ADCON0 ;CONFIGURO OSCILADO/8,CANAL 0, DONE, APAGADO
RETURN
;******************************************************************************************************************************************
ADC BSF ADCON0,0 ;ENCIENDO EL CONVERSOR
CALL RETARDO4 ;RETARDO DE 1MILISEGUNDO
BSF ADCON0,2 ;INICIA EL PROCESO
NOP
NOP
REPETIR BTFSS PIR1,ADIF ;CHEQUEO SI LA CONVERSION TERMINO
GOTO REPETIR
MOVF ADRESH,W ;MUEVO LOS 2 BITS MAS SIGNIFICATIVOS A W
MOVWF REGA1 ;CARGO LOS 2 BITS MAS SIGNIFICATVIOS A REG0
CLRF REGA2 ;LIMPIO REGA1
CLRF REGA3 ;LIMPIO REGA2
BSF STATUS,RP0 ;ME MUEVO AL BANCO 1`PARA UTILIZAR EL ADRESL
MOVF ADRESL,W ;PASO LOS 8 BITS RESTANTES A W
BCF STATUS,RP0 ;ME MUEVO AL BANCO 0 PARA UTILIZAR LOS REGISTROS DE PROPOSITOS GENERALES
MOVWF REGA0
BCF ADCON0,0 ;TERMINO LA CONVERSION ASI QUE LO APAGO
GOTO BIN_BCD
;******************************************************************************************************************************************
RETARDO1 MOVLW .41 ;RETARDO DE 5MILISEGUNDOS
MOVWF CONT1
MOVlW .41
MOVWF CONT2
DEMORA1 DECFSZ CONT1,F
GOTO DEMORA1
DECFSZ CONT2,F
GOTO DEMORA1
RETURN
;****************************************************************************************************************************************
RETARDO2 MOVLW .183 ;RETARDO DE 1 SEGUNDOS
MOVWF CONT1
MOVlW .183
MOVWF CONT2
MOVLW .11
MOVWF CONT3
DEMORA2 DECFSZ CONT1,F
GOTO DEMORA2
DECFSZ CONT2,F
GOTO DEMORA2
DECFSZ CONT3,F
GOTO DEMORA2
RETURN
;****************************************************************************************************************************************
RETARDO3 CLRF CONT1 ;RETARDO DE 3 SEGUNDOS PARA MOSTRAR EL NUMERO
CLRF CONT2
MOVLW .16
MOVWF CONT3
DEMORA3 DECFSZ CONT1,F
GOTO DEMORA3
DECFSZ CONT2,F
GOTO DEMORA3
DECFSZ CONT3,F
GOTO DEMORA3
RETURN
;****************************************************************************************************************************************
RETARDO4 MOVLW .18 ;RETARDO DE 1MILISEGUNDOS
MOVWF CONT1
MOVlW .18
MOVWF CONT2
DEMORA4 DECFSZ CONT1,F
GOTO DEMORA4
DECFSZ CONT2,F
GOTO DEMORA4
RETURN
;****************************************************************************************************************************************
BIN_BCD clrf MTEMP ;Reset sign flag
call absa ;Make REGA positive
skpnc
return ;Overflow
call clrdig ;Clear all digits
movlw D'32' ;Loop counter
movwf MCOUNT
b2dloop rlf REGA0,f ;Shift msb into carry
rlf REGA1,f
rlf REGA2,f
rlf REGA3,f
movlw DIGIT10
movwf FSR ;Pointer to digits
movlw D'10' ;10 digits to do
movwf CONTA
adjlp rlf INDF,f ;Shift digit and carry 1 bit left
movlw D'10'
subwf INDF,w ;Check and adjust for decimal overflow
skpnc
movwf INDF
decf FSR,f ;Next digit
decfsz CONTA,f
goto adjlp
decfsz MCOUNT,f ;Next bit
goto b2dloop
btfsc MTEMP,0 ;Check sign
bsf DSIGN,0 ;Negative
clrc
return
;UTILITY ROUTINES
;Add REGB to REGA (Unsigned)
;Used by add, multiply,
addba movf REGB0,w ;Add lo byte
addwf REGA0,f
movf REGB1,w ;Add mid-lo byte
skpnc ;No carry_in, so just add
incfsz REGB1,w ;Add carry_in to REGB
addwf REGA1,f ;Add and propagate carry_out
movf REGB2,w ;Add mid-hi byte
skpnc
incfsz REGB2,w
addwf REGA2,f
movf REGB3,w ;Add hi byte
skpnc
incfsz REGB3,w
addwf REGA3,f
return
;Move REGA to REGC
;Used by multiply, sqrt
movac movf REGA0,w
movwf REGC0
movf REGA1,w
movwf REGC1
movf R;Used by sqrt
clrba clrf REGB0
clrf REGB1
clrf REGB2
clrf REGB3
;Clear REGA
;Used by multiply, sqrt
clra clrf REGA0
clrf REGA1
clrf REGA2
clrf REGA3
return
;Check sign of REGA and convert negative to positive
;Used by multiply, divide, bin2dec, round
absa rlf REGA3,w
skpc
return ;Positive
;Negate REGA
;Used by absa, multiply, divide, bin2dec, dec2bin, round
negatea movf REGA3,w ;Save sign in w
andlw 0x80
comf REGA0,f ;2's complement
comf REGA1,f
comf REGA2,f
comf REGA3,f
incfsz REGA0,f
goto nega1
incfsz REGA1,f
goto nega1
incfsz REGA2,f
goto nega1
incf REGA3,f
nega1 incf MTEMP,f ;flip sign flag
addwf REGA3,w ;Return carry set if -2147483648
return
;Check sign of REGB and convert negative to positive
;Used by multiply, divide
absb rlf REGB3,w
skpc
return ;Positive
;Negate REGB
;Used by absb, subtract, multiply, divide
negateb movf REGB3,w ;Save sign in w
andlw 0x80
comf REGB0,f ;2's complement
comf REGB1,f
comf REGB2,f
comf REGB3,f
incfsz REGB0,f
goto negb1
incfsz REGB1,f
goto negb1
incfsz REGB2,f
goto negb1
incf REGB3,f
negb1
incf MTEMP,f ;flip sign flag
addwf REGB3,w ;Return carry set if -2147483648
return
;Shift left REGA and REGC
;Used by multiply, divide, round
slac rlf REGA0,f
rlf REGA1,f
rlf REGA2,f
rlf REGA3,f
slc rlf REGC0,f
rlf REGC1,f
rlf REGC2,f
rlf REGC3,f
return
;Set all digits to 0
;Used by bin2dec
clrdig clrf DSIGN
clrf DIGIT1
clrf DIGIT2
clrf DIGIT3
clrf DIGIT4
clrf DIGIT5
clrf DIGIT6
clrf DIGIT7
clrf DIGIT8
clrf DIGIT9
clrf DIGIT10
return
;****************************************************************************************************************************************
VALOR_ADC MOVLW H'30'
ADDWF DIGIT7,W
CALL DATO_LCD
MOVLW H'30'
ADDWF DIGIT8,W
CALL DATO_LCD
MOVLW H'30'
ADDWF DIGIT9,W
CALL DATO_LCD
MOVLW H'30'
ADDWF DIGIT10,W
CALL DATO_LCD
MOVLW B'11000101'
GOTO CONTROL_LCD
;****************************************************************************************************************************************
END