Esempio n. 1
0
//-----------------------------------------------------------------------------
// reads the next available value from the FIFO and converts it to volts before returning the reading
//-----------------------------------------------------------------------------
double Read_ACCESIO_AD(void) {

	//scale counts into AD Range Volts
	unsigned short data;

	data = InPort(AIO_BASE);


	return
		((double)(data) / 65536.0
		- ((accesSettings.adrange&0x02)?0.5:0.0))		// Adjust for polarity jumper
		* ((accesSettings.adrange&0x04)?10.0:20.0);	// Adjust for gain jumper

}
Esempio n. 2
0
//-----------------------------------------------------------------------------
// performs all the low-level operations to grab analog data from ACCESIO card
//	called from Process.cpp, ProcessTrigger()
//-----------------------------------------------------------------------------
void ReadDAQIntegrated(DataStruct *data) {

	CString str;
	double intAdc[16];

	DEBUG_MESSAGE_EXT(_T(" - in ReadDAQIntegrated\r\n"));


	for (int i = 0; i < 16; i++) {
		intAdc[i] = ((double)(InPort(AIO_BASE)) / 65536.0
			- ((accesSettings.adrange&0x02)?0.5:0.0))		// Adjust for polarity jumper  0.5
			* ((accesSettings.adrange&0x04)?10.0:20.0);		// Adjust for gain jumper  20.0
	}

	data->integAlo = (float)intAdc[0];
	data->integAhi = (float)intAdc[1];
	data->integClo = (float)intAdc[2];
	data->integChi = (float)intAdc[3];

	return;
}
Esempio n. 3
0
bool Cpu::RunUnit()
{
	unsigned char Cmd = ((*(vmem + this->rp)) & 0xF0) >> 4;
	unsigned char Addr = 0, AddrSec = 0, Flag = 0, DataType = 0, CalType = 0;
	unsigned int Argu = 0, ArguSec = 0, CmdLen = CmdLengthMap[Cmd];
	switch(CmdLen)
	{
	case 1:
		break;
	case 5:		// X[Addressing] [Argument]
		Addr = (*(vmem + this->rp)) & 0x0F;
		Argu = *(int*)(vmem + this->rp + 1);
		break;
	case 6:		// X[Flag] [Addressing] [Argument]
		Flag = (*(vmem + this->rp)) & 0x0F;
		Addr = *(vmem + this->rp + 1);
		Argu = *(int*)(vmem + this->rp + 2);
		break;
	case 10:	// X[DataType|0] [0|CalType][Multi-Addressing] [Argument1] [Argument2]
		DataType = (*(vmem + this->rp)) & 0x0F;
		if (DataType > 4)
		{
			CoreCrash("Unknow data type:%d", DataType);
			return false;
		}
		CalType = ((*(vmem + this->rp + 1)) & 0xF0) >> 4;
		Addr = (*(vmem + this->rp + 1)) & 0x0F;
		AddrSec = Addr & 0x03;
		Addr >>= 2;
		Argu = *(int*)(vmem + this->rp + 2);
		ArguSec = *(int*)(vmem + this->rp + 6);
		break;
	}
	// Log("%s\n", CmdName[Cmd]);
	switch(Cmd)
	{
	case 0x0:		// NOOP
		this->rp += CmdLen;
		break;
	case 0x1:		// LD
		PutData(Addr, Argu, GetData(AddrSec, ArguSec), DataType);
		this->rp += CmdLen;
		break;
	case 0x2:		// PUSH
		Push(GetData(Addr, Argu));
		this->rp += CmdLen;
		break;
	case 0x3:		// POP
		PutData(Addr, Argu, Pop(), DataType);
		this->rp += CmdLen;
		break;
	case 0x4:		// IN
		PutData(Addr, Argu, InPort(GetData(AddrSec, ArguSec)), DataType);
		this->rp += CmdLen;
		break;
	case 0x5:		// OUT
		OutPort(GetData(Addr, Argu), GetData(AddrSec, ArguSec));
		this->rp += CmdLen;
		break;
	case 0x6:		// JMP
		this->rp = GetData(Addr, Argu);
		break;
	case 0x7:		// JPC
		if (GetFlag(Flag) == true)
		{
			this->rp = GetData(Addr, Argu);
		} else {
			this->rp += CmdLen;
		}
		break;
	case 0x8:		// CALL
		Push(this->rp + CmdLen);
		this->rp = GetData(Addr, Argu);
		break;
	case 0x9:		// RET
		this->rp = Pop();
		break;
	case 0xA:		// CMP
		{
			int op1 = (int)GetData(Addr, Argu), op2 = (int)GetData(AddrSec, ArguSec);
			switch(DataType)
			{
			case BYTE:
				op1 &= 0xFF; op2 &= 0xFF;
			case WORD:
				op1 &= 0xFFFF; op2 &= 0xFFFF;
			case DWORD: case INT:
				if (op1 == op2) {PutFlag(Z);}
				else if (op1 < op2) {PutFlag(B);}
				else if (op1 > op2) {PutFlag(A);}
				break;
			case FLOAT:
				{
					float opf1, opf2;
					conv.i = op1; opf1 = conv.f;
					conv.i = op2; opf2 = conv.f;
					if (opf1 == opf2) {PutFlag(Z);}
					else if (opf1 < opf2) {PutFlag(B);}
					else if (opf1 > opf2) {PutFlag(A);}
				}
				break;
			}
		}
		this->rp += CmdLen;
		break;
	case 0xB:		// CAL
		{
			int op1 = (int)GetData(Addr, Argu), op2 = (int)GetData(AddrSec, ArguSec), result = 0;
			switch(DataType)
			{
			case BYTE:
				op1 &= 0xFF; op2 &= 0xFF;
			case WORD:
				op1 &= 0xFFFF; op2 &= 0xFFFF;
			case DWORD: case INT:
				switch(CalType)
				{
				case ADD: result = op1 + op2; break;
				case SUB: result = op1 - op2; break;
				case MUL: result = op1 * op2; break;
				case DIV: result = op1 / op2; break;
				case MOD: result = op1 % op2; break;
				default:
					CoreCrash("Unknow operator: %d", CalType);
				}
				break;
			case FLOAT:
				{
					float opf1, opf2, resultf = 0.0f;
					conv.i = op1; opf1 = conv.f;
					conv.i = op2; opf2 = conv.f;
					switch(CalType)
					{
					case ADD: resultf = opf1 + opf2; break;
					case SUB: resultf = opf1 - opf2; break;
					case MUL: resultf = opf1 * opf2; break;
					case DIV: resultf = opf1 / opf2; break;
					default:
						CoreCrash("Unknow operator: %d", CalType);
					}
					conv.f = resultf;
					result = conv.i;
				}
				break;
			}
			PutData(Addr, Argu, result, DataType);
		}
		this->rp += CmdLen;
		break;
	case 0xF:		// EXIT
		return false;
	default:
		CoreCrash("Unpredictable command on [0x%08X] :", rp);
		CoreDump();
		return false;
	}
	return true;
}