Autor Tema: Problema con A/D del Pic 16F877A  (Leído 9761 veces)

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

Desconectado peter2006

  • PIC10
  • *
  • Mensajes: 41
Problema con A/D del Pic 16F877A
« en: 16 de Diciembre de 2006, 13:48:52 »
Tengo un proyecto con el 16F877A que usa una entrada analogica AN0 que toma datos de un potenciometro, funcionaba bien pero de repente algo cambio y no da lecturas en todo el recorrido del potenciometro, solo lee en la parte final con lo cual pierde mucha sencibilidad.
Puede ser que se haya estropeado la entrada o cambie algo en el programa sin darme cuenta?
El programa esta en CCS.

Gracias.
   
Ideas pocas pero confusas

Desconectado Veguepic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2119
Re: Problema con A/D del Pic 16F877A
« Respuesta #1 en: 16 de Diciembre de 2006, 14:06:05 »
MUY MUY dificil que alguien te pueda ayudar sin mayores datos.

Si cambiaste algo para mal en el programa, como saberlo??

Si esta mal tu circuito, como saberlo??

Si bien yo no se CSS, lo que si se, es que se necesita mas informacion para que alguien te pueda ayudar.

Saludos
“Si la gente es buena sólo porque temen al castigo y porque esperan una recompensa, entonces verdaderamente somos un grupo lastimoso." Albert Einstein.

Saludos desde Lima , Peru    -    Hugo

Desconectado vszener

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2395
Re: Problema con A/D del Pic 16F877A
« Respuesta #2 en: 16 de Diciembre de 2006, 14:08:38 »
Sube el código y como dice el amigo veguepic, da más datos.


Feliz Navidad!!! ;)
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado peter2006

  • PIC10
  • *
  • Mensajes: 41
Re: Problema con A/D del Pic 16F877A
« Respuesta #3 en: 16 de Diciembre de 2006, 14:50:44 »
Perdon por ser tan impreciso, la parte de la inicialización es la siguiente:

#include <16F877A.h>
#device *=16
#device adc=8
#use delay(clock=20000000)
#fuses NOWDT,HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#ZERO_RAM


// VARIABLES
// definiciones básicas


#byte porta= 0x05
#byte portb= 0x06
#byte portc= 0x07
#byte portd= 0x08
#byte porte= 0x09

#byte trisa= 0x85
#byte trisb= 0x86
#byte trisc= 0x87
#byte trisd= 0x88
#byte trise= 0x89

   porta= 0b00000000; set_tris_a (0b10000000);
   portb= 0b00000000; set_tris_b (0b11111001);
   portc= 0b00000000; set_tris_c (0b00000000);
   portd= 0b00000000; set_tris_d (0b00000000);
   porte= 0b00000000; set_tris_e (0b11101111);


  setup_adc_ports(AN0);
  setup_adc(ADC_CLOCK_INTERNAL);
  setup_adc(ADC_CLOCK_DIV_32);
  setup_psp(PSP_DISABLED);
  setup_spi(FALSE);
  setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  setup_timer_1(T1_DISABLED);
  setup_timer_2(T2_DIV_BY_4,250,10);
  setup_comparator(NC_NC_NC_NC);
  setup_vref(FALSE);
  set_adc_channel(0);


el circuito es simple, el cursor del pote esta comectado a la entada AN0 y la resistencia a los 5V y el  neutro.
Luego leo el AN0 con read_adc() para obtener un valor entre 0 y 255


Gracias.
Ideas pocas pero confusas

Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
Re: Problema con A/D del Pic 16F877A
« Respuesta #4 en: 19 de Diciembre de 2006, 11:06:04 »
Hola peter2006, no conosco mucho de CCS, pero de lo que estoy seguro es:

 setup_adc(ADC_CLOCK_INTERNAL);
 setup_adc(ADC_CLOCK_DIV_32);

Si usas clock interno no usas el DIV_32, por velocidad por supuesto te conviene el DIV_32

El otro tema es que estes usando un potenciometro de valor muy alto, yo te recomendaría que el valor del mismo no sea superior a 1K, caso contrario seguro podrá hacerte el problema que comentas.

Un saludo y espero tus comentarios.

Atte. CARLOS.
La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.

Deimos

  • Visitante
