Autor Tema: Problema con ADC PIC16F876A  (Leído 2677 veces)

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

Desconectado enzo84

  • PIC10
  • *
  • Mensajes: 13
Problema con ADC PIC16F876A
« en: 13 de Diciembre de 2008, 02:49:44 »
   LIST P=16F876A
   PROCESSOR 16F876A
   INCLUDE "P16F876A.INC"
   RADIX           DEC
   __IDLOCS        H'0000'
   ERRORLEVEL      0, -302, -306

   __CONFIG       

_CP_OFF&_PWRTE_ON&_BODEN_OFF&_LVP_OFF&_DEBUG_OFF&_XT_OSC&_WDT_OFF&_WRT_OFF

   ;ORG 20H

   ORG 00h

Inicio:
   BSF   STATUS,RP0
   BCF   STATUS,RP1   ;pagina 1
   movlw   b'00001001'   ;justificación a la izquierda (8bits)
   movwf   ADCON1      
   movlw   b'11000111'   ;3 entradas analogicas
   movwf   TRISA
   MOVLW   b'11111111'
   MOVWF   TRISC       ;todos en el c como entrada (6 y 7)
   BCF   STATUS,RP0    ;pagina 0
   movlw   b'01000001'
   movwf   ADCON0          ;enciendo el adc y Fosc/8
   BSF   RCSTA,SPEN
   BSF   STATUS,RP0   ;pagina 1
   MOVLW   24H
   MOVWF   TXSTA
   MOVLW   25
   MOVWF   SPBRG
   BSF   TXSTA,TXEN
   BCF   STATUS,RP0   ;pagina 0
   MOVLW   90H
   MOVWF   RCSTA

Start:
   btfsc   PORTC,0      ;cuando se presiona, comienza Bucle
   goto   Start

Bucle:
   bcf   ADCON0,3 ;selecciono
   bcf   ADCON0,4 ;canal 0
   NOP
   bsf   ADCON0,2 ;inicio conversion en canal 0
   btfsc   ADCON0,2 ;espero a que termine la conversion   
   goto   $-1
   movf   ADRESH, W
   BTFSS   PIR1,TXIF ;espero a que se vacie buffer de salida   
   GOTO   $-1
   MOVWF   TXREG     ;cuando se vacia envio el dato del canal 0
   NOP
   NOP
   bsf   ADCON0,3 ;selecciono
   bcf   ADCON0,4 ;canal 1
   NOP
   bsf   ADCON0,2 ;inicio conversion en canal 1
   btfsc   ADCON0,2 ;espero a que la conversión termine   
   goto   $-1
   movf   ADRESH, W
   BTFSS   PIR1,TXIF ;espero a que se vacie buffer de salida   
   GOTO   $-1
   MOVWF   TXREG ;cuando se vacia envio en dato del canal 1
   NOP
   NOP
   bcf   ADCON0,3 ;selecciono
   bsf   ADCON0,4 ;canal 2
   NOP
   bsf   ADCON0,2 ;inicio conversion en canal 2
   btfsc   ADCON0,2 ;espero a que la conversion termine   
   goto   $-1
   movf   ADRESH, W
   BTFSS   PIR1,TXIF ;espero a que se vacie el buffer de salida   
   GOTO   $-1
   MOVWF   TXREG ;cuando se vacia envio el dato del canal 2
   NOP
   NOP
   goto   Bucle

   END
« Última modificación: 13 de Diciembre de 2008, 03:06:27 por enzo84 »

Desconectado enzo84

  • PIC10
  • *
  • Mensajes: 13
Re: Problema con ADC
« Respuesta #1 en: 13 de Diciembre de 2008, 03:03:57 »
Hola a todos foreros! Le ven algún problema al código anterior?, paso a explicar:

El pic es un 16f876a, la configuración es la mínima, cristal, dos condensadores, dos tierras y dos conexiones a +5v, además, la conexión para tx y rx de la línea serial.

Uso los pines ra0, ra1, y ra2 como entradas analógicas, y la idea es muestrearlas y enviarlas por rs232 todo el tiempo.

Cual es el problema?, bueno, funciona, pero solo el canal 1(ra0), del canal 2(ra1) me llegan 2,5 voltios aproximadamente, cuando pongo esa pata a +5v, y del canal 3(ra2) me llega una tensión aún menor cuando pongo esa pata a cero, creo que unos 1,25 voltios (sospechosamente hay un patrón ahí).

Lo primero que pensé es, se cagó el módulo adc del pic, pero después dije, ese no es el problema, sino que el problema está en la multiplexación, tiempo quizás? bueno, lo modifiqué y le puse un retardo de 4 milisegundos (mucho) entre cada muestra, y hacía lo mismo, así que lo dejé como estaba.

Después probé hacer un bucle en el que solo tome muestras del canal 3 o RA2 y adivinen que, funcionaba bien, cuando lo ponía a cero, me llegaba un cero, y cuando lo ponia a +5v a esa pata (pata 4 del pic) me llegaba un 255, osea, +5v.

Olvidé mencionar que la tensión de referencia es 5v como podrán ver en la configuración.

Qué puede ser? el cristal que uso es de 4 Mhz.

Lo próximo que voy a probar es hacer la secuencia inversa para sacarme la duda de si es problema en la multiplexación, es decir, muestrear primero RA2, después RA1, y finalmente RA0, si el problema es ese, debería mostrarme bien los valores de RA2, pero no los de RA1, y RA0.

