output.c

来自「电表解决方案概要power_meter_r8c2g_source_code」· C语言 代码 · 共 1,132 行 · 第 1/2 页

C
1,132
字号
	unsigned int total_time = 0;
	unsigned char left_time = 0;
	unsigned int pass_time = 0;

	
    for (i = 0; i < table_colum; i++)
     {	 
		if ((i == 1)&&(program_buff != Special_PGM))						/* 处理浸泡时间 */
		{	
			total_time += main_soak_time * 60;
			
			if (i == operation_counter)
			pass_time = (total_time - process_left_time);
						
			continue;
		}
			 
		if ((i == 2)&&(program_buff != Special_PGM))						/* 处理洗涤时间 */
		{			
			total_time += main_wash_time * 60;
			
			if (i == operation_counter)
			pass_time = (total_time - process_left_time);
						
			continue;
		}
			 
		if ((i == (table_colum - 3))&&(program_buff != Special_PGM))		/* 处理脱水时间 */
		{
			
			if (spin_time_buff == 6)			  
			total_time += table_adr[i] * 60;
			  
			if (spin_time_buff != 6)
			total_time += spin_time_buff * 60;				
									
			if (i == operation_counter)
			pass_time = (total_time - process_left_time);			
			
			continue;
		}
			 
		if (i == operation_counter)						/* 处理当前运行过程剩余时间 */
		 {								
			total_time += table_adr[i];		 
			
			if ((i==0)&&(first_count_flag == 1))
			 {
				 first_count_flag = 0;
				 process_left_time = 120;
				 
				 if (program_buff == Special_PGM)
				 process_left_time = 5;
				 
				 pass_time = (total_time - process_left_time);				 
				 continue;
			 }
			
			pass_time = (total_time - process_left_time);				/* 计算已运行时间 */
			
			if (program_buff == Special_PGM)
			 {
				  pass_time = (total_time - process_left_time/60);			
				  if ((process_left_time % 60) > 30)
				  pass_time -= 1;
			 }
									
			continue;
		 }		
		 
		total_time += table_adr[i];						/* 计算程序运行需要的总时间 */
			
//		if (i == (table_colum-1))
//		{
//			left_time = (total_time - pass_time)/60;	
//		}	 	
     }		
	 
	if (program_buff == Special_PGM) 
	 {
		left_time = total_time - pass_time;
		process_left_time = 300;
	 }
	
	else 
	 {
		left_time = (total_time - pass_time)/60;		/* 计算剩余时间 */
	
		if ((left_time % 60) > 30)
		left_time += 1;									/* 剩余时间误差修正 */
	 }
	
    return left_time;									/* 返回剩余时间 */

}

/**************************************************************

void eeprom_write(void),

将系统掉电时状态保存到 EEPROM 的写入程序

**************************************************************/

void eeprom_write(void)
{
	static unsigned char i=0;
	static unsigned char j=0;	
	
	IicPack IicData_w;
	
	IicData_w.iic_DeviceAddress = 0xa0;				/* 设置 EEPROM 设备地址 */
	IicData_w.iic_MemoryAddress = 0x00;				/* 设置 EEPROM 读写起始地址 */
//	IicData_w.iic_Data = WriteData;
	IicData_w.iic_Data = RAM_TOP_2;					/* 设置状态保护 RAM 地址 */
	IicData_w.iic_NumberOfByte = 8;					/* 设置一次读写字节数 */
	
	for (j = 0; j <= 30; j++)						/* 数据循环写入,根据数据多少决定循环次数 */
	 {
		 if (j == 30)
		  {
			  IicData_w.iic_NumberOfByte = 5;
			  
			  initIicBus();
			  IicBusWrite(&IicData_w);			  
			  break;
		  }
		  
		 initIicBus();
		 
		 IicBusWrite(&IicData_w);
		 
		 asm("nop");
		 
		 IicData_w.iic_MemoryAddress += 8;		 
//		 IicData_w.iic_Data += 8;
		 
		 epprom_4ms_buff = 1;
		 
		 while (epprom_4ms_buff)
		 {
		 	asm("nop");
		 }		 
	 }	
	
	asm("nop");
	asm("nop");
	asm("nop");
	
}

/*******************************************************************

void eeprom_read(void),

将系统掉电时状态恢复到R8C MCU RAM中,使程序运行在系统掉电时的状态

*******************************************************************/

