Si en realidad cometi MAS errores. Luego te doy el codigo coorregido y te digo los errores que tuve. Primero te cuento mis intenciones.
Cuando intente reducir el codigo me encontre que no utilizas las entradas 0,1,2,3,4 sino que la ultima es el 5. Es decir no son todas seguidas.
Una solución es en el codigo fijarse que si el indice es el 4, usar el canal 5. Esta es una solucion muy simple, pero que si algun dia cambias las entradas o la cantidad de entradas tendrias que modificar el codigo. Lo cual no sirve, y es mejor un codigo que pueda ser reutilizado
La otra solucion fue hacer una tabla. De los canales y coeficientes.
const int8 ADC_Channels[5] = {0,1,2,3,5};
Esto me permite que yo pueda cambiar el orden de las entradas leidas o coeficientes sin tener que cambiar el codigo, lo cual me permite reutilizarlo.
Y aqui llega un nuevo problema.... Cuando se cuando se terminan las entradas?
Existen 2 formas de realizarlo.. La primera y mas simple es agregar un termino que finalice el loop. Como yo hice fue agregar un 0xFF, entonces la idea es que cuando ADC_Channels
sea igual a 0xFF salga. (Este es uno de mis errores). Entonces el codigo correcto seria asi:
#define MUESTRAS (1<<3)
float ADC_Values[5];
const int8 ADC_Channels[6] = {0,1,2,3,5,0xFF};
const float ADC_Coef[5] = {0.48875855327468230694037145650049,0.48875855327468230694037145650049,0.48875855327468230694037145650049,0.48875855327468230694037145650049,0.06109481915933528836754643206256};
void filtro_promediado(float * ADC_Val)
{
int8 i,j;
for(i=0; ADC_Channels[i]!=0xFF ; i++)
{
set_adc_channel(ADC_Channels[i]);
delay_us(20);
for(j=0; j<MUESTRAS;j++) {
ADC_Val[i] = read_adc();
}
ADC_Val[i] /= MUESTRAS;
ADC_Val[i] *= ADC_Coef[i];
}
}
Otra forma de saber cuando termina es darle de antemano la cantidad. Utilizando el operador sizeof, para esto ya no utilizamos mas un termino para indicarnos el fin. Lo cual hace mas intuitivo la parte de elegir los canales y coeficientes, ya que si tenes 5 canales necesitas si o si 5 coeficientes y 5 lugares donde ponerlo.
#define MUESTRAS (1<<3)
#define CANT_CANALES 5
float ADC_Values[CANT_CANALES];
const int8 ADC_Channels[CANT_CANALES] = {0,1,2,3,5};
const float ADC_Coef[CANT_CANALES] = {0.48875855327468230694037145650049,0.48875855327468230694037145650049,0.48875855327468230694037145650049,0.48875855327468230694037145650049,0.06109481915933528836754643206256};
void filtro_promediado(float * ADC_Val, int8 Asize)
{
int8 i,j;
for(i=0; i < Asize ; i++)
{
set_adc_channel(ADC_Channels[i]);
delay_us(20);
for(j=0; j<MUESTRAS;j++) {
ADC_Val[i] = read_adc();
}
ADC_Val[i] /= MUESTRAS;
ADC_Val[i] *= ADC_Coef[i];
}
}
Para esto vamos a llamar a la funcion de esta forma:
filtro_promediado(ADC_Values, (sizeof ADC_Values)/(sizeof ADC_Values[0]))
sizeof se precalcula antes por el compilador y luego es reemplazado por una constante en el programa. Es decir no es una funcion que va a tener sus instrucciones en el microcontrolador.
--------------
Si aun asi queres mas generalizacion de la funcion podes hacer:
#define MUESTRAS (1<<3)
#define CANT_CANALES 5
float ADC_Values[CANT_CANALES];
const int8 ADC_Channels[CANT_CANALES] = {0,1,2,3,5};
const float ADC_Coef[CANT_CANALES] = {0.48875855327468230694037145650049,0.48875855327468230694037145650049,0.48875855327468230694037145650049,0.48875855327468230694037145650049,0.06109481915933528836754643206256};
void filtro_promediado(float * ADC_Val, const int8 * ADC_Chan, const float * ADC_Cof, int8 Asize)
{
int8 i,j;
for(i=0; i < Asize ; i++)
{
set_adc_channel(ADC_Chan[i]);
delay_us(20);
for(j=0; j<MUESTRAS;j++) {
ADC_Val[i] = read_adc();
}
ADC_Val[i] /= MUESTRAS;
ADC_Val[i] *= ADC_Cof[i];
}
}
El #define CANT_CANALES nos permite que si por algun motivos no ponemos la cantidad correcta tengamos un error y todos los arrays tengan el mismo largo.
El pasar todos los punteros permite que no importa el nombre que le des vos a tus arrays siempre y cuando lo pases en orden.
Respecto a la proteccion para que se usen solo los valores dados y no entradas de mas que no estan contempladas en el array, esto depende de quien hace el codigo, ya que posee un campo de "tamaño"