TODOPIC

Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: ErnestAl en 17 de Mayo de 2007, 10:29:22

Título: Conversor A/D
Publicado por: ErnestAl en 17 de Mayo de 2007, 10:29:22
Buenas!!!! estoy empezando a aumentar la dificultad de mis programas, ahora estoy con el C/AD y tengo una duda.
 Simulando en proteus para un voltaje de 2.5V el resultado de la conversion es '01111111' en cambio si calculo el valor de 2.5V apartir de la resolucion si trabajo con 8bits tengo un valor de '10000000'
 ¿donde esta el fallo?,aqui teneis mi ASM
            list p=16F877
            radix   hex
            #include <p16f877.inc>  ;incluimos la libreria del PIC 16F877
;**************ZONA DE ETIQUETAS*****************
            temp   equ      0x20
            depo   equ      0x21
            aux      equ      0x23

;************************************************
            org      0x00
            goto   inicio
            org      0x05
;*************************************************
;*****************CONFIGURACION DEL CONTROLADOR

inicio         
;*******************definicion variables***************************
            movlw   b'10000000'
            movwf   depo
;*********************************************************
            bsf      STATUS,RP0;Acceso al banco 1
            bcf      STATUS,RP1
   ;************PUERTOS****************
            movlw      0xFF
            movwf      TRISA ;El puerto A entradas   
            bsf         TRISC,5; START
            CLRF      TRISB
         ;   bcf         TRISB,0 ;Bomba de llenado
         ;   bcf         TRISB,1 ;STOP BOMBA Extractora
         ;   bcf         TRISB,2 ;POZO BAJO MINIMOS
         ;   bcf         TRISB,3 ;POZO SOBREPASA LIMITES
;*******************CONFIGURACION DEL TIMER0****************
            movlw      b'00000111';configuramos el TMRo con preescalod de 256
              movwf      OPTION_REG
;***********************************************************
;*************CONFIGURACION DEL C/AD************************
            movlw      b'00000010';justificamos a la Izquierda
            movwf      ADCON1;y todos los pines del PORTA como Analogicos
;************************************************************
            bcf         STATUS,RP0
            bcf         STATUS,RP1 ;vuelvo al banco0
;************************************************************
      ;****CARACTERISTICAS DEL C/AD****************
            movlw      b'01000001';selecciono un Tad de 8*Tosc
            movwf      ADCON0   ;y a la espera de empezar conversion
;*^**********************PROGRAMA***************************
main         clrf      PORTA
            clrf      PORTB   
            call      muestra
            call      retardo
            goto      main
muestra         btfsc      PORTC,5
            goto      muestra
 bucle         btfss       INTCON,T0IF
              goto       bucle ;Esperar que el timer0 desborde
            bcf       INTCON,T0IF ;Limpiar el indicador de desborde
            bsf       ADCON0,GO ;Empezar la conversion A/D
espera         btfsc       ADCON0,GO ;ADCON0 es 0? (la conversion esta completa?)
            goto      espera       ;No, ir _espera
            movf       ADRESH,W ;Si, W=ADRESH
            ;movwf      depo
            subwf      depo,w
            btfss      STATUS,C
            goto      menor
            btfss      STATUS,Z
            goto      mayor
            goto      igual   
         
            return

igual         bsf      PORTB,1
            return
mayor         bsf      PORTB,2
            return
menor         bsf      PORTB,0
            return

;**************RETARDO PARA MOSTRAR EL VALOR
retardo      
            movlw      D'15'   
             movwf      temp
            clrf      TMR0
            bcf         INTCON,T0IF
   retardo_2   btfss      INTCON,T0IF
            goto      retardo_2
             decfsz      temp,f
            goto      retardo_3
            return
   retardo_3   bcf         INTCON,T0IF
            goto      retardo_2



end
Título: Re: Conversor A/D
Publicado por: micro_cadaver en 17 de Mayo de 2007, 10:59:20
haber apliquemos la formula para los siguientes datos:
Vref+ = 5V
Vref - = 0V
(Vref+) - (Vref-) = 5V

      (Vref+) - (Vref-)             =    5     = 0.004887.... = k
maxima resolución de 10bits      1023 