Re: Problema con A/D del Pic 16F877A
« Respuesta #5 en: 19 de Diciembre de 2006, 13:01:29 »
El CCS para hacer A/D con el 877 no permite cambiar el bit de justificacion de la lectura (ADCON1,ADFM), y por defecto sale a la izquierda, con lo que pierdes los dos ultimos bits de LSB.

La verdad es que no se como se puede cambiar, intenté modificar las librerias para que viese el cambio en el bit y no habia manera. Casi estoy seguro que tu problema viene por ahi. Ademas tu mismo dices que haces una conversion de 0 a 255, y no hasta 1024. Si te pasa lo que creo que te pasa, el A/D está haciendo conversion de 4 a 1024, ya que por la justificacion hacia la izquierda, utiliza los primeros 8 bits (MSB).

Coincido con Chaly, no uses un potenciometro tan grande. Usa uno de 1K o menos si puede ser, y si es multivuelta mejor que mejor. Ah y que el potenciometro sea lineal, no logaritmico, sino vas a volver al 877 loco perdio jajajaj

Hasta luego maj@@@@@@@@@@@s




Desconectado flacoclau

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1692
    • El Micro Reactor
Re: Problema con A/D del Pic 16F877A
« Respuesta #6 en: 19 de Diciembre de 2006, 15:46:35 »
Puede que también se te haya hecho un corto en algún cable del potenciómetro y se haya quemado el carbón del mismo, es muy común.
Las personas con buena ortografía me atraen textualmente.

El Micro Reactor

Córdoba capital - Argentina.

Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
Re: Problema con A/D del Pic 16F877A
« Respuesta #7 en: 19 de Diciembre de 2006, 16:14:46 »
Hola Deimos, si el CCS usa el ADC por defecto con justificación a la izquierda no es un problema, ya que la lectura igual saguirá siendo correcta pero de 0 a 255 por lo tanto no creo que ese sea el motivo del error, es lo mismo que usar el convertidor en 10 bit y el resultado dividirlo por 4, nada más que eso. Por lo tanto sería imposible que la lectura sea de 4 a 1023 (1024 son 11 bits).

Un saludo.

Atte. CARLOS.
La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.

Desconectado peter2006

  • PIC10
  • *
  • Mensajes: 41
Re: Problema con A/D del Pic 16F877A
« Respuesta #8 en: 20 de Diciembre de 2006, 00:21:01 »

Gracias a todos por sus aportes, ya me pongo a probarlos y les comento.


Saludos.
Ideas pocas pero confusas

Deimos

  • Visitante
Re: Problema con A/D del Pic 16F877A
« Respuesta #9 en: 20 de Diciembre de 2006, 09:31:53 »
Chaly no me has interpretado bien.

Pongamos que hago una lectura de 1100001111. Ese el el valor de la lectura en binario.

Si cojo los 8 MSB me sale 11000011
Si cojo los 8 LSB me sale 00001111

Cogiendo los 8 MSB, no se me pondrá a 1 el primer bit hasta que no salga como minimo un 4. Por eso digo que con MSB's solo veré de 4 a 1023 (tienes razon con 11 bits para 1024, queria decir 1023 en mi anterior mensaje). Cogiendo los 8 LSB's veré solo de 0 a 255.

La diferencia que veo es que

1023-4=1019 combinaciones
0-255=255 combinaciones

Vaya es como yo lo veo. Quizas me esté equivocando.

Dews!!!

Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
Re: Problema con A/D del Pic 16F877A
« Respuesta #10 en: 20 de Diciembre de 2006, 18:37:21 »
Hola Deimos, entonces tienes un concepto mal interpretado, porque con 8 bit nunca tendrás más de 256 convinaciones posibles, no importa que sean los 8MSB o los 8LSB, siempre son 8 bits y no hay más de 256

Pasemos a tú ejemplo:

Si cojo los 8 MSB me sale 11000011 = que en definitiva no es más que 195 en decimal
Si cojo los 8 LSB me sale 00001111  = que en definitiva no es más que 15   en decimal

Tienes razon que con los MSB veras de 4 a 1023 (en realidad de 0 a 1023) del valor real del convertidor A/D, pero recuerda que con los MSB tienes que dividir por 4 el valor real, por lo tanto también tienes 256 convinaciones.

