|
发表于 2010-9-17 12:50:56
|
显示全部楼层
u32 App56_SPD(u32 Address) //脉冲密度(P型指令)
{
u16 S1_16bit,S2_16bit/*,D_16bit*/;
//u32 S1_32bit,S2_32bit,D_32bit;
u8 b_exe,b_exe_last;
b_exe=IF_execute();
b_exe_last=Get_lastState(Address); //取last位
if(b_exe)
{
S1_16bit=Get_u16_data(Address+2,0); //取得Xn标号
S2_16bit=Get_u16_data(Address+6,0); //取得定时时间(ms)
if(b_exe_last) //初始化已经完成,计数处理中
{
//D_16bit=Get_u16_data(Address+10,2); //取得定时时间(ms)
if(*(u16*)(SPD_X0+(S1_16bit-0x400)*4)==0) //定时时间到
{
Put_u16_data(Address+10,0,1); //扫描频率备份清零
Put_u16_data(Address+10,*(u16*)(SPD_X0_Lock+(S1_16bit-0x400)*4),0); //扫描频率取出
*(u16*)(X_CNT_BASE+(S1_16bit-0x400)*4)=0;
*(u16*)(SPD_X0+(S1_16bit-0x400)*4)=S2_16bit;
}
else
{
Put_u16_data(Address+10,*(u16*)(X_CNT_BASE+(S1_16bit-0x400)*4),1); //扫描频率变动
Put_u16_data(Address+10,*(u16*)(SPD_X0+(S1_16bit-0x400)*4),2); //剩余定时时间修正
}
}
else //初始化,判断是否执行
{
if((*(u32*)(X0_En+(S1_16bit-0x400)*4))==0) //高速输入还未置上
{
(*(u32*)(X0_En+(S1_16bit-0x400)*4))=1; //置互斥标记,
Put_u16_data(Address+10,S2_16bit,2); //剩余时间放在 D+2 中
// 设置IO口为外部中断输入计数,清除计数值
Hign_Speed_Port_init(S1_16bit-0x400,4,1); //软件计数模式
*(u16*)(SPD_X0+(S1_16bit-0x400)*4)=S2_16bit; //填时间
*(u32*)(X_CNT_BASE+(S1_16bit-0x400)*4)=0;
Put_u16_data(Address+10,0,1);
}
else //高速输入已被占用,退出
{
return (Address+2*7);
}
}
}
else //触电下降沿
{
if(b_exe_last) //释放资源
{
*(u16*)(SPD_X0+(S1_16bit-0x400)*4)=0; //清零时间
Hign_Speed_Port_init(S1_16bit-0x400,4,0);
}
}
Set_lastState(Address,b_exe); //b_exe => last_bit
return (Address+2*7);
} |
|