listo, ahora para 2.5V que valor arrojara el conversor?
hacemos: 2.5/k = d' 511.5 ' = 0X1FF
ordenando datos para una justificación a la izquierda:
01 1111  1111

ADRESH = 0111 1111 = 0X7F
ADRESL = 11

como has calculado amigo ernestal? porq no veo algu ndetalle erroneo en tu codigo y ademas el resultado te sale como en el ejemplo.  :-/ esperamos tu respuesta  :-)
Título: Re: Conversor A/D
Publicado por: ErnestAl en 17 de Mayo de 2007, 16:04:20
yo lo he calculado para una maxima resolucion de 8bits!!!!!!!!!!!acabo de repasar mis calculos, si lo pongo tal y como tu dices sale clavado!!!!!!


Muchisimas gracias!!!!
 
 Pd: En cuanto funcione pasare a usart la USART para almacenar los valores en la eeprom, espero llegar algun dia a ser como ustedes!!!!!!!!!!

 GRACIAS
Título: Re: Conversor A/D
Publicado por: ErnestAl en 17 de Mayo de 2007, 20:08:59
la precipitacion es el principal causante del error.....me acabo de dar cuenta que colocar un '0' a la izquierda o a la derecha en ensamblador te puedo dar mas de un dolor de cabeza!! :) :) :)
Título: Re: Conversor A/D
Publicado por: micro_cadaver en 18 de Mayo de 2007, 01:24:23
seeeeeeeeeee animo amigo veo que tienes la materia prima para esta profesion!!!!  :-/ :-/
Título: Re: Conversor A/D
Publicado por: Enigma en 26 de Julio de 2007, 12:49:23
Hola!!!!! aprovechandome de este mensaje..... también ando en las mismas, configurando e CAD del PIC 16F877A, pero es que tengo una serie de dudas ya que no manejo muy bien el funcionamiento del mismo... Haber si entendi, el valor analogico que entra por el pic, se multiplica siempre por esa constante K, que describio micro_cadaver...? siempre se va a hacer esa división dentro del pic...????.... Aja, y que pasa si justifico a la derecha????..... Estoy haciendo un medidor de nivel de un tanque, pero berro!!! :? se me hace dificil, porque de pana que no entiendo lo de la resolución esa de 8 bits.... Por fa, si me explican un poquito creo que lo entenderé.... jejejeje Gracias!!!!!


otra cosita!!!

haber apliquemos la formula para los siguientes datos:
Vref+ = 5V
Vref - = 0V
(Vref+) - (Vref-) = 5V

      (Vref+) - (Vref-)             =    5     = 0.004887.... = k
maxima resolución de 10bits      1023 

listo, ahora para 2.5V que valor arrojara el conversor?
hacemos: 2.5/k = d' 511.5 ' = 0X1FF
ordenando datos para una justificación a la izquierda:
01 1111  1111

ADRESH = 0111 1111 = 0X7F
ADRESL = 11

como has calculado amigo ernestal? porq no veo algu ndetalle erroneo en tu codigo y ademas el resultado te sale como en el ejemplo.   esperamos tu respuesta 
 

Chamos me llamaran tarada, o no se pero de pana, este temita del conversor se me ha hecho peluo!!!, Porque d'511.5' = 0X1FF, como sacaste eso????  lo he sacado y no me da....??? que has hecho......?????
Atte: Enigma... La llanerita de Guayana :P
Título: Re: Conversor A/D
Publicado por: PalitroqueZ en 26 de Julio de 2007, 15:47:51
Enigma, para el 16F877A siempre habrá resolución de 10 bits, lo que sucede es que con la justificación, que no es mas que hacer LSB o MSB los 10 bits del resultado del cad, puedes aproximar dicho resultado a 8 bits obviando un par de bits lsb, que sucede cuando justificas a la izquierda.


LSB= bit menos significativo
MSB= bit mas significativo
Título: Re: Conversor A/D
Publicado por: maunix en 26 de Julio de 2007, 19:17:53
Un par de links en donde consultar también sobre el tema

http://www.todopic.com.ar/foros/index.php?topic=15272.msg95910#msg95910

http://www.todopic.com.ar/foros/index.php?topic=14529.msg88942#msg88942

Saludos
Título: Re: Conversor A/D
Publicado por: microcom en 26 de Julio de 2007, 21:23:10
http://www.todopic.com.ar/foros/index.php?topic=17835.0

