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

📄 stecx900.c

📁 机械手(基于日立2398CPU)程序
💻 C
字号:
/**********************************************************************/
/* System      : 俽俹梡僐儞僩儘乕儔 俽俿俤俠亅倃倃倃                  */
/* File Name   : SETCX900.C                                           */
/* Description :                                                      */
/*                                                                    */
/* ------------------------------------------------------------------ */
/*   Copyright(C) Eikosha Co.Ltd. 2000/10/15                          */
/* ------------------------------------------------------------------ */
/* History     : 2000/10/15 Created                                   */
/**********************************************************************/

#include	<machine.h>
#include	"iodefine.h"
#include	"vect.h"
#include	"stecX.h"
#include	"StecSeq.h"
#include	"E2Prom.h"

#define	SCANMAX			8						/* 擖椡庢崬夞悢 */
#define RECO_ON			0xFF					/* 俉夞堦抳 ON */
#define RECO_OFF		0x00					/* 俉夞堦抳 OFF */
#define	READYSCANMAX	100						/* 揹尮搳擖捈屻IO庢崬傒弨旛夞悢 */
#define	_ACV			P6.PORT.BIT.B6			/* ACV Port */

#pragma abs16	(TimerBZ, PwrFail,Inputbuff, Inputbuff2, DipSWbuff, Input, Input2, DipSW)

static unsigned char	SelNo;
static unsigned char	Clk1s, ClkP5s, ClkP1s, SeqTimer;
volatile static unsigned char	IOScanCount;	/* 揹尮搳擖屻I/O僗僉儍儞夞悢 */
unsigned char			PwrFail;
unsigned char			Inputbuff[8];			/* 昗弨擖椡僶僢僼傽乮俀係揰乯 */
unsigned char			DipSWbuff[16];			/* 僨傿僢僾僗僀僢僠擖椡僶僢僼傽乮侾俇揰乯 */

static unsigned short	TimerBZ;
static unsigned short	PwrDwn;
unsigned short			Timer[TIMERMAX];
unsigned short			OnOffTimer;				/* LED ON/OFF帪娫僇僂儞僩 */
unsigned short			OffTimer;				/* LED OFF帪娫僇僂儞僩 */
unsigned short			LEDCount;				/* LED揰柵夞悢 */
unsigned short			PitchDelay;				/* 僺僢僠幉僼儕乕仺楢懕僼儕乕傊偺僨傿儗僀帪娫僇僂儞僩 */

extern unsigned short	MainSysAlmC;			/* 儊僀儞僔僗僥儉傾儔乕儉僐乕僪 */

union DEFIO {
	unsigned char BYTE;
	struct {
		unsigned char B7:1;
		unsigned char B6:1;
		unsigned char B5:1;
		unsigned char B4:1;
		unsigned char B3:1;
		unsigned char B2:1;
		unsigned char B1:1;
		unsigned char B0:1;
	} BIT;
};

union	DEFIO			Input[3];					/* 昗弨擖椡僨乕僞乮俀係揰暘乯 */
union	DEFIO			Input2[1];					/* 憹愝擖椡僨乕僞乮係揰暘乯 */
union	DEFIO			DipSW[2];					/* 僨傿僢僾僗僀僢僠擖椡僨乕僞乮侾俇揰暘乯 */

enum _temp1{rsIDLE, rsWAIT, rsRECV, rsSUM, rsREND, rsSEND};
extern volatile enum _temp1 Ser2Stat;
enum _temp2{rsIOIDLE, rsIOWAIT, rsIORECV, rsIOSUM, rsIOREND, rsIOSEND};
extern volatile enum _temp2 Ser2IOStat;
enum _temp3{rsNO, rsIO, rsSV};
extern volatile enum _temp3 Ser2SW;

void OutReset(void);
extern void SetCurAlarm(char no, unsigned short code);
unsigned char IOCom(unsigned char o_id);

/*--------------------------------------------------------------------*
 * MODULE   : INT_TGI4A_TPU4
 * ABSTRACT : TGR4A僐儞儁傾儅僢僠妱崬傒
 * FUNCTION : 1ms枅偺妱崬傒
 * NOTE     : vector 54 TGI4A TPU4
 * RETURN   : 
 * CREATE   : 00.10.15 A.Murakami
 * UPDATE   : 
 *--------------------------------------------------------------------*/
