TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: estratus123 en 21 de Marzo de 2006, 22:43:00

Título: Asesoria sobre ADC
Publicado por: estratus123 en 21 de Marzo de 2006, 22:43:00
Hola a todos, esta pregunta se ha formulado muchas veces pero no he logrado entender muy bien como funciona el ADC, estoy usando un pic 16f877 y me gusta saber como es que se tiene que configurar el pic para que pueda usar el ADC y como puedo recojer los datos analogicos que estan entrando... Espero me puedan ayudar
Título: RE: Asesoria sobre ADC
Publicado por: RaDoN en 22 de Marzo de 2006, 04:30:00
En general configuras los pines del puerto A (donde suele estar el ADC) como entrada, posteriormente le indica que lo usarás como analogicos. Debes escojerle un reloj por ejemplo el interno que no te dará problemas. Seleccionas el canal que desees que coja la muestra y por ultimo le indica que inicialice la captura.

Si no indicas con que lenguaje pretendes hacerlo, no podemos ser específicos, si es en ASM basta con que veas el datasheet cuales son los registros de control de este.
Título: RE: Asesoria sobre ADC
Publicado por: maunix en 22 de Marzo de 2006, 05:45:00
Escrito originalmente por estratus123
Hola a todos, esta pregunta se ha formulado muchas veces pero no he logrado entender muy bien como funciona el ADC, estoy usando un pic 16f877 y me gusta saber como es que se tiene que configurar el pic para que pueda usar el ADC y como puedo recojer los datos analogicos que estan entrando... Espero me puedan ayudar


No has intentado buscar en las Application Notes de Microchip? Realmente está todo resuelto solo debieras echar un vistazo y acomodar el software a tus necesidades puntuales.

Por defecto el pic en cuestión enciende con el puerto A todo como entrada y sus canales analógicos activados.

Saludos
Título: RE: Asesoria sobre ADC
Publicado por: estratus123 en 22 de Marzo de 2006, 10:10:00
Hola de nuevo,  les comento que estoy usando lenguaje ensamblador, el mayor problema que tengo es con algunos registros que no entiendo su funcion, voy a poner mi idea y espero me corrijan y me digan en que estoy mal.
El ADCON1 sirve para configurar el puerto entre a/d si es 0 los bit"s 0 y 1 es analogico y si estan en 1 es digital, pero tengo una duda en las caracteristicas dice que tambien hay un valor que lo toma como vref+, creo que es una referencia de voltaje, si me pudieran explicar que es exactamente y como usarlo o que utilidad tiene. Luego esta el ADCON0 el bit 7 y 6 (ADCS1,ADCS0) creo que es el reloj que usara para la conversion tambien tengo muchas dudas de que hace esto si lo tengo que configurar o no es necesario, el bit 4 y 3 son los canales de conversion que puedo usar, el bit 2 segun yo con este bit activo el conversor cuando se pone a uno, y tengo entendido que este regresa a cero cuando termina la conversion, el bit 1 es el que me avisa cuando la conversion termino y este bit debo de reresarlo manualmente a 0 por software, el bit 0 entiendo que es para decir si operara el adc, si esta activo o desactivo aunque no entiendo muy bien, ojala que si estoy mal en alguna de estas especificaciones me corrijan.

Tengo la duda de donde se almacena el resultado del ADC, segun he visto en los programas, se alamacena en un registro llamado ADRESL que segun mi pic 16f877 esta en 0x9E, es correcto esto o estoy completamente perdido. Este resultado se puede manipular normalmente o se tiene que manejar de alguna forma en especial.
En parte de los ejemplos que  he visto de microchip se acitva el INTCON, para esto es necesario, no entiendo ben esto.
Voy a poner mi idea de programa para capturar un dato, espero que ayuden en corregirlo, para poder obtener correctamente la conversion.
Tambien tengo una duda en el ADCON0,0 este bit lo tengo que desactivar cada vez que cambie entre canales del conversor, o siempre puede estar activo.


            bsf          status,rp0          ;entro al banco1
            movlw    0x00
            movwf    adcon1               ;configuro las entradas analogicas
            bcf         status,rp0        
            bcf         adcon0,4            
            bcf         adcon0,3            ;selecciono el canal AN0
            bsf         adcon0,0            ;Activo el ADC
            call         espe                  ;Tengo entendido que debo de darle un tiempo
                                                    ;de activacion, pero no se que tiempo debe ser.
                                                    ;Si me explicaran esta parte.
            bsf         ADCON0,2          ;Inicio la conversion
