00001
00079 #include <avr32/io.h>
00080 #include "intc.h"
00081 #include "board.h"
00082 #include "compiler.h"
00083 #include "qdec.h"
00084 #include "gpio.h"
00085 #include "power_clocks_lib.h"
00086
00087 #define FCPU_HZ 60000000
00088 #define FPBA_HZ FCPU_HZ
00089
00091
00092 static pcl_freq_param_t pcl_freq_param =
00093 {
00094 .cpu_f = FCPU_HZ,
00095 .pba_f = FPBA_HZ,
00096 .osc0_f = FOSC0,
00097 .osc0_startup = OSC0_STARTUP
00098 };
00100
00101
00102 volatile avr32_qdec_t* qdec = &AVR32_QDEC0;
00103
00104
00105 volatile unsigned char flag_qdec = 0;
00106
00110 #if (defined __GNUC__)
00111 __attribute__((__interrupt__))
00112 #elif (defined __ICCAVR32__)
00113 __interrupt
00114 #endif
00115 static void qdec_int_handler(void)
00116 {
00117
00118 qdec_write_rc_cnt(qdec,0x00);
00119 qdec_write_pc_cnt(qdec,0xffff);
00120
00121 flag_qdec = 1;
00122
00123 qdec->scr = (1<<AVR32_QDEC_SCR_CMP_OFFSET);
00124 }
00125
00128 int main(void)
00129 {
00130
00131 static const qdec_timer_opt_t QUADRATURE_TIMER_OPT =
00132 {
00133 .upd = DISABLED,
00134 .tsdir = QDEC_TSIR_DOWN,
00135 .filten = FALSE,
00136 .evtrge = FALSE,
00137 .rcce = TRUE,
00138 .pcce = TRUE,
00139 };
00140
00141 static const qdec_interrupt_t QDEC_INTERRUPT =
00142 {
00143 .cmp = 1,
00144 .cap = 0,
00145 .pcro = 0,
00146 .rcro = 0
00147 };
00148
00149
00150 if (pcl_configure_clocks(&pcl_freq_param) != PASS) {
00151 while(1);
00152 }
00153
00154
00155 scif_gc_setup(AVR32_SCIF_GCLK_QDEC0,
00156 SCIF_GCCTRL_OSC0,
00157 AVR32_SCIF_GC_NO_DIV_CLOCK,
00158 0);
00159
00160 scif_gc_enable(AVR32_SCIF_GCLK_QDEC0);
00161
00162 Disable_global_interrupt();
00163
00164
00165 INTC_init_interrupts();
00166
00167
00168 INTC_register_interrupt(&qdec_int_handler, AVR32_QDEC0_IRQ, AVR32_INTC_INT0);
00169
00170 Enable_global_interrupt();
00171
00172
00173 qdec_write_rc_cnt(qdec,0x0000);
00174 qdec_write_pc_cnt(qdec,0xffff);
00175
00176 qdec_write_rc_cmp(qdec,0);
00177 qdec_write_pc_cmp(qdec,0);
00178
00179
00180 qdec_init_timer_mode(qdec,&QUADRATURE_TIMER_OPT);
00181
00182
00183 qdec_configure_interrupts(qdec,&QDEC_INTERRUPT);
00184
00185
00186 qdec_software_trigger(qdec);
00187
00188 unsigned int pc_cmp = 0;
00189 while(1)
00190 {
00191
00192 if(flag_qdec == 1)
00193 {
00194 gpio_tgl_gpio_pin(LED0_GPIO);
00195 if (pc_cmp < 0xffff ) pc_cmp += 0x100;
00196 else pc_cmp = 0;
00197 qdec_write_pc_cmp(qdec,pc_cmp);
00198 flag_qdec = 0;
00199 }
00200 }
00201 }