00001
00092 #include "compiler.h"
00093 #include "board.h"
00094
00095 #include "power_clocks_lib.h"
00096 #include "dsp.h"
00097 #include "gui.h"
00098 #include "controller.h"
00099
00100 #include "gpio.h"
00101 #include "print_funcs.h"
00102 #include "intc.h"
00103 #include "flashc.h"
00104 #include "adcifa.h"
00105 #include "twim.h"
00106 #include "cycle_counter.h"
00107
00108 #include "conf_at42qt1060.h"
00109
00110 #include "lin_task.h"
00111 #include "can_task.h"
00112
00113 #include "conf_demo.h"
00114
00115 A_ALIGNED dsp16_t signal1_buf[BUFFER_LENGTH];
00116 A_ALIGNED dsp16_t signal4_buf[BUFFER_LENGTH];
00117 volatile U16 adc_current_conversion;
00120 void init_sys_clocks(void)
00121 {
00122 pcl_switch_to_osc(PCL_OSC0, FOSC0, OSC0_STARTUP);
00123 }
00124
00125 volatile Bool input_fft_view = FALSE;
00126 volatile Bool output_fft_view = FALSE;
00127 volatile Bool zoom_view = FALSE;
00128 volatile int zoom_view_id;
00129
00130 enum state_master
00131 {
00132 STATE_IDLE,
00133 STATE_SOURCE1,
00134 STATE_OUTPUT1,
00135 STATE_OUTPUT2,
00136 STATE_OUTPUT3
00137 };
00138
00139 enum state_function
00140 {
00141 STATE_FCT_IDLE,
00142 STATE_FCT_FUNCTION1,
00143 STATE_FCT_FUNCTION2,
00144 STATE_FCT_FUNCTION3,
00145 STATE_FCT_FUNCTION4,
00146 STATE_FCT_ZOOM
00147 };
00148
00149 static enum state_master state = STATE_IDLE;
00150 static enum state_function state_fct = STATE_FCT_IDLE;
00151 static Bool new_state_fct = FALSE;
00152
00157 static Bool state_machine_global(int source_id, enum state_function *state)
00158 {
00159
00160 switch (*state)
00161 {
00162 case STATE_FCT_IDLE:
00163 if (source_id == GUI_SOURCE1_ID)
00164 {
00165 if (new_state_fct)
00166 {
00167 gui_set_selection(GUI_SOURCE1_ID);
00168 }
00169 }
00170 else if (source_id == GUI_OUTPUT1_ID)
00171 {
00172 if (new_state_fct)
00173 {
00174 gui_set_selection(GUI_OUTPUT1_ID);
00175 }
00176 }
00177 else if (source_id == GUI_OUTPUT2_ID)
00178 {
00179 if (new_state_fct)
00180 {
00181 gui_set_selection(GUI_OUTPUT2_ID);
00182 }
00183 }
00184 else if (source_id == GUI_OUTPUT3_ID)
00185 {
00186 if (new_state_fct)
00187 {
00188 gui_set_selection(GUI_OUTPUT3_ID);
00189 }
00190 }
00191 break;
00192
00193 case STATE_FCT_FUNCTION1:
00194 break;
00195
00196 case STATE_FCT_FUNCTION2:
00197 break;
00198
00199 case STATE_FCT_FUNCTION3:
00200 break;
00201
00202 case STATE_FCT_FUNCTION4:
00203 break;
00204
00205 case STATE_FCT_ZOOM:
00206 if (new_state_fct)
00207 {
00208 zoom_view = TRUE;
00209 if (source_id == GUI_SOURCE1_ID)
00210 zoom_view_id = GUI_SOURCE1_ID;
00211 else if (source_id == GUI_OUTPUT1_ID)
00212 zoom_view_id = GUI_OUTPUT1_ID;
00213 else if (source_id == GUI_OUTPUT2_ID)
00214 zoom_view_id = GUI_OUTPUT2_ID;
00215 else if (source_id == GUI_OUTPUT3_ID)
00216 zoom_view_id = GUI_OUTPUT3_ID;
00217 }
00218 break;
00219 }
00220 return TRUE;
00221 }
00222
00227 static void state_machine_task(void)
00228 {
00229 #ifdef BUTTON_CONTROL
00230
00231 if (gpio_get_pin_value(GPIO_PUSH_BUTTON_0)==GPIO_PUSH_BUTTON_0_PRESSED)
00232 {
00233 state_fct = STATE_FCT_ZOOM;
00234 new_state_fct = TRUE;
00235 }
00236 else
00237 {
00238 state_fct = STATE_FCT_IDLE;
00239 state = STATE_SOURCE1;
00240 new_state_fct = TRUE;
00241 }
00242
00243 if (zoom_view && (gpio_get_pin_value(GPIO_PUSH_BUTTON_0)!=GPIO_PUSH_BUTTON_0_PRESSED))
00244 {
00245 zoom_view = FALSE;
00246 gui_clear_view();
00247 new_state_fct = TRUE;
00248 state_fct = STATE_FCT_IDLE;
00249 }
00250 #else
00251
00252 if (controller_key_fct5())
00253 {
00254 state_fct = STATE_FCT_ZOOM;
00255 new_state_fct = TRUE;
00256 new_state_fct = TRUE;
00257 }
00258 else if (controller_key_fct1())
00259 {
00260 state_fct = STATE_FCT_IDLE;
00261 state = STATE_SOURCE1;
00262 new_state_fct = TRUE;
00263 }
00264 else if (controller_key_fct2())
00265 {
00266 state_fct = STATE_FCT_IDLE;
00267 state = STATE_OUTPUT1;
00268 new_state_fct = TRUE;
00269 }
00270 else if (controller_key_fct3())
00271 {
00272 state_fct = STATE_FCT_IDLE;
00273 state = STATE_OUTPUT2;
00274 new_state_fct = TRUE;
00275 }
00276 else if (controller_key_fct4())
00277 {
00278 state_fct = STATE_FCT_IDLE;
00279 state = STATE_OUTPUT3;
00280 new_state_fct = TRUE;
00281 }
00282
00283 if (zoom_view && !controller_key_fct5())
00284 {
00285 zoom_view = FALSE;
00286 gui_clear_view();
00287 new_state_fct = TRUE;
00288 state_fct = STATE_FCT_IDLE;
00289 }
00290 #endif
00291
00292 switch (state)
00293 {
00294 case STATE_IDLE:
00295 break;
00296 case STATE_SOURCE1:
00297 if (!state_machine_global(GUI_SOURCE1_ID, &state_fct))
00298 return;
00299 break;
00300 case STATE_OUTPUT1:
00301 if (!state_machine_global(GUI_OUTPUT1_ID, &state_fct))
00302 return;
00303 break;
00304 case STATE_OUTPUT2:
00305 if (!state_machine_global(GUI_OUTPUT2_ID, &state_fct))
00306 return;
00307 break;
00308 case STATE_OUTPUT3:
00309 if (!state_machine_global(GUI_OUTPUT3_ID, &state_fct))
00310 return;
00311 break;
00312
00313 }
00314 new_state_fct = FALSE;
00315 }
00316
00317
00318 adcifa_opt_t adcifa_opt = {
00319 .frequency = 1000000,
00320 .reference_source = ADCIFA_ADCREF0,
00321 .sample_and_hold_disable = FALSE,
00322 .single_sequencer_mode = FALSE,
00323 .free_running_mode_enable = FALSE,
00324 .sleep_mode_enable = FALSE
00325 };
00326
00327
00328 adcifa_sequencer_opt_t adcifa_sequence_opt = {
00329 NUMBER_OF_INPUTS_ADC_SEQ0,
00330 ADCIFA_SRES_12B,
00331 ADCIFA_TRGSEL_SOFT,
00332 ADCIFA_SOCB_ALLSEQ,
00333 ADCIFA_CSWS_WSTATE,
00334 ADCIFA_HWLA_NOADJ,
00335 ADCIFA_SA_NO_EOS_SOFTACK
00336 };
00337
00338 S16 adc_values_seq0[NUMBER_OF_INPUTS_ADC_SEQ0];
00339 adcifa_sequencer_conversion_opt_t adcifa_sequence_conversion_opt_seq0[NUMBER_OF_INPUTS_ADC_SEQ0] =
00340 {
00341 {
00342 INPUT1_ADC_INP,
00343 INPUT1_ADC_INN,
00344 ADCIFA_SHG_1
00345 }
00346 };
00347
00348 S16 adc_values_seq1[NUMBER_OF_INPUTS_ADC_SEQ1];
00349 adcifa_sequencer_conversion_opt_t adcifa_sequence_conversion_opt_seq1[NUMBER_OF_INPUTS_ADC_SEQ1] =
00350 {
00351 {
00352 INPUT2_ADC_INP,
00353 INPUT2_ADC_INN,
00354 ADCIFA_SHG_8
00355 }
00356 };
00357
00358 volatile avr32_adcifa_t *adcifa = &AVR32_ADCIFA;
00359
00364 void adc_process_init(void)
00365 {
00366
00367 static const gpio_map_t ADCIFA_GPIO_MAP =
00368 {
00369 {AVR32_ADCREF0_PIN,AVR32_ADCREF0_FUNCTION},
00370 {AVR32_ADCREFP_PIN,AVR32_ADCREFP_FUNCTION},
00371 {AVR32_ADCREFN_PIN,AVR32_ADCREFN_FUNCTION},
00372 {INPUT1_ADC_PIN, INPUT1_ADC_FUNCTION},
00373 {INPUT2_ADC_PIN, INPUT2_ADC_FUNCTION}
00374 };
00375
00376
00377 gpio_enable_module(ADCIFA_GPIO_MAP, sizeof(ADCIFA_GPIO_MAP) / sizeof(ADCIFA_GPIO_MAP[0]));
00378
00379
00380 adcifa_configure(adcifa, &adcifa_opt, FOSC0);
00381
00382
00383 adcifa_configure_sequencer(adcifa, 0, &adcifa_sequence_opt, adcifa_sequence_conversion_opt_seq0);
00384
00385
00386 adcifa_configure_sequencer(adcifa, 1, &adcifa_sequence_opt, adcifa_sequence_conversion_opt_seq1);
00387 }
00388
00393 void adc_process_task(void)
00394 {
00395 int i;
00396
00397
00398 adcifa_start_sequencer(adcifa, 0);
00399
00400
00401 if (adcifa_get_values_from_sequencer(adcifa, 0, &adcifa_sequence_opt, adc_values_seq0)==ADCIFA_STATUS_COMPLETED)
00402 {
00403 for (i=BUFFER_LENGTH-1;i>=1;i--)
00404 {
00405 signal1_buf[i] = signal1_buf[i-1];
00406 }
00407 adc_current_conversion = adc_values_seq0[0];
00408 signal1_buf[0] = ( adc_current_conversion*0x20) - 0x8000;
00409 }
00410
00411
00412 adcifa_start_sequencer(adcifa, 1);
00413
00414
00415 if (adcifa_get_values_from_sequencer(adcifa, 1, &adcifa_sequence_opt, adc_values_seq1)==ADCIFA_STATUS_COMPLETED)
00416 {
00417 for (i=BUFFER_LENGTH-1;i>=1;i--)
00418 {
00419 signal4_buf[i] = signal4_buf[i-1];
00420 }
00421 signal4_buf[0] = ( (~adc_values_seq1[0])*0x20) - 0x8000;
00422 }
00423 }
00428 static void twi_init(void)
00429 {
00430 const gpio_map_t AT42QT1060_TWI_GPIO_MAP =
00431 {
00432 {AT42QT1060_TWI_SCL_PIN, AT42QT1060_TWI_SCL_FUNCTION},
00433 {AT42QT1060_TWI_SDA_PIN, AT42QT1060_TWI_SDA_FUNCTION}
00434 };
00435
00436 const twi_options_t AT42QT1060_TWI_OPTIONS =
00437 {
00438 .pba_hz = FPBA_HZ,
00439 .speed = AT42QT1060_TWI_MASTER_SPEED,
00440 .chip = AT42QT1060_TWI_ADDRESS,
00441 .smbus = FALSE,
00442 };
00443
00444
00445 gpio_enable_module(AT42QT1060_TWI_GPIO_MAP,
00446 sizeof(AT42QT1060_TWI_GPIO_MAP) / sizeof(AT42QT1060_TWI_GPIO_MAP[0]));
00447
00448 twi_master_init(AT42QT1060_TWI, &AT42QT1060_TWI_OPTIONS);
00449 }
00450
00455 int main(void)
00456 {
00457
00458 init_sys_clocks();
00459
00460
00461 init_dbg_rs232(FPBA_HZ);
00462
00463
00464 print_dbg("AT32UC3C-EK DEMO\n");
00465
00466
00467 adc_process_init();
00468
00469
00470 INTC_init_interrupts();
00471
00472
00473 twi_init();
00474
00475
00476 gui_init(FCPU_HZ, FHSB_HZ, FPBB_HZ, FPBA_HZ);
00477
00478 #ifndef BUTTON_CONTROL
00479 controller_init(FCPU_HZ, FHSB_HZ, FPBA_HZ, FPBB_HZ);
00480 #endif
00481
00482
00483 lin_task_init();
00484
00485
00486 can_task_init();
00487
00488 Enable_global_interrupt();
00489
00490
00491 while (1)
00492 {
00493
00494 lin_task();
00495
00496 can_task();
00497
00498 gui_task();
00499
00500 #ifndef BUTTON_CONTROL
00501 controller_task();
00502 #endif
00503
00504 adc_process_task();
00505
00506 state_machine_task();
00507 }
00508 }