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

📄 path_switch.c

📁 单片机程序代码,经过很详细的测试.呵呵,硬件相关.
💻 C
📖 第 1 页 / 共 5 页
字号:
unsigned char xdata inport;
unsigned char xdata outport;
unsigned char xdata quotient;								//除8的商值
unsigned char xdata residue;								//除8的余数值

	for (timeid = 0; timeid <= 62; timeid++){
		if (path_switch_state[timeid] == 2){								//如果处于自动倒换状态
			if (path_switch_array[2][timeid][3] == 1){						//当前时隙工作在OTB盘A口上
				quotient = timeid >> 3;										//得到该时隙所在的字节值(同timeid / 8运算)
	  			residue = timeid & 0x07;									//同timeid % 8运算
	  			residue = 7 - residue;                      				//得到该时隙所在的bit位
	  			value = ais_reg[2][quotient] | f2rc7860_rd(quotient + 0x00A6);
	  			value = (value >> residue) & 0x01;
				if (value){
					inport = path_switch_array[2][timeid][0];				//得到保护的备用光口
					outport = path_switch_array[2][timeid][1];				//得到被保护的光口
    				value = path_switch_function(inport,timeid,outport);	//进行该时隙的通道倒换
					if (outport < 4){										//光口处于时隙的保换倒换状态
						switch (outport){									//对光口进行并发配置
							case 0: value = path_switch_function(inport,timeid,1);
									break;
							case 1: value = path_switch_function(inport,timeid,0);
									break;
							case 2: value = path_switch_function(inport,timeid,3);
									break;
							case 3: value = path_switch_function(inport,timeid,2);
									break;
							default:break;
						}
					}
					if (value == 0){										//如果倒换成功
						path_switch_array[2][timeid][3] = 0;				//倒换成功改写当前时隙所用端口
						path_switch_array[inport][timeid][3] = 1;
						SetResRdyTbl(28);
					}
				}
			}
		}
	}
//	SetResRdyTbl(28);
	auto_path_port = 2;
}



void path_switch_otbb_tu(void) large reentrant {
//OTB的B口TU自动倒换函数
//unsigned char xdata value1;									//记录TU-LOP值
//unsigned char xdata value2;									//记录TU-AIS值
unsigned char xdata value;									
unsigned char xdata timeid;									//时隙号
unsigned char xdata inport;
unsigned char xdata outport;
unsigned char xdata quotient;								//除8的商值
unsigned char xdata residue;								//除8的余数值

	for (timeid = 0; timeid <= 62; timeid++){
		if (path_switch_state[timeid] == 2){									//如果处于自动倒换状态
			if (path_switch_array[3][timeid][3] == 1){							//当前时隙工作在OTB盘B口上
				quotient = timeid >> 3;										//得到该时隙所在的字节值(同timeid / 8运算)
	  			residue = timeid & 0x07;									//同timeid % 8运算
	  			residue = 7 - residue;                      				//得到该时隙所在的bit位
	  			value = ais_reg[3][quotient] | f2rc7860_rd(quotient + 0x02A6);
	  			value = (value >> residue) & 0x01;
				if (value){
					inport = path_switch_array[3][timeid][0];				//得到保护的备用光口
					outport = path_switch_array[3][timeid][1];				//得到被保护的光口
    				value = path_switch_function(inport,timeid,outport);	//进行该时隙的通道倒换
					if (outport < 4){										//光口处于时隙的保换倒换状态
						switch (outport){									//对光口进行并发配置
							case 0: value = path_switch_function(inport,timeid,1);
									break;
							case 1: value = path_switch_function(inport,timeid,0);
									break;
							case 2: value = path_switch_function(inport,timeid,3);
									break;
							case 3: value = path_switch_function(inport,timeid,2);
									break;
							default:break;
						}
					}
					if (value == 0){										//如果倒换成功
						path_switch_array[3][timeid][3] = 0;				//倒换成功改写当前时隙所用端口
						path_switch_array[inport][timeid][3] = 1;
						SetResRdyTbl(28);
					}
				}
			}
		}
	}
//	SetResRdyTbl(28);
	auto_path_port = 3;
}


void report_auto_path_switch(unsigned char path_port){
//F01上报发生自动倒换告警

    tx_buf[0] = '$';
	tx_buf[1] = '2';
	tx_buf[2] = '1';
	tx_buf[3] = 0x46;
	tx_buf[4] = 0x30;
	tx_buf[5] = 0x31;
	tx_buf[6] = '0';
	tx_buf[7] = '0';
	tx_buf[8] = '0';
	tx_buf[9] = '4';
	switch (path_port){
		case 0: tx_buf[10] = '5';
				tx_buf[11] = '1';
				tx_buf[12] = '0';
				tx_buf[13] = '1';
				break;
		case 1: tx_buf[10] = '5';
				tx_buf[11] = '1';
				tx_buf[12] = '0';
				tx_buf[13] = '2';
				break;
		case 3: tx_buf[10] = '4';
				tx_buf[11] = '4';
				tx_buf[12] = '0';
				tx_buf[13] = '1';
				break;
		case 4: tx_buf[10] = '4';
				tx_buf[11] = '4';
				tx_buf[12] = '0';
				tx_buf[13] = '2';
				break;
		default:tx_buf[10] = 'F';
				tx_buf[11] = 'F';
				tx_buf[12] = 'F';
				tx_buf[13] = 'F';
				break;
	}
	tx_buf[14] = '*';
	tx_buf_pointer = 0;	
	while(tx_buf[tx_buf_pointer] != '*'){
		SBUF = tx_buf[tx_buf_pointer];
		while(tx_done == 0);
		tx_done = 0;
		tx_buf_pointer++;
	}
	SBUF = tx_buf[tx_buf_pointer];          //发送最后一个字符'*'
	while(tx_done == 0);
	tx_done = 0;
}

unsigned char down_file_over(void){
//C82 MCP通知MCU文件配置下载完成,MCU打开外中断
	commandid = 0x00433832;
	init_temp = 1;
	EX0 = 1;				//open INT0 interrupt
	if (!GetResRdyTbl(1))
		SetResRdyTbl(1); 
	return (0);
}

unsigned char close_int0(void){
//C83 MCP通知MCU文件配置下载开始,MCU关闭外中断
	commandid = 0x00433833;
	init_temp = 0;
	EX0 = 0;				//close INT0 interrupt
	if (!GetResRdyTbl(1))
		SetResRdyTbl(1); 
	return (0);
}

/*
unsigned char read_variable(struct cmd_para_save *read_va){
//T02读变量的值
unsigned char xdata sum;
unsigned char xdata return_value;

	sum = read_va -> test_read_name;
	return_value = int_sum[sum];

	if (!GetResRdyTbl(41))
		SetResRdyTbl(41); 
	return (return_value);
}

void report_variable_value(unsigned char value){
unsigned char xdata temp;

	tx_buf[0] = '$';
	tx_buf[1] = '2';
	tx_buf[2] = '1';
	tx_buf[3] = 0x54;
	tx_buf[4] = 0x30;
	tx_buf[5] = 0x32;
	tx_buf[6] = '0';
	tx_buf[7] = '0';
	tx_buf[8] = '0';
	tx_buf[9] = '2';
	temp = value >> 4;
	if (temp > 9)
		tx_buf[10] = temp + 0x37;
	else tx_buf[10] = temp + 0x30;
	temp = value & 0x0F;
	if (temp > 9)
		tx_buf[11] = temp + 0x37;
	else tx_buf[11] = temp + 0x30;
	tx_buf[12] = '*';
	tx_buf_pointer = 0;	
	while(tx_buf[tx_buf_pointer] != '*'){
		SBUF = tx_buf[tx_buf_pointer];
		while(tx_done == 0);
		tx_done = 0;
		tx_buf_pointer++;
	}
	SBUF = tx_buf[tx_buf_pointer];          //发送最后一个字符'*'
	while(tx_done == 0);
	tx_done = 0;
}

unsigned char write_variable(struct cmd_para_save *write_va){
//T03写变量值
unsigned char xdata sum;
unsigned char xdata write_value;
unsigned char xdata return_value;

	commandid = 0x00543033;
	sum = write_va -> test_write_name;
	write_value = write_va -> test_value;

	int_sum[sum] = write_value;

	if (!GetResRdyTbl(1))
		SetResRdyTbl(1); 
	return (return_value);
}
*/

