Pues como dice el enunciado, he estado trabajando en este codigo para poder usar varios pulsadores con el uso de solo 2 pines y que la deteccion se realizara por interrupciom, para ello uso un canal del comparador analogico y uno del adc y diversos divisores de tension.
Para que la deteccion se haga por interrupcion el grueso del programa se realiza en la rutina del comparador; el comparador se configura con la tension de referencia maxima de forma que cualquier divisor de tension este por debajo y active el comparador. El esquema seria:
Vcc---R--Al adc y comparador del pic---Pulsador1---R1----Tierra
\-Pulsador2---R2----Tierra
-----
\-Pulsadorn---Rn----Tierra
De esta forma segun el pulsador activado la tension en la entrada del pic sera distinta. Para que el funcionamiento sea adecuado creo que lo importante es tomar los valores de las resistencia de forma que disten bastante los valores del adc; y en la toma de decisiones, ya que el valor del adc no sera siempre exacto, hacerlo a traves de if(adc>x)...else if(adc>x2)...else if()....else de forma escalonada de mayor valor del adc a menor. Al no trabajar con un solo valor del adc no da problemas por pequeñas fluctuaciones.
Mi idea es usarlo en un mando, por eso uso una usart viartual solo para transferir. En este caso con los 8 pines del 12f683 hubiera tenido los pines justos, de esta forma me quedan 3 libres para poder usarlos en otra cosa si se me ocurre; y solo se necesita una resistencia mas ya que para cada pulsador hay que usar de todas formas una resistencia. Pero creo que para diseños de otro tipo donde los pines sean cruciales y siempre que el micro disponga de adc y comparador puede servirle a alguien.
En mi caso la resistencia R es de 1kohm y las restantes : 1'8kohm,1kohm,330ohm,100ohm y 0ohm.
#include <12f683.h>
#device ADC=8
#fuses INTRC_IO,NOWDT, PUT, NOBROWNOUT, NOCPD,NOMCLR, NOPROTECT
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_A2)
/*El programa detecta el accionamiento de disntintos pulsadores, para ello se
conectaran a la entrada del adc distintos divisores de tension cada uno
correspondiente a un pulsador.
La ejecucion del programa se realiza mediante interrupciones, para ello se diseña
los divisores de tension de forma que todos sean inferiores a la tension de
referencia maxima del comparador (High range y 15 = 0'71875 Vdd).En la rutina del
comparador se toma valor adc y se envia por uart.
*/
//El envio se realiza en hexadecimal
//Constasntes toma decision
const int modo = 0xFA;//00001001 reposo
const int adelante = 0xA5;//00101011 recto
const int atras = 0xAA;//00011101 atras los dos
const int derecha = 0xA6;//00011011 derecha
const int izquierda = 0xA9;//00101101 izquierda
//Vatiables
int valor;
int orden;
//Rutina comparador, lee valor
#INT_COMP
void compara(){
delay_ms(20);
if (C1out){
valor = read_adc(ADC_START_AND_READ);
delay_us(50);
//Toma decisiones para envio usart
if(valor>160){
orden=atras;
}
else if(valor>124){
orden=derecha;
}
else if(valor>61){
orden=izquierda;
}
else if(valor>21){
orden=adelante;
}
else{
orden=modo;
}
printf("%X",orden
);// %x envie en hexadecimal }
}
void main()
{
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
//Arranca el oscilador
setup_oscillator(OSC_4MHZ|OSC_INTRC);
setup_comparator(A1_VR);//Entrada en a1 y Vreferencia interna
setup_vref(VREF_HIGH|15); //Vref rango alto y 15 en VR3-0 = >0'70 Vdd
//ADC
setup_adc_ports(sAN0); //Entrada an0/gpio0
setup_adc(ADC_CLOCK_DIV_64||VSS_VDD);//Reloj y referencias
//Interrupciones
enable_interrupts(INT_COMP);
enable_interrupts(GLOBAL); //todas las interrupciones desactivadas
//Programa
do{
}while(TRUE); //bucle infinito
// TODO: USER CODE!!
}
Despues de acabarlo, creo que el unico problema es que pasaria si accionamos mas de un pulsador a la vez, lo he probado bastante y no me da ningun fallo.
Al principio pense que tendria que complementar el comparador pero no es necesario, no se si me lie en esa parte.
Espero que le pueda servir a alguien y si me equivoque en algo poder comentarlo con vosotros