unsigned char Read_Key_Press(void) { measure_count(); // Measure all sensors delta_cnt = meas_cnt - base_cnt; // Calculate delta: c_change // Handle baseline measurment for a base C decrease if (delta_cnt < 0) // If negative: result decreased { // below baseline, i.e. cap decreased base_cnt = (base_cnt+meas_cnt) >> 1; // Re-average baseline down quickly delta_cnt = 0; // Zero out delta for position determination }
void Baseline_Capacitance_Initial(void) { unsigned char i; measure_count(); // Establish an initial baseline capacitance base_cnt = meas_cnt; for(i=15; i>0; i--) // Repeat and average base measurement { base_cnt= (meas_cnt+base_cnt)/2; } }
void CapTouch(void) { unsigned char m = KEY_LVL; key_pressed = 0; // Assume no keys are pressed measure_count(); // Measure sensor { delta_cnt = base_cnt - meas_cnt; // Calculate delta: c_change /* Handle baseline measurment for a base C decrease*/ if (delta_cnt < 0) // If negative: result increased { // beyond baseline, i.e. cap dec base_cnt = (base_cnt+meas_cnt) >> 1; // Re-average quickly delta_cnt = 0; // Zero out for pos determination } if (delta_cnt > m) // Determine if each key is pressed { // per a preset threshold m = delta_cnt; key_pressed = 1; // key pressed } else key_pressed = 0; }
void main(void) { /******************************************************************************/ // Init /******************************************************************************/ WDTCTL = WDTPW + WDTHOLD; // watchdog timer off configureClocks(); init_PWM_TimerA(); hour = 6; hour24 = 6; minute = 1; // Set to one because with 0 no LED is on which is confusing. second = 0; state = SET_HOUR; capsense=0; LEDState=OFF; timer=0; DEMOPointer = 1; P1REN = BIT6 + BIT7; // P1REN = pullup/down enable P1OUT = BIT6 + BIT7; // P1OUT = define pullup P1IFG = 0; P1IES = BIT6 + BIT7; // set high to low transition for P1.6&7 interrupt P1IE = BIT6 + BIT7; // enable P1.6&7 interrupt P1REN |= BIT4 + BIT5; // P1REN = pullup/down enable P1OUT |= BIT4 + BIT5; // P1OUT = pullup P2REN |= BIT0; // P2REN = pullup/down enable P2OUT |= BIT0; // P2OUT = pullup P2OUT |= BIT3; P2DIR |= BIT3; P3REN = 0xFF; // Tie all P3 ports which are not available on N package P3OUT = 0xFF; WDTCTL = WDTPW + WDTTMSEL + WDTCNTCL + WDTSSEL; // watchdog counter mode, ACLK, /32768 IFG1 &= ~WDTIFG; // Clear WDT interrupt flag IE1 |= WDTIE; // WDT interrupt enable measure_count(); // Establish baseline capacitance base_cnt = meas_cnt; for(i=15; i>0; i--) // Repeat and avg base measurement { measure_count(); base_cnt = (meas_cnt+base_cnt)/2; } /******************************************************************************/ // Mainloop /******************************************************************************/ __enable_interrupt(); while(1) { switch(state) { case NORMAL: if (capsense) { CapTouch(); } if (LEDState==ON) { HourView(); } if (LEDState==ON && ((hour24>=7) && (hour24<18))) { MoonOff(); SunOn(); } if (LEDState==ON && ((hour24>=18) || (hour24<7))) { SunOff(); MoonOn(); } break; case SET_HOUR: capsense=OFF; MoonOff(); SunOff(); HourView(); break; case SET_MINUTE: capsense=OFF; MoonOff(); SunOff(); MinuteView(); break; case DEMO: if (DEMOPointer==1) { MoonOn(); SunOff(); } if (DEMOPointer==7) { MoonOff(); SunOn(); } j = 5000/DEMOPointer; for(i=0;i<j;i++) { unsigned int OnTime = 10*DEMOPointer; unsigned int OffTime = 120/DEMOPointer; for(LEDPointer = 1;LEDPointer <= DEMOPointer;LEDPointer++) { LEDOn(); delay(OnTime); LEDOff(); delay(OffTime); } } DEMOPointer++; if (DEMOPointer==13) { DEMOPointer=1; } break; } } } // main()
/* Main Function*/ int main(void) { unsigned int i,j; WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer if (CALBC1_1MHZ==0xFF) // If calibration constant erased { while(1); // do not load, trap CPU!! } if (CALBC1_8MHZ==0xFF) // If calibration constant erased { while(1); // do not load, trap CPU!! } DCOCTL = 0; // Select lowest DCOx and MODx settings BCSCTL1 = CALBC1_1MHZ; // Set DCO to 1MHz DCOCTL = CALDCO_1MHZ; BCSCTL3 |= LFXT1S_2; // LFXT1 = VLO IE1 |= WDTIE; // enable WDT interrupt P2SEL = 0x00; // No XTAL __bis_SR_register(GIE); // Enable interrupts measure_count(); // Establish baseline capacitance for (i = 0; i<NUM_SEN; i++) base_cnt[i] = meas_cnt[i]; for(i=15; i>0; i--) // Repeat and avg base measurement { measure_count(); for (j = 0; j<NUM_SEN; j++) base_cnt[j] = (meas_cnt[j]+base_cnt[j])/2; } /* Main loop starts here*/ while (1) { j = KEY_LVL; measure_count(); // Measure all sensors for (i = 0; i<NUM_SEN; i++) { /* Handle baseline measurment for a base C decrease*/ if (base_cnt[i] < meas_cnt[i]) // If negative: result increased { // beyond baseline, cap decreased base_cnt[i] = (base_cnt[i]+meas_cnt[i]) >> 1; // Re-average up quickly delta_cnt[i] = 0; // Zero out for position determination } else { delta_cnt[i] = base_cnt[i] - meas_cnt[i]; // Calculate delta: c_change } if (delta_cnt[i] > j) // Determine if each key is pressed { // per a preset threshold key_press[i] = 1; // Specific key pressed j = delta_cnt[i]; key_pressed = i+1; // key pressed } else key_press[i] = 0; }
/* Main Function*/ int main(void) { unsigned int i,j; WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer if (CALBC1_1MHZ==0xFF) // If calibration constant erased { while(1); // do not load, trap CPU!! } DCOCTL = 0; // Select lowest DCOx and MODx settings BCSCTL1 = CALBC1_1MHZ; // Set DCO to 1MHz DCOCTL = CALDCO_1MHZ; BCSCTL3 |= LFXT1S_2; // LFXT1 = VLO IE1 |= WDTIE; // enable WDT interrupt P2SEL = 0x00; // No XTAL P1DIR = LED_1 + LED_2; // P1.0 & P1.6 = LEDs P1OUT = 0x00; __bis_SR_register(GIE); // Enable interrupts measure_count(); // Establish baseline capacitance for (i = 0; i<NUM_SEN; i++) base_cnt[i] = meas_cnt[i]; for(i=15; i>0; i--) // Repeat and avg base measurement { measure_count(); for (j = 0; j<NUM_SEN; j++) base_cnt[j] = (meas_cnt[j]+base_cnt[j])/2; } /* Main loop starts here*/ while (1) { j = KEY_LVL; key_pressed = 0; // Assume no keys are pressed measure_count(); // Measure all sensors for (i = 0; i<NUM_SEN; i++) { delta_cnt[i] = base_cnt[i] - meas_cnt[i]; // Calculate delta: c_change /* Handle baseline measurment for a base C decrease*/ if (delta_cnt[i] < 0) // If negative: result increased { // beyond baseline, i.e. cap dec base_cnt[i] = (base_cnt[i]+meas_cnt[i]) >> 1; // Re-average quickly delta_cnt[i] = 0; // Zero out for pos determination } if (delta_cnt[i] > j) // Determine if each key is pressed { // per a preset threshold key_press[i] = 1; // Specific key pressed j = delta_cnt[i]; key_pressed = i+1; // key pressed } else key_press[i] = 0; } /* Delay to next sample, sample more slowly if no keys are pressed*/ if (key_pressed) { BCSCTL1 = (BCSCTL1 & 0x0CF) + DIVA_0; // ACLK/(0:1,1:2,2:4,3:8) cycles = 20; } else { cycles--; if (cycles > 0) BCSCTL1 = (BCSCTL1 & 0x0CF) + DIVA_0; // ACLK/(0:1,1:2,2:4,3:8) else { BCSCTL1 = (BCSCTL1 & 0x0CF) + DIVA_3; // ACLK/(0:1,1:2,2:4,3:8) cycles = 0; } } WDTCTL = WDT_delay_setting; // WDT, ACLK, interval timer /* Handle baseline measurment for a base C increase*/ if (!key_pressed) // Only adjust baseline down { // if no keys are touched for (i = 0; i<NUM_SEN; i++) base_cnt[i] = base_cnt[i] - 1; // Adjust baseline down, should be } // slow to accomodate for genuine pulse_LED(); // changes in sensor C __bis_SR_register(LPM3_bits); }