/******************************************************************************
*   
*
*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;
//			
//		}
		
	}
}	
Example #2
0
/*
 * 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);
	}
}