A alguien le pasó?

Desde ya muchas gracias...
« Última modificación: 13 de Diciembre de 2008, 03:08:15 por enzo84 »

Desconectado enzo84

  • PIC10
  • *
  • Mensajes: 13
Re: Problema con ADC
« Respuesta #2 en: 13 de Diciembre de 2008, 03:05:46 »
Otra cosa que me olvidé mencionar es que también uso un botoncito para comenzar la adquisición... pero eso no es problema.
« Última modificación: 13 de Diciembre de 2008, 03:08:34 por enzo84 »

Desconectado enzo84

  • PIC10
  • *
  • Mensajes: 13
Re: Problema con ADC PIC16F876A
« Respuesta #3 en: 13 de Diciembre de 2008, 06:00:24 »
Bueno gente con la ayuda de NANO1985  a estas horas de la madrugada se solucionó el problema.

Las modificaciones fueron, agregarle unos NOPs (demasiados quizás) para darle tiempo a que se efectúen los cambios en el multiplexor y en los registros de configuración (ADCON0,ADCON1), y la segunda modificación y la más crítica, que creo que es por esto que no funcionaba, el apagado del módulo COMPARADOR que me dijo NANO1985 que el lo apagaba.

Evidentemente el comparador interfiere, a continuación, el nuevo programa:

   LIST P=16F876A
   PROCESSOR 16F876A
   INCLUDE "P16F876A.INC"
   RADIX           DEC
   __IDLOCS        H'0000'
   ERRORLEVEL      0, -302, -306

   __CONFIG       _CP_OFF&_PWRTE_ON&_BODEN_OFF&_LVP_OFF&_DEBUG_OFF&_XT_OSC&_WDT_OFF&_WRT_OFF

   ;ORG 20H

   ORG 00h

Inicio:
   BSF   STATUS,RP0
   BCF   STATUS,RP1   ;pagina 1
   movlw   b'00000111'   ;APAGO COMPARADOR      
   movwf   CMCON   
   movlw   b'00001001'   ;justificación a la izquierda (8bits)
   movwf   ADCON1      
   NOP
   NOP
   NOP
   NOP
   NOP
   NOP
   NOP
   movlw   b'00000111'   ;3 entradas analogicas
   movwf   TRISA
   MOVLW   b'11111111'
   MOVWF   TRISC       ;todos en el c como entrada (6 y 7)
   BCF   STATUS,RP0    ;pagina 0
   movlw   b'01000001'
   movwf   ADCON0          ;enciendo el adc y Fosc/8
   NOP
   NOP
   NOP
   NOP
   NOP
   NOP
   NOP
   BSF   RCSTA,SPEN
   BSF   STATUS,RP0   ;pagina 1
   MOVLW   24H
   MOVWF   TXSTA
   MOVLW   25
   MOVWF   SPBRG
   BSF   TXSTA,TXEN
   BCF   STATUS,RP0   ;pagina 0
   MOVLW   90H
   MOVWF   RCSTA

Start:
   btfsc   PORTC,0      ;cuando se presiona, comienza Bucle
   goto   Start

Bucle:
   movlw   b'01000001'   ;SELECCIONO CANAL 1 - RA0
   movwf   ADCON0          ;enciendo el adc y Fosc/8
   NOP
   NOP
   NOP
   NOP
   NOP
   NOP
   NOP
   bsf   ADCON0,2 ;inicio conversion en canal 0
   NOP
   NOP
   btfsc   ADCON0,2 ;espero a que termine la conversion   
   goto   $-1
   movf   ADRESH, W
   BTFSS   PIR1,TXIF ;espero a que se vacie buffer de salida   
   GOTO   $-1
   MOVWF   TXREG     ;cuando se vacia envio el dato del canal 0
   NOP
   NOP

   movlw   b'01001001'   ;SELECCIONO CANAL 2 - RA1
   movwf   ADCON0          ;enciendo el adc y Fosc/8
   NOP
   NOP
   NOP
   NOP
   NOP
   NOP
   NOP
   bsf   ADCON0,2 ;inicio conversion en canal 1
   NOP
   NOP
   btfsc   ADCON0,2 ;espero a que la conversión termine   
   goto   $-1
   movf   ADRESH, W
   BTFSS   PIR1,TXIF ;espero a que se vacie buffer de salida   
   GOTO   $-1
   MOVWF   TXREG ;cuando se vacia envio en dato del canal 1
   NOP
   NOP


   movlw   b'01010001'   ;SELECCIONO CANAL 3 - RA2
   movwf   ADCON0          ;enciendo el adc y Fosc/8
   NOP
   NOP
   NOP
   NOP
   NOP
   NOP
   NOP
   bsf   ADCON0,2 ;inicio conversion en canal 2
   NOP
   NOP
   btfsc   ADCON0,2 ;espero a que la conversion termine   
   goto   $-1
   movf   ADRESH, W
   BTFSS   PIR1,TXIF ;espero a que se vacie el buffer de salida   
   GOTO   $-1
   MOVWF   TXREG ;cuando se vacia envio el dato del canal 2
   NOP
   NOP
   goto   Bucle

   END

Funciona!! Gracias NANO1985!...


 

anything