void INT_TGI4A_TPU4(void)
{  
	volatile unsigned char i;
	volatile unsigned char *p = &Inputbuff[0];
	volatile unsigned char *pDsw = &DipSWbuff[0];
	TPU4.TSR.BIT.TGFA = OFF;

	if(IOScanCount < READYSCANMAX)
		IOScanCount++;
	else
		SysInf.Flag.bIOReadyFlag = ON;

	/* 擖椡價僢僩庢傝崬傒 */
	
	*p <<= 1;
		if (PD.PORT.BIT.B0 == LOW) * p |= 1;
	p++; *p <<= 1;
		if (PD.PORT.BIT.B1 == LOW) * p |= 1;
	p++; *p <<= 1;
		if (PD.PORT.BIT.B2 == LOW) * p |= 1;
	p++; *p <<= 1;
		if (PD.PORT.BIT.B3 == LOW) * p |= 1;
	p++; *p <<= 1;
		if (PD.PORT.BIT.B4 == LOW) * p |= 1;
	p++; *p <<= 1;
		if (PD.PORT.BIT.B5 == LOW) * p |= 1;
	p++; *p <<= 1;
		if (PD.PORT.BIT.B6 == LOW) * p |= 1;
	p++; *p <<= 1;
		if (PD.PORT.BIT.B7 == LOW) * p |= 1;
	p++;

	// DIPSW 1 Input
	*pDsw <<= 1;
		if (P4.PORT.BIT.B0 == LOW) * pDsw |= 1;	// DIPSW 1-1 Input
	pDsw++; *pDsw <<= 1;
		if (P4.PORT.BIT.B1 == LOW) * pDsw |= 1;	// DIPSW 1-2 Input
	pDsw++; *pDsw <<= 1;
		if (P4.PORT.BIT.B2 == LOW) * pDsw |= 1;	// DIPSW 1-3 Input
	pDsw++; *pDsw <<= 1;
		if (P4.PORT.BIT.B3 == LOW) * pDsw |= 1;	// DIPSW 1-4 Input
	pDsw++; *pDsw <<= 1;
		if (P4.PORT.BIT.B4 == LOW) * pDsw |= 1;	// DIPSW 1-5 Input
	pDsw++; *pDsw <<= 1;
		if (P4.PORT.BIT.B5 == LOW) * pDsw |= 1;	// DIPSW 1-6 Input
	pDsw++; *pDsw <<= 1;
		if (P4.PORT.BIT.B6 == LOW) * pDsw |= 1;	// DIPSW 1-7 Input
	pDsw++; *pDsw <<= 1;
		if (P4.PORT.BIT.B7 == LOW) * pDsw |= 1;	// DIPSW 1-8 Input
	pDsw++;

	// DIPSW 2 Input
	*pDsw <<= 1;
		if (P6.PORT.BIT.B0 == LOW) * pDsw |= 1;	// DIPSW 2-1 Input
	pDsw++; *pDsw <<= 1;
		if (P6.PORT.BIT.B1 == LOW) * pDsw |= 1;	// DIPSW 2-2 Input
	pDsw++; *pDsw <<= 1;
		if (P6.PORT.BIT.B2 == LOW) * pDsw |= 1;	// DIPSW 2-3 Input
	pDsw++; *pDsw <<= 1;
		if (P6.PORT.BIT.B3 == LOW) * pDsw |= 1;
	pDsw++; *pDsw <<= 1;
		if (P6.PORT.BIT.B4 == LOW) * pDsw |= 1;
	pDsw++; *pDsw <<= 1;
		if (P6.PORT.BIT.B5 == LOW) * pDsw |= 1;
	pDsw++; *pDsw <<= 1;
		if (P6.PORT.BIT.B6 == LOW) * pDsw |= 1;	// ACV Input
	pDsw++; *pDsw <<= 1;
		if (P6.PORT.BIT.B7 == LOW) * pDsw |= 1;	// Power Down Input
	pDsw++;

	{
		unsigned char	n;
		unsigned short	*p = &Timer[0];
		for (n = 0; n<(sizeof(Timer) / sizeof(Timer[0])); n++, p++)
			if (*p)	(*p)--;
	}
	if (ClkP1s)	ClkP1s--;
	else{
		SysInf.Flag.bp1s = ~SysInf.Flag.bp1s;
		ClkP1s = 100/1;
		if (ClkP5s)	ClkP5s--;
		else{
			SysInf.Flag.bp5s = ~SysInf.Flag.bp5s;
			ClkP5s = 4;
			if (Clk1s)	Clk1s--;
			else {
				SysInf.Flag.b1s = ~SysInf.Flag.b1s;
				Clk1s = 1;
			}
		}
	}
	if (--SeqTimer == 0){
		SeqTimerCount();
		SeqTimer = 10 / 1;
	}

	if (SysInf.Flag.bPitchFree == ON){
		PitchDelay++;
	}

/* 儌僯僞LED1惂屼 */
	if(SysInf.Flag.bDownloadMode == OFF){
		if(MainSysAlmC != 0){
			if(OnOffTimer)
				OnOffTimer--;
			else{
				SysInf.Flag.bp25s = ~SysInf.Flag.bp25s;
				OnOffTimer = 250 / 1;
			}
			if(OffTimer == 0){
				if(P1.DR.BIT.B5 == LOW && SysInf.Flag.bp25s == OFF)
					LEDCount++;
				P1.DR.BIT.B5 = ~SysInf.Flag.bp25s;
			}
			if(LEDCount >= MainSysAlmC){
				P1.DR.BIT.B5 = HIGH;
				OffTimer++;
				if(OffTimer >= (1000 / 1)){
					SysInf.Flag.bp25s = ON;
					P1.DR.BIT.B5 = ~SysInf.Flag.bp25s;
					OnOffTimer = 250 / 1;
					OffTimer = 0;
					LEDCount = 0;
				}
			}
		}
		else{
			P1.DR.BIT.B5 = ~SysInf.Flag.bp5s;
		}
	}
	else{
		P1.DR.BIT.B5 = ~SysInf.Flag.b1s;
	}

	if(Timer[TMCOMMINT] == 0){
		if(Ser2SW == rsNO && Ser2IOStat == rsIOSEND){
			Ser2SW = rsIO;
			Timer[TMIOCOMM] = 2 / 1;			/* 2ms */
			P5.DR.BIT.B3 = 1;					/* 憲怣 Enable */
			P5.DR.BIT.B2 = 1;					/* 庴怣 Disable */
			SCI2.SCR.BIT.RE = 0;				/* 庴怣嬛巭 */
			SCI2.SCR.BIT.TE = 1;				/* 憲怣摦嶌嫋壜 */
			SCI2.SCR.BIT.TIE = 1;				/* SCI2憲怣僨乕僞僄儞僾僥傿妱崬傒嫋壜 */
		}
		else if(Ser2SW == rsNO && Ser2Stat == rsSEND){
			Ser2SW = rsSV;
			Timer[TMSVCOMM] = 2 / 1;			/* 2ms */
			P5.DR.BIT.B3 = 1;					/* 憲怣 Enable */
			P5.DR.BIT.B2 = 1;					/* 庴怣 Disable */
			SCI2.SCR.BIT.RE = 0;				/* 庴怣嬛巭 */
			SCI2.SCR.BIT.TE = 1;				/* 憲怣摦嶌嫋壜 */
			SCI2.SCR.BIT.TIE = 1;				/* SCI2憲怣僨乕僞僄儞僾僥傿妱崬傒嫋壜 */
		}
		Timer[TMCOMMINT] = 4;					// 4ms
	}
	if(Timer[TMIOCOMM] == 0 && Ser2SW == rsIO && Ser2IOStat != rsIOIDLE && Ser2IOStat != rsIOREND){
		Ser2IOStat = rsIOIDLE;
		if(Ser2SW == rsIO)
			Ser2SW = rsNO;
		if(SysInf.Flag.bSeqInit == ON){			/* 僔乕働儞僒弶婜壔姰椆 */
			SysInf.Flag.bIOComm = OFF;
			Alarm(SYSALM10);						// Communication Error Main <-> I/O
		}
	}
	if(Timer[TMSVCOMM] == 0 && Ser2SW == rsSV && Ser2Stat != rsIDLE && Ser2Stat != rsREND){
		Ser2Stat = rsIDLE;
		if(Ser2SW == rsSV)
			Ser2SW = rsNO;
		SVQueueCode(0x03);						/* 億乕儕儞僌僨乕僞撉弌偟 */
		SysInf.Flag.bSvComm = OFF;
		Alarm(SYSALM6);							// 03.03 yoshi communication error 2 main&servoamp
	}

/* 揹尮堎忢専抦 */
	if(((SysInf.Flag.bPwrFail == OFF) && (_ACV == LOW)) || (SysInf.Flag.bPwrFailDis == ON))
		PwrFail = 20/1;

	if(SysInf.Flag.bSeqRun == ON) {			// 僀僯僔儍儔僀僘廔椆傑偱張棟偼偟側偄
		if((P6.PORT.BIT.B7 == HIGH) && (SysInf.Flag.bPowerDown == OFF)){	// Power Down専弌
			if(SysInf.Flag.bPwrFail == OFF){
				while(E2PDSysWrite());			// 彂偒崬傒偨偄僷儔儊乕僞偺傒偺彂崬傒乮俆俇僶僀僩乮侾瓦凹迺獊j乯
				while(E2WriteCheck());
				OutReset();						// 慡弌椡嫮惂OFF
				SysInf.Flag.bPowerDown = ON;	// Power Down専弌FLAG ON
				Alarm(SYSALM9);					// 2004.09.28 Added by Sun
			}
		}
		if(SysInf.Flag.bPwrFailEnd == OFF){		// 弖掆張棟傑偩
			if(PwrFail){
				PwrFail--;
				PwrDwn = (2000/1);			// 僽僓乕仌儊僢僙乕僕昞帵傑偱偺僨傿儗僀帪娫愝掕
			}
			else{
				OutReset();
				SysInf.Flag.bPwrFail = ON;	// AC揹尮堎忢専弌
			}
			if(SysInf.Flag.bPwrFail == ON){
				if(PwrDwn > 0)
					PwrDwn--;
				else if(SysInf.Flag.bPowerDown == OFF){
					SysInf.Flag.bPwrFailEnd = ON;	// 弖掆張棟廔椆(娫偵崌傢側偐偭偨偙偲傪峫椂偟偰丄偙偙偱僙僢僩)
					Alarm(SYSALM7);
					SetCurAlarm(0, SYSALM7);	/* 弖掆傾儔乕儉僸僗僩儕 */
					while(E2PDSysWrite());		/* 彂偒崬傒偨偄僷儔儊乕僞偺傒偺彂崬傒乮俆俇僶僀僩乮侾瓦凹迺獊j乯 */
					while(E2WriteCheck());
//					SysInf.Flag.bPwrFail = OFF;
				}
			}
		}
	}
}

