ADC con PIC16f877a

Iniciado por Jsempe, 13 Octubre 2013, 04:39 AM

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

Jsempe

Buenas, soy nuevo en este foro. Les cuanto mi problema

Estoy realizando una practica con mi pic 16f877a para aprender a utilizar el adc, coloque un potenciometro en el Ra0 para varialo y ver los distintos valores del adc en una pantalla lcd, pero los valores en la pantalla se vuelven locos, suben y bajan, segun queria que al momento de tener 5v en ra0 el valor de la lcd fuera 1024 que son 2^10 que son los bits que posee este pic para el adc..
Les anexo mi codigo para ver si alguien me puede ayudar

Agradecido con el que me eche una mano.
;******************************************************************************************************************************************
;             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"
CICLO CALL CONFIG_ADC ;CONFIGURACION DE ADCON 0
CALL ADC ;CONFIGURO
CALL VALOR_ADC
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 CALL clrdig ;BORRO LOS VALORES DEL ADC
MOVWF B'01000001'
MOVWF ADCON0 ;CONFIGURO OSCILADO/8,CANAL 0, DONE, ENCIENDO
GOTO RETARDO4 ;ESPERA EL TIEMPO DE ADQUISICION

;******************************************************************************************************************************************
ADC BSF ADCON0,2 ;INICIA EL PROCESO
NOP
NOP
REPETIR BTFSS ADCON0,2 ;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 ;CARGO EL VALOR DEL ADRESL EN REGA0
BCF ADCON0,0 ;TERMINO LA CONVERSION ASI QUE LO APAGO
GOTO BIN_BCD

;****************************************************************************************************************************************

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

clrdig clrf DSIGN
clrf DIGIT1
clrf DIGIT2
clrf DIGIT3
clrf DIGIT4
clrf DIGIT5
clrf DIGIT6
clrf DIGIT7
clrf DIGIT8
clrf DIGIT9
clrf DIGIT10
return
absa rlf REGA3,w
skpc
return ;Positive


;****************************************************************************************************************************************
VALOR_ADC MOVLW 0X30
ADDWF   DIGIT7,W
CALL DATO_LCD
MOVLW 0X30
ADDWF   DIGIT8,W
CALL DATO_LCD
MOVLW 0X30
ADDWF   DIGIT9,W
CALL DATO_LCD
MOVLW 0X30
ADDWF   DIGIT10,W
CALL DATO_LCD
MOVLW 0X0C ;COFIG DISPLAY CONTROL: DISPALY=ON,CURSOR=OFF,PARPADEO DEL CURSOR=OFF
CALL CONTROL_LCD
MOVLW B'11000101'
GOTO CONTROL_LCD
;******************************************************************************************************************************************
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
;****************************************************************************************************************************************
END