conve   btfss      ADCON0,1          ;Si el bit 1 de ADCON0 esta en uno termino
            goto      conve                  ;la conversion si no lo sigue revisando.
            bsf        status,rp0           ;Entro al banco uno para sacar el resultado
            movf     adresl,0               ;de adresl y lo dejo en W
            bcf        status,rp0            ;Regreso al banco 0

      ;En teoria yo entiendo que asi funcionaria, pero no estoy muy seguro,
      ;si quisiera sacar otro dato tendria primero que borrar el ADCON0,1

            bcf        adcon0,1


Bueno basicamente es hasta donde se yo, si cometi algun error les agradeceria mucho que me explicaran donde fue, y como lo podria corregir, y si me explicaran donde debe de llevar tiempos y donde no se los agradeceria aun mas, ya que he leido que se le debe de dar tiempos a la conversion si no esta sera erronea. Muchas gracias adelantadas
Título: RE: Asesoria sobre ADC
Publicado por: estratus123 en 22 de Marzo de 2006, 10:13:00
Escrito originalmente por RaDoN
En general configuras los pines del puerto A (donde suele estar el ADC) como entrada, posteriormente le indica que lo usarás como analogicos. Debes escojerle un reloj por ejemplo el interno que no te dará problemas. Seleccionas el canal que desees que coja la muestra y por ultimo le indica que inicialice la captura.

Si no indicas con que lenguaje pretendes hacerlo, no podemos ser específicos, si es en ASM basta con que veas el datasheet cuales son los registros de control de este.


Hola RaDoN, perdona mi ingnorancia, pero que es eso de escojer un reloj interno, supongo que es algo basico, pero no he visto los relojes internos, tiene que ver algo con ADCON0 los bit 7 y 6, y si si es esto, como funcionan, ya que no entiendo muy bien lo del reloj interno
Título: RE: Asesoria sobre ADC
Publicado por: RaDoN en 22 de Marzo de 2006, 13:43:00
Codigo:

////////////////////////////////////////////////////////////////// ADC
// ADC Functions: SETUP_ADC(), SETUP_ADC_PORTS() (aka SETUP_PORT_A),
//                SET_ADC_CHANNEL(), READ_ADC()
// Constants used for SETUP_ADC() are:
#define ADC_OFF                 0              // ADC Off
#define ADC_CLOCK_DIV_2   0x10000
#define ADC_CLOCK_DIV_4    0x4000
#define ADC_CLOCK_DIV_8    0x0040
#define ADC_CLOCK_DIV_16   0x4040
#define ADC_CLOCK_DIV_32   0x0080
#define ADC_CLOCK_DIV_64   0x4080
#define ADC_CLOCK_INTERNAL 0x00c0              // Internal 2-6us

Título: RE: Asesoria sobre ADC
Publicado por: estratus123 en 23 de Marzo de 2006, 02:47:00
Escrito originalmente por RaDoN
Codigo:

////////////////////////////////////////////////////////////////// ADC
// ADC Functions: SETUP_ADC(), SETUP_ADC_PORTS() (aka SETUP_PORT_A),
//                SET_ADC_CHANNEL(), READ_ADC()
// Constants used for SETUP_ADC() are:
#define ADC_OFF                 0              // ADC Off
#define ADC_CLOCK_DIV_2   0x10000
#define ADC_CLOCK_DIV_4    0x4000
#define ADC_CLOCK_DIV_8    0x0040
#define ADC_CLOCK_DIV_16   0x4040
#define ADC_CLOCK_DIV_32   0x0080
#define ADC_CLOCK_DIV_64   0x4080
#define ADC_CLOCK_INTERNAL 0x00c0              // Internal 2-6us




Hola de nuevo, disculpa, pero no entendi nada de tu codigo, supongo que por que solo se lo basico del ensamblador y no he llegado tan lejos, ojala me lo pudieras explicar, y con respecto al codigo que puse esta bien o estoy completamente perdido??? Gracias y perdonen las molestias
Título: RE: Asesoria sobre ADC
Publicado por: Azicuetano en 23 de Marzo de 2006, 03:27:00
Esta es la primera rutina de conversión AD que hice en su día. Yo diría que es la más simple que tengo.