Citar
La diferencia que veo es que

1023-4=1019 combinaciones
0-255=255 combinaciones

En la realidad los cálculos son los siguientes:

1023 - 0 = 1024 / 4 = 256 convinaciones posibles
  255 - 0 =                 256 convinaciones posibles

Con la diferencia que si tomas los LSB tendrás 4 escalas de 256 convinaciones en todo el rango del vref, pero si tomas los MSB tendrás una escala de 256 convinaciones para todo el rango del vref.

Por consiguiente la unica solucion haceptable si deseas trabajar con solo 8 bits es qye tomes los MSB, ya que si tomas los LSB para un mismo resultado puedes tener asta 4 valores de tensiones posibles.

Espero se me entienda lo que quiero explicarte, un saludo.

Atte. CARLOS.
La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.

Deimos

  • Visitante
Re: Problema con A/D del Pic 16F877A
« Respuesta #11 en: 21 de Diciembre de 2006, 05:22:49 »
Hola chaly29 creo que ya comprendo. Divides entre 4 porque sabes que pierdes los 2 bits LSB y por eso solo es buena 1 de cada 4 combinaciones.


Tienes razon que con los MSB veras de 4 a 1023 (en realidad de 0 a 1023) del valor real del convertidor A/D, pero recuerda que con los MSB tienes que dividir por 4 el valor real, por lo tanto también tienes 256 convinaciones.

Citar
La diferencia que veo es que

1023-4=1019 combinaciones
0-255=255 combinaciones

En la realidad los cálculos son los siguientes:

1023 - 0 = 1024 / 4 = 256 convinaciones posibles
  255 - 0 =                 256 convinaciones posibles

Con la diferencia que si tomas los LSB tendrás 4 escalas de 256 convinaciones en todo el rango del vref, pero si tomas los MSB tendrás una escala de 256 convinaciones para todo el rango del vref.

Por consiguiente la unica solucion haceptable si deseas trabajar con solo 8 bits es qye tomes los MSB, ya que si tomas los LSB para un mismo resultado puedes tener asta 4 valores de tensiones posibles.


Es posible que por eso el CCS tenga configurado el bit ADCON1,ADFM=1(justificación por la izquierda)? Porque ya expliqué que intenté cambiarle la librería para que me hiciese la justificación por la derecha y no hubo manera humana.

Gracias por la aclaración chaly.

Dewssssss

Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
Re: Problema con A/D del Pic 16F877A
« Respuesta #12 en: 21 de Diciembre de 2006, 06:01:57 »
Hola Deimos, las librerías del CCS no las conosco, pero para cambiar la justificación del convertidor tienes que setear el bit 7 del registro ADCON1.

Con 0 lo justificas a la izquierda y con 1 a la derecha.

Espero te sea de ayuda, pero realmente no comprendo para que deseas cambiar ese parámetro, ya que justificado a la derecha no es muy usado.

Un saludo.

Atte. CARLOS.
La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Problema con A/D del Pic 16F877A
« Respuesta #13 en: 21 de Diciembre de 2006, 09:06:12 »
Hola Deimos, las librerías del CCS no las conosco, pero para cambiar la justificación del convertidor tienes que setear el bit 7 del registro ADCON1.

Con 0 lo justificas a la izquierda y con 1 a la derecha.

Espero te sea de ayuda, pero realmente no comprendo para que deseas cambiar ese parámetro, ya que justificado a la derecha no es muy usado.

Un humilde aporte

1) Si se quiere usar precisión de 8 bits -> usar justificación izquierda y leer el ADRESH
2) Si se queire usar precisión de 10 bits -> usar justificación derecha y leer ambos registros.


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 peter2006

  • PIC10
  • *
  • Mensajes: 41
Re: Problema con A/D del Pic 16F877A
« Respuesta #14 en: 21 de Diciembre de 2006, 22:03:16 »
Con el pote de 1k mejoro la lectura, ahora quisiera complicar un poco mas el tema, si conecto un sensor LM35 para medir temperatura me da lecturas que fluctuan mucho y no varia al calentar el sensor se queda variando entre 27 y 36 la lectura del puerto, me podrian aconsejar como medir una temperatura.

Gracias.
 
Ideas pocas pero confusas