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

📄 hs.c

📁 SDH光端机支路单元盘开发程序
💻 C
字号:
/****************************************/
/* Copyright (c) 2004, 通信工程学院戴佳 */
/* All rights reserved.                 */
/* 作    者:戴佳                       */
/****************************************/

//Mapper: A0-10  211=2k*4=8K     A000H-A7FFH    1M_SEL
//A800H-AFFFH    2M_SEL
//B000H-B7FFH    3M_SEL
//B800H-BFFFH    4M_SEL
//Transceiver: A0-9  210=1K*4=4K  C000H-C3FFH    1T_CS
//                                C400H-C7FFH    2T_CS
//                                C800H-CBFFH    3T_CS
//                                CC00H-CFFFH    4T_CS
//双口RAM:A0-12  213=8K        8000H-9FFFH    IDT_CS
//RAM HM62256:A0-14  215=32K   0000H-7FFFH    HM_CS
//SEM : D000H-DxxxH  SEML
//外部程序存储区:~EA=0区分内部ROM和外部ROM的公共地址区,~PSEN=0
//ROM AM27C512:A0-15  216=64K  0000H-FFFFH

#include <other.h>

void M1_Init();				//初始化
void M2_Init();
void M3_Init();
void M4_Init();
void T1_Init();
void T2_Init();
void T3_Init();
void T4_Init();
void LoadM1_C();			//初始化时配置特殊寄存器
void LoadM2_C();			//初始化时配置特殊寄存器
void LoadM3_C();			//初始化时配置特殊寄存器
void LoadM4_C();			//初始化时配置特殊寄存器
void PerQ_Init();
void Perf_query();			//性能查询
void Int_query();			//中断队列查询
void Ram2p_q();				//双口RAM查询

void NotifyProv();			//通知主控二次配置
void Provision();
void Alm_query();
void OpenInt();

bit get_sem(uchar *sem_type);

uchar f40ms;				//40ms标志
uchar f1s;					//1s标志
uchar f15min;				//15min标志
uchar i40ms;
uint i1s;
uchar i15min;
uchar ius;
uint xdata CounterBIP[16];
uint xdata CounterFEBE[16];
uint xdata CounterES[16];
uint xdata CounterSES[16];
uint xdata CounterUS[16];
uchar xdata FgESEn[16];  	//越限使能标志
uchar xdata FgSESEn[16];
uchar xdata FgUSEn[16];
uchar xdata ESAlm[16];  	//性能越限告警标志
uchar xdata SESAlm[16];
uchar xdata USAlm[16];
uchar xdata USFlag[16];  	//不可用时间标示
uchar xdata k[16];
uchar xdata m[16];
uchar FgProEd;  			//二次配置完成标志
uchar xdata f[16]; 			//16个2M使用标志
uchar xdata *AddrDPR;   	//双口RAM起始地址
uchar  Alm_Rd;				//告警队列相对读指针
uchar  Alm_Wr;				//告警队列相对写指针
uchar  Pol_Rd;				//轮询队列相对读指针
uchar  Pol_Wr;				//轮询队列相对写指针
uchar  Pro_Rd;				//配置队列相对读指针
uchar  Pro_Wr;				//配置队列相对写指针

uchar xdata FgSDAlm[16];
uchar xdata FgADLOC;
uchar xdata FgAALOC;
uchar xdata FgAUAIS;
uchar xdata FgADH4E;
uchar xdata FgRFFE[16];
uchar xdata FgTAFE[16];
uchar xdata FgTLOS[16];
uchar xdata FgTLOC[16];
uchar xdata FgTDAIS[16];
uchar xdata FgAAIS[16];
uchar xdata FgALOP[16];
uchar xdata FgASIZE[16];
uchar xdata FgANDF[16];
uchar xdata FgAREI[16];
uchar xdata FgARDI[16];
uchar xdata FgARFI[16];
uchar xdata FgAUNEQ[16];
uchar xdata FgASLER[16];
uchar xdata FgAJ2LOL[16];
uchar xdata FgAJ2TIM[16];
uchar xdata FgPEREn[16];

uint xdata ESThre[16];   	//性能门限初始值
uint xdata SESThre[16];
uint xdata USThre[16];

uchar Int0_flag;			//中断队列标志
uchar Int1_flag;
void Timer_int() interrupt 1 using 1
{
  TH0=0x70;					//预置计数初值
  TL0=0x00;
  f40ms=1;
  i40ms++;

  if (i40ms==25)
  {
    f1s=1;
    i40ms=0;
    i1s++;
    if (i1s==900)  			//15 minutes performance
    {
      f15min=1;
      i1s=0;
    }
  }
}

void Out_int0() interrupt 0 using 1
{
  uchar ch;
  Int0_flag=1;				//表示外部中断0,实际是双口RAM产生的中断
  ch=DP_RAM_INTR;    		//读清中断
}

void delay1ms()
{
  uchar j;
  for (j=0;j<125;j++)
  {
    j++;
    j--;
  }
}

