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

📄 alarm.c

📁 单片机程序代码,经过很详细的测试.呵呵,硬件相关.
💻 C
📖 第 1 页 / 共 3 页
字号:
#include <REG54.H>
#include "rc7820.h"
#include "rc7860.h"
#include "f2rc7820.h"
#include "f2rc7860.h"
#include "se0111.h"
#include "se0121.h"
#include "cmd_para_save.h"

extern unsigned long int xdata commandid;                         	//表示命令代码的变量
extern unsigned char f2rc7820_rd(unsigned char f2addr) large reentrant;
extern unsigned char f2rc7860_rd(unsigned int f2addr) large reentrant;
extern void f2rc7860_wr(unsigned int f2addr,unsigned char value) large reentrant;
extern unsigned char se0111_reg_rd(unsigned char Haddr,unsigned char Laddr,unsigned char slot);
extern unsigned char se0121_reg_rd(unsigned char Laddr,unsigned char slot);
extern unsigned char get_clock_state(unsigned char clksource);
extern void SetResRdyTbl(unsigned char prio) large reentrant;
extern unsigned char GetResRdyTbl(unsigned char prio) large reentrant;
extern unsigned char xdata tx_buf[];
extern unsigned char xdata tx_buf_pointer;
extern bit tx_done;
extern unsigned char xdata start_flg[4];
extern unsigned char xdata start_flg_EOS[4];
extern unsigned char xdata board_type[4][2];	//定义插盘类型数组,第一位表示槽号,第二位表示盘号
extern unsigned char xdata clk_source;
extern unsigned char xdata timeslot_2M[3][21];				//2M时隙配置标志位,1表示配置时隙,0表示该时隙删除

unsigned char xdata LOS_TU_2M[3][21];								//硬件电路检测的支路信号LOS
unsigned char xdata int_alarm[4][4] = {{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}};
//保存中断告警数组,行表示某光口,列表示该光口的告警值
unsigned char xdata check_alarm_mcb[5] = {0,0,0,0,0};				//查询MCB盘的其他非中断告警
unsigned char xdata check_alarm_otb[3] = {0,0,0};					//查询OTB盘的其他非中断告警
unsigned char xdata check_alarm_2M[3][21][2] = {{{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}},{{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}},{{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}}};
//保存2M盘告警数组,[3]表示3个2M盘,[21]表示21个支路,[2]表示告警值
unsigned char xdata frame_flg_before[15] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};	//告警标志位,一秒前的
unsigned char xdata frame_flg_work[15] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};	//告警标志位,当前一秒的
unsigned char xdata check_alarm_Eos[3][3] = {{0,0,0},{0,0,0},{0,0,0}};
//保存Eos盘的告警数组,第一个[3]表示3个Eos盘,后一个[3]表示告警的内容
unsigned char xdata frame_flg_before_eos[3] = {0,0,0};
unsigned char xdata frame_flg_work_eos[3] = {0,0,0};

void get_2M_reg(unsigned char tnum,unsigned char addrh1,unsigned char addrl1,unsigned char addrh2,unsigned char addrl2,unsigned char slot){
//取2M盘的告警寄存器值存入数组,tnum表示支路号,slot表示2M盘号
	if (timeslot_2M[slot][tnum]){
		check_alarm_2M[slot][tnum][0] = se0111_reg_rd(addrh1,addrl1,slot + 1) & 0xCC;	//得到2M盘支路1的AIS、LOP、RDI、RFI
		if (check_alarm_2M[slot][tnum][0] >= 0x80){
			check_alarm_2M[slot][tnum][0] = 0x80;
		}
		else if (check_alarm_2M[slot][tnum][0] >= 0x40){
			check_alarm_2M[slot][tnum][0] = 0x40;
		}
		if (se0111_reg_rd(addrh2,addrl2,slot + 1) == 0){		//判断V5字节的bit7-5,是否有未装载信号
			check_alarm_2M[slot][tnum][0] |= 0x20;
		}
		if (LOS_TU_2M[slot][tnum] != 0){						//判断硬件是否出现该支路的LOS
			check_alarm_2M[slot][tnum][0] |= 0x10;
		}
	}
	else check_alarm_2M[slot][tnum][0] = 0;
}