Para configurar el AD pones:

Codigo:


;   CONFIGURAMOS EL CONVERSOR A/D

      bcf      ADCON1,ADFM      ; Justificacion a la derecha. El valor de la conversion lo guardamos en ADRESH
      bcf      ADCON1,0         ; D D D D D D D A
      bsf      ADCON1,1
      bsf      ADCON1,2
      bsf      ADCON1,3
      MOVLW   b"00000001"         ; RA0 se programan como entrada
      MOVWF   TRISA

      bcf      STATUS,RP1      ; BANCO 0
      bcf      STATUS,RP0

      bcf      ADCON0,7         ; Fosc/32
      bcf      ADCON0,6   


   


Ahora ponemos una rutina para seleccionar la patilla con la que queremos hacer la conversión. En este caso pongo RA0

Codigo:


PATILLA_CONVERSION_0      ; En la patilla RA0 tendremos la entrada analógica
 
      bcf ADCON0,5      ; Seleccionamos la patilla RA0 como la entrada que realizara la conversion A/D.
      bcf ADCON0,4
      bcf ADCON0,3

      bcf PIR1,ADIF      ; Cuando se finaliza una conversion este bit se activa. En primera instancia lo pondremos a "0"
      RETURN




Ahora... cada vez que quieras hacer una conversión no tienes más que llamar a esta función.

Codigo:


CONVERSION

      bcf STATUS,RP1
      bcf STATUS,RP0

      bsf ADCON0,0      ; Hacemos operativo el modulo A/D

      nop               ; Retardo necesario
      nop
      nop
      nop
      nop
      nop
      nop
      nop
      nop
      nop
      nop
      nop
      nop
      nop
      nop
      nop
      nop
      nop
      nop
      nop

      bcf PIR1,ADIF      ; Este bit se activa cuando la conversión se completa. En un principio lo pongo a "0" y cuando hagamos una CONVERSIÓN ya se activará
      
      bsf ADCON0,2      ; Le decimos al Micro que comience ya con la conversión.

loop   btfss PIR1,ADIF      ; Este bit se activará cuando finalice la conversión.
      goto loop            
   
      nop

      movf ADRESH,W
      movwf AD         ; Metemos el resultado de la convesion (que se guarda en ADRESH porque anteriormente lo hemos configurado así ) en AD.
      

      RETURN





Recuerda que este código es el primero que hice, es decir, es muy mejorable.Yo ahora ya no lo utilizo porque lo he ido optimizando, pero, te paso este porque es el que tengo más o menos explicado.

Si tienes algún problema avisa.


Un saludo desde Alicante.
Título: RE: Asesoria sobre ADC
Publicado por: maunix en 23 de Marzo de 2006, 05:37:00
estratus123 tal vez tu problema sea que no sabes bien como funciona un A/D o que es lo que hace?  Es esta tu duda principal?

Es que comenzaste preguntando como configurar el A/D y luego saliste consultando que era el Vreferencia y el Clock y todo eso, cosas que son básicas en electrónica y cualquiera que haya usado o visto como funcionan los A/D lo sabe.

No es mi animo ofender, al contrario, es "saber que sabes" para poderte guiar o explicarte esas cosas.

Título: RE: Asesoria sobre ADC
Publicado por: estratus123 en 23 de Marzo de 2006, 09:20:00
Escrito originalmente por maunix
estratus123 tal vez tu problema sea que no sabes bien como funciona un A/D o que es lo que hace?  Es esta tu duda principal?

Es que comenzaste preguntando como configurar el A/D y luego saliste consultando que era el Vreferencia y el Clock y todo eso, cosas que son básicas en electrónica y cualquiera que haya usado o visto como funcionan los A/D lo sabe.

No es mi animo ofender, al contrario, es "saber que sabes" para poderte guiar o explicarte esas cosas.



