Problemas con ADC en PIC16F887 y CCS

...bueno si el programa ya te funcionan entonces #ZERO RAM no tiene mucha relevancia pero normalmente se lo sitúa entes del void main().

#ZERO RAM
void main()
{
...
}

Por mi parte e trabajado con CCS, MikroC para el caso de ambos compiladores encontré los famosos bugs debido a eso en lo único que puedo estar 100% seguro es cuando programo en asm..., claro que con el tiempo logre resolver todos mis problemas usando CCS, MikroC y asm.

En cuanto al los errores en las nuevas versiones de los compiladores yo los tomo mas como por ejemplo:
el paso de win xp a win vista que fue toda una pena, pero del win xp a win 7... eso fue mas digerible...
 
Saludos compañeros.
Quería preguntarles acerca de un problema que tengo.
¿Cómo puedo tomar sólo 4 valores que pueda dar mi potenciómetro en el conversor ADC que estoy armando?

Es que sólo quiero tomar 4 o 5 valores de mi conversor y que me lo muestre en un LCD 4x20 y luego después de mostrarlos que muestre un mensaje que ya terminó el proceso.

¿Me podrían ayudar en eso? Es que no sé cómo tomar sólo 4 o 5 valores de mi potenciómetro.

Aquí les dejo la imagen y el código.
PHP:
#‎include‬<16f887.h> 
‪#‎fuses‬ XT
‪#‎device‬ adc=10 //10-bit ADC
‪#‎use‬ delay (clock=4000000) 
#include<lcd420.c>
‪#‎byte‬ port_A=0x05
#byte port_B=0x06
void main()
{
float data;
set_tris_a(0b00001111);
set_tris_b(0b00000000);
lcd_init();
delay_ms(200);
setup_adc(adc_clock_internal);
setup_adc_ports(sAN0);
while(true)
{
set_adc_channel(0);
data=read_adc();
lcd_gotoxy(1,1); printf(lcd_putc,"# DIG 1 = %1.2f ",data);
}
}
Quiero mostrar sólo 4 o 6 valores de mi potenciómetro y mostrarlos en el lcd.
Me dijeron que use un ciclo for, pero no tengo idea de cómo hacer eso.

Disculpen las molestia y gracias de antemano.
 

Adjuntos

  • convertidor ADC.png
    convertidor ADC.png
    77.7 KB · Visitas: 6
Quiero mostrar sólo 4 o 6 valores de mi potenciómetro y mostrarlos en el lcd.
Me dijeron que use un ciclo for, pero no tengo idea de cómo hacer eso.
De forma fácil si se puede con un bucle "for()" y usando un arreglo con la dimensión de las muestras que quieras tomar.
El arreglo debe ser conforme a los bits de lectura del ADC. (8, 10, 16 bits)
Por cada ciclo tomas una muestra y la guardas en el arreglo.
Esperas y tomas la otra lectura hasta completar los ciclos.

De forma un poco más complicada, es tomando una muestra y hacer una comparación para determinar si la lectura anterior es diferente a la actual y así realizar otra lectura para guardarla.
 
Buscando por internet y el foro no he podido localizar algún tipo de información que me ayude, por lo que planteo el problema, esperando que alguien me pudiese dar algún consejillo que me abra la mente para dar con la solución, explico el problema:
Trabajo con CCS compiler haciendo un programa para un PIC16F887 que tiene una función muy simple, leer un sensor y determinar hacia donde se dirige (en este caso una base con movimiento en el eje X) ya sea hacia adelante +X o hacia atrás –X; Así mismo en el trayecto +X si se alcanza la 1er posición ajustada activar un relevador K1 y si se alcanza la 2ª posición asignada activar otro relevador K2. Ahora bien teniendo los dos relevadores activados si la base se mueve hacia –X entonces desactivarlos.
Bien esa es la premisa y lo realizado hasta el momento funciona de maravilla con excepción de determinar hacia donde se dirige hacia +X o –X y el problema es por lo siguiente.
Hago una primera lectura del sensor y ese dato lo guardo y digamos se convierte en la posición anterior o previa u old o como le gusten llamar, después de un retardo de 2 segundos hago otra lectura del sensor y entonces comparo mediante una resta y determino hacia donde se dirije la base.
Posicion = Pos_anterior – Pos_actual;
IF(Posicion > 0){Direccion = 0;}
IF(Posicion < 0) {Direccion = 1;}
Hasta allí todo de maravilla…. Pero cuando la base no se mueve llega un punto en el los relevadores entran en un modo de ON/OFF por que la lectura obvio no es estable o fija, esta varia levemente pero varia y en determinado momento cumple ambas condiciones en muy poco tiempo, es decir puede ser > que 0 o < que 0. Y para acabar la igualdad también afecta.
He probado con otros métodos y no he tenido éxito, he llegado al punto de ceguera mental de tanto ver y analizar el problema por ello recurro a este foro y tratando de tener algún tip.
Les adelanto la lectura de la señal análoga esta de rechupete tiene una variación de +/- 0.01 pero esa pequeñez me ha dado mucho dolor de cabeza.
Saludos
 
Hola aguevara, lo que te sucede es de lo más normal con el método que usas.
Lo que se me ocurre en este instante es:
Tomar un valor mínimo de desplazamiento para considerarlo desplazamiento.

Posicion = Pos_anterior – Pos_actual;
IF(Posicion > valor_minimo_de _desplazamiento){Direccion = 0;}
IF(Posicion < valor_minimo_de_desplazamiento) {Direccion = 1;}
 
Atrás
Arriba