http://www.todopic.com.ar/foros/index.php?topic=17821.msg121166#msg121166

aqui tambien amigo

saludos
Título: Re: Conversor A/D
Publicado por: Enigma en 27 de Julio de 2007, 10:49:49
Gracias mis amiguitos del foro por los links, por lo menos estoy más orientada que antes.... Pero mi duda, inquietud, preocupación sigue carcomiendo mi cerebro!!!! :(..... Como hago con los benditos decimales de la lectura analogica....??? es decir, como en el ejemplo que está haya abajo... entran 2.5 V.... y sale el 511,5 decimal y el 0x1ff hexa.... donde queda el bendito .5????? como hago para representar ese bendito decimal en BCD..??? es decir, se hace por punto flotante o algo así?????

Y otra cosita y por fa corrijanme si estoy mal.... el CAD del pic hace esto...?
1) Entra la señal analogica
2) La toma y la covierte a digital...
3) luego esa digital la lleva a binario
4) y por ultimo la bota por el pin de salida....???
Título: Re: Conversor A/D
Publicado por: micro_cadaver en 27 de Julio de 2007, 12:00:52
cual pin de salida?

el A/D luego de tomar las muestras del valor analogo que esta en el respectivo canal (por ejemplo RA0) lo carga en los registros de captura de su módulo , ADRESL y ADRESH , y una vez ahi ya están en binario o digital o hezadecimal o decimal. Pero si lo quieres pasar a un LCD tiene que convertir ese valor de los registros a caracteres ASCII.
Título: Re: Conversor A/D
Publicado por: PalitroqueZ en 27 de Julio de 2007, 12:14:03
enigma, ya creo entender tu duda. el resultado del CAD no es un flotante, es el número de pasos al cuál ha deducido la conversión en representación digital de una señal de naturaleza analógica. Por eso es que ves que usan ecuaciones, porque con esa ecuación es que tu deduces cuál es su valor correspondiente.

si quieres por ejemplo mostrarle al mundo (fuera del pic) una tensión de entrada ANx entonces debes usar esos calculos para  llevar esos pasos al sistema que nosotros entendemos mejor: el decimal

Título: Re: Conversor A/D
Publicado por: Enigma en 27 de Julio de 2007, 13:15:12
 :8}  :8}.... Dios que pesado es este conversor... no me cae para nada....Dios mio como jo... que strees, hice un tremendo ascensor que hasta hablaba y no puedo hacer la conversión de un miserable voltaje analogico a su nivel de altura correspondiente!!! o peor todavia ni siquiera de análogico lo se pasar a bcd.... que suerte tan triste la mia...  :8}  :8}

Gracias por su valioso esfuerzo muchacho.... son los mejores!!!!!! :mrgreen:

Atte: Enigma... La llanerita de Guayana  :P  :8}
Título: Re: Conversor A/D
Publicado por: micro_cadaver en 27 de Julio de 2007, 13:21:40
no te rindas llanerita!!!!!!!!!!!!!!
Título: Re: Conversor A/D
Publicado por: microcom en 27 de Julio de 2007, 15:51:12
Enigma todo bien.
que mas inquitudes tienes?

por que no utilizas la herramienta proteus para  que simules tu programa  te sirvira para analizar los cambios en tu programa.
saludos
Título: Re: Conversor A/D
Publicado por: Enigma en 29 de Julio de 2007, 17:21:31
HOla Gente que tal.... bueno todavia sigo con el ADc, y disculpen el fastidio, pero es que quede muy picada, y bueno aquí me tienen insistiendo... jejejeje.... les echo el cuento, estuve compilando y compilando y cooompilando y bueno el programa no me muestra nada en la LCD, estuve verificando y chequeando las partes del programa haber por donde era que no esta pasando el compilador o por donde era que se estaba quedando pegado el programa... y bueno resulta y acontece que se está quedando pegado en esta partesita que les voy a colocar en rojo.... por favor ustedes que son los pipis y los huevos en micro me pueden decir que tengo malo jejejejeje... si ven una burrada (que a lo mejor está  :?) recuerden que soy nueva en esto y bueno ya saben.... :-/.... el programa compila fino, pero cuando lo simulo en Proteus se me queda pegado en lo que esta en rojo.....

