main.c File Reference


Detailed Description

UC3C-EK CAN and LIN Loopbacks demo.

Author:
Atmel Corporation: http://www.atmel.com
Support and FAQ: http://support.atmel.no/

Definition in file main.c.

#include "compiler.h"
#include "board.h"
#include "power_clocks_lib.h"
#include "dsp.h"
#include "gui.h"
#include "controller.h"
#include "gpio.h"
#include "print_funcs.h"
#include "intc.h"
#include "flashc.h"
#include "adcifa.h"
#include "twim.h"
#include "cycle_counter.h"
#include "conf_at42qt1060.h"
#include "lin_task.h"
#include "can_task.h"
#include "conf_demo.h"

Go to the source code of this file.

Enumerations

enum  state_function {
  STATE_FCT_IDLE, STATE_FCT_FUNCTION1, STATE_FCT_FUNCTION2, STATE_FCT_FUNCTION3,
  STATE_FCT_FUNCTION4, STATE_FCT_ZOOM
}
enum  state_master {
  STATE_IDLE, STATE_SOURCE1, STATE_OUTPUT1, STATE_OUTPUT2,
  STATE_OUTPUT3
}

Functions

void adc_process_init (void)
 ADC Process Init.
void adc_process_task (void)
 ADC Process Task.
void init_sys_clocks (void)
 Initializes the MCU system clocks.
int main (void)
 Main File Section:
  • Initialization (CPU, TWI, Usart,...)
  • Main loop with task management (CAN, LIN, ADC).

static Bool state_machine_global (int source_id, enum state_function *state)
 Global State Machine:
  • Function Idle
  • Function Zoom.

static void state_machine_task (void)
 Navigation State Machine:
  • STATE_SOURCE1, STATE_OUTPUT1, STATE_OUTPUT2, OUTPUT3.

static void twi_init (void)
 TWI Initialisation for QTouch Controller.

Variables

volatile U16 adc_current_conversion
S16 adc_values_seq0 [NUMBER_OF_INPUTS_ADC_SEQ0]
S16 adc_values_seq1 [NUMBER_OF_INPUTS_ADC_SEQ1]
volatile avr32_adcifa_t * adcifa = &AVR32_ADCIFA
adcifa_opt_t adcifa_opt
adcifa_sequencer_conversion_opt_t adcifa_sequence_conversion_opt_seq0 [NUMBER_OF_INPUTS_ADC_SEQ0]
adcifa_sequencer_conversion_opt_t adcifa_sequence_conversion_opt_seq1 [NUMBER_OF_INPUTS_ADC_SEQ1]
adcifa_sequencer_opt_t adcifa_sequence_opt
volatile Bool input_fft_view = FALSE
static Bool new_state_fct = FALSE
volatile Bool output_fft_view = FALSE
A_ALIGNED dsp16_t signal1_buf [BUFFER_LENGTH]
A_ALIGNED dsp16_t signal4_buf [BUFFER_LENGTH]
static enum state_master state = STATE_IDLE
static enum state_function state_fct = STATE_FCT_IDLE
volatile Bool zoom_view = FALSE
volatile int zoom_view_id


Enumeration Type Documentation

Enumerator:
STATE_FCT_IDLE 
STATE_FCT_FUNCTION1 
STATE_FCT_FUNCTION2 
STATE_FCT_FUNCTION3 
STATE_FCT_FUNCTION4 
STATE_FCT_ZOOM 

Definition at line 139 of file main.c.

Enumerator:
STATE_IDLE 
STATE_SOURCE1 
STATE_OUTPUT1 
STATE_OUTPUT2 
STATE_OUTPUT3 

Definition at line 130 of file main.c.

00131 {
00132   STATE_IDLE,
00133   STATE_SOURCE1,
00134   STATE_OUTPUT1,
00135   STATE_OUTPUT2,
00136   STATE_OUTPUT3
00137 };


Function Documentation

void adc_process_init ( void   ) 

ADC Process Init.

Definition at line 364 of file main.c.

References adcifa, adcifa_opt, adcifa_sequence_conversion_opt_seq0, adcifa_sequence_conversion_opt_seq1, adcifa_sequence_opt, INPUT1_ADC_FUNCTION, INPUT1_ADC_PIN, INPUT2_ADC_FUNCTION, and INPUT2_ADC_PIN.

Referenced by main().

00365 {
00366   // GPIO pin/adc-function map.
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   // Assign and enable GPIO pins to the ADC function.
00377   gpio_enable_module(ADCIFA_GPIO_MAP, sizeof(ADCIFA_GPIO_MAP) / sizeof(ADCIFA_GPIO_MAP[0]));
00378 
00379   // Configure ADCIFA core
00380   adcifa_configure(adcifa, &adcifa_opt, FOSC0);
00381   
00382   // Configure ADCIFA sequencer 0
00383   adcifa_configure_sequencer(adcifa, 0, &adcifa_sequence_opt, adcifa_sequence_conversion_opt_seq0);
00384 
00385   // Configure ADCIFA sequencer 1
00386   adcifa_configure_sequencer(adcifa, 1, &adcifa_sequence_opt, adcifa_sequence_conversion_opt_seq1);
00387 }

