⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ucosmovementcontrol.c.bak

📁 UCOSii for c8051f020
💻 BAK
📖 第 1 页 / 共 2 页
字号:
//***************************************************************************************************************
// FILE NAME         : MovementControl.C
// FILE DESCRIPTION  :
// TARGET DEVICE     : C8051F021
// CREATED ON        : 2007.12.29
// CREATED BY        : yuanwq
// VERSION           : 1.00
// MODIFY  RECORD    :
// uCOS-II VERSION   : 2.51
//****************************************************************************************************************
//****************************************************************************************************************
// Include File
//****************************************************************************************************************
#include "includes.h"
#include "FunctionPrototype.h"
//#include "Movement_speed.h"

//STACK Define
//*****************************************************************************************************************

OS_STK LED_TestSTK[MaxStkSize];

OS_STK TL16C554communicateRXSTK[MaxStkSize];
OS_STK FRENIC_RS485TXSTK[MaxStkSize];
//OS_STK FALDIC_RS422TXSTK[MaxStkSize];
OS_STK FRENIC_RS485TXProcessSTK[MaxStkSize];
OS_STK TL16C554TestTaskSTK[MaxStkSize];

//----------------------------------------------------------------------------------------------------------------
sbit LED = P1^6;
#include "Movement_speed.h"
//TASK Function
//*****************************************************************************************************************

void LED_Test(void *nouse) reentrant;

void TL16C554communicateRX(void *nouse) reentrant;
void FRENIC_RS485TX(void *nouse) reentrant;
//void FALDIC_RS422TX(void *nouse) reentrant;
void FRENIC_RS485TXProcess(void *nouse) reentrant;
void TL16C554TestTask(void *nouse) reentrant;
//MAIN ROUTINE
//*****************************************************************************************************************

void main(void)
{
  INT8U ERROR_NUMBER;
    
  Hardware_Init();    //-------------------------------------------------------------------------- 硬件初始化程序
  Variables_Init();   //-------------------------------------------------------------------------- 变量初始化程序
    
	OSInit();
	
    
  SET_STATUS(Q0_Output,Q_En_Move);
	XBYTE[Q0_Address] = Q0_Output.Now_Flag;
	
	//---- 创建信号量
  TL16C554_RXSEM = OSSemCreate(0);
  while(!TL16C554_RXSEM);

	FRENIC_RS485TXMUX = OSSemCreate(1);
  while(!FRENIC_RS485TXMUX);
  //TL16C554_TXMUX = OSSemCreate(1);
  //while(!TL16C554_TXMUX);       
  
  //---- 创建邮箱
	//TxTL16C554Mbox_A = OSMboxCreate((void *) 0);
	//while(!TxTL16C554Mbox_A);
	FRENIC_RS485TxMbox = OSMboxCreate((void *) 0);
	while(!FRENIC_RS485TxMbox);
	//TxTL16C554Mbox_C = OSMboxCreate((void *) 0);
	//while(!TxTL16C554Mbox_C);
	//TxTL16C554Mbox_D = OSMboxCreate((void *) 0);
	//while(!TxTL16C554Mbox_D);

	//---- 创建队列
	FRENIC_RS485TXMsg = OSQCreate(&FRENIC_RS485TXMsgTbl[0],5);
  while(!FRENIC_RS485TXMsg);

	//RxTL16C554Msg = OSQCreate(&RxTL16C554MsgTbl[0],5);
  //while(!RxTL16C554Msg);

	//TL16C554ProcessMsg = OSQCreate(&TL16C554ProcessMsgTbl[0],5);
	//while(!TL16C554ProcessMsg);
    
  TL16C554TestMsg = OSQCreate(&TL16C554TestMsgTbl[0],5);
  while(!TL16C554TestMsg);                                 
  //---- 创建内存分区
  CommunicateBUF = OSMemCreate(CommunicatePART,COM_BLOCK_NUM,COM_BLOCK_SIZE,&ERROR_NUMBER);
	while(ERROR_NUMBER);

  //---- 创建任务
  ERROR_NUMBER = OSTaskCreate(TL16C554communicateRX, (void *)0, &TL16C554communicateRXSTK[0],4);
 while(ERROR_NUMBER);
	
	//---- 测试灯任务:使测试LED间隔1s闪烁                               
	ERROR_NUMBER = OSTaskCreate(LED_Test, (void *)0, &LED_TestSTK[0],14);
  while(ERROR_NUMBER);                                                 
  //----变频器发送任务
	ERROR_NUMBER = OSTaskCreate(FRENIC_RS485TX, (void *)0, &FRENIC_RS485TXSTK[0],7);
	while(ERROR_NUMBER);

	ERROR_NUMBER = OSTaskCreate(FRENIC_RS485TXProcess, (void *)0, &FRENIC_RS485TXProcessSTK[0],6);
	while(ERROR_NUMBER);

	ERROR_NUMBER = OSTaskCreate(TL16C554TestTask, (void *)0, &TL16C554TestTaskSTK[0],5);
	while(ERROR_NUMBER);
	
  
    
    //---- 以Timer0为uCOS系统时钟,对其进行初始化
    InitTimer0();
    
    //---- 开始多任务调度
    OSStart();
}