main()
{
  uchar t;
  uchar tmp1;
  uint delcou;
  WDI=0;
  for (delcou=1;delcou<1000;delcou++)   //delay 1s for chip configuration
  {
    delay1ms();
    WDI=1;
    WDI=0;
  }

  Int0_flag=0;
  Int1_flag=1;
  f40ms=0;								//40ms标志
  f1s=0;								//1s标志
  f15min=0;								//15min标志
  i40ms=0;
  i1s=0;
  i15min=0;
  ius=0;
  FgProEd=0;   

  EA=0;									//关中断

  Alm_Rd=0;
  Alm_Wr=0;
  Pol_Rd=0;
  Pol_Wr=0;
  Pro_Rd=0;
  Pro_Wr=0;


  M1_Init();
  WDI=1;
  WDI=0;
  M4_Init();
  WDI=1;
  WDI=0;
  M2_Init();
  WDI=1;
  WDI=0;
  M3_Init();
  WDI=1;
  WDI=0;

  WDI=1;
  WDI=0;
  T4_Init();
  T2_Init();
  T3_Init();
  T1_Init();

  ALM_SEM=0xFF;  						//drop_sem
  POL_SEM=0xFF;
  PRO_SEM=0xFF;

  AddrDPR=0x8000;

  *(AddrDPR+1)=ALMQ_ST_ADDR_L;
  *(AddrDPR)=ALMQ_ST_ADDR_H;
  *(AddrDPR+2)=ALMQ_LEN;
  *(AddrDPR+6)=POLQ_ST_ADDR_L;
  *(AddrDPR+5)=POLQ_ST_ADDR_H;
  *(AddrDPR+7)=POLQ_LEN;
  *(AddrDPR+11)=PROQ_ST_ADDR_L;
  *(AddrDPR+10)=PROQ_ST_ADDR_H;
  *(AddrDPR+12)=PROQ_LEN;
  *(AddrDPR+16)=PERQ_ST_ADDR_L;
  *(AddrDPR+15)=PERQ_ST_ADDR_H;

  WDI=1;
  WDI=0;

  if (get_sem(&ALM_SEM)==1)
  {
    *(AddrDPR+3)=Alm_Rd;
    *(AddrDPR+4)=Alm_Wr;
  }
  ALM_SEM=0xFF;
  if (get_sem(&POL_SEM)==1)
  {
    *(AddrDPR+8)=Pol_Rd;
    *(AddrDPR+9)=Pol_Wr;
  }
  POL_SEM=0xFF;
  if (get_sem(&PRO_SEM)==1)
  {
    *(AddrDPR+13)=Pro_Rd;
    *(AddrDPR+14)=Pro_Wr;
  }
  PRO_SEM=0xFF;
  WDI=1;
  WDI=0;

  for (t=0;t<16;t++)    				//初始化
  {
    *(AddrDPR+18+t)=0xFF;  				//全部赋为0xFF,16字节留给主控用
    CounterBIP[t]=0;
    CounterFEBE[t]=0;
    CounterES[t]=0;  					//used for performance counting
    CounterSES[t]=0; 					//used for performance counting
    CounterUS[t]=0;  					//used for performance counting
    k[t]=0;      						//used for performance counting
    m[t]=0;      						//used for performance counting
    USFlag[t]=0; 						//used for performance counting
    f[t]=0;      						//2M时隙映射配置标志赋初值
    ESAlm[t]=0;
    SESAlm[t]=0;
    USAlm[t]=0;
    ESThre[t]=900;     					//性能门限初始默认值900
    SESThre[t]=900;
    USThre[t]=900;
    FgSDAlm[t]=0;
    FgRFFE[t]=0;
    FgTAFE[t]=0;
    FgTLOS[t]=0;
    FgTLOC[t]=0;
    FgTDAIS[t]=0;
    FgAAIS[t]=0;
    FgALOP[t]=0;
    FgASIZE[t]=0;
    FgANDF[t]=0;
    FgAREI[t]=0;
    FgARDI[t]=0;
    FgARFI[t]=0;
    FgAUNEQ[t]=0;
    FgASLER[t]=0;
    FgAJ2LOL[t]=0;
    FgAJ2TIM[t]=0;

    FgPEREn[t]=1;     					//初始打开性能越限使能
  }
  FgADLOC=0;
  FgAALOC=0;
  FgAUAIS=0;
  FgADH4E=0;
  WDI=1;
  WDI=0;

  FgProEd=1;   

  NotifyProv();    						//通知主控进行二次配置
  Provision();     						//二次配置
  //Green Light Red Dark
  Led_C1=0;
  Led_C2=1;
  tmp1=DP_RAM_INTR;  					//清除中断
  OpenInt(); 							//通过中断掩码打开中断

  EA=1;									//开CPU中断
  EX0=1;								//开外部中断0 ,二次配置通过双口RAM中断进行
  ET0=1;								//开T/C0中断
  PX0=0;								//外部中断低优先级
  PT0=1;								//计数器高优先级
  TMOD=0x01;							//T/C0工作在方式1
  TH0=0x70;								//预置计数初值
  TL0=0x00;
  TR0=1;								//启动T/C0

  M1_052=M1_052|0x40;    				//计数器清零
  M1_082=M1_082|0x40;
  M1_0B2=M1_0B2|0x40;
  M1_0E2=M1_0E2|0x40;
  M2_052=M2_052|0x40;
  M2_082=M2_082|0x40;
  M2_0B2=M2_0B2|0x40;
  M2_0E2=M2_0E2|0x40;
  M3_052=M3_052|0x40;
  M3_082=M3_082|0x40;
  M3_0B2=M3_0B2|0x40;
  M3_0E2=M3_0E2|0x40;
  M4_052=M4_052|0x40;
  M4_082=M4_082|0x40;
  M4_0B2=M4_0B2|0x40;
  M4_0E2=M4_0E2|0x40;

 PerQ_Init();  							//性能队列初始化,向固定位置写固定值

  WDI=1;
  WDI=0;


  while(1)
  {

    Int_query(); 						//中断队列查询
    WDI=1;
    WDI=0;
    Alm_query(); 						//非中断告警查询

    Perf_query();						//性能查询
    WDI=1;
    WDI=0;
    
  }
}

//中断查询函数

void Int_query()
{
  if (Int0_flag==1)
  {
    Int0_flag=0;
    WDI=1;
    WDI=0;
    Ram2p_q();			//查询双口ram
  }
}

⌨️ 快捷键说明

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