//! [acc_irq_handler_start] void ACC_Handler(void) { //! [acc_irq_handler_start] //! [acc_irq_handler_status] uint32_t ul_status; ul_status = acc_get_interrupt_status(ACC); /** Compare Output Interrupt */ if ((ul_status & ACC_ISR_CE) == ACC_ISR_CE) { //! [acc_irq_handler_status] //! [acc_irq_handler_result_1] if (acc_get_comparison_result(ACC)) { //! [acc_irq_handler_result_1] puts("-ISR- Voltage Comparison Result: AD5 > DAC0\r"); //! [acc_irq_handler_result_2] } else { //! [acc_irq_handler_result_2] puts("-ISR- Voltage Comparison Result: AD5 < DAC0\r"); //! [acc_irq_handler_result_3] } //! [acc_irq_handler_result_3] //! [acc_irq_handler_result_end] } //! [acc_irq_handler_result_end] //! [acc_irq_handler_end] }
/** * \brief Initialize re200b sensor in order to detect motion * \param ul_acc_minus ACC minus input, use ACC peripheral definition in header. * \param ul_acc_plus ACC plus input, use ACC peripheral definition in header. */ void re200b_motion_detect_init(uint32_t ul_acc_minus, uint32_t ul_acc_plus) { pmc_enable_periph_clk(ID_ACC); /* Initialize ACC */ acc_init(ACC, ul_acc_plus, ul_acc_minus, ACC_MR_EDGETYP_ANY, ACC_MR_INV_DIS); /* clear status */ acc_get_interrupt_status(ACC); /* reset event flags */ g_compare_result = CMP_EQUAL; g_ul_compare_event_flag = false; }
/** * Interrupt handler for the ACC. */ void ACC_Handler(void) { uint32_t ul_status; ul_status = acc_get_interrupt_status(ACC); /* Compare Output Interrupt */ if ((ul_status & ACC_ISR_CE) == ACC_ISR_CE) { if (acc_get_comparison_result(ACC)) { puts("-ISR- Voltage Comparison Result: AD0 > DAC0\r"); } else { puts("-ISR- Voltage Comparison Result: AD0 < DAC0\r"); } } }
/** * \brief re200b_motion_detect_handler which allow to know comparison result * (CMP_GREATER or CMP_LESS) */ void re200b_motion_detect_handler(void) { uint32_t ul_status; ul_status = acc_get_interrupt_status(ACC); /* Compare Output Interrupt */ if ((ul_status & ACC_IER_CE) == ACC_IER_CE) { g_ul_compare_event_flag = true; if (acc_get_comparison_result(ACC)) { g_compare_result = CMP_GREATER; } else { g_compare_result = CMP_LESS; } } }
/** * \brief Application entry point for smc_lcd example. * * \return Unused (ANSI-C compatibility). */ int main(void) { uint32_t i = 0; uint8_t uc_string_display[30]; sysclk_init(); board_init(); /* LCD display initialization */ _display_init(); /* Clear LCD */ ili9325_fill(COLOR_WHITE); /* Initialize Pir sensor */ re200b_motion_detect_init(ACC_MR_SELMINUS_AD0, ACC_MR_SELPLUS_AD4); while (1) { /* Reset motion detection (enable interrupt, clear variable, * clear status register) */ re200b_motion_detect_enable(); re200b_motion_detect_reset(); acc_get_interrupt_status(ACC); /* Enter sleep mode */ pmc_enable_sleepmode(0); /* Check if a motion was detected */ if (re200b_motion_detection() != 0UL) { /* Disable motion detection */ re200b_motion_detect_disable(); /* Display information about motion detection on LCD */ if ((i*LCD_LINE_HEIGHT) >= BOARD_LCD_HEIGHT) { i = 0; ili9325_fill(COLOR_WHITE); } sprintf((char*)uc_string_display, "Motion Detected:%ul", i); ili9325_draw_string(0, i*LCD_LINE_HEIGHT, uc_string_display); i++; } } }