void LED_Test(void *nouse) reentrant
{
  nouse = nouse;
    
	while(1)
	{
   LED = ~LED;
	 OSTimeDly(OS_TICKS_PER_SEC * 1);
	}
}
//----TL16C554接收任务
void TL16C554communicateRX(void *nouse) reentrant
{
  INT8U ErrTL16C554Rx;
  INT8U FinishTL16C554Rx = 0;
  INT8U RxTL16C554CheckSUM = 0;
  INT8U RxTL16C554CheckSUM_H,RxTL16C554CheckSUM_L;
 // INT8U *MemTL16C554RX_B;//*MemTL16C554RX_A,*MemTL16C554RX_C,*MemTL16C554RX_D;
    
  nouse = nouse;
    
	while(1)
	{
    OSSemPend(TL16C554_RXSEM, 0, &ErrTL16C554Rx);
		
 		if(TL_16C554_INIT_SY & 0x01) 
		{
			for(TL16C554RX_i = 0;TL16C554RX_i < RevvCharNumber;TL16C554RX_i++)
			{
				RevvCharFinish_A[TL16C554RX_i + RevvCharNumber_A] = RevvSerialChar_A[TL16C554RX_i];
			}
			if(RevvCharNumber_A == 0x00)
			{
				 RevvCharNumber_A = 0x08;
			}
			else 
			{
				RevvCharNumber_A = 0x00;
			}
			if(RevvCharNumber_A == 0x00)
			{
				RS422_CanRevv = 1;
				for(TL16C554RX_i = 1;TL16C554RX_i<=13;TL16C554RX_i++)
				{
					if(TL16C554RX_i == 1) 
					{
						RxTL16C554CheckSUM = RevvCharFinish_A[1];
					}
					else
					{
						RxTL16C554CheckSUM += RevvCharFinish_A[TL16C554RX_i];
					}
				}
				 RxTL16C554CheckSUM_H = (RxTL16C554CheckSUM & 0xF0) >> 4;
			   RxTL16C554CheckSUM_L = (RxTL16C554CheckSUM & 0x0F);
			   RxTL16C554CheckSUM_H = TO_ASCII(RxTL16C554CheckSUM_H);
			   RxTL16C554CheckSUM_L = TO_ASCII(RxTL16C554CheckSUM_L);
			   if((RevvCharFinish_A[14] == RxTL16C554CheckSUM_H) && (RevvCharFinish_A[15] == RxTL16C554CheckSUM_L))            
      	{
			       //---- 数据接收正确,存储数据
			       //----存储接收数据,并且发送处理任务信号
         }
				else //校验和错误
			   {
			   	//发送重新发送信号
				}
			}
		}
 		if(TL_16C554_INIT_SY & 0x02) 
		{
				for(TL16C554RX_i = 0;TL16C554RX_i < RevvCharNumber;TL16C554RX_i++)
				{
					RevvCharFinish_B[TL16C554RX_i + RevvCharNumber_B] = RevvSerialChar_B[TL16C554RX_i];
				}
				if(RevvCharNumber_B == 0x00)
				{
					 RevvCharNumber_B = 0x08;
				}
				else 
				{
						RevvCharNumber_B = 0x00;
				}
				if(RevvCharNumber_B == 0x00)
				{//OSSemPost(FRENIC_RS485TXMUX);		
	
				if((TL16C554RS485Tx_BUF[4] == Write_FRENIC_Comm)&&(RevvCharFinish_B[6] == ACK))
						{
							//RS485_CanRevv = 1;
							//if((RS485_CanSend == 1)&&(RS485_CanRevv == 1))//----发送RS485发送使能信号
						//{
						    RS485_SendNew = 1;
							OSSemPost(FRENIC_RS485TXMUX);		
						//}
							SuudRevvRS485	= 1;
						}
					else
					{
						if((TL16C554RS485Tx_BUF[4] == Write_FRENIC_Comm)&&(RevvCharFinish_B[6] == NAK))
						{
							SuudRevvRS485	= 0;
							OSSemPost(FRENIC_RS485TXMUX);		
							///此处需要增加变频器错误应答
							///
							///
						}
						else
						{
							for(TL16C554RX_i = 1;TL16C554RX_i<=13;TL16C554RX_i++)
							{
								if(TL16C554RX_i == 1) 
								{
									RxTL16C554CheckSUM = RevvCharFinish_B[1];
								}
									else
									{
										RxTL16C554CheckSUM += RevvCharFinish_B[TL16C554RX_i];
									}
							}
					    RxTL16C554CheckSUM_H = (RxTL16C554CheckSUM & 0xF0) >> 4;
					    RxTL16C554CheckSUM_L = (RxTL16C554CheckSUM & 0x0F);
					    RxTL16C554CheckSUM_H = TO_ASCII(RxTL16C554CheckSUM_H);
					    RxTL16C554CheckSUM_L = TO_ASCII(RxTL16C554CheckSUM_L);
					    if((RevvCharFinish_B[14] == RxTL16C554CheckSUM_H) && (RevvCharFinish_B[15] == RxTL16C554CheckSUM_L))            
      				{
					    
					    //---- 数据接收正确,存储数据
					//RS485_CanRevv = 1;
						//if((RS485_CanSend == 1)&&(RS485_CanRevv == 1))//----发送RS485发送使能信号
						//{
							OSSemPost(FRENIC_RS485TXMUX);		
						//}		
							 	if(TL16C554RS485Tx_BUF[3] == Read_FRENIC)
							  {
						
						////////////////////////////////////////////////////
					/*		  	MemTL16C554RX_B = (INT8U *)OSMemGet(CommunicateBUF,&ErrTL16C554Rx); 
        	          *(MemTL16C554RX_B + 0) = RevvCharFinish_B[1];
        	          *(MemTL16C554RX_B + 1) = RevvCharFinish_B[2];
        	          
        	          *(MemTL16C554RX_B + 2) = RevvCharFinish_B[4];
        	          *(MemTL16C554RX_B + 3) = RevvCharFinish_B[5];
        	          *(MemTL16C554RX_B + 4) = RevvCharFinish_B[6];
        	          *(MemTL16C554RX_B + 5) = RevvCharFinish_B[7];
        	          
        	          *(MemTL16C554RX_B + 6) = RevvCharFinish_B[9];
        	          *(MemTL16C554RX_B + 7) = RevvCharFinish_B[10];
        	          *(MemTL16C554RX_B + 8) = RevvCharFinish_B[11];
							*(MemTL16C554RX_B + 9) = RevvCharFinish_B[12];
        	           //OSQPost(RxTL16C554Msg,MemTL16C554RX_B);
        	           //
        	           //发送信息给接收处理任务
        	           //*/
        	        }
							}
							 else //校验和错误
			  	     	{

						//RS485_SendNew = 0;
						//RS485_CanRevv = 1;
					//if((RS485_CanSend == 1)&&(RS485_CanRevv == 1))//----发送RS485发送使能信号
						//{
							OSSemPost(FRENIC_RS485TXMUX);		
						//}
			  	     	OSMboxPost(FRENIC_RS485TxMbox,(void *)0);
							 }
						}
					}
}
		}
/* 		if(TL_16C554_INIT_SY & 0x04) 
		{
				for(TL16C554RX_i = 0;TL16C554RX_i < RevvCharNumber;TL16C554RX_i++)
				{
					RevvCharFinish_C[TL16C554RX_i + RevvCharNumber_C] = RevvSerialChar_C[TL16C554RX_i];
				}
				if(RevvCharNumber_C == 0x00) 
				{
						RevvCharNumber_C = 0x08;
				}
					else 
					{
							RevvCharNumber_C = 0x00;
					}
				if(RevvCharNumber_C == 0x00)
					{
						for(TL16C554RX_i = 1;TL16C554RX_i<=13;TL16C554RX_i++)
						{
							if(TL16C554RX_i == 1) 
							{
								RxTL16C554CheckSUM = RevvCharFinish_C[1];
							}
							else
							{
								RxTL16C554CheckSUM += RevvCharFinish_C[TL16C554RX_i];
							}
						}
				        RxTL16C554CheckSUM_H = (RxTL16C554CheckSUM & 0xF0) >> 4;
				        RxTL16C554CheckSUM_L = (RxTL16C554CheckSUM & 0x0F);
				        RxTL16C554CheckSUM_H = TO_ASCII(RxTL16C554CheckSUM_H);
				        RxTL16C554CheckSUM_L = TO_ASCII(RxTL16C554CheckSUM_L);
				        if((RevvCharFinish_C[14] == RxTL16C554CheckSUM_H) && (RevvCharFinish_C[15] == RxTL16C554CheckSUM_L))            
				        	{
      						    //---- 数据接收正确,存储数据
								         if(RevvCharFinish_C[3] == 0x06)
								          {
                                    MemTL16C554RX_C = (INT8U *)OSMemGet(CommunicateBUF,&ErrTL16C554Rx);
                                    *(MemTL16C554RX_C + 0) = RevvCharFinish_C[1];
                                    *(MemTL16C554RX_C + 1) = RevvCharFinish_C[2];
                                    
                                    *(MemTL16C554RX_C + 2) = RevvCharFinish_C[4];
                                    *(MemTL16C554RX_C + 3) = RevvCharFinish_C[5];
                                    *(MemTL16C554RX_C + 4) = RevvCharFinish_C[6];
                                    *(MemTL16C554RX_C + 5) = RevvCharFinish_C[7];
                                    
                                    *(MemTL16C554RX_C + 6) = RevvCharFinish_C[9];
                                    *(MemTL16C554RX_C + 7) = RevvCharFinish_C[10];
                                    *(MemTL16C554RX_C + 8) = RevvCharFinish_C[11];
                                    *(MemTL16C554RX_C + 9) = RevvCharFinish_C[12];
                                    OSQPost(RxTL16C554Msg,MemTL16C554RX_C);
                          }
                  }
		        		else //校验和错误
			            {
						      }
					}
		}
 		if(TL_16C554_INIT_SY & 0x08) 
		{
				for(TL16C554RX_i = 0;TL16C554RX_i < RevvCharNumber;TL16C554RX_i++)
				{
					RevvCharFinish_D[TL16C554RX_i + RevvCharNumber_D] = RevvSerialChar_D[TL16C554RX_i];
				}
				if(RevvCharNumber_D == 0x00)
					{
						 RevvCharNumber_D = 0x08;
					}
					else 
					{
							RevvCharNumber_D = 0x00;
					}
				if(RevvCharNumber_D == 0x00)
					{
						for(TL16C554RX_i = 1;TL16C554RX_i<=13;TL16C554RX_i++)
						 {
							if(TL16C554RX_i == 1)
								{
									RxTL16C554CheckSUM = RevvCharFinish_D[1];
								}
								else
									{
										RxTL16C554CheckSUM += RevvCharFinish_D[TL16C554RX_i];
									}
							}
				        RxTL16C554CheckSUM_H = (RxTL16C554CheckSUM & 0xF0) >> 4;
				        RxTL16C554CheckSUM_L = (RxTL16C554CheckSUM & 0x0F);
				        RxTL16C554CheckSUM_H = TO_ASCII(RxTL16C554CheckSUM_H);
				        RxTL16C554CheckSUM_L = TO_ASCII(RxTL16C554CheckSUM_L);
				        if((RevvCharFinish_D[14] == RxTL16C554CheckSUM_H) && (RevvCharFinish_D[15] == RxTL16C554CheckSUM_L))
				            //---- 数据接收正确,存储数据
				            {
								   						if(RevvCharFinish_D[3] == 0x06)
 															{           							
                                    MemTL16C554RX_D = (INT8U *)OSMemGet(CommunicateBUF,&ErrTL16C554Rx);
                                    *(MemTL16C554RX_D + 0) = RevvCharFinish_D[1];
                                    *(MemTL16C554RX_D + 1) = RevvCharFinish_D[2];
                                    
                                    *(MemTL16C554RX_D + 2) = RevvCharFinish_D[4];
                                    *(MemTL16C554RX_D + 3) = RevvCharFinish_D[5];
                                    *(MemTL16C554RX_D + 4) = RevvCharFinish_D[6];
                                    *(MemTL16C554RX_D + 5) = RevvCharFinish_D[7];
                                    
                                    *(MemTL16C554RX_D + 6) = RevvCharFinish_D[9];
                                    *(MemTL16C554RX_D + 7) = RevvCharFinish_D[10];
                                    *(MemTL16C554RX_D + 8) = RevvCharFinish_D[11];
                                    *(MemTL16C554RX_D + 9) = RevvCharFinish_D[12];
                                    OSQPost(RxTL16C554Msg,MemTL16C554RX_D);
                              }
                    }
							  	else //校验和错误
			            {
						      }
					}
	  }
*/
	}
}
//----变频器发送任务
void FRENIC_RS485TX(void *nouse) reentrant
{
  INT8U ErrFRENIC_RS485TX;
	INT8U FRENIC_RS485TXCheckSUM;
  INT8U FRENIC_RS485TXCheckSUM_H,FRENIC_RS485TXCheckSUM_L;
  INT8U *MemFRENIC_RS485TX;
  INT8U *FRENIC_RS485_Tx;
    
  nouse = nouse;

	while(1)
	{
	OSSemPend(FRENIC_RS485TXMUX, 0, &ErrFRENIC_RS485TX);//可能需要设置超时////////////////
	 if(RS485_SendNew)
     {   		
     		MemFRENIC_RS485TX = (INT8U *)OSQPend(FRENIC_RS485TXMsg, 50, &ErrFRENIC_RS485TX);
	   		if(ErrFRENIC_RS485TX == OS_TIMEOUT)
			{
			if((TL16C554RS485Tx_BUF[5] == FREMIC_Mov_Control)&&(TL16C554RS485Tx_BUF[7] == '6'))
			{
				RS485_SendStart();
	      		RS485_CanSend = FALSE;
	      		RS485_CanRevv = FALSE;
     			for(TL16C554TX_i=0;TL16C554TX_i<16;TL16C554TX_i++)
     			{
     				SendChar_UART_B(TL16C554RS485Tx_BUF[TL16C554TX_i]);     
     			}
			}
			else
			{
				OSSemPost(FRENIC_RS485TXMUX);		/////
			}
			}
			else
			{
	   		TL16C554RS485Tx_BUF[0] = 0x01;
     		TL16C554RS485Tx_BUF[1] = *(MemFRENIC_RS485TX + 0);
     		TL16C554RS485Tx_BUF[2] = *(MemFRENIC_RS485TX + 1);
     		TL16C554RS485Tx_BUF[3] = 0x05;
     		TL16C554RS485Tx_BUF[4] = *(MemFRENIC_RS485TX + 2);
     		TL16C554RS485Tx_BUF[5] = *(MemFRENIC_RS485TX + 3);
     		TL16C554RS485Tx_BUF[6] = *(MemFRENIC_RS485TX + 4);
     		TL16C554RS485Tx_BUF[7] = *(MemFRENIC_RS485TX + 5);
     		TL16C554RS485Tx_BUF[8] = 0x20;
     		TL16C554RS485Tx_BUF[9] = *(MemFRENIC_RS485TX + 6);
     		TL16C554RS485Tx_BUF[10] = *(MemFRENIC_RS485TX + 7);
     		TL16C554RS485Tx_BUF[11] = *(MemFRENIC_RS485TX + 8);
     		TL16C554RS485Tx_BUF[12] = *(MemFRENIC_RS485TX + 9);
     		TL16C554RS485Tx_BUF[13] = 0x03;
     		OSMemPut(CommunicateBUF,MemFRENIC_RS485TX);
     		for(TL16C554TX_i = 1;TL16C554TX_i <= 13;TL16C554TX_i++)
	   		{            
	   			if(TL16C554TX_i == 1)
	  			{
      			FRENIC_RS485TXCheckSUM = TL16C554RS485Tx_BUF[TL16C554TX_i];
	  			}
	  				else
	    			{
      		  	FRENIC_RS485TXCheckSUM += TL16C554RS485Tx_BUF[TL16C554TX_i];
	    			}
	    	}
	    		FRENIC_RS485TXCheckSUM_H = (FRENIC_RS485TXCheckSUM & 0xF0) >> 4;
      		FRENIC_RS485TXCheckSUM_L = (FRENIC_RS485TXCheckSUM & 0x0F);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -