平车主控板(运维板)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

256 lines
5.2 KiB

#include "bsp_relay.h"
#include "../msp/pwm.h"
#include "../app/app_paraid.h"
#if 0 //可惜sbit不能作为参数值
U8 g_relay_data[RELAY_NUM][2] =
{
RELAY_PRINTER, ULN1B,
RELAY_PC, ULN2B,
RELAY_LED, ULN3B,
RELAY_LED_FUYIN, ULN4B,
RELAY_LED_RENXIANG, ULN5B,
RELAY_12V_RESV, 5ULN6B,
};
#endif
void _ULN1B_HANDLER(U8 oper)
{
ULN1B = oper;
}
void _ULN2B_HANDLER(U8 oper)
{
ULN2B = oper;
}
void _ULN3B_HANDLER(U8 oper)
{
ULN3B = oper;
}
void _ULN4B_HANDLER(U8 oper)
{
ULN4B = oper;
}
void _ULN5B_HANDLER(U8 oper)
{
ULN5B = oper;
}
void _ULN6B_HANDLER(U8 oper)
{
ULN6B = oper;
}
void _ULN8B_HANDLER(U8 oper)
{
ULN8B = oper;
}
void _CBC_HANDLER(U8 oper)
{
switch(oper)
{
case RELAY_KAI:
D_pwer12_off();
break;
case RELAY_BI:
D_pwer12_on();
break;
default:
break;
}
}
#if 0
struct _s_relay_oper s_relay_oper[RELAY_NUM] =
{
//status这里全部为RELAY_BI,如果系统看门狗重启,值会保存在flash_page0,从而读取设定
//oper_max_time这里全部为0,真实值由flash->page1设定
//relay_name, relay_handler, initital, status, oper_max_time, oper_stmp
{RELAY_PRINTER, _ULN1B_HANDLER, RELAY_BI, RELAY_BI, 0, 0}, //常闭
{RELAY_PC, _ULN2B_HANDLER, RELAY_KAI, RELAY_KAI, 0, 0}, //常开
{RELAY_LED, _ULN3B_HANDLER, RELAY_BI, RELAY_BI, 0, 0}, //常闭
{RELAY_LED_FUYIN, _ULN4B_HANDLER, RELAY_KAI, RELAY_KAI, 0, 0}, //常开
{RELAY_LED_RENXIANG,_ULN5B_HANDLER, RELAY_KAI, RELAY_KAI, 0, 0}, //常开
{RELAY_12V_RESV, _ULN6B_HANDLER, RELAY_BI, RELAY_BI, 0, 0},
{RELAY_PRINTER_1, _ULN8B_HANDLER, RELAY_BI, RELAY_BI, 0, 0}, //常闭
{RELAY_CBC, _CBC_HANDLER, RELAY_NONE, RELAY_NONE, 0, 0}, //无常闭常开特性
};
U8 L2_relay_convert_and_do(int i,int val)
{
U8 oper = val;
if(s_relay_oper[i].relay_initial == RELAY_BI) //常闭
{
oper = val;
}
else if(s_relay_oper[i].relay_initial == RELAY_KAI) //常开
{
oper = !val;
}
return oper;
}
#endif
#if 0
void L1_relay_on(vU8 n,vU8 val)
{
U8 i = 0;
for(i=0;i<RELAY_NUM;i++)
{
if(s_relay_oper[i].relay == n)
{
if(n == RELAY_PC) //PC属于按键,每次发送指令 都代表按下(断开)
{
if(val == RELAY_KAI)
{
s_task_relay.pc = PC_GUANJI;
}
else
{
s_task_relay.pc = PC_KAIJI;
}
s_task_relay.pc_stmp = s_nos_tick.t_1s;
val = RELAY_BI; //短路
}
s_relay_oper[i].relay_handler(L2_relay_convert_and_do(i,val));
s_relay_oper[i].relay_status = val;
s_relay_oper[i].relay_oper_stmp = s_nos_tick.t_1s;
}
}
}
//#else
void L1_relay_on(vU8 n,vU8 val)
{
U8 i = 0;
for(i=0;i<RELAY_NUM;i++)
{
if(s_relay_oper[i].relay == n)
{
#ifdef BOARD_MAIN04_GM35
if(n == RELAY_PC) //PC属于按键,每次发送指令 都代表按下(断开)
{
if(val == RELAY_KAI)
{
s_task_relay.pc = PC_GUANJI;
}
else
{
s_task_relay.pc = PC_KAIJI;
}
s_task_relay.pc_stmp = s_nos_tick.t_1s;
val = RELAY_KAI;
}
#elif defined BOARD_MAIN03_A9
//xxx
#endif
if(n == RELAY_12V_RESV) //12v继电器保留,暂不工作,以减少功率
{
val = s_relay_oper[i].relay_initial;
}
s_relay_oper[i].relay_handler(val);
s_relay_oper[i].relay_status = val;
s_relay_oper[i].relay_oper_stmp = s_nos_tick.t_1s;
}
}
}
#endif
#if 0
void L2_do_relay(U8 *buf)
{
U8 val = buf[0], index = buf[1] ,i = 0;
if(index == 0xFF) //操作所有继电器
{
if(val == RELAY_BI)
{
L2_relay_poweron_all();
}
else
{
L2_relay_poweroff_all();
}
}
else
{
for(i=0;i<RELAY_NUM;i++)
{
if((index >> i) & 0x1)
{
// L1_relay_on(i,((val >> i) & 0x1 == PROTO_RELAY_KAI ? RELAY_KAI : RELAY_BI));
L1_relay_on(i, val >> i & 0x1);
}
}
}
}
#endif
#if 0
//全关(断开)
void L2_relay_poweroff_all(void)
{
_CBC_HANDLER(RELAY_KAI);
L1_relay_on(RELAY_PC, RELAY_KAI);
L1_relay_on(RELAY_PRINTER, RELAY_KAI);
L1_relay_on(RELAY_PRINTER_1, RELAY_KAI);
}
void L2_relay_poweron_all(void)
{
U8 i = 0;
_CBC_HANDLER(RELAY_BI);
for(i=0;i<RELAY_NUM;i++)
{
if(s_relay_oper[i].relay == RELAY_CBC)
{
continue;
}
else if(s_relay_oper[i].relay == RELAY_PC)
{
//开机,短路2-3s
L1_relay_on(s_relay_oper[i].relay, RELAY_BI);
}
else
{
L1_relay_on(s_relay_oper[i].relay, s_relay_oper[i].relay_initial);
}
}
}
#endif
void L2_relay_init(void)
{
ULN1B = 0;
ULN2B = 0;
ULN3B = 0;
ULN4B = 0;
ULN5B = 0;
ULN6B = 0;
ULN8B = 0;
_CBC_HANDLER(RELAY_BI); //闭合
//set output
BITN_0(P1M1,BITN5);BITN_1(P1M0,BITN5);
BITN_0(P6M1,BITN2);BITN_1(P6M0,BITN2);
BITN_0(P6M1,BITN1);BITN_1(P6M0,BITN1);
BITN_0(P6M1,BITN0);BITN_1(P6M0,BITN0);
BITN_0(P1M1,BITN3);BITN_1(P1M0,BITN3);
BITN_0(P1M1,BITN4);BITN_1(P1M0,BITN4);
BITN_0(P4M1,BITN4);BITN_1(P4M0,BITN4);
//继电器上电初始化 继电器 1响应,0恢复默认状态(常开 or 常闭)
ULN1B = 0;
ULN2B = 0;
ULN3B = 0;
ULN4B = 0;
ULN5B = 0;
ULN6B = 0;
ULN8B = 0;
BITN_0(P6M1,BITN4);BITN_1(P6M0,BITN4);
BITN_0(P6M1,BITN5);BITN_1(P6M0,BITN5);
_CBC_HANDLER(RELAY_BI); //闭合
}