Hola maunix, lamentablemente no se exactamente como funciona el ADC internamente, la informacion que tengo ha sido por otros programas que he visto o manuales que he leido, auque hasta ahorita apenas voy a llevar a cabo yo mi propio programa, ya que habia usado programas pero que me habian pasado para usos informativos, ahora yo quiero hacer mi propio programa para poder entender como se debe de tratar el ADC de un pic. Perdona si mi tema causo confusion, alomejor desde un inicio no me exprese bien sobre lo que necesitaba, aun asi espero seguir recibiendo ayuda del foro.
Título: RE: Asesoria sobre ADC
Publicado por: maunix en 23 de Marzo de 2006, 16:55:00
estratus123 creo que me mal interpretaste.  Claro que seguiré respondiendo tus preguntas, solo quise reformularla para saber realmente cuales son tus dudas.

A ver si te explico un poco

El módulo A/D del pic tiene las siguientes caracteristicas

1) Varios Canales
2) Una tensión de conversión que va de 0V a Vref o a Vcc.
3) 8 o 10 bits de precisión en la mayoría de los pics

El conversor puede convertir un canal  por vez.  El valor convertido será proporcional a la Tensión Adquirida dividido la Tensión de Referencia,  multiplicado por la cantidad de posibilidades que haya de acuerdo a la resolución menos 1.  Con 8 bits tienes 256 posibles valores (de 0 a 255) , con 10 bits, tienes 1024 posibles valores (de 0 a 1023).

El Vref ,se usa si quieres usar otra tensión de referencia que sea diferente a Vcc.  Sino, lo dejas con referencia igual a Vcc.

Si la tensión en un canal es 2V y la Ref es 5V, el valor convertido será

Para 8 bits --> (2/5) * 255 = 102d
Para 10 bits --> (2/5) * 1023 = 409d

El clock del A/D, es el que marca los pasos de la conversión.  Cuanto más rapido el clock más rápido tendrás la conversión.  Ahora bien, el manual aclara que no debes intentar superar la máxima velocidad ya que si haces esto, el valor convertido podria ser totalmente impreciso.

Espero haberte aclarado un poco mas el panorama.

Título: RE: Asesoria sobre ADC
Publicado por: estratus123 en 24 de Marzo de 2006, 12:06:00
Hola de nuevo, muchas gracias maunix por la explicacion me ha ayudado mucho para entender el ADC y gracias Azicuetano tu codigo me ayudo mucho para asesorarme, ya estoy haciendo pruebas y todo parece ir bien, ya solo me queda un duda, en la configuracion del ADCON1 esta el bit 7 ADFM, tengo entendido que el conversor de este pic es de 10 bit"s, depende de que se configure en adfm sera los valores que tomara de esos 10 bit"s, en la  DataSheet del pic viene lo siguiente.

bit 7 ADFM: A/D Result Format Select bit
1 = Right justified. Six (6) Most Significant bits of ADRESH are read as ‘0’.
0 = Left justified. Six (6) Least Significant bits of ADRESL are read as ‘0’.

Y aqui es donde me confundo, si esta en "1" me tomara ADRESL los valores menos significativos de la conversion es decir los bit del 0 a 7 y ADRESH del 8 al 9 ???
Y si esta en 0 ADFM sera a l inversa o como funciona esto, por que aqui me causa mucha duda eso? ojala me puedan explicar bien.
Título: RE: Asesoria sobre ADC
Publicado por: maunix en 24 de Marzo de 2006, 13:40:00
Escrito originalmente por estratus123
Hola de nuevo, muchas gracias maunix por la explicacion me ha ayudado mucho para entender el ADC y gracias Azicuetano tu codigo me ayudo mucho para asesorarme, ya estoy haciendo pruebas y todo parece ir bien, ya solo me queda un duda, en la configuracion del ADCON1 esta el bit 7 ADFM, tengo entendido que el conversor de este pic es de 10 bit"s, depende de que se configure en adfm sera los valores que tomara de esos 10 bit"s, en la  DataSheet del pic viene lo siguiente.

bit 7 ADFM: A/D Result Format Select bit
1 = Right justified. Six (6) Most Significant bits of ADRESH are read as ‘0’.
0 = Left justified. Six (6) Least Significant bits of ADRESL are read as ‘0’.

Y aqui es donde me confundo, si esta en "1" me tomara ADRESL los valores menos significativos de la conversion es decir los bit del 0 a 7 y ADRESH del 8 al 9 ???
Y si esta en 0 ADFM sera a l inversa o como funciona esto, por que aqui me causa mucha duda eso? ojala me puedan explicar bien.


