Pongo aqui mi duda q me ha surgido al trabajar con Visual Basic, el post donde se explica todo es
http://miarroba.com/foros/ver.php?foroid=64652&temaid=4259270pero concretando mi problema:
El amigo Colores2 me paso un algoritmo para evitar en la medida de lo posible el problema de fluctuaciones q tenia en la toma de valores desde el adc del pic, el algoritmo:
Leer valor ADC y guardarlo en ADCvalor
Si ADCvalor <> ADCvalorAnterior y ADCvalor <> ADCvalorAnterior + 1 entonces
***Enviar ADCvalor
***ADCvalorAnterior = ADCvalor
bien, la condicion creo q la pongo bien en mi programa, os pego aqui el codigo, en negrita la condicion:
//Programa que realiza una conversion de un potenciometro
#include <16f877A.h>
#device adc=10
#fuses XT, NOPROTECT, NOPUT, NOWDT, NOBROWNOUT, NOLVP, NOCPD
#use delay (clock= 4000000)
#use rs232(BAUD=19200, BITS=8, PARITY=N, XMIT=PIN_C6, RCV=PIN_C7)
void main() {
float const resoluc= 5.00/1024.00; //Resoluci�n del convertidor (4.90 es la tension de alimentacion
//q se usa como referencia
float corriente= (2*5.00)/11400.00; //Cuidado aqui para medir la resistencia REAL, esto conlleva fallos
float tension, tensionm, tensiont; //Valor tension sacada
float valor[]; //Numero de pasos de la medida
float v_ohmico, v_ohmicom, v_ohmicot; //Valor ohmico del potenciometro
int m, j, k;
char canal, modo;
setup_adc_ports (ALL_ANALOG); //Todas las entradas del covertidor son analogicas
setup_adc (ADC_CLOCK_INTERNAL); //Selecciono reloj interno del pic
for (;Gi�o {
j= 0;
k= 0;
for (k= 0; k<2; k++) {
switch (k) {
case 0: modo= "a"; break;
case 1: modo= "b"; break;
}
for (j= 0; j<4; j++) {
valor[0]= 0;
tensionm= 0;
tensiont= 0;
v_ohmicom= 0;
v_ohmicot= 0;
set_adc_channel (j);
switch (j) {
case 0: canal= "A"; break;
case 1: canal= "B"; break;
case 2: canal= "C"; break;
case 3: canal= "D"; break;
}
for (m= 1; m<101; m++) { //Bucle que va obteniendo 100 valores de tension
delay_us(20); //Retardo para que de tiempo de cargarse el condensador del adc
valor[m]= read_adc(); //Obtiene el valor del adc
if ((valor[m]!=valor[m-1])&&(valor[m]!=valor[m-1]+1))
tension= valor[m]*resoluc; //Calcula la tension
v_ohmico= (2*tension)/corriente; //Calculo valor ohmico de los potenciometros
v_ohmicot= (v_ohmicot+v_ohmico); //Va sumando los valores ohmicos de los 100 datos
tensiont= (tensiont+tension);
}
v_ohmicom= v_ohmicot/100; //Media del valor ohmico
tensionm= tensiont/100;
if (modo="a")
printf ("%c%c%1.2f
",modo, canal, tensionm);
if (modo= "b")
printf ("%c%c%1.2f
", modo, canal, v_ohmicom);
delay_ms(20); //Retraso de 20ms y vuelta a empezar
}
}
}
}
pues bien, el problema esta en q al simularlo con proteus y el hyperterminal, no me aparece nada por pantalla, pero sin embargo, tal como esta pero quitando el "if" y el array (dejando la variable valor como una normal), me envia perfectamente. Tal como lo veo, creo q el problema tiene q estar en el array, q o lo declaro mal o algo asi, pq el algoritmo creo q esta bien implementado en c.
Bueno, espero vuestra ayuda a ver si alguien q sepa mas c q yo sabe pq me pasa esto.
Gracias
Un saludo