/*--------------------------------------------------------------------*
 * MODULE   : INT_IRQ2
 * ABSTRACT : AC埵憡専弌妱傝崬傒
 * FUNCTION : IRQ2妱傝崬傒
 * NOTE     : vector 18 External trap IRQ2
 * RETURN   : 
 * CREATE   : 01.01.11 A.Murakami
 * UPDATE   : 
 *--------------------------------------------------------------------*/
//void INT_IRQ2(void)
//{
//	if(SysInf.Flag.bPwrFail == OFF)
//		PwrFail = 20/2;
//}

/*--------------------------------------------------------------------*
 * MODULE   : OutReset
 * ABSTRACT : 奜晹弌椡偺儕僙僢僩
 * FUNCTION : 
 * NOTE     : 
 * RETURN   : 
 * CREATE   : 
 * UPDATE   : 
 *--------------------------------------------------------------------*/
void OutReset(void)
{
	PE.DR.BYTE = 0x00;							// 嫮惂OFF

	PC.DR.BYTE = 0x00;							// 嫮惂OFF

	PB.DR.BIT.B0 = HIGH;						/* OE OFF */
}
/*--------------------------------------------------------------------*
 * MODULE   : IORefresh
 * ABSTRACT : 僔乕働儞僗僄儕傾偲幚IO偺儕僼儗僢僔儏
 * FUNCTION : 
 * NOTE     : 
 * RETURN   : void
 * CREATE   : 00.10.29 A.Murakami
 * UPDATE   : 
 *--------------------------------------------------------------------*/
