📄 functionprototype.c
字号:
// Include File
//****************************************************************************************************************
#include "includes.h"
#define FUNCTION_GLOBALS
#include "FunctionPrototype.h"
//Automatic Prototypes
//---- 初始化定时器0,作为ucOS-II的系统时钟。
void InitTimer0(void)
{
TMOD |= 0x01; //--------------------------------------------------- 定时器0:模式1(16位定时器),仅受TR0控制
TH0 = 0xBE; //-------------------------------- 定义Tick=100次/秒(即0.02秒/次),TH,TL值与CPU的频率有关(20M)
TL0 = 0xE4; //-------------------- OS_CPU_C.C中定时器中断响应也要设置,OS_CFG.H中OS_TICKS_PER_SEC也有关系
ET0=1; //-------------------------------------------------------------------------------- 允许T0中断
TR0=1;
}
/*****************************************************************************************************************
FUNCTON NAME : Timer3_Init
FUNCTION VERSION :
CREATED ON :
FUNCTION DESCRIPTION : configure timer3 register as a delay counter(100MS)
INPUT PARAMETER : None
RETURN VALUE : None
MODIFY RECORD :
****************************************************************************************************************/
void Timer3_Init(void)
{
TMR3CN = 0x00; //---------------------------------- Stop Timer3, Clear TF3, use SYSCLK/12 as timebase
TMR3RLH = 0x15;
TMR3RLL = 0x9F;
TMR3H = 0xff; //---------------------------------------------------------- set to reload immediately
TMR3L = 0xff;
EIE2 = (EIE2 | 0x01); //---------------------------------------------------- Enable Timer3 interrupts
TMR3CN |= 0x04; //---------------------------------------------------------------- start Timer3
}
//---------------------------------------------------------------------------------------------------------------
/*****************************************************************************************************************
FUNCTON NAME: Variables_Init
FUNCTION VERSION:
CREATED ON:
FUNCTION DESCRIPTION: intialize the port input and output
INPUT PARAMETER:None
RETURN VALUE:None
MODIFY RECORD:
******************************************************************************************************************/
void Variables_Init(void)
{
PcTx_Number = 0;
A_MODIFY_TIME = 0;
L_MODIFY_TIME = 0;
T_MODIFY_TIME = 0;
TIME = 0;
FLG_ActiveSendToPc = FALSE;
//TL16C554初始化参数
RevvCharNumber_A = 0;
RevvCharNumber_B = 0;
RevvCharNumber_C = 0;
RevvCharNumber_D = 0;
RS485_CanSend = 1;
RS485_CanRevv = 1;
ErrRS485Number = 0;
RS485_SendNew = 1;
SuudRevvRS485 = 1;
}
//-----------------------------------------------------------------------------------------------------------------
/******************************************************************************************************************
FUNCTON NAME: SYSCLK_Init
FUNCTION VERSION:
CREATED ON:
FUNCTION DESCRIPTION: This routine initializes the system clock to use an 20MHz crystal as its clock source.
INPUT PARAMETER: None
RETURN VALUE: None
MODIFY RECORD:
******************************************************************************************************************/
void SYSCLK_Init (void)
{
int i; //------------------------------------------------------------------------------------ delay counter
OSCXCN = 0x67; //---------------------------------------------------------- start external oscillator with
//------------------------------------------------------------ 20MHz crystal
for (i=0; i < 256; i++) ; //------------------------------------------ XTLVLD blanking interval (>1ms)
while (!(OSCXCN & 0x80)) ; //------------------------------------------ Wait for crystal osc. to settle
OSCICN = 0x88; //------------------------------------- select external oscillator as SYSCLK
//------------------------------------------ source and enable missing clock
//----------------------------------------------------------------- detector
}
//-----------------------------------------------------------------------------------------------------------------
/******************************************************************************************************************
FUNCTON NAME: PORT_Init
FUNCTION VERSION:
CREATED ON:
FUNCTION DESCRIPTION: intialize the port input and output
INPUT PARAMETER:None
RETURN VALUE:None
MODIFY RECORD:
******************************************************************************************************************/
void PORT_Init(void)
{
XBR0 = 0x05; //--------------------------------------------------------------------- Enable UART0 , SMBUS
XBR1 = 0x14; //------------------------------------------------------------------------- Enable INT0,INT1
XBR2 = 0x42; //------------------------------------------------- Enable weak pull-up , csrossbar , EMIFLE
P0MDOUT = 0xff; //------------------------------------------------- P0口为漏极开路输入
P1MDIN = 0xff; // -------------------------------------------------P1口
P1MDOUT = 0xff; //-------------------------------------------------推挽方式输出
P2MDOUT = 0xff; //------------------------------------------------- p2口为推挽输出,作为数据总线
P3MDOUT = 0xff; //------------------------------------------------- P3.3 P3.4为输出口,其余口为输入口
P74OUT = 0xff; //-------------------------------------------------推挽方式输出
P4 = 0x00;
P5 = 0x00;
P6 = 0x00;
P7 = 0x00;
EMI0CF = 0x04; //
}
//----------------------------------------------------------------------------------------------------------------
/*****************************************************************************************************************
FUNCTON NAME: UART0_Init
FUNCTION VERSION:
CREATED ON:
FUNCTION DESCRIPTION: Configure the UART using Timer1, for <baudrate> and 8-N-1.
INPUT PARAMETER:
RETURN VALUE:
MODIFY RECORD:
*****************************************************************************************************************/
void UART0_Init (void)
{
SCON0 = 0x50; //------------------------------------------------- SCON0: mode 1, 8-bit UART, enable RX
TMOD = 0x20; //-------------------------------------------------- TMOD: timer 1, mode 2, 8-bit reload
TH1 = -(SYSCLK/BAUDRATE/16); //----------------------------------- set Timer1 reload value for baudrate
TR1 = 1; //----------------------------------------------------------- start Timer1
CKCON |= 0x10; //---------------------------------------- Timer1 uses SYSCLK as time base
PCON |= 0x80; //------------------------------------------------------------- SMOD00 = 1
//TI0 = 1; //----------------------------------------------------- Indicate TX0 ready
IP = 0x10; //--------------------------------------------------------- 串口为高优先级
ES0 = 1; //------------------------------------------------- enable UART interrupts
}
//-----------------------------------------------------------------------------------------------------------------
/******************************************************************************************************************
FUNCTON NAME : init_devices
FUNCTION VERSION :
CREATED ON :
FUNCTION DESCRIPTION : 设置硬件寄存器的初始值。
还有其他的与硬件相关的初始化也可以放在这里。
INPUT PARAMETER : None
RETURN VALUE : None
MODIFY RECORD :
******************************************************************************************************************/
void Hardware_Init(void)
{
//---- 禁止看门狗
WDTCN = 0xde;
WDTCN = 0xad;
SYSCLK_Init (); //---------------晶振初始化
PORT_Init (); //---------------单片机端口初始化
UART0_Init (); //---------------串口初始化
//TL16C554复位,并初始化
RSSET_554 = 1;
DelayUS(2);
RSSET_554 = 0;
DelayMS(300);
TL16554_init();//---------------串口芯片TL16C554C初始化
Timer3_Init(); //----------------定时器3初始化
Timer2_init(); //----------------定时器2初始化
INTER_Init();
}
//----------------------------------------------------------------------------------------------------------------
/******************************************************************************************************************
FUNCTON NAME : Table_TilitStatus
FUNCTION VERSION :
CREATED ON :
FUNCTION DESCRIPTION :
INPUT PARAMETER : None
RETURN VALUE : None
MODIFY RECORD :
REMARK : _________________
断开延时定时器: Control Signal: _____| |________________
________________________
Timer Flag : _____| |_________
SoftTimer每100ms中断一次
******************************************************************************************************************/
void Table_TilitStatus(void)
{
//21---- 从正90度到正角度区
//注:I_正90度限位 下降沿
// --->> 置位A_正角度区域 、 清位A_水平区域 、 清位A_负角度区域
if(IS_NEG_EDGE(Tilit_Switch,I_T_P90))
{
SET_STATUS(Tilit_Switch,A_Table_POS);
CLR_STATUS(Tilit_Switch,A_Table_ZERO);
CLR_STATUS(Tilit_Switch,A_Table_NEG);
}
UPDATE_EDGE(Tilit_Switch,I_T_P90);
//22---- 水平位置位(抗齿轮间隙扰动) A_Table_POS(正角度区域标志)A_Table_NEG(负角度区域标志)条件避免再次置位
//注:I_0度限位 上升沿 并且 A_正角度区域标志 && V_床体倾斜断开延时定时器 计时到 标志
// --->> 置位A_水平区域 、 清位A_正角度区域 、 清位A_负角度区域
if(IS_POS_EDGE(Tilit_Switch,I_T_0))
{
if(CHECK_STATUS(Tilit_Switch,A_Table_POS) && CHECK_STATUS(Soft_Timer[Tilit_Timer],Timer_Flag))
{
SET_STATUS(Tilit_Switch,A_Table_ZERO);
CLR_STATUS(Tilit_Switch,A_Table_POS);
CLR_STATUS(Tilit_Switch,A_Table_NEG);
}
}
//注:I_0度限位 下降沿 并且 A_负角度区域标志 && V_床体倾斜断开延时定时器 计时到 标志
// --->> 置位A_水平区域 、 清位A_正角度区域 、 清位A_负角度区域
if(IS_NEG_EDGE(Tilit_Switch,I_T_0))
{
if(CHECK_STATUS(Tilit_Switch,A_Table_NEG) && CHECK_STATUS(Soft_Timer[Tilit_Timer],Timer_Flag))
{
SET_STATUS(Tilit_Switch,A_Table_ZERO);
CLR_STATUS(Tilit_Switch,A_Table_POS);
CLR_STATUS(Tilit_Switch,A_Table_NEG);
}
}
//---- 从零度到正角度区(置标志位)床体位置是其它位置标志的条件(加入 I_T_0 的常闭条件用以防止在水平限位开关有效时搬动床体运动手柄对床体旋转的扰动)
//注:A_水平区域 && !I_0度限位开关 && Q_正倾
// --->> 置位A_正角度区域 、 清位A_水平区域
if(CHECK_STATUS(Tilit_Switch,A_Table_ZERO) && !CHECK_STATUS(Tilit_Switch,I_T_0))
{
if(CHECK_STATUS(Local_Flag_1,V_Tilit_EnTilit))
{
if(IS_POS_EDGE(Control_1,C_T_TilitPOS))
{
SET_STATUS(Tilit_Switch,A_Table_POS);
CLR_STATUS(Tilit_Switch,A_Table_ZERO);
}
}
else if(CHECK_STATUS(Output_1,Q_T_TilitPOS))
{
SET_STATUS(Tilit_Switch,A_Table_POS);
CLR_STATUS(Tilit_Switch,A_Table_ZERO);
}
}
UPDATE_EDGE(Control_1,C_T_TilitPOS);
//---- 从零度到负角度区
//注:A_水平区域 && !I_0度限位开关 && Q_负倾
// --->> 置位A_负角度区域 、 清位A_水平区域
if(CHECK_STATUS(Tilit_Switch,A_Table_ZERO) && !CHECK_STATUS(Tilit_Switch,I_T_0) && CHECK_STATUS(Output_1,Q_T_TilitNEG))
{
SET_STATUS(Tilit_Switch,A_Table_NEG);
CLR_STATUS(Tilit_Switch,A_Table_ZERO);
}
//---- 到限位位置清区域位置标志位
//注:I_负90度限位 || I_正90度限位
// --->> 清位A_正角度区域 、 清位A_负角度区域
if(CHECK_STATUS(Tilit_Switch,I_T_N90) || CHECK_STATUS(Tilit_Switch,I_T_P90))
{
CLR_STATUS(Tilit_Switch,A_Table_NEG);
CLR_STATUS(Tilit_Switch,A_Table_POS);
}
//27--从负90度到达负角度区
//注:I_负90度 下降沿
// --->> 置位A_负角度区域 、 清位A_正角度区域
if(IS_NEG_EDGE(Tilit_Switch,I_T_N90))
{
SET_STATUS(Tilit_Switch,A_Table_NEG);
CLR_STATUS(Tilit_Switch,A_Table_POS);
}
UPDATE_EDGE(Tilit_Switch,I_T_N90);
//69--PHILIPS控制台负倾允许在水平位切换;床体在水平位置时,逆时针运动命令的上升沿则置位负倾允许标志
if(CHECK_STATUS(Local_Flag_2,V_GIM_PMS))
{
if(IS_POS_EDGE(Control_1,C_T_TilitNEG))
{
if(CHECK_STATUS(Tilit_Switch,A_Table_ZERO))
{
SET_STATUS(Local_Flag_1,V_Tilit_EnTilit);
}
}
UPDATE_EDGE(Control_1,C_T_TilitNEG);
if(!CHECK_STATUS(Tilit_Switch,A_Table_ZERO))
{
CLR_STATUS(Local_Flag_1,V_Tilit_EnTilit);
}
}
}
//---------------------------------------------------------------------------------------------------------------
/****************************************************************************************************************
FUNCTON NAME : Table_TilitExecute
FUNCTION VERSION :
CREATED ON :
FUNCTION DESCRIPTION :
INPUT PARAMETER :
RETURN VALUE :
MODIFY RECORD :
*****************************************************************************************************************/
void Table_TilitExecute(void)
{
//1--正转输出控制
//注:C_正倾 && !C_负倾 && !Q_负倾
// --->> 启动 Q_正倾
if(CHECK_STATUS(Control_1,C_T_TilitPOS) && !CHECK_STATUS(Control_1,C_T_TilitNEG) && !CHECK_STATUS(Output_1,Q_T_TilitNEG))
{
SET_STATUS(Output_1,Q_T_TilitPOS);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -