/****************************************************************************** * * *No_Feedback_EN START 不使用回授控制 * * ******************************************************************************/ void main(void) { OSCCON = 0x70 ; //8Mhz while(!HFIOFR); //INTOSC ready // while(!PLLR); //PLL ready //ANSELA = 0b00010000 ; ANSELA = 0b00010000 ; //max2014 ANSELB = 0x00 ; ANSELD = 0x00 ; ANSELE = 0x00 ; LATA = 0; LATB = 0; LATC = 0; LATD = 0; TRISA = 0b00101011; TRISB = 0b00100001; //RB0 = RA2 input //TRISC = 0b00011111; TRISC = 0b01001111; TRISBbits.TRISB0 = 0; #if(_4WD_Test_EN) TRISD = 0b00110111; #else TRISD = 0b00110011; #endif TRISE = 0b00000000; //RE0,RE1,RE2由input改為output INTCON = 0b11000000; //GIE & PEIE //T1G_RPM_Init(); //T0 IOCBF5 = 0; //IOCBP5 = 1; IOCBP5 = 0; IOCBN5 = 1; IOCIF = 0; IOCIE = 1; OPTION_REG = 0b11000001; //1:4 TMR0 = 0; TMR0IF = 0; //T2 T2CON = 0b01111011; TMR2IF = 0; TMR2IE = 1; TMR2 = 0; PR2 = 250 - 1; T2_Start(); INTEDG = 0; INTF = 0; INTE = 0; /****************************************************************************** * *定位CHECK * ******************************************************************************/ #if(Front_Position_EN) Front_Position(); #endif #if(Back_Position_EN) Back_Position(); #endif #if(_2WD_Position_EN) _2WD_Position(); #endif #if(_4WDL_Position_EN) _4WDL_Position(); #endif Check_Motor_Status(); Check_Hand_Status(); switch(Gear_Status_NEW) { case _4WDLOCK_1: L1_Out = 0; L2_Out = 1; L3_Out = 1; Handback_Error = 0; break; case _2WDLOCK: L1_Out = 1; L2_Out = 0; L3_Out = 1; Handback_Error = 0; break; case _4WD_1: L1_Out = 0; L2_Out = 0; L3_Out = 1; Handback_Error = 0; break; case _2WD: L1_Out = 1; L2_Out = 0; L3_Out = 0; Handback_Error = 0; break; default: Handback_Error = 1; } // Gear_Status_OLD = Gear_Status_NEW; //將開機後初始狀態儲存 if( Error_Mode == 1) { // LED1 = 1; // while(1); Special = 1; //Pull = 1; Gear_Status_NEW = _2WD; } /****************************************************************************** ******************************************************************************* ******************************************************************************* ******************************************************************************* ******************************************************************************* *********************************LOOP 迴圈開始********************************* ******************************************************************************* ******************************************************************************* ******************************************************************************* ******************************************************************************* ******************************************************************************/ while(1) { IOCBP5 = 0; IOCBN5 = 1; if (Special == 1) //開機第一次會做 { Special = 0; } else { Check_Hand_Status(); Check_Motor_Status(); } if(Speed_rd) { Speed_rd = 0; TMR0IE = 0; Speed = (Speed_U * 100) + (Speed_H * 10) + Speed_L; NOP(); NOP(); } ADC_Func(); if( (RB5 == 1 && RPM_Zero ==1)||(RB5 == 0 && RPM_Zero ==1)) //轉速為"0"或接地時,RPM超速燈號關閉 Over_Speed_Error = 0; /****************************************************************************** * *LED 顯示控制區 * ******************************************************************************/ #if(LED_EN) //if(Handback_Error == 1) { LED1_FLASH(3); } //轉速為"0"、接地或轉速<1600rpm if(RPM_Zero == 1 || Over_Speed_Error == 1) { LED3_FLASH(3); } else { LED3 = 0; } // if(Over_Speed_Error == 1) // { LED13_FLASH(3); // // } // else // { if((Handback_Error == 0)&&(Voltage_Error == 0)) // LED1 = 0 ; // if(RPM_Zero == 0) // LED3 = 0; // } //RPM超速 if((Error_Mode == 1)|| (Handback_Error == 1)) { LED2_FLASH(1); } else{ LED2 = 0; } if(Voltage_Error == 1) { LED1 = 1; } else{ LED1 = 0; } //暫時關閉 #endif while( Voltage_Error == 1) { ADC_Func(); } if(((Speed < 15)&&(Voltage_Error == 0) && (Over_Speed_Error ==0))) { if(Pull_Error == 1 && Pull_Count < Pull_Value) //錯誤模式下 { if( Pull ==1) { Pull_Count ++; switch(Gear_Status_OLD) { case _4WDLOCK_1: Error_Mode_Func(_4WDLOCK_1,Motor_4WL_Status); break; case _2WDLOCK: Error_Mode_Func(_2WDLOCK,Motor_2WL_Status); break; case _4WD_1: Error_Mode_Func(_4WD_1,Motor_4WD_Status); break; case _2WD: Error_Mode_Func(_2WD,Motor_2WD_Status); break; } Pull_5S_CNT = Pull_Count_Val; } } if (Gear_Status_NEW != Gear_Status_OLD) //把手狀態 { Pull_Error = 0; //把手有變化,拉的次數重新計數 Pull_Count = 0; Pull_5S_CNT = Pull_Count_Val; switch(Gear_Status_NEW) { case _4WDLOCK_1: if(Speed < 3) { L1_Out = 0; L2_Out = 1; L3_Out = 1; Change_Func(_4WDLOCK_1,Motor_4WL_Status); Gear_Status_OLD = Gear_Status_NEW; } break; case _2WDLOCK: if(Speed < 3) { L1_Out = 1; L2_Out = 0; L3_Out = 1; //2WL輸出給ECU為"010" Change_Func(_2WDLOCK,Motor_2WL_Status); Gear_Status_OLD = Gear_Status_NEW; } break; case _4WD_1: if(Speed < 15) { if ((Moving_Status == Motor_2WD_Status) && (Speed >= 3)) { L1_Out = 0; L2_Out = 0; L3_Out = 1; Change_Func(_4WD_1,Motor_4WD_Status); Gear_Status_OLD = Gear_Status_NEW; } else if (Speed < 3) { L1_Out = 0; L2_Out = 0; L3_Out = 1; Change_Func(_4WD_1,Motor_4WD_Status); Gear_Status_OLD = Gear_Status_NEW; } } break; case _2WD: if(Speed < 15) { if ((Moving_Status == Motor_4WD_Status) && (Speed >= 3)) { L1_Out = 1; L2_Out = 0; L3_Out = 0; Change_Func(_2WD,Motor_2WD_Status); Gear_Status_OLD = Gear_Status_NEW; } else if (Speed < 3) { L1_Out = 1; L2_Out = 0; L3_Out = 0; Change_Func(_2WD,Motor_2WD_Status); Gear_Status_OLD = Gear_Status_NEW; } } break; switch(Moving_Status) { case Motor_2WD_Status : L1_Out = 1; L2_Out = 0; L3_Out = 0; break; case Motor_2WL_Status : L1_Out = 1; L2_Out = 0; L3_Out = 1; break; case Motor_4WD_Status : L1_Out = 0; L2_Out = 0; L3_Out = 1; break; case Motor_4WL_Status : L1_Out = 0; L2_Out = 1; L3_Out = 1; break; } } } Check_Status(); Output_ECU(); } // if(Error_Mode == 1) // { // Pull_Count ++; // if( Pull_Count >Pull_Value) // Pull_Count = Pull_Value; // // } } }
/* * function name: DRX_simulation * brief: DRX simulation for TDD(c0~6)/FDD(c7) environment. * param: none * return: none */ void DRX_simulation(void) { srand((unsigned)time(NULL)); #ifdef RandomWayPoint Read_RWP_CQI(); #endif //Subframe RF; UE_Status ue_status[UE_number]; for(int ntime = 0; ntime < 11; ntime++) { int runtime = 0; DRX_initial(ue_status,UE_number); system_initial(); Configure_Load(is_load,R_UE_num); UE_initial(ue,system_load); while(runtime < RunTime) {printf("*"); ue_10ms_cqi(ue); system_10ms_capacity(ue,system_capacity,system_load); DRX_Mapping(radioframe); for(int i = 0; i < 10; i++) { //transmit packet of ue in a subframe for DL or UL /*u_len = radioframe[i].UE_num.size();*/ Check_Status(ue,ue_status,&radioframe[i]); drt = radioframe[i].drt; //RF.drt = drt; /*sort_ue(&u_len,&drt,&radioframe[i]);*/ if(drt == S) { //create packet of UE in a subframe /*UE_1ms_pkt(ue,system_load,runtime+i);*/ u_len = radioframe[i].UE_num.size(); for(int index = 0; index < u_len; index++) ue[index].awake++; Create_UE_pkt(ue,runtime+i); continue; } tmpRF[drt].push_back(radioframe[i]); tmpRF_len[drt] = tmpRF[drt].size(); tmp_sc = system_capacity[drt]; int send_packet = 0; for(int index = 0; index < tmpRF_len[drt]; index++) { sort_ue(&u_len,&drt,&tmpRF[drt][index]); for(int j = 0; j < u_len; j++) { /*ue_num = radioframe[i].UE_num[j];*/ ue_num = tmpRF[drt][index].UE_num[j];; ue[ue_num].awake++; if(tmp_sc <= 0) continue; /*p_len = ue[ue_num].pkt[drt].size();*/ p_len = ue[ue_num].pkt_buffer[drt]; for(int l = 0; l < p_len; l++) { tmp_pkt = ue[ue_num].pkt[drt][0]; if(tmp_pkt.pkt_size <= tmp_sc) { tmp_sc -= tmp_pkt.pkt_size; ue[ue_num].delay[drt] += (runtime + i) - tmp_pkt.arr_time; /*ue[ue_num].pkt[drt].erase(ue[ue_num].pkt[drt].begin());*/ ue[ue_num].pkt_buffer[drt]--; ue[ue_num].pkt[drt].pop_front(); ue[ue_num].pkt_num[drt]++; send_packet++; } else { ue[ue_num].pkt[drt][0].pkt_size -= tmp_sc; tmp_sc = -1; break; } } } //if(tmp_sc >= 0) // CompletedRFSize[drt]++; } //for(int index = 0; index < CompletedRFSize[drt]; index++) //{ tmpRF[drt].pop_front(); //} //CompletedRFSize[drt] = 0; #ifdef RN_1st if(radioframe[i].is_RN || u_len > 0) ue[UE_number].awake++; #endif //create packet of UE in a subframe Create_UE_pkt(ue,runtime+i); } runtime += 10; } Print_value(ue); } }