/** DONT_TRANSLATE */ BOOT_CODE void initTimer(void) { int timeout; disableWatchdog(); enableTimers(); timer->cfg = TIOCP_CFG_SOFTRESET; for (timeout = 10000; (timer->cfg & TIOCP_CFG_SOFTRESET) && timeout > 0; timeout--) ; if (!timeout) { printf("init timer failed\n"); return; } maskInterrupt(/*disable*/ true, DMTIMER0_IRQ); /* Set the reload value */ timer->tldr = 0xFFFFFFFFUL - TIMER_INTERVAL_TICKS; /* Enables interrupt on overflow */ timer->tier = TIER_OVERFLOWENABLE; /* Clear the read register */ timer->tcrr = 0xFFFFFFFFUL - TIMER_INTERVAL_TICKS; /* Set autoreload and start the timer */ timer->tclr = TCLR_AUTORELOAD | TCLR_STARTTIMER; }
int main() { // Chip errata CHIP_Init(); // ensure core frequency has been updated SystemCoreClockUpdate(); // start clocks initClocks(); // init LEDs LED_Init(); // init scheduler SCHEDULER_Init(); // enable timers enableTimers(); // enable interrupts enableInterrupts(); // init tasks SCHEDULER_TaskInit(&radio_task, radio_task_entrypoint); // run SCHEDULER_Run(); }
void main(void) { PORTA=0x00; DDRA=0x00; PORTB=0x00; DDRB=0x00; PORTC=0x00; DDRC=0x00; PORTD=0x00; DDRD=0x00; PORTE=0x00; DDRE=0x00; PORTF=0x00; DDRF=0x00; PORTG=0x00; DDRG=0x00; initTimer0(); initTimer1(); initTimer2(); initTimer3(); enableTimers(); // External Interrupt(s) initialization // INT0-INT7: Off EICRA=0x00; EICRB=0x00; EIMSK=0x00; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; SFIOR=0x00; // ====================== TRUE INITIALIZATION ============================= initLeds(); //initJumpers(); InitFans(); // configure Fans FanSetPower(&fan1, 5); FanSetPower(&fan2, 0); FanSetPower(&fan3, 0); FanSetPower(&fan4, 0); // max is 27 FanEnable(&fan2); FanEnable(&fan3); FanEnable(&fan4); InitRailControl(); InitPsuControl(); InitPullDownControl(); //InitTemperature(); // no temperature-based control yet // depend on jumper J1 InitSignalControl(); InitADC(); InitBatChargeControl(); initPPC_State(); initUSART(); #asm("sei") while(1) { // read jumpers // read inputs // update fans // update outputs // enter sleep /* // test fan speed debug if (getTicksDelta(lastFanStepTickCount) > FAN_STEP_INTERVAL) { lastFanStepTickCount = getTickCount(); debug_fan_power_step++; if (debug_fan_power_step > PWR_FAN_MAX) debug_fan_power_step = PWR_FAN_MIN; FanSetPower(&fan1, debug_fan_power_step); }; */ BatChargeUpdate(); //batChargeState.all_batteries_charged = 1; // !!! SignalsIndicateCharged(batChargeState.all_batteries_charged); #if 1 SignalReadUpdate(); switch (ppcState.mode) { case(PPC_MODE_WAITING): { if (InputsTransientHigh(SIGNAL_INDEX_SPINT_POWER)) { setPPC_Mode(PPC_MODE_STARTING); }; break; }; // waiting mode state case(PPC_MODE_STARTING): { FanEnable(&fan1); switch(ppcState.stage) { case(0): PsuSet(0,0,1,0); PsuUpdateOutput(); PORTA = railState.port_value | psuState.port_value | pullDownState.portA_value; delay_ms(200); break; case(1): PsuSet(1,0,1,0); PsuUpdateOutput(); PORTA = railState.port_value | psuState.port_value | pullDownState.portA_value; delay_ms(200); break; case(2): PsuSet(1,0,1,1); PsuUpdateOutput(); PORTA = railState.port_value | psuState.port_value | pullDownState.portA_value; delay_ms(200); break; case(3): RailSet(1,0); RailUpdateOutput(); PORTA = railState.port_value | psuState.port_value | pullDownState.portA_value; delay_ms(200); break; case(4): RailSet(1,1); RailUpdateOutput(); PORTA = railState.port_value | psuState.port_value | pullDownState.portA_value; delay_ms(1000); break; case(5): PullDownSet(1,0,0); PullDownUpdateOutput(); PORTA = railState.port_value | psuState.port_value | pullDownState.portA_value; delay_ms(100); break; case(6): PullDownSet(0,0,0); PullDownUpdateOutput(); PORTA = railState.port_value | psuState.port_value | pullDownState.portA_value; delay_ms(100); break; default: setPPC_Mode(PPC_MODE_ACTIVE); break; }; ppcState.stage++; break; }; // starting mode state case(PPC_MODE_ACTIVE): { FanEnable(&fan1); if (signalState.current_signal_state[SIGNAL_INDEX_SPINT_POWER] == 0) { setPPC_Mode(PPC_MODE_PARKING); }; //if (InputsTransientLow(SIGNAL_INDEX_SPINT_POWER)) break; }; // acitve mode state case(PPC_MODE_PARKING): { FanDisable(&fan1); switch(ppcState.stage) { case(0): // turn off PSU power PsuSet(0,0,0,0); PsuUpdateOutput(); PORTA = railState.port_value | psuState.port_value | pullDownState.portA_value; delay_ms(200); break; case(1): // park computer (pull-in) PullDownSet(1,0,0); PullDownUpdateOutput(); PORTA = railState.port_value | psuState.port_value | pullDownState.portA_value; delay_ms(100); break; case(2): // park computer (pull-out) PullDownSet(0,0,0); PullDownUpdateOutput(); PORTA = railState.port_value | psuState.port_value | pullDownState.portA_value; delay_ms(1000); // wait before clamping power rail break; case(3): // turn-off rails RailSet(0,0); RailUpdateOutput(); PORTA = railState.port_value | psuState.port_value | pullDownState.portA_value; delay_ms(200); break; default: setPPC_Mode(PPC_MODE_WAITING); break; }; ppcState.stage++; break; }; // Parking mode state }; // MODE Switch // This function locks for 0.2 second minimum // This must be read in the end of control loop /* TemperatureReadUpdate(); if (temperatureState.temperature1 != 0) { if (temperatureState.temperature1 <= 30) { FanDisable(&fan1); } else { FanEnable(&fan1); FanSetPower(&fan1,(unsigned char)(PWR_FAN_MIN + ((signed int)(PWR_FAN_MAX - PWR_FAN_MIN))*temperatureState.temperature1/60)); }; } else { FanDisable(&fan1); }; */ RailUpdateOutput(); PsuUpdateOutput(); PullDownUpdateOutput(); networkUpdate(); PORTA = railState.port_value | psuState.port_value | pullDownState.portA_value; #endif /* if (ppcState.mode == PPC_MODE_WAITING) { #asm("sleep") } */ } } // main