#include #include "a2d.h" #include "buttons.h" #include "AwesomeLIB.h" #include "lcd.h" void a2d_init(void) { trisa |= 0xFF; // set portA to inputs adcon1 = 0x0b; // A0 - A3 analog, rest digital, 0b00001011 adcon2 = 0x22; // TAD is 32*Tosc 1.6usec with TAQ = 2 TAD, 0b00100010 adcon0.0 = 1; // enable a2d return; } void a2d_calibrate(void) { char switches = check_switches(); if (switches == 3) { lcd_clear(); lcd_printf("Calibrating"); lcd_cmd(0x56); delay_ms(1); lcd_cmd(0x56); delay_ms(1); a2d_find_neutral(); while (switches == 3) { a2d_find_boundary(); set_led(0b1111111111); display_led(); switches = check_switches(); } } } char a2d_convert(char channel) { if (channel==0){ // set channel adcon0.5 = 0; adcon0.4 = 0; adcon0.3 = 0; adcon0.2 = 0;} else if (channel==1){ adcon0.5 = 0; adcon0.4 = 0; adcon0.3 = 0; adcon0.2 = 1;} else if (channel==2){ adcon0.5 = 0; adcon0.4 = 0; adcon0.3 = 1; adcon0.2 = 0;} else if (channel==3){ adcon0.5 = 0; adcon0.4 = 0; adcon0.3 = 1; adcon0.2 = 1;} char result; adcon0.1 = 1; // start conversion while(adcon0.1); // wait to finish result = adresh; return result; // return value (8 bits from high register) } void a2d_find_neutral(void) { char i; for(i = 0; i < 4; ++i) // step through each potentiometer { neutral[i] = a2d_convert(i); // set neutral } return; } void a2d_find_boundary(void) { char i; signed char test; for(i = 0; i < 4; ++i) // step through each potentiometer { test = a2d_convert(i); if(test > max[i]) // compare result to maximum { max[i] = test; // set new maximum limit } if(test < min[i]) // compare result to minimum { min[i] = test; // set new minimum limit } } return; } void a2d_convert_all(void) { char i; for(i = 0; i < 4; ++i) // step through each potentiometer raw[i] = a2d_convert(i); // obtain raw a2d value return; } void a2d_scale_all(char jvalue[]) { char i; for(i = 0; i < 4; ++i) //++i // step through each potentiometer { if(raw[i] < neutral[i]) // see if less than neutral { jvalue[i] = ((raw[i]-min[i])*100 / (neutral[i]-min[i])) - 100; if(jvalue[i] < -100) // make sure scaled value is within boundaries jvalue[i] = -100; } else if(raw[i] > neutral[i]) // see if greater than neutral { jvalue[i] = (raw[i]-neutral[i])*100 / (max[i]-neutral[i]); if(jvalue[i] > 100) // make sure scaled value is within boundaries jvalue[i] = 100; } else jvalue[i] = 0; // if raw[i] = limits[i][1], it's at neutral position } return; }