void adc_process_task ( void   ) 

ADC Process Task.

Definition at line 393 of file main.c.

References adc_current_conversion, adc_values_seq0, adc_values_seq1, adcifa, adcifa_sequence_opt, BUFFER_LENGTH, signal1_buf, and signal4_buf.

Referenced by main().

00394 {
00395     int i;
00396 
00397     // Start ADCIFA sequencer 0
00398     adcifa_start_sequencer(adcifa, 0);
00399 
00400     // Get Values from sequencer 0
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     // Start ADCIFA sequencer 1
00412     adcifa_start_sequencer(adcifa, 1);
00413 
00414     // Get Values from sequencer 1
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 }

void init_sys_clocks ( void   ) 

Initializes the MCU system clocks.

Definition at line 120 of file main.c.

Referenced by main().

00121 {
00122   pcl_switch_to_osc(PCL_OSC0, FOSC0, OSC0_STARTUP);
00123 }

int main ( void   ) 

Main File Section:

  • Initialization (CPU, TWI, Usart,...)
  • Main loop with task management (CAN, LIN, ADC).

Definition at line 455 of file main.c.

References adc_process_init(), adc_process_task(), can_task(), can_task_init(), controller_init(), controller_task(), FCPU_HZ, FHSB_HZ, FPBA_HZ, FPBB_HZ, gui_init(), gui_task(), init_sys_clocks(), lin_task(), lin_task_init(), state_machine_task(), and twi_init().

00456 {
00457   // Initialize System Clock
00458   init_sys_clocks();
00459   
00460   // Initialize USART
00461   init_dbg_rs232(FPBA_HZ);
00462   
00463   // Print Startup Message
00464   print_dbg("AT32UC3C-EK DEMO\n");
00465 
00466   // Initialize ADC for Potentiometer and Microphone
00467   adc_process_init();
00468 
00469   // Initialize Interrupts
00470   INTC_init_interrupts();
00471   
00472   // Initialize TWI Interface
00473   twi_init();
00474   
00475   // GUI, Controller and DSP process init
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   // Initialize LIN Interface
00483   lin_task_init();
00484 
00485   // Initialize CAN Interface
00486   can_task_init();
00487   
00488   Enable_global_interrupt();
00489 
00490   // Main loop
00491   while (1)
00492   {
00493     // Call Lin Task for communication management
00494     lin_task();
00495     // Call CAN Task for communication management
00496     can_task();
00497     // Call Gui Task for display update
00498     gui_task();
00499     // Call Controller Task for control Update    
00500 #ifndef BUTTON_CONTROL
00501     controller_task();
00502 #endif
00503     // Call ADC Task for sensors update
00504     adc_process_task();
00505     // Here add the other concurrent process
00506     state_machine_task();
00507   }
00508 }

static Bool state_machine_global ( int  source_id,
enum state_function state 
) [static]

Global State Machine:

  • Function Idle
  • Function Zoom.

Definition at line 157 of file main.c.

References GUI_OUTPUT1_ID, GUI_OUTPUT2_ID, GUI_OUTPUT3_ID, gui_set_selection(), GUI_SOURCE1_ID, new_state_fct, STATE_FCT_FUNCTION1, STATE_FCT_FUNCTION2, STATE_FCT_FUNCTION3, STATE_FCT_FUNCTION4, STATE_FCT_IDLE, STATE_FCT_ZOOM, zoom_view, and zoom_view_id.

Referenced by state_machine_task().

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   // Not Implemented
00193   case STATE_FCT_FUNCTION1:
00194     break;
00195   // Not Implemented
00196   case STATE_FCT_FUNCTION2:
00197     break;
00198   // Not Implemented
00199   case STATE_FCT_FUNCTION3:
00200     break;
00201   // Not Implemented
00202   case STATE_FCT_FUNCTION4:
00203     break;
00204   // Zoom
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 }

static void state_machine_task ( void   )  [static]

Navigation State Machine:

  • STATE_SOURCE1, STATE_OUTPUT1, STATE_OUTPUT2, OUTPUT3.

Definition at line 227 of file main.c.

References controller_key_fct1(), controller_key_fct2(), controller_key_fct3(), controller_key_fct4(), controller_key_fct5(), gui_clear_view(), GUI_OUTPUT1_ID, GUI_OUTPUT2_ID, GUI_OUTPUT3_ID, GUI_SOURCE1_ID, new_state_fct, state, state_fct, STATE_FCT_IDLE, STATE_FCT_ZOOM, STATE_IDLE, state_machine_global(), STATE_OUTPUT1, STATE_OUTPUT2, STATE_OUTPUT3, STATE_SOURCE1, and zoom_view.

Referenced by main().

00228 {
00229 #ifdef BUTTON_CONTROL
00230   // Set function state
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   // Clear Zoom state if on and a key is pressed
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   // Set function state
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   // Clear Zoom state if on and a key is pressed
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 }