void report_variable_value(){		//测试中断次数的打印程序
unsigned char xdata temp;

	tx_buf[0] = '$';
	tx_buf[1] = '2';
	tx_buf[2] = '1';
	tx_buf[3] = 0x54;
	tx_buf[4] = 0x30;
	tx_buf[5] = 0x32;
	tx_buf[6] = '0';
	tx_buf[7] = '0';
	tx_buf[8] = '0';
	tx_buf[9] = '4';
	temp = test_reg[0] >> 4;
	if (temp > 9)
		tx_buf[10] = temp + 0x37;
	else tx_buf[10] = temp + 0x30;
	temp = test_reg[0] & 0x0F;
	if (temp > 9)
		tx_buf[11] = temp + 0x37;
	else tx_buf[11] = temp + 0x30;
	temp = test_reg[1] >> 4;
	if (temp > 9)
		tx_buf[12] = temp + 0x37;
	else tx_buf[12] = temp + 0x30;
	temp = test_reg[1] & 0x0F;
	if (temp > 9)
		tx_buf[13] = temp + 0x37;
	else tx_buf[13] = temp + 0x30;
	tx_buf[14] = '*';
	tx_buf_pointer = 0;	
	while(tx_buf[tx_buf_pointer] != '*'){
		SBUF = tx_buf[tx_buf_pointer];
		while(tx_done == 0);
		tx_done = 0;
		tx_buf_pointer++;
	}
	SBUF = tx_buf[tx_buf_pointer];          //发送最后一个字符'*'
	while(tx_done == 0);
	tx_done = 0;
}

void read_port_reg(unsigned char read_port){
//T04读取1K50的寄存器值
unsigned char xdata temp;
	for (temp = 0; temp <= 62; temp++){
		port_reg[temp] = XBYTE[0x8C00 + temp + read_port * 0x40];
	}
	if (!GetResRdyTbl(42))
		SetResRdyTbl(42); 
}

void report_read_port(void){
//T04回复命令
unsigned char xdata temp;
unsigned char xdata reg_value;

	tx_buf[0] = '$';
	tx_buf[1] = '2';
	tx_buf[2] = '1';
	tx_buf[3] = 0x54;
	tx_buf[4] = 0x30;
	tx_buf[5] = 0x34;
	tx_buf[6] = '0';
	tx_buf[7] = '0';
	tx_buf[8] = '7';
	tx_buf[9] = 'E';
	for (temp = 0; temp <= 62; temp++){
		reg_value = port_reg[temp] >> 4;
		if (reg_value > 9)
			tx_buf[10 + 2 * temp] = reg_value + 0x37;
		else tx_buf[10+ 2 * temp] = reg_value + 0x30;
		reg_value = port_reg[temp] & 0x0F;
		if (reg_value > 9)
			tx_buf[11 + 2 * temp] = reg_value + 0x37;
		else tx_buf[11 + 2 * temp] = reg_value + 0x30;
	}
	tx_buf[136] = '*';
	tx_buf_pointer = 0;	
	while(tx_buf[tx_buf_pointer] != '*'){
		SBUF = tx_buf[tx_buf_pointer];
		while(tx_done == 0);
		tx_done = 0;
		tx_buf_pointer++;
	}
	SBUF = tx_buf[tx_buf_pointer];          //发送最后一个字符'*'
	while(tx_done == 0);
	tx_done = 0;
}

void read_ais_reg(void){
//T05读取ais寄存器的值
	if (!GetResRdyTbl(43))
		SetResRdyTbl(43); 
}

void report_ais_reg(unsigned char read_port){
//T05回复命令
unsigned char xdata temp;
unsigned char xdata reg_value;

	tx_buf[0] = '$';
	tx_buf[1] = '2';
	tx_buf[2] = '1';
	tx_buf[3] = 0x54;
	tx_buf[4] = 0x30;
	tx_buf[5] = 0x35;
	tx_buf[6] = '0';
	tx_buf[7] = '0';
	tx_buf[8] = '

⌨️ 快捷键说明

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