void eeprom_read(void)
{
	static unsigned char i=0;
	static unsigned char j=0;	
	
	IicPack IicData_w;	
	IicPack IicData_r;
	
	IicData_r.iic_DeviceAddress = 0xa0;		/* 设置 EEPROM 设备地址 */
	IicData_r.iic_MemoryAddress = 0x40;		/* 设置 EEPROM 读写起始地址 */
//	IicData_r.iic_Data = ReadData;
	IicData_r.iic_Data = RAM_TOP_1;			/* 设置状态保护 RAM 地址 */
	IicData_r.iic_NumberOfByte = 0x08;		/* 设置一次读写字节数 */
	
	initIicBus();	
	
	IicBusRead(&IicData_r);			/* 读掉电保护字节,用于判断是否运行掉电记忆程序 */
	
	asm("nop");
	asm("nop");
	asm("nop");
	
	if(Rec_Byte == 1)				/* 掉电保护字节有效,运行掉电记忆程序 */
	 {
	 
		IicData_r.iic_DeviceAddress = 0xa0;
		IicData_r.iic_MemoryAddress = 0x00;		 
		IicData_r.iic_Data = RAM_TOP;
		IicData_r.iic_NumberOfByte = 0xF5;
	
		initIicBus();	
	
		IicBusRead(&IicData_r);		/* 将掉电时系统保护的数据写到 MCU RAM 中 */
	
		asm("nop");
		asm("nop");
		asm("nop");	
		asm("nop");
		asm("nop");
		asm("nop");			
		
		Rec_Byte = 0;				/* 清掉电保护字节 */
		
		IicData_w.iic_DeviceAddress = 0xa0;
		IicData_w.iic_MemoryAddress = 0x40;
		IicData_w.iic_Data = RAM_TOP_1;	
		IicData_w.iic_NumberOfByte = 8;	
		
		initIicBus();
		IicBusWrite(&IicData_w);	/* 将 EEPROM 里面对应地址的掉电保护字节清0 */
		
		asm("nop");
		asm("nop");
		asm("nop");	
		asm("nop");
		asm("nop");
		asm("nop");		
		
		recover_flag = 1;			/* 置掉电记忆标志 */					
	
	 }
	 
}

/********************************************************
Name : initIicBus
Parameters : None
Returns : None
Description : initialize I2C-BUS port
********************************************************/

void initIicBus(void)
{
	iic_sda_d = 0; 					/* SDA input ("H" state) */
	iic_scl_d = 0; 					/* SCL input ("H" state) */
}

//-----------------------------------------------------------------

/********************************************************
Name : IicBusRead
Parameters : structure IicPack pointer
Returns : Acknowledge
Description : Sequential Ramdom Read Cycle (I2C-BUS)
********************************************************/

unsigned char IicBusRead(IicPack *IicData)
{
	unsigned char i,ret;											/* Ramdom Read Cycle / Sequential Ramdom Read Cycle */
	
	IicData->iic_DeviceAddress &= 0xFE; 							/* WRITE Setting DeviceAddress */
	StartCondition(); 												/* Start Condition */
	
	while (1) 
	 {
		
		if ((ret=ByteWrite(IicData->iic_DeviceAddress)) == NOACK)	/* WRITE DeviceAddress */
		break; 		
																	/* NoAck Detect */
		if ((ret=ByteWrite(IicData->iic_MemoryAddress)) == NOACK)
																	/* WRITE MemoryAddress */
		break; 														/* NoAck Detect */

		IicData->iic_DeviceAddress |= 0x01; 						/* READ Setting DeviceAddress */
		StartCondition(); 											/* ReStart Condition */
		if ((ret=ByteWrite(IicData->iic_DeviceAddress)) == NOACK)
																	/* DeviceAddress WRITE */
		break; 	
																	/* NoAck Detect */
		for (i=1; i<IicData->iic_NumberOfByte; i++) 
		 { 															/* specified bytes as loop */
			ByteRead (IicData->iic_Data, ACK); 						/* Read data (Ack output) */
			IicData->iic_Data++; 									/* */
		 }
	 
		ByteRead (IicData->iic_Data, NOACK); 						/* Read data (NoAck output) */
		break;
	 }
	StopCondition(); 												/* Stop Condition */
	return(ret);
}

//-------------------------------------------------------------------------