El conversor si es de 10 bits, siempre convierte 10 bits.

Ahora bien, el punto es el siguiente.  Son 10 bits que se ubican en dos registros de 8 bits cada uno.  ADRESH:ADRESL

Entonces imaginemos que el dato convertido sea el 1023d (el máximo posible).

Entonces el valor será

Con justificación izquierda:
ADRESH:ADRESL = b1111111111000000
ADRESH = 11111111b = 0xFF = 255d
ADRESL = 1100000b  = 0xC0 = 192d


Con justificación derecha
ADRESH:ADRESL = b0000001111111111
ADRESH = 00000011b = 0x03 = 3d
ADRESL = 11111111b  = 0xFF = 255d


Entonces, si solo quieres trabajar con 8 bits, usas justificación izquierda, ya que con solo leer ADRESH tendrás los valores "mas importantes" de la conversión!  Los dígitos menos significativos solo indicarán los saltos más pequeños de tensión.  El A/D convierte a 5V con una precisión de 4.8 mV.  Si tu solo usas los 8 bits mas significativos entonces etas usando saltos de casi 20 mV ya que no tienes en cuenta las variaciones más pequeñas.


Si quieres usar modo de 10 bits, entonces debes usar la justificación a la derecha asi el número leído estará bien acomodado en los registros y te será más fácil trabajar con él.


Saludos



Título: RE: Asesoria sobre ADC
Publicado por: estratus123 en 25 de Marzo de 2006, 18:23:00
Hola de nuevo a todos, muchas gracias por toda la ayuda que me han dado con el ADC, ya por fin logre entender su funcionamiento y ya funcionan a la perfeccion mis programas.
Título: RE: Asesoria sobre ADC
Publicado por: maunix en 27 de Marzo de 2006, 14:36:00
Escrito originalmente por estratus123
Hola de nuevo a todos, muchas gracias por toda la ayuda que me han dado con el ADC, ya por fin logre entender su funcionamiento y ya funcionan a la perfeccion mis programas.


Me alegro te esten funcionando las cosas.

Título: RE: Asesoria sobre ADC
Publicado por: microcom en 30 de Marzo de 2006, 14:39:00


 
  conversion analogo digital con lm35
  espero que te sirva y


LIST    P=16F873A
   #INCLUDE<P16F873A.INC>
   ;DECLARACION DE VARIABLES
   ;CONVERSOR ANALOGO DIGITAL DE CUATRO DIGITOS
 
;FARENTHEIT
TIMER0      EQU   01
PCL        EQU     02
STATUS      EQU   03
PORTA      EQU   05
PORTB      EQU   06
ADCON0     EQU     1F
ADCON1      EQU   9F
ADRESL      EQU   9E
ADRESH      EQU   1E
INTCON      EQU   0B
AVE_LOW      EQU   20
AVE_HIG      EQU   21
JAI_LOW      EQU   22
JAI_HIG      EQU   23
COS_LOW      EQU   24
COS_HIG      EQU   25
SUC_LOW      EQU   26
SUC_HIG      EQU   27
REG1      EQU   28
REG2      EQU   29
REG3      EQU   2A
COVEÑAS      EQU   2B
VALLEN      EQU   2C
UNO      EQU   2D
DOS      EQU   2E
CERO      EQU   2F
UNI_GRADOS   EQU   30
DEC_GRADOS   EQU   31
CENT_GRADOS   EQU   32
COCIENTE   EQU   39
COLOMB      EQU   3A
RESULTADO   EQU   3B
RFARE_L      EQU   3C
RFARE_H      EQU   3D
RESULT_L   EQU   3E
RESULT_H   EQU   3F
CENTENAS   EQU   40
DECENAS      EQU   41
UNIDAD      EQU   42
CONTA      EQU   43
MENS      EQU   44
   ;BITS CONVERSOR
ADIF   EQU   6   
GODONE   EQU   2
ADON   EQU   0
ADFM   EQU   7
C   EQU   0
   ;BITS   LCD
RS   EQU   1
E   EQU   2

   ORG   00
   GOTO   INICIO
TEMPO   MOVLW   .80
   MOVWF   REG1
DEC6   MOVLW   .21
   MOVWF   REG2
DEC5   MOVLW   .20
   MOVWF   REG3
