Título: ADC con PIC16f877a
Publicado por: Jsempe en 13 Octubre 2013, 04:39 am
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
|