Autor Tema: Ejemplo conversor analogico digital con pic16f877A  (Leído 9125 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado JOSEMP

  • PIC10
  • *
  • Mensajes: 33
Ejemplo conversor analogico digital con pic16f877A
« en: 15 de Octubre de 2013, 17:14:59 »
Saludos amigos, tengo bastante tiempo ya tratando aprender a utilizar el Ca/d de este pic pero no he podido  :?, talvez alguien me pueda pasar algun ejemplo sencillo de como hacerlo por lo menos con un potenciometro para poder guiarme.

Les dejo la rutina que tengo la he revisado como 1000 veces pero la veo bien, talvez tenga un problema de logica ya que cuando quemo el pic para montarlo en fisico los valores del adc se ponen locos (suben y bajan) sin yo mover el potenciometro. cabe destacar que al momento de simularlo en proteus me salen puros 0000's

utilizoun cristal de 4mhz, y un potenciometro de 10K en Ra0





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


BINARIO_B
BINARIO_A
DECENAMIL
UNIDADMIL
CENTENA
DECENA
UNIDAD

                        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,TODOS ANALOGICOS
          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'01000101'
MOVWF ADCON0 ;CONFIGURO OSCILADO/8,CANAL 0, GO, ENCIENDO
GOTO RETARDO5 ;ESPERA EL TIEMPO DE ADQUISICION 25uS

;******************************************************************************************************************************************
ADC BSF ADCON0,GO ;INICIA EL PROCESO
REPETIR BTFSS ADCON0,2 ;CHEQUEO SI LA CONVERSION TERMINO
GOTO REPETIR
MOVFW ADRESH ;MUEVO LOS 2 BITS MAS SIGNIFICATIVOS A W
MOVWF BINARIO_B ;CARGO LOS 2 BITS MAS SIGNIFICATVIOS A BINARIO_B
BANKSEL ADRESL ;ME MUEVO AL BANCO 1 DONDE ESTA EL ADRESL
MOVFW ADRESL ;CARGO EN W EL VALOR DE ADRESL
BANKSEL BINARIO_A ;ME MUEVO AL BANCO 0 DONDE ESTA BINARIO_A
MOVWF BINARIO_A ;CARGO EL BINARIO_A CON EL VALOR DE 2 QUE VIENE DEL ADRESL
GOTO BIN_BCD ;VOY A LA SUBRUTINA BIN_BCD, YA QUE TENGO LOS VALORES DELCONVERTIDOR

;****************************************************************************************************************************************
BIN_BCD SWAPF BINARIO_B,W
ANDLW 0X0F
ADDLW 0XF0
MOVWF UNIDADMIL
ADDWF UNIDADMIL,F
ADDLW 0XE2
MOVWF CENTENA
ADDLW 0X32
MOVWF UNIDAD
MOVF BINARIO_B,W
ANDLW 0X0F
ADDWF CENTENA,F
ADDWF CENTENA,F
ADDWF UNIDAD,F
ADDLW 0XE9
MOVWF DECENA
ADDWF DECENA,F
ADDWF DECENA,F
SWAPF BINARIO_A,W
ANDLW 0X0F
ADDWF DECENA,F
ADDWF UNIDAD,F
RLF DECENA,F
RLF UNIDAD,F
COMF UNIDAD,F
RLF UNIDAD,F
MOVF BINARIO_A,W
ANDLW 0X0F
ADDWF UNIDAD,F
RLF UNIDADMIL,F
MOVLW 0X07
MOVWF DECENAMIL
MOVLW 0X0A
LB1 ADDWF UNIDAD,F
DECF DECENA,F
BTFSS STATUS,C
GOTO LB1
LB2 ADDWF DECENA,F
DECF CENTENA,F
BTFSS STATUS,C
GOTO LB2
LB3 ADDWF CENTENA,F
DECF UNIDADMIL,F
BTFSS STATUS,C
GOTO LB3
LB4 ADDWF UNIDADMIL,F
DECF DECENAMIL,F
BTFSS STATUS,C
GOTO LB4
RETURN

;****************************************************************************************************************************************
VALOR_ADC MOVLW 0X30
ADDWF   DECENAMIL,W
CALL DATO_LCD
MOVLW 0X30
ADDWF   UNIDADMIL,W
CALL DATO_LCD
MOVLW 0X30
ADDWF   CENTENA,W
CALL DATO_LCD
MOVLW 0X30
ADDWF   DECENA,W
CALL DATO_LCD
MOVLW 0X30
ADDWF   UNIDAD,W
CALL DATO_LCD
MOVLW 0X0C ;COFIG DISPLAY CONTROL: DISPALY=ON,CURSOR=OFF,PARPADEO DEL CURSOR=OFF
CALL CONTROL_LCD
MOVLW B'11000101' ;POSICIONO EL CURSOR EN LA SEGUNDA FILA POSICION 5
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
;****************************************************************************************************************************************
RETARDO5 MOVLW .8 ;RETARDO DE 25u SEGUNDOS
MOVWF CONT1
DEMORA5 DECFSZ CONT1,F
GOTO DEMORA5
RETURN
;****************************************************************************************************************************************
 END

Desconectado Vangeluz

  • PIC12
  • **
  • Mensajes: 74
    • Vangeluzweb
Re: Ejemplo conversor analogico digital con pic16f877A
« Respuesta #1 en: 22 de Octubre de 2013, 16:57:51 »
Mira amigo, yo tambien estoy metiendome con lo que es la conversion ADC, y en mi caso con el 16F876A pude hacer algo sencillo, pero me funciono.

Se trata del famoso termostato de Pablin, creado para el 16F870, solo le cambie a 16F876 y funciona de maravilla.

Va con un sensor de temperatura, pero si en lugar de sensor, le colocas un divisor resistivo a +5V y negativo, tomas el centro y lo mandas a la entrada del ADC,

puedes variar manualmente el potenciometro y te muestra en ASCII numeros de 000 a 255.

Si colocas como en mi caso 10k a (+)  de una tension y 1K a ( - ) y calibras a 000, puedes medir tension externa hasta unos 50 VDC.

Modificando puedes tambien usarlo como Ohmetro, Amperimetro, Wattimetro, etc, y por medio de diversos sensores es ilimitado en aplicaciones !!!

Espero te sirva, solo debes modificar la configuracion de los puertos, pero creo que no tiene muchas diferencias, mas que eso.

Termostato PIC y LCD
Vangeluz

Desconectado JOSEMP

  • PIC10
  • *
  • Mensajes: 33
Re: Ejemplo conversor analogico digital con pic16f877A
« Respuesta #2 en: 23 de Octubre de 2013, 18:34:51 »
Mira amigo, yo tambien estoy metiendome con lo que es la conversion ADC, y en mi caso con el 16F876A pude hacer algo sencillo, pero me funciono.

Se trata del famoso termostato de Pablin, creado para el 16F870, solo le cambie a 16F876 y funciona de maravilla.

Va con un sensor de temperatura, pero si en lugar de sensor, le colocas un divisor resistivo a +5V y negativo, tomas el centro y lo mandas a la entrada del ADC,

puedes variar manualmente el potenciometro y te muestra en ASCII numeros de 000 a 255.

Si colocas como en mi caso 10k a (+)  de una tension y 1K a ( - ) y calibras a 000, puedes medir tension externa hasta unos 50 VDC.

Modificando puedes tambien usarlo como Ohmetro, Amperimetro, Wattimetro, etc, y por medio de diversos sensores es ilimitado en aplicaciones !!!

Espero te sirva, solo debes modificar la configuracion de los puertos, pero creo que no tiene muchas diferencias, mas que eso.

Termostato PIC y LCD

(y)