#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!!
}