00001
00083
00084 #include <avr32/io.h>
00085 #include "compiler.h"
00086 #include "board.h"
00087 #include "pm.h"
00088 #include "gpio.h"
00089 #include "eic.h"
00090 #include "qt1081.h"
00091
00092 #define INT_MODE_EIC 0
00093 #define INT_MODE_GPIO 1
00094
00095
00096 #define INT_MODE INT_MODE_EIC
00097
00098 #if __GNUC__
00099 #include "intc.h"
00100 #endif
00101
00102 #define is_touch_up() is_touch_sensor_0()
00103 #define is_touch_down() is_touch_sensor_1()
00104 #define is_touch_right() is_touch_sensor_2()
00105 #define is_touch_left() is_touch_sensor_3()
00106 #define is_touch_center() is_touch_sensor_4()
00107
00109 eic_options_t eic_options[2];
00110
00111 #if __GNUC__
00112 __attribute__ ((__interrupt__))
00113 #elif __ICCAVR32__
00114 #pragma handler = EXTINT_GROUP, 1
00115 __interrupt
00116 #endif
00117 #if(INT_MODE == INT_MODE_GPIO)
00118 void touch_button_isr(void){
00119
00120 if(gpio_get_pin_interrupt_flag(QT1081_TOUCH_SENSOR_0))
00121 {
00122 gpio_clear_pin_interrupt_flag(QT1081_TOUCH_SENSOR_0);
00123 gpio_tgl_gpio_pin(LED0_GPIO);
00124 }
00125
00126 if(gpio_get_pin_interrupt_flag(QT1081_TOUCH_SENSOR_1))
00127 {
00128 gpio_clear_pin_interrupt_flag(QT1081_TOUCH_SENSOR_1);
00129 gpio_tgl_gpio_pin(LED1_GPIO);
00130 }
00131
00132 if(gpio_get_pin_interrupt_flag(QT1081_TOUCH_SENSOR_2))
00133 {
00134 gpio_clear_pin_interrupt_flag(QT1081_TOUCH_SENSOR_2);
00135 gpio_tgl_gpio_pin(LED2_GPIO);
00136 }
00137
00138 if(gpio_get_pin_interrupt_flag(QT1081_TOUCH_SENSOR_3))
00139 {
00140 gpio_clear_pin_interrupt_flag(QT1081_TOUCH_SENSOR_3);
00141 gpio_tgl_gpio_pin(LED3_GPIO);
00142 }
00143
00144 if(gpio_get_pin_interrupt_flag(QT1081_TOUCH_SENSOR_4))
00145 {
00146 gpio_clear_pin_interrupt_flag(QT1081_TOUCH_SENSOR_4);
00147 gpio_tgl_gpio_pin(LED0_GPIO);
00148 }
00149
00150 }
00151 #endif
00152 #if( INT_MODE == INT_MODE_EIC)
00153 void touch_button_isr(void){
00154
00155 if(is_touch_up()){
00156 gpio_tgl_gpio_pin(LED0_GPIO);
00157 }
00158 if(is_touch_down()){
00159 gpio_tgl_gpio_pin(LED1_GPIO);
00160 }
00161 if(is_touch_right()){
00162 gpio_tgl_gpio_pin(LED1_GPIO);
00163 }
00164 if(is_touch_left()){
00165 gpio_tgl_gpio_pin(LED2_GPIO);
00166 }
00167 if(is_touch_center()){
00168 gpio_tgl_gpio_pin(LED2_GPIO);
00169 }
00170
00171 eic_clear_interrupt_line(&AVR32_EIC, QT1081_EIC_EXTINT_INT);
00172 }
00173 #endif
00174
00175
00176 int main(void) {
00177
00178 pm_switch_to_osc0(&AVR32_PM, FOSC0, OSC0_STARTUP);
00179
00180
00181 eic_options[0].eic_mode = EIC_MODE_EDGE_TRIGGERED;
00182
00183
00184 eic_options[0].eic_edge = EIC_EDGE_RISING_EDGE;
00185
00186 eic_options[0].eic_async = EIC_SYNCH_MODE;
00187
00188 eic_options[0].eic_line = QT1081_EIC_EXTINT_INT;
00189
00190
00191 gpio_set_gpio_pin(LED0_GPIO);
00192 gpio_set_gpio_pin(LED1_GPIO);
00193 gpio_set_gpio_pin(LED2_GPIO);
00194 gpio_set_gpio_pin(LED3_GPIO);
00195
00196 gpio_enable_module_pin( QT1081_EIC_EXTINT_PIN, QT1081_EIC_EXTINT_FUNCTION);
00197
00198 #if( INT_MODE == INT_MODE_GPIO)
00199 Disable_global_interrupt();
00200
00201 #if __GNUC__
00202 INTC_init_interrupts();
00203
00204
00205
00206 INTC_register_interrupt(&touch_button_isr, AVR32_GPIO_IRQ_6, 0);
00207
00208 INTC_register_interrupt(&touch_button_isr, AVR32_GPIO_IRQ_7, 0);
00209 #endif
00210 gpio_enable_pin_interrupt(QT1081_TOUCH_SENSOR_0, GPIO_RISING_EDGE);
00211 gpio_enable_pin_interrupt(QT1081_TOUCH_SENSOR_1, GPIO_RISING_EDGE);
00212 gpio_enable_pin_interrupt(QT1081_TOUCH_SENSOR_2, GPIO_RISING_EDGE);
00213 gpio_enable_pin_interrupt(QT1081_TOUCH_SENSOR_3, GPIO_RISING_EDGE);
00214 gpio_enable_pin_interrupt(QT1081_TOUCH_SENSOR_4, GPIO_RISING_EDGE);
00215
00216 Enable_global_interrupt();
00217 #endif
00218
00219 #if(INT_MODE == INT_MODE_EIC)
00220 Disable_global_interrupt();
00221
00222 #if __GNUC__
00223 INTC_init_interrupts();
00224
00225
00226 INTC_register_interrupt(&touch_button_isr, QT1081_EIC_EXTINT_IRQ, AVR32_INTC_INT0);
00227 #endif
00228
00229
00230 eic_init(&AVR32_EIC, eic_options, 1);
00231
00232 eic_enable_lines(&AVR32_EIC, (1<<eic_options[0].eic_line));
00233
00234 eic_enable_interrupt_lines(&AVR32_EIC, (1<<eic_options[0].eic_line));
00235
00236 Enable_global_interrupt();
00237 #endif
00238
00239 while(TRUE);
00240
00241 return 0;
00242 }