Autor Tema: Problema ADC 18F2331  (Leído 3409 veces)

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

Desconectado superprp

  • PIC16
  • ***
  • Mensajes: 137
Problema ADC 18F2331
« en: 04 de Marzo de 2008, 15:21:24 »
Tengo un problema y no se cual puede ser, tengo un código de leer tres infrarrojos de sharp por RA2,RA3 Y RA4 y de sacarme un valor digital al llegar a una cierta distancia por RC5, RC6, RC7 pero cuando conecto algo a RA2, o RA4, no me hace nada, y cuando lo conecto a RA3 me funciona pero me modifica además el RC7, bueno, aquí está el código que lo explica mejor:

org 0x00
   goto inicio
   org 0x08
   org 0x18
   org 000020h
inicio
   
;preparamos los registros
;configuramos los pines de E/S:
   bsf TRISA, 0      ;entrada analógica del sensor
   bsf TRISA, 2      ;entrada infrarrojo derecha
   bsf TRISA, 3      ;entrada infrarrojo central
   bsf TRISA, 4      ;entrada infrarrojo izquierda
        bcf TRISC, 5      ;salida infrarrojo derecha
   bsf TRISC, 6      ;salida infrarrojo central
   bsf TRISC, 7      ;salida infrarrojo izquierda
   clrf LATA         ;reseteamos todos los puertos
   clrf LATC

;configuramos las entradas analógicas
   bsf ADCON0, 0      ;habilitar A/D
   bsf ADCON0, 1      ;inicialmente a 0, poner a 1 para iniciar la conversión (comprobar despues hasta leer 0, finalizada la conversión)
   bsf ADCON0, 3      ;SELECCIONAMOS EL CANAL C
   bcf ADCON0, 2
   bcf ADCON0, 4      ;canal simple habilitado
   bcf ADCON0, 5      ;modo simple (=1 modo continuo)      
   bcf ADCON1, 4      ;buffer FIFO deshabilitado
   bcf ADCON1, 6      ;Referencia de tensión analógica interna
   bcf ADCON1, 7      
   bcf ADCON2, 0      ;reloj de conversión Fosc/4
   bcf ADCON2, 1
   bsf ADCON2, 2
   bcf ADCON2, 3      ;sin retardo para la conversión
   bcf ADCON2, 4
   bcf ADCON2, 5
   bcf ADCON2, 6
   bcf ADCON2, 7      ;justificación izquierda
   bcf ADCON3, 0      ;sin disparo para la conversión
   bcf ADCON3, 1
   bcf ADCON3, 2
   bcf ADCON3, 3
   bcf ADCON3, 4
   bsf ANSEL0, 2      ;AN2 con entrada analógica y no digital(=0)
   bsf ANSEL0, 3      ;AN3 con entrada analógica
   bsf ANSEL0, 4       ;AN4 con entrada analógica
   clrf ADCHS         ;selección de grupos A,B,C,D
   bsf ADCHS, 0      ;selecciono el AN4 en lugar de AN0
   bsf ADCON0, 1      ;EMPEZAMOS LA CONVERSIÓN


polling
;COMPROBAMOS LOS INFRARROJOS ¿OBSTÁCULO?
   btfss ADCON0, 1
   call leer_analogico
   goto polling



;SUBRUTINA LEER ANALÓGICO
leer_analogico            
;   movlw b'00010100'      ;comprobamos si está a menos de 30cm (0.4v)
   movlw b'00101110'      ;comprobamos si está a menos de 15cm (0.9v)
   subwf ADRESH
   bnc encender         ;si está a menos de 30cm encendemos un aviso
   nop
   nop
apagar
   clrf alerta            ;si no apagamos el aviso
   return
encender
   movlw 0x01
   movwf alerta
comprueba            
   btfsc cont_an, 1      ;¿quién ha sido?
   goto leer_infrarrojo3
   btfss cont_an, 0
   goto leer_infrarrojo1
   goto leer_infrarrojo2

leer_infrarrojo1
   btfss alerta, 0
   goto cuenta1
   goto reset1
cuenta1
   movlw 0x01
   addwf infra1
   movlw 0xFF
   subwf infra1
   bnc alerta1
   return
reset1
   clrf infra1
   bsf LATB, 7
   bsf ADCON0, 3         ;SELECCIONAMOS EL CANAL D
   bsf ADCON0, 2
   bsf ADCON0, 1         ;volvemos a activar la lectura analógica
   incf cont_an
   return
alerta1
   bcf LATB, 7
   bsf ADCON0, 3         ;SELECCIONAMOS EL CANAL D
   bsf ADCON0, 2
   bsf ADCON0, 1         ;volvemos a activar la lectura analógica
   incf cont_an
   return
   


leer_infrarrojo2
   btfss alerta, 0
   goto cuenta2
   goto reset2
