Segun el programa deberia apagarse el led y no encenderse, no hay nada que haga encender al led 1 una ves que se detecte que el ADC esta con menos de 255, tal ves siga leyendo valores mayores a 255, y eso ya pasa por un problema de hardware
Eficiente va a depender que estas buscando de tu codigo.
Usar un switch..case creo que seria complicarse la vida.Y no tendrias una mejora en ningun sentido.
Tal ves lo que buscas vos es "resumir" un poco el programa. Y pienso que lo podrías hacer con un for y un array, y tambien aprovechando que las salidas estan todas seguidas ( A0 a A4).. Ejemplo:Código: C
int8 canales[] = {13,11,9,8,10}; void main() { // aca la configuracion del ADC como lo tenes while(1) { int8 i, valores; valores = 0; for( i=0; i< sizeof canales ; i++) { valores <<= 1; // Roto a la izquierda un lugar if ( adc(canales[i]) >= 255 ) valores |= 1; // Si esta en 1, le hago una OR al bit0, asi pongo en 1 ese bit. } output_a(valores); delay_ms(100); } }
Aclaremos un par de puntos:
- Yo resumi tu programa, hace casi lo mismo que el tuyo.
- Cuando tocas no dispara el ADC, vos lees el ADC para determinar si es que hay un toque.
- La forma de implementar la nota de aplicacion me parece incorrecta.
- El sensor es importante.
La nota de aplicacion especifica:
Necesitas un canal analogico que lo unico que va a servir es para referenciarlo a VDD (Si es que no posee VDD como referencia). Mas los canales de los sensores. Ese canal va a estar a VDD siempre.
Y los pasos a seguir son:
- Pongo todos los canales como salida y en 0. Excepto el que me da referencia de VDD. Esto es para que el capacitor que es el sensor este descargado.
- Selecciono el canal ( sin leer) que posee VDD y espero que se cargue el capacitor de S/H ( cambiar de canal y un pequeño delay )
- Procedo a poner como entrada el canal que deseo leer y cambio de canal.
- Inicio la conversion
- Vas a tener un valor en "alto", queriendo decir que no se detecto nada. Y un valor "bajo" que significa que se detecto algo.
Los valores que obtenes tocando o no, vas a tener que observarlo y definir cual es el limite que conviene para que sea fiable la deteccion del toque.
Por que va a depender de la capacidad del sensor tambien, no podes pensar que si o si el valor quede perfecto en VDD.
1 - Pongo todos los canales como salida y en 0. Excepto el que me da referencia de VDD. Esto es para que el capacitor que es el sensor este descargado.
2 - Selecciono el canal ( sin leer) que posee VDD y espero que se cargue el capacitor de S/H ( cambiar de canal y un pequeño delay )
3 - Procedo a poner como entrada el canal que deseo leer y cambio de canal.
4 - Inicio la conversion
5 - Vas a tener un valor en "alto", queriendo decir que no se detecto nada. Y un valor "bajo" que significa que se detecto algo.
Si lees los pasos que te doy (que es lo que copie del AN) vas a ver que es casi lo mismo, lo voy a copiar y numerar, para que veas la similitud:Citar1 - Pongo todos los canales como salida y en 0. Excepto el que me da referencia de VDD. Esto es para que el capacitor que es el sensor este descargado.
2 - Selecciono el canal ( sin leer) que posee VDD y espero que se cargue el capacitor de S/H ( cambiar de canal y un pequeño delay )
3 - Procedo a poner como entrada el canal que deseo leer y cambio de canal.
4 - Inicio la conversion
5 - Vas a tener un valor en "alto", queriendo decir que no se detecto nada. Y un valor "bajo" que significa que se detecto algo.Código: C
set_tris_a(0b11111100); // Paso 1, pongo la entradas de los sensores a leer como salida. Observa que el canal 1 (A1) es quien esta en VDD y A0 el que quiero leer. output_high(PIN_A1); // Ya lo puse como salida, le pongo un nivel alto o VDD set_adc_channel(1); //Paso 2, selecciono el canal que posee VDD output_low(PIN_A0); // Esto es parte del paso 1, ya que ademas de ponerlo como salida, exigue que se ponga a GND el sensor de interes. set_tris_a(0b11111101); // Paso 3, pongo como entrada el sensor que quiero leer. Y selecciono el canal que quiero leer set_adc_channel(0); // value=read_adc(); // Paso 4, inicio la conversion
pues solo esta usando todo el puerto a y los analogicos que se encuentran ahi para hacer el sensor capacitivo, pero y si quiero sensores en otros puertos, como le tendria que hacer?.