Autor Tema: Ayuda ADC con PIC16f877a  (Leído 2245 veces)

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

Desconectado JOSEMP

  • PIC10
  • *
  • Mensajes: 33
Ayuda ADC con PIC16f877a
« en: 18 de Septiembre de 2013, 13:24:22 »
Saludos :)

Amigos estoy realizando una practica sencilla para aprender a utilizar el conversor A/D de este pic coloque un potenciometro en Ra0 para variarlo y ver el valor de la conversión en una LCD. Como saben es de 10 bits  ya configure todo pero ahora que tengo el valor en binario de la conversion entre el AdreH y adresL, ahora como haría para pasar ese valor para poder verlo en la pantalla?. Estuve leyendo por ahi de llevarlo a BCD por unidades decenas centenas ( y unidad de mil ya que tendria una resolucion de 1023). Me descargue una rutina del compañero suky de Binario a BCD pero todavía no logro comprenderla.

Otra pregunta: seria mejor trabajar con solo 8 Bits o con los 10? cuales serian sus ventajas y desventajas?

Logrado esto quisiera realizar el termómetro con el lm35

Gracias a quien me pueda ayudar!

Desconectado Pinolillo16

  • PIC18
  • ****
  • Mensajes: 324
Re: Ayuda ADC con PIC16f877a
« Respuesta #1 en: 24 de Septiembre de 2013, 03:22:54 »
Que tal amigo, te recomiendo que realices los siguiente para que te pueda quedar mas claro todo:

1 Realiza un programa donde conviertas de Binario a BCD con la rutina de suky o mejor aun arma la propia,
2 Una vez dominado esto, te recomiendo que trabajes de momento con los 8 bits mas significativos

Para la conversión tratare de explicarte un poco espero te ayude:

Tenemos una variable x con valor ej. 34, muy bien este valor estara dado en binario algo asi b'00100010'
Tienes que tener una variable de decenas y una de unidades ya que el 34 utiliza mas de 10 unidades. A tu variable x
le restaras 10 unidades, cada que esto se pueda incrementaras en 1 las decenas, cuando el resultado de la resta sea negativo
entonces ya no tendras un valor mayor de 10 por ello estaras teniendo en x las unidades. Y por último para que puedas visualizar estos
valores en la lcd habra que sumarle un 48 en decimal para que puedas obtener el ascii corespondiente.

Saludos


Desconectado JOSEMP

  • PIC10
  • *
  • Mensajes: 33
Re: Ayuda ADC con PIC16f877a
« Respuesta #2 en: 09 de Octubre de 2013, 23:16:08 »
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.


Código: [Seleccionar]
;******************************************************************************************************************************************
;             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




 

anything