cuenta2
   movlw 0x01
   addwf infra2
   movlw 0xFF
   subwf infra2
   bnc alerta2
   return
reset2
   clrf infra2
   bsf LATB, 6
   bsf ADCON0, 3         ;SELECCIONAMOS EL CANAL B
   bsf ADCON0, 2
   bsf ADCON0, 1         ;volvemos a activar la lectura analógica
   incf cont_an
   return
alerta2
   bcf LATB, 6
   bsf ADCON0, 3         ;SELECCIONAMOS EL CANAL B
   bsf ADCON0, 2
   bsf ADCON0, 1         ;volvemos a activar la lectura analógica
   incf cont_an
   return



leer_infrarrojo3
   btfss alerta, 0
   goto cuenta3
   goto reset3
cuenta3
   movlw 0x01
   addwf infra3
   movlw 0xFF
   subwf infra3
   bnc alerta3
   return
reset3
   clrf infra3
   bsf LATB, 5
   bsf ADCON0, 3         ;SELECCIONAMOS EL CANAL C
   bsf ADCON0, 2
   bsf ADCON0, 1         ;volvemos a activar la lectura analógica
   incf cont_an
   return
alerta3
   bcf LATB, 5
   bsf ADCON0, 3         ;SELECCIONAMOS EL CANAL C
   bsf ADCON0, 2
   bsf ADCON0, 1         ;volvemos a activar la lectura analógica
   incf cont_an
   return




ESPERO QUE PODAIS AYUDARME HABER PORQUE NO ME FUNCIONA EL PROGRAMA

GRACIAS!!
« Última modificación: 04 de Marzo de 2008, 15:25:28 por superprp »

Desconectado superprp

  • PIC16
  • ***
  • Mensajes: 137
Re: Problema ADC 18F2331
« Respuesta #1 en: 11 de Marzo de 2008, 14:47:11 »
Leyendo y leyendo (no ya en el datasheet, si no en un pdf de especificaciones de programación que he encontrado en la pagina de microchip) he visto que si programo el PIC con LVP el pin RB5 no funciona correctamente parece ser, por lo que lo he programado con LVP a '0', pero ahora lo que me sucede es que me tarda como unos 30 segundos o casi 1 minuto en convertir el valor analógico, y antes el resto de valores analógicos los hacía al instante, ¿a que puede ser debido?

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Problema ADC 18F2331
« Respuesta #2 en: 12 de Marzo de 2008, 08:41:06 »
superprp , no he usado ese pic pero también te confieso que me es tedioso leer tu código.  Te sugiero uses el include del pic en cuestión y uses los nombres de los bits de cada registro en vez de usar el número.

Lo del include sería agregar arriba de tu código algo asi como


   list   P=PIC18F2331
   #include   P18F2331.INC


Una vez hecho eso podrías hacer por ejemplo


        bsf    ADCON0,ADON


en vez de


        bsf    ADCON0,0



Como ves, eso hace más legible al código.  Es más fácil darse cuenta y recordar la palabra ADON, que el bit 0 del ADCON0, sobre todo cuando tienes en la cabeza varios registros y bits de varios micros.

Al respecto de los fuses, el LVP está bien que lo tengas desactivado ya que solo molestará si no vas a usar el modo LVP.  En cuanto a los demás fuses, como los tienes? Qué cristal usas? activas el watchdog?
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado superprp

  • PIC16
  • ***
  • Mensajes: 137
Re: Problema ADC 18F2331
« Respuesta #3 en: 12 de Marzo de 2008, 14:17:49 »
ok, lo siento por la ilegibilidad, pero a mi me resulta mas facil trabajar con la posición del bit que con el nombre de cada bit, la proxima vez lo pondré mas legible para que me podais ayudar mejor.

los fuses activos son:
-Ext RC CLKO RA6
-FCMEM
-IESO
-BOREN
-WDTEN
-FLTAMX
-SPSMX
-GPTREN
-EXCLKMX
-MCLRE
-STVREN
-WDPSO
-WPDS1
-WPDS2
-WPDS3
-HPOL
-LPOL
-VINEM
-PWMPIN
-PWM4MX

el resto están inactivos

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Problema ADC 18F2331
« Respuesta #4 en: 12 de Marzo de 2008, 17:03:32 »
-WDTEN

Este bit en concreto te activa el WatchDog timer, el cual reseteará tu micro constantemente.

Puedes desactivarlo o bien agregar una instrucción clrwdt en tu código en un lugar que se ejecute con frecuencia.

El BORENhará resetear tu pic si el voltaje supera los 5.2V por ejemplo, también lo puedes deshabilitar por ahora así no tienes problemas con eso.