static void twi_init ( void   )  [static]

TWI Initialisation for QTouch Controller.

Definition at line 428 of file main.c.

References AT42QT1060_TWI, AT42QT1060_TWI_ADDRESS, AT42QT1060_TWI_MASTER_SPEED, AT42QT1060_TWI_SCL_FUNCTION, AT42QT1060_TWI_SCL_PIN, AT42QT1060_TWI_SDA_FUNCTION, AT42QT1060_TWI_SDA_PIN, and FPBA_HZ.

Referenced by main().

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   // Assign I/Os to TWI.
00445   gpio_enable_module(AT42QT1060_TWI_GPIO_MAP,
00446     sizeof(AT42QT1060_TWI_GPIO_MAP) / sizeof(AT42QT1060_TWI_GPIO_MAP[0]));
00447   // Initialize as master.
00448   twi_master_init(AT42QT1060_TWI, &AT42QT1060_TWI_OPTIONS);
00449 }


Variable Documentation

volatile U16 adc_current_conversion

Definition at line 117 of file main.c.

Referenced by adc_process_task(), and can_example_prepare_data_to_send().

S16 adc_values_seq0[NUMBER_OF_INPUTS_ADC_SEQ0]

Definition at line 338 of file main.c.

Referenced by adc_process_task().

S16 adc_values_seq1[NUMBER_OF_INPUTS_ADC_SEQ1]

Definition at line 348 of file main.c.

Referenced by adc_process_task().

volatile avr32_adcifa_t* adcifa = &AVR32_ADCIFA

Definition at line 358 of file main.c.

Referenced by adc_process_init(), and adc_process_task().

adcifa_opt_t adcifa_opt

Initial value:

 {
                              .frequency                = 1000000,  
                              .reference_source         = ADCIFA_ADCREF0, 
                              .sample_and_hold_disable  = FALSE,    
                              .single_sequencer_mode    = FALSE,    
                              .free_running_mode_enable = FALSE,    
                              .sleep_mode_enable        = FALSE     
                                             }

Definition at line 318 of file main.c.

Referenced by adc_process_init().

adcifa_sequencer_conversion_opt_t adcifa_sequence_conversion_opt_seq0[NUMBER_OF_INPUTS_ADC_SEQ0]

Initial value:

 
                                                            {
                                                                {
                                                                  INPUT1_ADC_INP,
                                                                  INPUT1_ADC_INN,
                                                                  ADCIFA_SHG_1
                                                                }                                 
                                                            }

Definition at line 339 of file main.c.

Referenced by adc_process_init().

adcifa_sequencer_conversion_opt_t adcifa_sequence_conversion_opt_seq1[NUMBER_OF_INPUTS_ADC_SEQ1]

Initial value:

 
                                                            {
                                                                {
                                                                  INPUT2_ADC_INP,
                                                                  INPUT2_ADC_INN,
                                                                  ADCIFA_SHG_8
                                                                }                                 
                                                            }

Definition at line 349 of file main.c.

Referenced by adc_process_init().

adcifa_sequencer_opt_t adcifa_sequence_opt

Initial value:

 {
                                                    NUMBER_OF_INPUTS_ADC_SEQ0,
                                                    ADCIFA_SRES_12B,
                                                    ADCIFA_TRGSEL_SOFT,
                                                    ADCIFA_SOCB_ALLSEQ,  
                                                    ADCIFA_CSWS_WSTATE,
                                                    ADCIFA_HWLA_NOADJ,
                                                    ADCIFA_SA_NO_EOS_SOFTACK
                                             }

Definition at line 328 of file main.c.

Referenced by adc_process_init(), and adc_process_task().

volatile Bool input_fft_view = FALSE

Definition at line 125 of file main.c.

Bool new_state_fct = FALSE [static]

Definition at line 151 of file main.c.

Referenced by state_machine_global(), and state_machine_task().

volatile Bool output_fft_view = FALSE

Definition at line 126 of file main.c.

A_ALIGNED dsp16_t signal1_buf[BUFFER_LENGTH]

Definition at line 115 of file main.c.

Referenced by adc_process_task(), and gui_task().

A_ALIGNED dsp16_t signal4_buf[BUFFER_LENGTH]

Definition at line 116 of file main.c.

Referenced by adc_process_task(), and gui_task().

enum state_master state = STATE_IDLE [static]

Definition at line 149 of file main.c.

Referenced by state_machine_task().

enum state_function state_fct = STATE_FCT_IDLE [static]

Definition at line 150 of file main.c.

Referenced by state_machine_task().

volatile Bool zoom_view = FALSE

Definition at line 127 of file main.c.

Referenced by gui_print_signal_box(), state_machine_global(), and state_machine_task().

volatile int zoom_view_id

Definition at line 128 of file main.c.

Referenced by gui_print_signal_box(), and state_machine_global().


Generated on Fri Feb 19 02:22:37 2010 for AVR32 - CAN LIN LOOPBACKS Demo. by  doxygen 1.5.5