aqui les dejo el programa..... jijijji (Adjunto)  :D


CHEQUEO
                         BTFSC      ADCON0,2          ; TERMINO LA CONVERSION?
                         GOTO       CHEQUEO         ; NO. VUELVO A PREGUNTAR
                         BCF   ADCON0,2         ; APAGO LA CONVERSION
                         MOVF   ADRESL,W         ; SI. MUEVO LA CONVERSION A W
                         MOVWF   REG         ; MUEVO LA CONVERSION A REG

Atte: Enigma... La llanerita de Guayana :P

Título: Re: Conversor A/D
Publicado por: micro_cadaver en 30 de Julio de 2007, 01:05:08
fuerza llanerita!!!! :mrgreen:
Título: Re: Conversor A/D
Publicado por: BrunoF en 30 de Julio de 2007, 01:47:43
INICIO
         BSF   STATUS,RP0         ; ME CAMBIO AL BANCO 1
         CLRF    ADCON1            ; ENTRADAS ANALOGICAS, JUSTIFICACIÓN  A LA IZQUIERDA
         MOVLW   b'00011001'         ; FOSC/2, CANAL 3
         MOVWF   ADCON0            ; (RA3/AN3)
         CLRF   PORTA            ; LIMPIO EL PUERTO A
         MOVLW   0XFF            ;
         MOVWF   TRISA            ; PUERTO A COMO ENTRADA
         BCF   STATUS,RP0         ; VUELVO AL BANCO 0
         CALL   LCD_INI            ; INICIA LA LCD
                                                ....

Donde LCD_INI es:

;-----------------RUTINA DE INICIO DEL LCD---------------------------------
LCD_INI
          MOVF     STATUS,W       ; MUEVE A W LO QUE ESTA EN STATUS (ESTADO DEL LCD)
          MOVWF    STATUS_LCD     ; GUARDA LA VARIABLE STATUS
          BSF      STATUS,RP0   ; CAMBIA AL BANCO 1
          BCF      STATUS,RP1     ; CAMBIA AL BANCO 1
          MOVLW    0X06          ; MUEVO SEIS A W
          MOVWF    ADCON1         ; CONFIGURA EL PUERTO A COMO DIGITAL
                                                ;a partir de aquí los pines del puerto A son digitales. imposible realizar una conversion A/D!!!
          MOVLW    0XF8           ; PARA CONFIGURAR EL PUERTO
          MOVWF    TRISA          ; CONFIGURA EL PUERTO A (RA7-RA3 ENTRADAS Y RA2-RA0 SALIDAS)

Título: Re: Conversor A/D
Publicado por: Enigma en 03 de Agosto de 2007, 13:59:12
Oppps!!!! jijijijiiji  :? bueno un errorsote lo comete cualquiera..... gracias por la corección chicos!!!!!
jejejeje

Atte: Enigma.... La llanerita de Guayana :P
Título: Re: Conversor A/D
Publicado por: Juan_PIC en 17 de Agosto de 2007, 22:10:42
haber apliquemos la formula para los siguientes datos:
Vref+ = 5V
Vref - = 0V
(Vref+) - (Vref-) = 5V

      (Vref+) - (Vref-)             =    5     = 0.004887.... = k
maxima resolución de 10bits      1023 

listo, ahora para 2.5V que valor arrojara el conversor?
hacemos: 2.5/k = d' 511.5 ' = 0X1FF
ordenando datos para una justificación a la izquierda:
01 1111  1111

ADRESH = 0111 1111 = 0X7F
ADRESL = 11

como has calculado amigo ernestal? porq no veo algu ndetalle erroneo en tu codigo y ademas el resultado te sale como en el ejemplo.  :-/ esperamos tu respuesta  :-)


Hola microcadaver. Aca me parece que hay que hacer una correcion. Cuando decis "maxima resolucion de bits 1023", la cantidad de combinaciones son 2^10, osea 1024. lo que daria:

5/1024 = 0.004882812 = k

2.5/k = d' 512 ' = 0X1FF

Diganme si esta bien la correccion o meti la pata porfa!

Saludos! :-/
Título: Re: Conversor A/D
Publicado por: micro_cadaver en 18 de Agosto de 2007, 00:38:23
estas seguro que D'512' = 0X1FF ?