El clock lo tienes activado como un RC externo (Fuse: Ext RC CLKO RA6) , es esto correcto? o estas usando un cristal? Revisa ese flag también
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado superprp

  • PIC16
  • ***
  • Mensajes: 137
Re: Problema ADC 18F2331
« Respuesta #5 en: 13 de Marzo de 2008, 05:57:10 »
Estoy usando un cristal de 4Mhz (me podrías explicar como se configura y para que es lo del ext RC CLKO RA6?) y en que puede afectar?

lo he puesto como XT pero el conversor analógico no me funciona correctamente, el resto de elementos si, porque cuando tenía el LVP activado me funcionaba bien el conversor y acuando lo desactivo no? a que puede ser debido?
« Última modificación: 13 de Marzo de 2008, 06:15:34 por superprp »

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Problema ADC 18F2331
« Respuesta #6 en: 13 de Marzo de 2008, 11:23:42 »
Estoy usando un cristal de 4Mhz (me podrías explicar como se configura y para que es lo del ext RC CLKO RA6?) y en que puede afectar?
Al modo de oscilador.  Si te fijas en el datasheet del PIC tienes todos los modos de oscilador que trae incorporado el PIC, no tendría sentido que copie y pegue el datasheet acá para poner exactamente lo mismo, pero para ser breve y explicativo, uno puede decidir entre varias opciones qué hardware usar en estos pics para usarlo como referencia de clock al mismo.



lo he puesto como XT pero el conversor analógico no me funciona correctamente, el resto de elementos si, porque cuando tenía el LVP activado me funcionaba bien el conversor y acuando lo desactivo no? a que puede ser debido?

Tal vez tengas mal la referencia del tiempo de conversión en el A/D (esto depende de la frecuencia del oscilador), el LVP no tiene nada que ver con el modo de oscilación.  Tal vez al modificar lo del LVP también cambiaste lo del cristal y por ende la frecuencia de operación.

Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado superprp

  • PIC16
  • ***
  • Mensajes: 137
Re: Problema ADC 18F2331
« Respuesta #7 en: 13 de Marzo de 2008, 12:14:45 »
Extrañamente solo cambiaba LVP, y me funcionaba, al cambiarlo, me dejo de funcionar... como se configura lo del A/D?? porque en el datasheet te vienen las opciones pero no las entiendo muy bien,

fosc/2,fosc/4, fosc/16 ... diferencia?
Tad, para que sirve?
y otros registros de configuración que no entiendo y en el datasheet no lo explica bien o no lo termino de entender yo

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Problema ADC 18F2331
« Respuesta #8 en: 13 de Marzo de 2008, 16:50:15 »
Extrañamente solo cambiaba LVP, y me funcionaba, al cambiarlo, me dejo de funcionar... como se configura lo del A/D?? porque en el datasheet te vienen las opciones pero no las entiendo muy bien,

fosc/2,fosc/4, fosc/16 ... diferencia?


Tad, para que sirve?
y otros registros de configuración que no entiendo y en el datasheet no lo explica bien o no lo termino de entender yo

Bueno lo del LVP realmente no me explico.

superprp algo que debes comprender es que los datasheets de los microcontroladores te explican cómo configurar su módulo A/D, su módulo uart, spi, etc, pero no te van a explicar cómo funciona un A/D, o cómo calcular una resistencia o lo que es una capacidad. 

Las dudas que tienes son más que nada de cómo funciona un A/D, bueno, para hacerla simple requieren de una base de tiempo o clock que les permite funcionar e ir digitalizando la cuenta.  Un TAD es el tiempo que tarda en convertir un bit , dicho tiempo debe tener un mínimo valor ya que si lo haces más pequeño el A/D perderá precisión porque lo quieres utilizar más rápido de lo que puede funcionar con precisión.

En general dicho tiempo es 1.6useg, lo que haces al configurar el módulo  A/D es 'escalar el clock del microcontrolador' para que el tiempo del A/D (o clock del A/D) no sean tan rápido como para que el A/D no funcione bien.

Te dejo un link que escribí hace tiempo que tal vez te sirva más para aclarar el punto.

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


- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado superprp

  • PIC16
  • ***
  • Mensajes: 137
Re: Problema ADC 18F2331
« Respuesta #9 en: 14 de Marzo de 2008, 08:35:29 »
Muchas gracias por la info, de todas formas, modificando el Tad, y la fosc/.. sigue sin funcionarme, bueno, realmente lo que me hace es algo muy extraño, y es que le tengo puesto que para una tensión y encienda un led, y cuando baje de un umbral se apague, pues bien, lo enciendo y vale, subo la tensión y tarda 3 minutos contados en encender el led, bajo la tensión y tarda otros 3 minutos en apagarlo... puede ser debido a alguna otra cosa? o solo al conversor A/D? el resto de elementos conectados al PIC me funcionan bien, dos timers que uso me funcionan bien...