示例#1
0
/**
 *  @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;
}
示例#2
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;
}
示例#3
0
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);
}
示例#7
0
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;
}