segun mi calculadora sale 0X200
Título: Re: Conversor A/D
Publicado por: Fer_TACA en 20 de Agosto de 2007, 13:23:06
Segun la mia tambien d'512' = 0x200 en hexadecimal.
Fermin
Título: Re: Conversor A/D
Publicado por: motordecontinua2 en 20 de Agosto de 2007, 17:06:04
Hola amigos. Si, microcadaver tiene razon, confunfi unos conceptos. Espero no haber creado dudas en otros ^^.

PD: Tarde en responder porque tengo unos problemas de coneccion con el foro, y ahora milagrosamente logre entrar. cuando trato de ingresar, me aparece una pantalla blanca que dice algo asi como de bad gateway. A alguien mas le pasa? Por favor ayuda.

PD2: Se que estoy violando una regla del foro, y tendria que abrir un nuevo tema, pero por miedo a perder la coneccion, lo dejo aca. Por favor sepan entender. Cualquier cosa mi Email es: juan_manuel_boga@hotmail.com    Gracias!

Ahh otra cosa. "motordecontinua2" es un usuario alternativo que cree para ver si podia entrar. En cuanto se solucione el problema con "motordecontinua" por favor borren "motordecontinua2".
Título: Re: Conversor A/D
Publicado por: poseidon20 en 24 de Agosto de 2007, 17:22:56
Buenas a todos, espeor no molestarlos con mis pequeños problemas. lo que trato de hacer es leer por el CH0 un valor analogo y luego ponerlo en el puerto B para ver su valor en binario. Mi duda es: si el valor del AD es de 10 bits, yo solo quiero 8 bits ¿como puedo hacer esto?. Gracias ante todo.

Código: ASM
  1. ;Conversor A/D del 16F877A
  2. ;CRISTAL : 20Mhz
  3.  
  4.                 LIST    P=16F877A
  5.                 INCLUDE<P16F877A.INC>
  6.  
  7.                 __CONFIG _CP_OFF  & _WDT_OFF & _BODEN_OFF & _HS_OSC  & _WRT_OFF & _LVP_OFF & _DEBUG_OFF
  8.  
  9.  
  10.                 ORG             0000H
  11.                
  12.  
  13.                 BSF     STATUS,RP0              ;BANCO 1
  14.                 CLRF    TRISB                   ;PORTB = SALIDA
  15.                 MOVLW   B'11111111'             ;PORTA = ENTRADA
  16.                 MOVWF   TRISA
  17.                 BCF     STATUS,RP0              ;BANCO 0
  18.  
  19.                 CALL    Inicializa_AD
  20. REPIT
  21.                 CALL    GO_AD
  22.                 MOVWF   PORTB
  23.                 GOTO    REPIT
  24.  
  25. ;********************************************
  26. Inicializa_AD
  27.                 BSF     STATUS,RP0              ;BANCO 1
  28.                 MOVLW   B'10000000'             ;JUSTIFICACION A LA DERECHA
  29.                 MOVWF   ADCON1                  ;TODO EL PORTA COMO ENTRADA ANALOGA
  30.                 BCF     STATUS,RP0              ;BANCO 0
  31.                 MOVLW   B'11000001'             ; CLOCK = RC,ENTRADA ANALOGA "0", AD ENCENDIDO
  32.                 MOVWF   ADCON0
  33.                 RETURN
  34.  
  35. GO_AD
  36.                 BCF     STATUS,RP0              ;BANCO 0
  37.                 BSF     ADCON0,GO_DONE          ;INICIO LA CONVERSION
  38.                 BTFSC   ADCON0,GO_DONE          ;ESPERO QUE TERMINE LA CONVERSION
  39.                 GOTO    $-1
  40.                 BSF     STATUS,RP0              ;BANCO 1
  41.                 MOVF    ADRESL,W
  42.                 BCF     STATUS,RP0              ;BANCO 0
  43.                 RETURN
  44.  
  45.  
  46.                 END

Título: Re: Conversor A/D
Publicado por: micro_cadaver en 24 de Agosto de 2007, 17:24:44
tienes que configurar la justificacion del resultado del conversor en el ADCON1, revisa el datasheet en la parte del modulo a/d. Saludos  :-/