/********************************************************
Name : IicBusWrite
Parameters : structure IicPack pointer
Returns : Acknowledge
Description : Byte Write or Page Write Cycle (I2C-BUS)
********************************************************/
unsigned char IicBusWrite(IicPack *IicData)
{
	unsigned char i,ret;
																	/* Byte Write / Page Write */
	IicData->iic_DeviceAddress &= 0xFE; 							/* WRITE Setting DeviceAddress */
	StartCondition(); 												/* Start Condition */
	while (1) 
	 {
		if ((ret=ByteWrite(IicData->iic_DeviceAddress)) == NOACK)
																	/* WRITE DeviceAddress */
		break; 														/* NoAck Detect */
		if ((ret=ByteWrite(IicData->iic_MemoryAddress)) == NOACK)
																	/* WRITE MemoryAddress */
		break; 														/* NoAck Detect */
		for (i=0; i<IicData->iic_NumberOfByte; i++)					/* specified bytes as loop */
	 	 { 					
			if ((ret=ByteWrite(*(IicData->iic_Data))) == NOACK) 	/* Write Data */
			break; 													/* NoAck Detect */
			IicData->iic_Data++; 									/* */
	 	 }
		break;
	 }	
	
	StopCondition(); 												/* Stop Condition */
	return(ret);
	
}

//-------------------------------------------------------------------------

/********************************************************
Name : StartCondition
Parameters : None
Returns : None
Description : Output Start Condition (I2C-BUS)
Note : *1 adjust a wait time
********************************************************/
void StartCondition(void)
{
	iic_scl = 0; 						/* SCL="L" */
	iic_scl_d = 1; 						/* SCL output */
	_WaitTime1us(); 					/* wait *1 */
	iic_sda_d = 0; 						/* SDA="H" */
	_WaitTime1us(); 					/* wait */
	_WaitTime1us(); 					/* wait *! */
	iic_scl = 1; 						/* SCL="H" */
	_Wait_tSU_STA; 						/* wait */
	iic_sda = 0; 						/* SDA="L" */
	iic_sda_d = 1; 						/* SDA output */
	_Wait_tHD_STA; 						/* wait */
	_WaitTime1us(); 					/* wait *1 */
	iic_scl = 0; 						/* SCL="L" */
}
/********************************************************
Name : StopCondition
Parameters : None
Returns : None
Description : Output Stop Condition (I2C-BUS)
Note : *1 adjust a wait time
********************************************************/
void StopCondition(void)
{
	iic_scl = 0; 						/* SCL="L" */
	iic_scl_d = 1; 						/* SCL output */
	_WaitTime1us(); 					/* wait *1 */
	iic_sda = 0; 						/* SDA="L" */
	iic_sda_d = 1; 						/* SDA output */
	_WaitTime1us(); 					/* wait *1 */
	iic_scl = 1; 						/* SCL="H" */
	_Wait_tSU_STO; 						/* wait */
	iic_sda_d = 0; 						/* SDA="H" */
	_WaitTime1us(); 					/* wait */
	_WaitTime1us(); 					/* wait *1 */
	iic_scl = 0; 						/* SCL="L" */
}

//--------------------------------------------------------

/********************************************************
Name : ByteWrite
Parameters : Write data
Returns : Acknowledge
Description : byte data Output (I2C-BUS)
Note : *1 adjust a wait time
********************************************************/
unsigned char ByteWrite(unsigned char iic_writeData)
{
	unsigned char maskData = 0x80; 						/* MSB first */
	unsigned char ret = ACK; 								/* Ack/NoAck */
	
	while (maskData) 
	 { 									/* 8times as loop */
		iic_sda = 0; 										/* initialize port-latch */
		if (iic_writeData & maskData) 
		 { 								/* "H" output ? */
			iic_sda_d = 0; 										/* Yes SDA="H" */
		 }
		 
		else
		 {
			iic_sda_d = 1; 										/* No SDA="L" */
			asm("nop"); 										/* wait *1 */
			asm("nop"); 										/* wait *1 */
			asm("nop"); 										/* wait *1 */
		 }
		 
		_Wait_tSU_DAT; 										/* wait */
		_WaitTime1us(); 									/* wait *1 */
		iic_scl = 1; 										/* SCL="H" */
		_Wait_tHIGH; 										/* wait */
		_WaitTime1us(); 									/* wait *1 */
		iic_scl = 0; 										/* SCL="L" */
		maskData >>= 1; 									/* change mask data */
		_WaitTime1us(); 									/* wait *1 */
		
	 }
	 
		iic_sda_d = 0; 										/* SDA input */
		_Wait_tAA; 											/* wait */
		_WaitTime2us(); 									/* wait *1 */
		iic_scl = 1; 										/* SCL="H" */
		
		if (iic_sda) 
		ret=NOACK; 											/* NoAck Detect */
		
		_Wait_tHIGH; 										/* wait */
		
		_WaitTime1us(); 									/* wait *1 */
		iic_scl = 0; 										/* SCL="L" */
		_Wait_tHD_DAT; 										/* wait */
		
		return(ret);
		
}