void IORefresh(void)
{
	unsigned char	n;
	unsigned char	*p;

	unsigned char i, j;
	unsigned char mask;

	/* 擖椡峏怴*/

	IOCom(1);

	// Input Data
	mask = 0x01;									// Mask Data Initialize
	for(i = 0; i < 8; i++){
		if ((Inputbuff[i] & RECO_ON) == RECO_ON)
			Input[0].BYTE |= mask;
		else if ((Inputbuff[i] | RECO_OFF) == RECO_OFF)
			Input[0].BYTE &= ~mask;
		if ((DipSWbuff[i] & RECO_ON) == RECO_ON)
			DipSW[0].BYTE |= mask;
		else if ((DipSWbuff[i] | RECO_OFF) == RECO_OFF)
			DipSW[0].BYTE &= ~mask;
		if ((DipSWbuff[i + 8] & RECO_ON) == RECO_ON)
			DipSW[1].BYTE |= mask;
		else if ((DipSWbuff[i + 8] | RECO_OFF) == RECO_OFF)
			DipSW[1].BYTE &= ~mask;
		mask <<= 1;
	}

	SeqData.B.SMI[56 / 16].c.Lo = DipSW[0].BYTE;	/* DIPSW 1 */
	SeqData.B.SMI[56 / 16].c.Hi = (SeqData.B.SMI[56 / 16].c.Hi & 0xF0) | (DipSW[1].BYTE & 0x0F);	/* DIPSW 2 + Pendant DIPSW */
	SeqData.B.IN[8/16].c.Lo = Input[0].BYTE;	/* OE1 Standard Input */

	PB.DR.BIT.B0 = LOW;			/* OE ON */

	PE.DR.BIT.B0 = SeqData.B.OUT[8/16].b.b0;
	PE.DR.BIT.B1 = SeqData.B.OUT[8/16].b.b1;
	PE.DR.BIT.B2 = SeqData.B.OUT[8/16].b.b2;
	PE.DR.BIT.B3 = SeqData.B.OUT[8/16].b.b3;
	PE.DR.BIT.B4 = SeqData.B.OUT[8/16].b.b4;
	PE.DR.BIT.B5 = SeqData.B.OUT[8/16].b.b5;
	PE.DR.BIT.B6 = SeqData.B.OUT[8/16].b.b6;
	PE.DR.BIT.B7 = SeqData.B.OUT[8/16].b.b7;

	PC.DR.BIT.B4 = SeqData.B.OUT[8/16].b.b8;
	PC.DR.BIT.B5 = SeqData.B.OUT[8/16].b.b9;
	PC.DR.BIT.B6 = SeqData.B.OUT[8/16].b.b10;
	PC.DR.BIT.B7 = SeqData.B.IN[1].b.b0;

	/* 摿庩儕儗乕峏怴 */
	_SMONE = OFF;				/* 婲摦屻1僗僉儍儞偺傒ON */
	_SMON  = ON;				/* 忢帪ON */
	_SMOFF = OFF;				/* 忢帪OFF */
	_SM1S  = SysInf.Flag.b1s;	/* 1昩僋儘僢僋 */
	_SMP5S = SysInf.Flag.bp5s;	/* 0.5昩僋儘僢僋 */
	_SMP1S = SysInf.Flag.bp1s;	/* 0.1昩僋儘僢僋 */

	_SMSVALMIN = DipSW[1].BIT.B4;
	_SMPALM  = SysInf.Flag.bMainAlarm || SysInf.Flag.bPndAlarm;
	_SMMAL   = (_SDZALM != 0 ? ON : OFF);
	_SMDELE  = (_SDJALM != 0 ? ON : OFF);
	_SMSALMF = (_SDSALM != 0 ? ON : OFF);
	_SMERF   = (_SDER != 0 ? ON : OFF);
	_SMOPEERRF = (_SDOPEERR != 0 ? ON : OFF);
	_SMCOMEF = (_SDCOME != 0 ? ON : OFF);
}

⌨️ 快捷键说明

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