DEC4   DECFSZ   REG3,1
   GOTO   DEC4
   DECFSZ   REG2,1
   GOTO   DEC5
   DECFSZ   REG1,1
   GOTO   DEC6
   RETURN
DATOS   
   BSF   PORTA,RS
   BSF   PORTA,E
   MOVWF   PORTB
   CALL   RETARDO
   BCF   PORTA,E
   CALL   RETARDO
   RETURN
RETARDO   
   MOVLW   .40
   MOVWF   REG1
DEC3   MOVLW   .30
   MOVWF   REG2
DEC2   MOVLW   .20
   MOVWF   REG3
DEC1   DECFSZ   REG3,1
   GOTO   DEC1
   DECFSZ   REG2,1
   GOTO   DEC2
   DECFSZ   REG1,1
   GOTO   DEC3
   RETURN

INSTRUC   
   BCF   PORTA,RS        ;COLOCA EN CERO RAO
   BSF   PORTA,E
   MOVWF   PORTB   
   CALL   RETARDO
   BCF   PORTA,E
        CALL    RETARDO
   RETURN
TABLA   ADDWF   PCL,1
   RETLW   "0"
   RETLW   "1"
   RETLW   "2"
   RETLW   "3"
   RETLW   "4"
   RETLW   "5"
   RETLW   "6"
   RETLW   "7"
   RETLW   "8"
   RETLW   "9"

TABLA1   ADDWF   PCL,1
        RETLW   "T"
   RETLW   "E"
   RETLW   "M"
   RETLW   "P"
   RETLW   "E"
                RETLW     "R"
                RETLW   "A"
   RETLW   "T"
   RETLW   "U"
   RETLW   "R"
   RETLW   "A"
    RETLW   "C"
   RETLW   "L"
   RETLW   "A"
   RETLW   "S"
   RETLW   "E"
   RETLW   " "
                RETLW    "D"
                RETLW   "I"
   RETLW   "G"
   RETLW   "I"
   RETLW   "T"
   RETLW   "A"      
   RETLW   "L"
   RETLW   " "
   RETLW   "0"
   RETLW   "5"

RETARD   MOVLW   .100   
   MOVWF   REG1
   nop
   nop
   nop
   nop
DEC9   DECFSZ   REG1,1
   GOTO   DEC9
   RETURN


INICIO
   BSF   STATUS,5
   BCF   STATUS,6
   CLRF   PORTB
   MOVLW   B"00000001"
   MOVWF   PORTA
   BCF   STATUS,5


LCDINI   MOVLW   B"00111000"     ;INTERFACE DE 8BITS 2 LINEAS
   CALL   INSTRUC
   MOVLW   B"00000110"     ;DIRECCION A LA DERECHA
   CALL   INSTRUC
   MOVLW   B"00001101"     ;PRENDE PANTALLA
   CALL   INSTRUC
   MOVLW   B"00000001"     ;LIMPIA PANTALLA
   CALL   INSTRUC

LCD   MOVLW   B"10000000"            ;EL PUNTERO SE UBICA EN LA PRIMERA
LINEA
        CALL    INSTRUC
        CLRF    MENS
RE      MOVF    MENS,0
        CALL    TABLA1
        CALL    DATOS
        INCF    MENS,1
        MOVF    MENS,0
        XORLW   .11
        BTFSS   STATUS,2
        GOTO     RE
   MOVLW   B"11000000"
   CALL   INSTRUC
RESS   MOVF   MENS,0
   CALL   TABLA1
   CALL   DATOS
   INCF   MENS,1
   MOVF   MENS,0
   XORLW   .27
   BTFSS   STATUS,2
   GOTO   RESS
   BSF   STATUS,5
COROSO   CALL   CONVERSIONANALOGODIGITAL
   CALL   MULTIPLICACION
   CALL   B2BCD
   CALL   VISUALIZACION
   GOTO   COROSO
CONVERSIONANALOGODIGITAL
   BSF   STATUS,5
   MOVLW   B"10001110"      ;RA0 ANALOGO JUSTIFICACION LOS OCHO PRIMEROS BITS
DE ADRESL Y DOS BITS DE ADRESH
   MOVWF   ADCON1
   BCF   STATUS,5
EEE   MOVLW   B"10000001"
   MOVWF   ADCON0
   CALL   RETARD
   BCF   PIR1,ADIF
   BSF   ADCON0,GODONE
   CALL   RETARD