//----------------------------------------------------------

/********************************************************
Name : ByteRead
Parameters : Read data strage location pointer, Select Ack/NoAck
Returns : None
Description : byte data input with Ack output (I2C-BUS)
Note : *1 adjust a wait time
********************************************************/
void ByteRead(unsigned char *iic_readData, unsigned char ackData)
{
	unsigned char maskData=0x80; 						/* MSB first */
	unsigned char readData;
	
	*iic_readData = 0; 									/* */
	
	while (maskData) 
	 { 													/* 8times as loop */
		readData = *iic_readData | maskData; 			/* */
		iic_sda_d = 0; 									/* initialize port-latch */
		_Wait_tAA; 										/* wait */
		iic_scl = 1; 									/* SCL="H" */
	
		if (iic_sda) 
	 	 { 												/* SDA="H" ? */
			*iic_readData = readData; 					/* Yes */
	 	 }
	
		else{
		asm("nop"); 									/* wait *1 */
		asm("nop"); 									/* wait *1 */
		asm("nop"); 									/* wait *1 */
		asm("nop"); 									/* wait *1 */
		asm("nop"); 									/* wait *1 */
		asm("nop"); 									/* wait *1 */
		asm("nop"); 									/* wait *1 */
		asm("nop"); 									/* wait *1 */
		asm("nop"); 									/* wait *1 */
		asm("nop"); 									/* wait *1 */
		asm("nop"); 									/* wait *1 */
		asm("nop"); 									/* wait *1 */
		asm("nop"); 									/* wait *1 */
		}
		
		_Wait_tHIGH; 									/* wait */
		_WaitTime1us(); 								/* wait *1 */
		iic_scl = 0; 									/* SCL="L" */
		maskData >>= 1; 								/* Change mask data */
		_WaitTime1us(); 								/* wait *1 */
	 }
	 
	if (!ackData) 
	 { 													/* Ack output ? */
														/* Ack output */
		iic_sda = ACK; 									/* Yes SDA="L" */
		iic_sda_d = 1; 									/* SDA output */
	 } 
	 
	else
	 {
														/* NoAck output */
		iic_sda = NOACK; 								/* No SDA="H" */
		iic_sda_d = 0; 									/* SDA input */
   	}
	 
	_Wait_tSU_DAT; 										/* wait */
	_WaitTime1us(); 									/* wait *1 */
	iic_scl = 1; 										/* SCL="H" */

//--------------------------------------------------------

	_Wait_tHIGH; 										/* wait */
	_WaitTime1us(); 									/* wait *1 */
	iic_scl = 0; 										/* SCL="L" */
	iic_sda_d = 0; 										/* SDA input */
	_WaitTime1us(); 									/* wait *1 */
	
}
/********************************************************
Name : _WaitTime0us
Parameters : None
Returns : None
Description : a 0us wait
********************************************************/
void _WaitTime0us(void)
{
	;
}
/********************************************************
Name : _WaitTime1us
Parameters : None
Returns : None
Description : a 1us wait
********************************************************/
void _WaitTime1us(void)
{											/* +14cycle */
	asm("nop"); 							/* +1cycle */
	asm("nop"); 							/* +1cycle = 16cycle */
}
/********************************************************
Name : _WaitTime2us
Parameters : None
Returns : None
Description : a 2us wait
********************************************************/
void _WaitTime2us(void)
{
											/* +14cycle */
	asm("nop"); 							/* +1cycle */
	asm("nop"); 							/* +1cycle */
	asm("nop"); 							/* +1cycle */
	asm("nop"); 							/* +1cycle */
	asm("nop"); 							/* +1cycle */
	asm("nop"); 							/* +1cycle */
	asm("nop"); 							/* +1cycle */
	asm("nop"); 							/* +1cycle */
	asm("nop"); 							/* +1cycle */
	asm("nop"); 							/* +1cycle */
	asm("nop"); 							/* +1cycle */
	asm("nop"); 							/* +1cycle */
	asm("nop"); 							/* +1cycle */
	asm("nop"); 							/* +1cycle */
	asm("nop"); 							/* +1cycle */
	asm("nop"); 							/* +1cycle */
	asm("nop"); 							/* +1cycle */
	asm("nop"); 							/* +1cycle = 32cycle */
}

//--------------------------------------------------------












⌨️ 快捷键说明

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