void programAsync(uint16_t timer1msDiff){ if(LED_GREEN_RUN(CO->NMT))CAN_RUN_LED_ON(); else CAN_RUN_LED_OFF(); if(LED_RED_ERROR(CO->NMT))CAN_ERROR_LED_ON(); else CAN_ERROR_LED_OFF(); }
/* main ***********************************************************************/ int main(void) { CO_NMT_reset_cmd_t reset = CO_RESET_NOT; InitCanLeds(); DBGU_Configure(115200); TRACE_INFO_WP("\n\rCanOpenNode %s (%s %s)\n\r", cVer, __DATE__, __TIME__); /* Configure Timer interrupt function for execution every 1 millisecond */ if (SysTick_Config(SysTick_1ms)) TRACE_FATAL("SysTick_Config\n\r"); initTimer(getTimer_us); /* Todo: initialize EEPROM */ /* Todo: Loading COD */ TRACE_INFO("Loading COD\n\r"); /* Verify, if OD structures have proper alignment of initial values */ TRACE_DEBUG("Checking COD in RAM (size=%d)\n\r", &CO_OD_RAM.LastWord - &CO_OD_RAM.FirstWord); if (CO_OD_RAM.FirstWord != CO_OD_RAM.LastWord) TRACE_FATAL("Err COD in RAM\n\r"); TRACE_DEBUG("Checking COD in EEPROM (size=%d)\n\r", &CO_OD_EEPROM.LastWord - &CO_OD_EEPROM.FirstWord); if (CO_OD_EEPROM.FirstWord != CO_OD_EEPROM.LastWord) TRACE_FATAL("Err COD in EEPROM\n\r"); TRACE_DEBUG("Checking COD in ROM (size=%d)\n\r", &CO_OD_ROM.LastWord - &CO_OD_ROM.FirstWord); if (CO_OD_ROM.FirstWord != CO_OD_ROM.LastWord) TRACE_FATAL("Err COD in ROM\n\r"); /* increase variable each startup. Variable is stored in eeprom. */ OD_powerOnCounter++; TRACE_INFO("CO power-on (BTR=%dk Node=0x%x)\n\r", CO_OD_ROM.CANBitRate, CO_OD_ROM.CANNodeID); ttimer tprof; while (reset != CO_RESET_APP) { /* CANopen communication reset - initialize CANopen objects *******************/ static uint32_t timer1msPrevious; CO_ReturnError_t err; /* disable timer interrupts, turn on red LED */ canTimerOff = 1; CanLedsSet(eCoLed_Red); /* initialize CANopen */ err = CO_init(); if (err) { TRACE_FATAL("CO_init\n\r"); /* CO_errorReport(CO->em, CO_EM_MEMORY_ALLOCATION_ERROR, CO_EMC_SOFTWARE_INTERNAL, err); */ } /* start Timer */ canTimerOff = 0; reset = CO_RESET_NOT; timer1msPrevious = CO_timer1ms; TRACE_INFO("CO (re)start\n\r"); while (reset == CO_RESET_NOT) { saveTime(&tprof); /* loop for normal program execution ******************************************/ uint32_t timer1msDiff; timer1msDiff = CO_timer1ms - timer1msPrevious; timer1msPrevious = CO_timer1ms; ClearWDT(); /* CANopen process */ reset = CO_process(CO, timer1msDiff); CanLedsSet((LED_GREEN_RUN(CO->NMT)>0 ? eCoLed_Green : 0) | (LED_RED_ERROR(CO->NMT)>0 ? eCoLed_Red : 0)); ClearWDT(); /* (not implemented) eeprom_process(&eeprom); */ uint32_t t = getTime_us(&tprof); OD_performance[ODA_performance_mainCycleTime] = t; if (t > OD_performance[ODA_performance_mainCycleMaxTime]) OD_performance[ODA_performance_mainCycleMaxTime] = t; } /* while (reset != 0) */ } /* while (reset != 2) */ /* program exit ***************************************************************/ /* save variables to eeprom */ CO_DISABLE_INTERRUPTS(); CanLedsSet(eCoLed_None); /* (not implemented) eeprom_saveAll(&eeprom); */ CanLedsSet(eCoLed_Red); /* delete CANopen object from memory */ CO_delete(); /* reset - by WD */ return 0; }
/* main ***********************************************************************/ int main (void){ CO_NMT_reset_cmd_t reset = CO_RESET_NOT; /* Initialize two CAN led diodes */ TRISAbits.TRISA0 = 0; LATAbits.LATA0 = 0; TRISAbits.TRISA1 = 0; LATAbits.LATA1 = 1; #define CAN_RUN_LED LATAbits.LATA0 #define CAN_ERROR_LED LATAbits.LATA1 /* Initialize other LED diodes for RPDO */ TRISAbits.TRISA2 = 0; LATAbits.LATA2 = 0; TRISAbits.TRISA3 = 0; LATAbits.LATA3 = 0; TRISAbits.TRISA4 = 0; LATAbits.LATA4 = 0; TRISAbits.TRISA5 = 0; LATAbits.LATA5 = 0; TRISAbits.TRISA6 = 0; LATAbits.LATA6 = 0; TRISAbits.TRISA7 = 0; LATAbits.LATA7 = 0; /* Configure Oscillator */ /* Fosc = Fin*M/(N1*N2), Fcy=Fosc/2 */ /* Fosc = 8M*24(2*2) = 48MHz -> Fcy = 24MHz */ PLLFBD=22; /* M=24 */ CLKDIVbits.PLLPOST=0; /* N1=2 */ CLKDIVbits.PLLPRE=0; /* N2=2 */ OSCTUN=0; /* Tune FRC oscillator, if FRC is used */ while(OSCCONbits.LOCK!=1) ClrWdt(); /* wait for PLL to lock */ /* Verify, if OD structures have proper alignment of initial values */ if(CO_OD_RAM.FirstWord != CO_OD_RAM.LastWord) while(1) ClrWdt(); if(CO_OD_EEPROM.FirstWord != CO_OD_EEPROM.LastWord) while(1) ClrWdt(); if(CO_OD_ROM.FirstWord != CO_OD_ROM.LastWord) while(1) ClrWdt(); /* initialize EEPROM */ /* (not implemented) */ /* increase variable each startup. Variable is stored in eeprom. */ OD_powerOnCounter++; while(reset != CO_RESET_APP){ /* CANopen communication reset - initialize CANopen objects *******************/ static uint16_t timer1msPrevious; CO_ReturnError_t err; /* disable timer and CAN interrupts, turn on red LED */ CO_TMR_ISR_ENABLE = 0; CO_CAN_ISR_ENABLE = 0; CAN_RUN_LED = 0; CAN_ERROR_LED = 1; /* Initialize digital outputs */ TRISAbits.TRISA2 = 0; LATAbits.LATA2 = 0; TRISAbits.TRISA3 = 0; LATAbits.LATA3 = 0; TRISAbits.TRISA4 = 0; LATAbits.LATA4 = 0; TRISAbits.TRISA5 = 0; LATAbits.LATA5 = 0; TRISAbits.TRISA6 = 0; LATAbits.LATA6 = 0; TRISAbits.TRISA7 = 0; LATAbits.LATA7 = 0; OD_writeOutput8Bit[0] = 0; OD_writeOutput8Bit[1] = 0; /* initialize CANopen */ err = CO_init(); if(err != CO_ERROR_NO){ while(1) ClrWdt(); /* CO_errorReport(CO->em, CO_EM_MEMORY_ALLOCATION_ERROR, CO_EMC_SOFTWARE_INTERNAL, err); */ } /* start CAN */ CO_CANsetNormalMode(ADDR_CAN1); /* Configure Timer interrupt function for execution every 1 millisecond */ CO_TMR_CON = 0; CO_TMR_TMR = 0; CO_TMR_PR = CO_FCY - 1; /* Period register */ CO_TMR_CON = 0x8000; /* start timer (TON=1) */ CO_timer1ms = 0; CO_TMR_ISR_FLAG = 0; /* clear interrupt flag */ CO_TMR_ISR_PRIORITY = 3; /* interrupt - set lower priority than CAN */ CO_TMR_ISR_ENABLE = 1; /* enable interrupt */ /* Configure CAN1 Interrupt (Combined) */ CO_CAN_ISR_FLAG = 0; /* CAN1 Interrupt - Clear flag */ CO_CAN_ISR_PRIORITY = 5; /* CAN1 Interrupt - Set higher priority than timer */ CO_CAN_ISR_ENABLE = 1; /* CAN1 Interrupt - Enable interrupt */ reset = CO_RESET_NOT; timer1msPrevious = CO_timer1ms; while(reset == CO_RESET_NOT){ /* loop for normal program execution ******************************************/ uint16_t timer1msCopy, timer1msDiff; static uint16_t TMR_TMR_PREV = 0; timer1msCopy = CO_timer1ms; timer1msDiff = timer1msCopy - timer1msPrevious; timer1msPrevious = timer1msCopy; ClrWdt(); /* calculate cycle time for performance measurement */ uint16_t t0 = CO_TMR_TMR; uint16_t t = t0; if(t >= TMR_TMR_PREV){ t = t - TMR_TMR_PREV; t = (timer1msDiff * 100) + (t / (CO_FCY / 100)); } else if(timer1msDiff){ t = TMR_TMR_PREV - t; t = (timer1msDiff * 100) - (t / (CO_FCY / 100)); } else t = 0; OD_performance[ODA_performance_mainCycleTime] = t; if(t > OD_performance[ODA_performance_mainCycleMaxTime]) OD_performance[ODA_performance_mainCycleMaxTime] = t; TMR_TMR_PREV = t0; /* CANopen process */ reset = CO_process(CO, timer1msDiff); CAN_RUN_LED = LED_GREEN_RUN(CO->NMT); CAN_ERROR_LED = LED_RED_ERROR(CO->NMT); ClrWdt(); /* (not implemented) eeprom_process(&eeprom); */ } } /* program exit ***************************************************************/ /* save variables to eeprom */ RESTORE_CPU_IPL(7); /* disable interrupts */ CAN_RUN_LED = 0; /* CAN_ERROR_LED = 0; */ /* (not implemented) eeprom_saveAll(&eeprom); */ CAN_ERROR_LED = 1; /* delete CANopen object from memory */ CO_delete(); /* reset */ return 0; }