EL   BTFSS   PIR1,ADIF
   GOTO   EL
   BSF   STATUS,5
   MOVF   ADRESL,0   ;LOW PARTE
   BCF   STATUS,5
   MOVWF   JAI_LOW
   MOVF   ADRESH,0   ;HIG PARTE      
   MOVWF   JAI_HIG      ;RA1 Y RA2 ADRESH
   MOVLW   .232
   MOVWF   AVE_LOW
   MOVLW   .1
   MOVWF   AVE_HIG
   CLRF   UNI_GRADOS   
   CLRF   DEC_GRADOS   
   CLRF   CENT_GRADOS
   RETURN


MULTIPLICACION         ;RUTINA MULTIPLICACION ENTRE DOS NUMEROS DE 16 BITS
   MOVLW   .16      ;LOS NUMEROS SON AVE Y JAI .EL RESULTADO QUEDA EN COS Y SUC
.
   MOVWF   COVEÑAS      ;JAI PIERDE EL NUMERO QUE TRAIA Y AVE QUEDA INTACTO.
   CLRF   SUC_HIG
   CLRF   SUC_LOW
   CLRF   COS_HIG
   CLRF   COS_LOW
MAR   RRF   JAI_HIG,1
   RRF   JAI_LOW,1
   BTFSC   STATUS,0
   CALL   SUMA
   RRF   COS_HIG,1
   RRF   COS_LOW,1
   RRF   SUC_HIG,1
   RRF   SUC_LOW,1
   DECFSZ   COVEÑAS,1
   GOTO   MAR
   RETURN



SUMA   MOVF   AVE_LOW,0
   ADDWF   COS_LOW,1
   BTFSC   STATUS,0
   INCF   COS_HIG,1
   MOVF   AVE_HIG,0   
   ADDWF   COS_HIG,1
   RETURN
B2BCD   BCF   STATUS,0
   MOVLW   D"24"
   MOVWF   VALLEN
   CLRF   CERO
   CLRF   UNO
   CLRF   DOS
OP16   RLF   SUC_LOW,1
   RLF   SUC_HIG,1
   RLF   COS_LOW,1
   RLF   DOS,1
   RLF   UNO,1
   RLF   CERO,1
   DECFSZ   VALLEN,1
   GOTO   A_DEC
   RETURN
A_DEC   MOVLW   DOS
   MOVWF   FSR
   CALL   A_BCD
   MOVLW   UNO
   MOVWF   FSR
   CALL   A_BCD
   MOVLW   CERO
   MOVWF   FSR
   CALL   A_BCD
   GOTO   OP16      ;.............
A_BCD   MOVLW   .3
   ADDWF   INDF,0
   MOVWF   COVEÑAS
   BTFSC   COVEÑAS,3
   MOVWF   INDF
   MOVLW   30
   ADDWF   INDF,0
   MOVWF   COVEÑAS
   BTFSC   COVEÑAS,7
   MOVWF   INDF
   RETURN

VISUALIZACION
   BCF   STATUS,5
   BCF   STATUS,6
   SWAPF   CERO,W
   ANDLW   0F
   MOVWF   CENT_GRADOS

   MOVF   CERO,0
   ANDLW   0F
   MOVWF   DEC_GRADOS

   SWAPF   UNO,W
   ANDLW   0F
   MOVWF   UNI_GRADOS
   MOVLW   B"10001100"
   CALL   INSTRUC
   MOVLW   B"00001100"   ;DESACTIVO EL CURSOR
   CALL   INSTRUC      
   MOVF   CENT_GRADOS,0
   CALL   TABLA
   CALL   DATOS
   MOVF   DEC_GRADOS,0
   CALL   TABLA
   CALL   DATOS
   MOVF   UNI_GRADOS,0
   CALL   TABLA
   CALL   DATOS
   RETURN
   END
Título: RE: Asesoria sobre ADC
Publicado por: estratus123 en 31 de Marzo de 2006, 00:25:00
Escrito originalmente por microcom


 
  conversion analogo digital con lm35
  espero que te sirva y






Gracias microcom voy a checarlo, sus asesorias me han ayudado mucho, y ya estoy empezando a usar el adc con mucho exito gracias por su apoyo