void get_alarm_value(void){
//每秒收集各类告警函数
unsigned char xdata temp;
unsigned char xdata bnum;
unsigned char xdata i;
unsigned char xdata j;
unsigned char xdata k;

	int_alarm[0][3] = (Ia3_a >> 4) & 0x03;
	Intmask3_a = Ia3_a;
	int_alarm[0][2] = Ia2_a & 0xF8;
	Intmask2_a = Ia2_a;
	int_alarm[0][1] = Ia1_a & 0xF0;
	Intmask1_a = Ia1_a;
	int_alarm[0][0] = Ia0_a;										//光口0中断写入数组
	Intmask0_a = Ia0_a;												//同时将中断值写入屏蔽寄存器
	frame_flg_work[0] = int_alarm[0][0] | int_alarm[0][1] | int_alarm[0][2] | int_alarm[0][3];	//当前是否有告警

	int_alarm[1][3] = (Ia3_b >> 4) & 0x03;
	Intmask3_b = Ia3_b;
	int_alarm[1][2] = Ia2_b & 0xF8;
	Intmask2_b = Ia2_b;
	int_alarm[1][1] = Ia1_b & 0xF0;
	Intmask1_b = Ia1_b;
	int_alarm[1][0] = Ia0_b;										//光口1中断
	Intmask0_b = Ia0_b;
	frame_flg_work[1] = int_alarm[1][0] | int_alarm[1][1] | int_alarm[1][2] | int_alarm[1][3];

	if (start_flg[0] == 0){
		temp = f2rc7860_rd(F2Ia0_a);									//光口2中断,即光分支盘光口1
		f2rc7860_wr(F2Intmask0_a,temp);
		int_alarm[2][0] = temp;	
		temp = f2rc7860_rd(F2Ia1_a);
		f2rc7860_wr(F2Intmask1_a,temp);
		int_alarm[2][1] = temp & 0xF0;
		temp = f2rc7860_rd(F2Ia2_a);
		f2rc7860_wr(F2Intmask2_a,temp);
		int_alarm[2][2] = temp & 0xF8;
		temp = f2rc7860_rd(F2Ia3_a);
		f2rc7860_wr(F2Intmask3_a,temp);
		int_alarm[2][3] = (temp >> 4) & 0x03;
		frame_flg_work[2] = int_alarm[2][0] | int_alarm[2][1] | int_alarm[2][2] | int_alarm[2][3];

		temp = f2rc7860_rd(F2Ia0_b);									//光口3中断,即光分支盘光口2
		f2rc7860_wr(F2Intmask0_b,temp);
		int_alarm[3][0] = temp;	
		temp = f2rc7860_rd(F2Ia1_b);
		f2rc7860_wr(F2Intmask1_b,temp);
		int_alarm[3][1] = temp & 0xF0;
		temp = f2rc7860_rd(F2Ia2_b);
		f2rc7860_wr(F2Intmask2_b,temp);
		int_alarm[3][2] = temp & 0xF8;
		temp = f2rc7860_rd(F2Ia3_b);
		f2rc7860_wr(F2Intmask3_b,temp);
		int_alarm[3][3] = (temp >> 4) & 0x03;
		frame_flg_work[3] = int_alarm[3][0] | int_alarm[3][1] | int_alarm[3][2] | int_alarm[3][3];
		f2rc7860_wr(F2Rdint_clr,0x40);
	}

	check_alarm_mcb[0] = (Reflos_reg1 >> 4) & 0x0C;					//MCB盘其它告警查询,时钟丢失查询
	check_alarm_mcb[1] = Reflos_reg2 & 0x0A;
	check_alarm_mcb[2] &= 0x02;										//清除MCB盘时钟源丢失
	temp = get_clock_state(clk_source);
	if (temp >> 4 == 0){
		check_alarm_mcb[2] |= 0x01;									//将时钟源状态写入数组
	}
	frame_flg_work[4] = check_alarm_mcb[0] | check_alarm_mcb[1] | check_alarm_mcb[2] |check_alarm_mcb[3] | check_alarm_mcb[4];
	
	temp = (f2rc7820_rd(F2Reflos_reg1) >> 4) & 0x08;				//OTB盘其它告警查询,时钟丢失查询
	temp |= (f2rc7820_rd(F2Reflos_reg1) >> 4) & 0x04;
	check_alarm_otb[0] = temp;
	frame_flg_work[5] = check_alarm_otb[0] |check_alarm_otb[1] |check_alarm_otb[2];

	P1 = 0x20;														//得到2M盘1的21个支路los信号
	for (temp = 0; temp	<= 7; temp++){
		LOS_TU_2M[0][temp] = (XBYTE[0xA000] >> temp) & 0x01;
		LOS_TU_2M[0][temp + 8] = (XBYTE[0xAC00] >> temp) & 0x01;
	}
	LOS_TU_2M[0][16] = XBYTE[0xB000] & 0x01;
	LOS_TU_2M[0][17] = (XBYTE[0xB000] >> 1) & 0x01;
	LOS_TU_2M[0][18] = (XBYTE[0xB000] >> 2) & 0x01;
	LOS_TU_2M[0][19] = (XBYTE[0xB000] >> 3) & 0x01;
	LOS_TU_2M[0][20] = (XBYTE[0xB000] >> 4) & 0x01;

	P1 = 0x60;														//得到2M盘2的21个支路los信号
	for (temp = 0; temp	<= 7; temp++){
		LOS_TU_2M[1][temp] = (XBYTE[0xA000] >> temp) & 0x01;
		LOS_TU_2M[1][temp + 8] = (XBYTE[0xAC00] >> temp) & 0x01;
	}
	LOS_TU_2M[1][16] = XBYTE[0xB000] & 0x01;
	LOS_TU_2M[1][17] = (XBYTE[0xB000] >> 1) & 0x01;
	LOS_TU_2M[1][18] = (XBYTE[0xB000] >> 2) & 0x01;
	LOS_TU_2M[1][19] = (XBYTE[0xB000] >> 3) & 0x01;
	LOS_TU_2M[1][20] = (XBYTE[0xB000] >> 4) & 0x01;

	P1 = 0x40;														//得到2M盘3的21个支路los信号
	for (temp = 0; temp	<= 7; temp++){
		LOS_TU_2M[2][temp] = (XBYTE[0xA000] >> temp) & 0x01;
		LOS_TU_2M[2][temp + 8] = (XBYTE[0xAC00] >> temp) & 0x01;
	}
	LOS_TU_2M[2][16] = XBYTE[0xB000] & 0x01;
	LOS_TU_2M[2][17] = (XBYTE[0xB000] >> 1) & 0x01;
	LOS_TU_2M[2][18] = (XBYTE[0xB000] >> 2) & 0x01;
	LOS_TU_2M[2][19] = (XBYTE[0xB000] >> 3) & 0x01;
	LOS_TU_2M[2][20] = (XBYTE[0xB000] >> 4) & 0x01;
	P1 = 0xFF;

	for (bnum = 0; bnum <= 2; bnum++){
		if (start_flg[bnum + 1] == 0){								//判断2M盘是否在盘位上
			k = 0;
			for (i = 0; i < 5; i++)
			{
				for (j = 0; j < 4; j++)
				{
					get_2M_reg(k,Stat_Arx_0H + (i * 8),Stat_Arx_0L + (j * 0x30),V5_Arx_0H + (i * 8),V5_Arx_0L + (j * 0x30),bnum);
					k += 1;
				}
			}

			get_2M_reg(20,Stat_Arx_20H,Stat_Arx_20L,V5_Arx_20H,V5_Arx_20L,bnum);

/***************************************************************************
			get_2M_reg(0,Stat_Arx_0H,Stat_Arx_0L,V5_Arx_0H,V5_Arx_0L,bnum);
			get_2M_reg(1,Stat_Arx_1H,Stat_Arx_1L,V5_Arx_1H,V5_Arx_1L,bnum);
			get_2M_reg(2,Stat_Arx_2H,Stat_Arx_2L,V5_Arx_2H,V5_Arx_2L,bnum);
			get_2M_reg(3,Stat_Arx_3H,Stat_Arx_3L,V5_Arx_3H,V5_Arx_3L,bnum);
			get_2M_reg(4,Stat_Arx_4H,Stat_Arx_4L,V5_Arx_4H,V5_Arx_4L,bnum);
			get_2M_reg(5,Stat_Arx_5H,Stat_Arx_5L,V5_Arx_5H,V5_Arx_5L,bnum);
			get_2M_reg(6,Stat_Arx_6H,Stat_Arx_6L,V5_Arx_6H,V5_Arx_6L,bnum);
			get_2M_reg(7,Stat_Arx_7H,Stat_Arx_7L,V5_Arx_7H,V5_Arx_7L,bnum);
			get_2M_reg(8,Stat_Arx_8H,Stat_Arx_8L,V5_Arx_8H,V5_Arx_8L,bnum);
			get_2M_reg(9,Stat_Arx_9H,Stat_Arx_9L,V5_Arx_9H,V5_Arx_9L,bnum);
			get_2M_reg(10,Stat_Arx_10H,Stat_Arx_10L,V5_Arx_10H,V5_Arx_10L,bnum);
			get_2M_reg(11,Stat_Arx_11H,Stat_Arx_11L,V5_Arx_11H,V5_Arx_11L,bnum);
			get_2M_reg(12,Stat_Arx_12H,Stat_Arx_12L,V5_Arx_12H,V5_Arx_12L,bnum);
			get_2M_reg(13,Stat_Arx_13H,Stat_Arx_13L,V5_Arx_13H,V5_Arx_13L,bnum);
			get_2M_reg(14,Stat_Arx_14H,Stat_Arx_14L,V5_Arx_14H,V5_Arx_14L,bnum);
			get_2M_reg(15,Stat_Arx_15H,Stat_Arx_15L,V5_Arx_15H,V5_Arx_15L,bnum);
			get_2M_reg(16,Stat_Arx_16H,Stat_Arx_16L,V5_Arx_16H,V5_Arx_16L,bnum);
			get_2M_reg(17,Stat_Arx_17H,Stat_Arx_17L,V5_Arx_17H,V5_Arx_17L,bnum);
			get_2M_reg(18,Stat_Arx_18H,Stat_Arx_18L,V5_Arx_18H,V5_Arx_18L,bnum);
			get_2M_reg(19,Stat_Arx_19H,Stat_Arx_19L,V5_Arx_19H,V5_Arx_19L,bnum);
			get_2M_reg(20,Stat_Arx_20H,Stat_Arx_20L,V5_Arx_20H,V5_Arx_20L,bnum);
**********************************************************************************/
		}
		if (start_flg_EOS[bnum + 1] == 0){
			i = se0121_reg_rd(Eos_clock,bnum + 1);	//得到EOS盘的时隙配置个数
			i = (i >> 3) & 0x07;
			check_alarm_Eos[bnum][0] = se0121_reg_rd(A_AIS,bnum + 1);
//			check_alarm_Eos[bnum][0] &= 0x1F;
			check_alarm_Eos[bnum][1] = se0121_reg_rd(A_LOP,bnum + 1);
//			check_alarm_Eos[bnum][1] &= 0x1F;
			switch (i)								//对没有配置的时隙做出屏蔽
			{
				case 1: check_alarm_Eos[bnum][0] &= 0x01;
						check_alarm_Eos[bnum][1] &= 0x01;
						break;
				case 2: check_alarm_Eos[bnum][0] &= 0x03;
						check_alarm_Eos[bnum][1] &= 0x03;
						break;
				case 3: check_alarm_Eos[bnum][0] &= 0x07;
						check_alarm_Eos[bnum][1] &= 0x07;
						break;
				case 4: check_alarm_Eos[bnum][0] &= 0x0F;
						check_alarm_Eos[bnum][1] &= 0x0F;
						break;
				case 5: check_alarm_Eos[bnum][0] &= 0x1F;
						check_alarm_Eos[bnum][1] &= 0x1F;
						break;
				default:check_alarm_Eos[bnum][0] = 0;
						check_alarm_Eos[bnum][1] = 0;
						break;
			}
			if (i != 0)
			{
				check_alarm_Eos[bnum][2] = se0121_reg_rd(FIFO_flg,bnum + 1);
				check_alarm_Eos[bnum][2] &= 0xC0;
			}
			else check_alarm_Eos[bnum][2] = 0;
		}
	}
	if (!GetResRdyTbl(19))							//设置每秒钟向MCP发送告警事件表
		SetResRdyTbl(19);

⌨️ 快捷键说明

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