/** * @brief Attach an interrupt handler to be triggered on a given * transition on the pin. Runs in interrupt context * * @param[in] pin Maple pin number * @param[in] handler Function to run upon external interrupt trigger. * @param[in] mode Type of transition to trigger on, eg falling, rising, etc. * * @sideeffect Registers a handler */ int attachInterrupt(uint8 pin, voidFuncPtr handler, uint32 mode) { uint8 outMode; /* Parameter checking */ if (pin >= NR_GPIO_PINS) { return EXT_INTERRUPT_INVALID_PIN; } if (!handler) { ASSERT(0); return EXT_INTERRUPT_INVALID_FUNCTION; } switch (mode) { case RISING: outMode = EXTI_RISING; break; case FALLING: outMode = EXTI_FALLING; break; case CHANGE: outMode = EXTI_RISING_FALLING; break; default: ASSERT(0); return EXT_INTERRUPT_INVALID_MODE;; } exti_attach_interrupt(PIN_TO_EXTI_CHANNEL[pin].channel, PIN_TO_EXTI_CHANNEL[pin].port, handler, mode); return 0; }
/* Attach ISR handler on pin, triggering on the given mode. */ void attachInterrupt(uint8 pin, voidFuncPtr handler, ExtIntTriggerMode mode) { uint8 outMode; /* Parameter checking */ if (pin >= NR_GPIO_PINS) { return; } if (!handler) { return; } switch (mode) { case RISING: outMode = EXTI_RISING; break; case FALLING: outMode = EXTI_FALLING; break; case CHANGE: outMode = EXTI_RISING_FALLING; break; default: ASSERT(0); return; } exti_attach_interrupt(PIN_MAP[pin].exti_port, PIN_MAP[pin].pin, handler, mode); return; }
void attachInterrupt(uint8 pin, voidFuncPtr handler, ExtIntTriggerMode mode) { if (pin >= BOARD_NR_GPIO_PINS || !handler) { return; } exti_trigger_mode outMode = exti_out_mode(mode); exti_attach_interrupt((exti_num) (PIN_MAP[pin].gpio_bit), gpio_exti_port(PIN_MAP[pin].gpio_device), handler, outMode); }
// setup() and loop(): void setup(void) { storage_start(); storage_add(16, "SOME LOCATION"); storage_add(16, "ANOTHER LOCATION"); //bluetooth_start(); communication_start(); gpio_set_mode(GPIOB, 8, GPIO_INPUT_PD); exti_attach_interrupt(AFIO_EXTI_8, AFIO_EXTI_PB, transmit_interrupt, EXTI_RISING); //Onboard LED gpio_set_mode(GPIOB, 1, GPIO_OUTPUT_PP); gpio_write_bit(GPIOB, 1, 1); }
void receiverA_start(void){ gpio_set_mode(RECEIVER_A_PORT, RECEIVER_A_PIN, GPIO_INPUT_PU); exti_attach_interrupt(RECEIVER_A_EXTI_LINE, RECEIVER_A_EXTI_PORT, receiverA_handler, EXTI_FALLING); }
void receiverA_enableInterrupt(void){ exti_attach_interrupt(RECEIVER_A_EXTI_LINE, RECEIVER_A_EXTI_PORT, receiverA_handler, EXTI_FALLING); }
void cap_init(void) { // 63 2 4 1 63 2 4 1 0 8 4 cap_set_mhd_r(63); cap_set_nhd_r(2); cap_set_ncl_r(4); cap_set_fdl_r(1); cap_set_mhd_f(63); cap_set_nhd_f(2); cap_set_ncl_r(4); cap_set_fdl_f(1); cap_set_dbr(0); cap_set_touch_threshold(8); cap_set_release_threshold(4); /** gpio_set_mode(PIN_MAP[BOARD_I2C_SDA].gpio_device, PIN_MAP[BOARD_I2C_SDA].gpio_bit, GPIO_OUTPUT_PP); gpio_set_mode(PIN_MAP[BOARD_I2C_SCL].gpio_device, PIN_MAP[BOARD_I2C_SCL].gpio_bit, GPIO_OUTPUT_PP); gpio_write_bit(PIN_MAP[BOARD_I2C_SDA].gpio_device, PIN_MAP[BOARD_I2C_SDA].gpio_bit, 1); gpio_write_bit(PIN_MAP[BOARD_I2C_SCL].gpio_device, PIN_MAP[BOARD_I2C_SCL].gpio_bit, 1); delay_us(1000); gpio_set_mode(PIN_MAP[BOARD_I2C_SDA].gpio_device, PIN_MAP[BOARD_I2C_SDA].gpio_bit, GPIO_INPUT_PD); // Can also be floating, but PD is safer if components misplaced. gpio_set_mode(PIN_MAP[BOARD_I2C_SCL].gpio_device, PIN_MAP[BOARD_I2C_SCL].gpio_bit, GPIO_INPUT_PD); */ i2c = CAPTOUCH_I2C; i2c_init(i2c); i2c_master_enable(i2c, I2C_BUS_RESET); mpr121Write(0x80, 0x63); // soft reset delay_us(1000); mpr121Write(ELE_CFG, 0x00); // disable electrodes for config delay_us(100); // Section A and B - R (rise) F (fall) T (touch) mpr121Write(MHD_R, cap_mhd_r); // (1 to 63) mpr121Write(NHD_R, cap_nhd_r); // (1 to 63) mpr121Write(NCL_R, cap_ncl_r); // (0 to 255) mpr121Write(FDL_R, cap_fdl_r); // (0 to 255) mpr121Write(MHD_F, cap_mhd_f); // (1 to 63) largest value to pass through filer mpr121Write(NHD_F, cap_nhd_f); // (1 to 63) maximum change allowed mpr121Write(NCL_F, cap_ncl_f); // (0 to 255) number of samples required to determine non-noise mpr121Write(FDL_F, cap_fdl_f); // (0 to 255) rate of filter operation, larger = slower. // Section D // Set the Filter Configuration // Set ESI2 // was 0x01, 0x25 mpr121Write(AFE_CONF, 0x01); //AFE_CONF 0x5C mpr121Write(FIL_CFG, 0x04); //FIL_CFG 0x5D // Section F mpr121Write(ATO_CFG0, 0x0B); // ATO_CFG0 0x7B // limits // was0xFF,0x00,0x0E mpr121Write(ATO_CFGU, 0x9C); // ATO_CFGU 0x7D mpr121Write(ATO_CFGL, 0x65); // ATO_CFGL 0x7E mpr121Write(ATO_CFGT, 0x8C); // ATO_CFGT 0x7F // enable debouncing mpr121Write(DBR, cap_dbr); // set debouncing, in this case 7 for both touch and release. // Section C // This group sets touch and release thresholds for each electrode mpr121Write(ELE0_T, cap_touch_threshold); mpr121Write(ELE0_R, cap_release_threshold); mpr121Write(ELE1_T, cap_touch_threshold); mpr121Write(ELE1_R, cap_release_threshold); mpr121Write(ELE2_T, cap_touch_threshold); mpr121Write(ELE2_R, cap_release_threshold); mpr121Write(ELE3_T, cap_touch_threshold); mpr121Write(ELE3_R, cap_release_threshold); mpr121Write(ELE4_T, cap_touch_threshold); mpr121Write(ELE4_R, cap_release_threshold); mpr121Write(ELE5_T, cap_touch_threshold); mpr121Write(ELE5_R, cap_release_threshold); mpr121Write(ELE6_T, cap_touch_threshold); mpr121Write(ELE6_R, cap_release_threshold); mpr121Write(ELE7_T, cap_touch_threshold); mpr121Write(ELE7_R, cap_release_threshold); mpr121Write(ELE8_T, cap_touch_threshold); mpr121Write(ELE8_R, cap_release_threshold); mpr121Write(ELE9_T, cap_touch_threshold); mpr121Write(ELE9_R, cap_release_threshold); mpr121Write(ELE10_T, cap_touch_threshold); mpr121Write(ELE10_R, cap_release_threshold); mpr121Write(ELE11_T, cap_touch_threshold); mpr121Write(ELE11_R, cap_release_threshold); delay_us(100); // Section E // Electrode Configuration // Enable 6 Electrodes and set to run mode // Set ELE_CFG to 0x00 to return to standby mode mpr121Write(ELE_CFG, 0x0C); // Enables all 12 Electrodes delay_us(100); // This can also be FLOATING, but PU is safer if components misplaced. gpio_set_mode(PIN_MAP[CAPTOUCH_GPIO].gpio_device, PIN_MAP[CAPTOUCH_GPIO].gpio_bit, GPIO_INPUT_PU); exti_attach_interrupt((afio_exti_num) (PIN_MAP[CAPTOUCH_GPIO].gpio_bit), gpio_exti_port(PIN_MAP[CAPTOUCH_GPIO].gpio_device), cap_change, EXTI_FALLING); // Clears the first interrupt uint32_t ts = realtime_get_unixtime(); for (int n = 0; n < 16; n++) press_time[n] = ts; for (int n = 0; n < 16; n++) release_time[n] = ts; press_time_any = ts; release_time_any = ts; // Set the cap_enabled flag to remember the captouch is on cap_enabled = 1; return; }