void naiboard_init(void) { // Setting up watchdog, so WDT_Reset() must be called at least // every 2000 clock cycles. WDT_EnableAndSetTimeout(WDT_PER_2KCLK_gc); POWERSAVING_DISABLE_ALL_MODULES(); DISABLE_JTAG(); POWERSAVING_ENABLE_RTC(); POWERSAVING_ENABLE_USART(); naiboard_enable_interrupts(); sysclk_init(); naiboard_led_init(); naiboard_uart_init(); naiboard_usb_init(); naiboard_eeprom_init(); naiboard_ports_init(); // Blink the LED so the user can see that we're alive :) naiboard_led1_on(); naiboard_delay_ms(50); naiboard_led1_off(); naiboard_delay_ms(50); naiboard_led1_on(); naiboard_delay_ms(50); naiboard_led1_off(); naiboard_delay_ms(50); naiboard_led1_on(); naiboard_delay_ms(50); naiboard_led1_off(); naiboard_rtc_init(); }
/* main function */ int main(void) { /* ============================== */ /* initialization =============== */ /* ============================== */ WDT_EnableAndSetTimeout(WDT_PER_512CLK_gc); /* set up LED pins */ init_leds(); /* set up I2C as slave */ init_twi(); /* set up our clocks */ init_clock(); /* set up sensors */ init_sensors(); /* set up motors */ init_motors(); /* set up crude digital outputs */ init_digout(); /* Flash all the LEDs for two and a half seconds to make sure * they're hooked up */ led_orders->behavior = LED_BEHAVIOR_TIMED; led_orders->time = 4000; led_error1->behavior = LED_BEHAVIOR_TIMED; led_error1->time = 6000; led_error2->behavior = LED_BEHAVIOR_TIMED; led_error2->time = 8000; led_mota->behavior = LED_BEHAVIOR_TIMED; led_mota->time = 10000; led_motb->behavior = LED_BEHAVIOR_TIMED; led_motb->time = 12000; /* motA.duty = 4000; */ /* motA.direction = 1; */ /* motB.duty = 16000; */ /* motB.direction = 1; */ /* enable interrupts - things start ticking now */ sei(); /* ============================== */ /* main loop ==================== */ /* ============================== */ for(;;) { _delay_us(10); WDT_Reset(); } }
/** * Main is used to: * Initialize drivers * Create threads * Pass drivers structures to threads */ int main( void ) { /* * Enable internal 32 MHz ring oscillator and wait until it's * stable. Set the 32 MHz ring oscillator as the main clock source. */ CLKSYS_Enable( OSC_RC32MEN_bm ); CLKSYS_Prescalers_Config( CLK_PSADIV_1_gc, CLK_PSBCDIV_1_1_gc ); do {} while ( CLKSYS_IsReady( OSC_RC32MRDY_bm ) == 0 ); CLKSYS_Main_ClockSource_Select( CLK_SCLKSEL_RC32M_gc ); //Enable watchdog timer, which will be reset by timer WDT_EnableAndSetTimeout( WDT_PER_1KCLK_gc ); /* * Do all configuration and create all tasks and queues before scheduler is started. * It is possible to put initialization of peripherals like displays into task functions * (which will be executed after scheduler has started) if fast startup is needed. * Interrupts are not enabled until the call of vTaskStartScheduler(); */ // Enable the Round-Robin Scheduling scheme.Round-Robin scheme ensures that no low-level // interrupts are “starved”, as the priority changes continuously PMIC_EnableRoundRobin(); //Create and start the timer, which will reset Watch Dog Timer xTimerStart(xTimerCreate((signed char*)"WDT",500, pdTRUE, 0, watchdogTimerCallback), 0); //---------Use USART on PORTC---------------------------- Serial usartFTDI = Serial(&USARTE0, BAUD9600, 128, 10); // Initialize SPI slave on port D SpiSlave spiSlave = SpiSlave(&SPIC,false,SPI_MODE_1_gc,64); // Initialize SPI master on port C SpiMaster spiMaster = SpiMaster(&SPID, false, SPI_MODE_1_gc, false, SPI_PRESCALER_DIV4_gc); SpiDevice spiDevice = SpiDevice(&spiMaster, &PORTD, SPI_SS_bm); //---------Start LED task for testing purposes----------- ledRGB = LedGroup(3); ledRGB.add(&PORTF, 0x04,1 );//R ledRGB.add(&PORTF, 0x08,1 );//G ledRGB.add(&PORTF, 0x02,1 );//B ledRGB.set(BLUE); LedProcessorThread ledRGBEThread = LedProcessorThread(&ledRGB, GREEN, 500, "RGB", 64, configLOW_PRIORITY); LedGroup ledString = LedGroup(7); ledString.add(&PORTA, 0x02, 0); ledString.add(&PORTA, 0x04, 0); ledString.add(&PORTA, 0x08, 0); ledString.add(&PORTA, 0x10, 0); ledString.add(&PORTA, 0x20, 0); ledString.add(&PORTA, 0x40, 0); ledString.add(&PORTA, 0x80, 0); LedProcessorThread ledStringThread = LedProcessorThread(&ledString, "STR", 64, configLOW_PRIORITY); // ***** Start main Looper Looper looper = Looper(10, "LPR", 750, configNORMAL_PRIORITY); //XXX why it is not working if on the heap not on the stack? //ExampleHandler *exampleHandler = (ExampleHandler*) pvPortMalloc(sizeof(ExampleHandler)); //*exampleHandler = ExampleHandler(looper, spiDevice, ledStringQueue, usartFTDI); ExampleHandler exampleHandler = ExampleHandler(&looper, &spiDevice, &ledStringThread, &usartFTDI); // ****** Register commands for the interpreter CommandInterpreter interpreter = CommandInterpreter(); interpreter.registerCommand(Strings_SpiExampleCmd, Strings_SpiExampleCmdDesc, &exampleHandler, EVENT_RUN_SPI_TEST); interpreter.registerCommand(Strings_BlinkCmd, Strings_BlinkCmdDesc, &exampleHandler, EVENT_BLINK); CommandInterpreterThread cmdIntThreadFTDI = CommandInterpreterThread(&interpreter, 32, &usartFTDI, "I12", 128, configNORMAL_PRIORITY); PinChangeController pinChangeController = PinChangeController(); pinChangeController.registerOnPinChangeListener(&exampleHandler, &PORTD, PIN2_bm, PORT_OPC_TOTEM_gc, PORT_ISC_RISING_gc); // ****** Start stand-alone tasks SpiSlaveThread spiSlaveThread = SpiSlaveThread(&spiSlave, &usartFTDI, "SLV", 128, configLOW_PRIORITY); /* Start scheduler. Creates idle task and returns if failed to create it. * vTaskStartScheduler never returns during normal operation. It is unlikely that XMEGA port will need to * dynamically create tasks or queues. To ensure stable work, create ALL tasks and ALL queues before * vTaskStartScheduler call. * Interrupts would be enabled by calling PMIC_EnableLowLevel();*/ vTaskStartScheduler(); /* Should never get here, stop execution and report error */ while(true) ledRGB.set(PINK); return 0; }