예제 #1
0
파일: sccb.cpp 프로젝트: Neon22/pixy
unsigned char CSccb::Read(unsigned char addr)
	{
	unsigned char i, val;

	// 2 phase
	Start();
	Write(m_dev);
	Write(addr);
	Stop();

	Start();
	Write(m_dev + 1);
	TriState();
	for (i=0, val=0; i<8; i++)
		{
		val <<= 1;
		PortWrite(1, 0);
		if (DATA_REG&DATA_MASK)
			val |= 1;
		PortWrite(0, 0);
		}

	// send NA bit
	PortWrite(0, 1);
	Drive();
	PortWrite(1, 1);
	PortWrite(0, 1);

	Stop();

	return val;
	}
예제 #2
0
파일: sccb.cpp 프로젝트: Neon22/pixy
void CSccb::Write(unsigned char val)
	{
	unsigned char i;

	for (i=0; i<8; i++, val<<=1)
		{
		if (val&0x80) // send msb first
			{
			PortWrite(0, 1);
			PortWrite(1, 1);
			PortWrite(0, 1);
			}
		else
			{
			PortWrite(0, 0);
			PortWrite(1, 0);
			PortWrite(0, 0);
			}
		}
	// send "don't care" bit
	TriState();
	PortWrite(0, 0);
	PortWrite(1, 0);
	PortWrite(0, 0);
	Drive();
	}
예제 #3
0
/**
 * @brief
 * This method transmits au8Buffer to Serial line.
 * Only if u8txenpin != 0, there is a flow handling in order to keep
 * the RS485 transceiver in output state as long as the message is being sent.
 * This is done with UCSRxA register.
 * The CRC is appended to the buffer before starting to send it.
 *
 * @param nothing
 * @return nothing
 * @ingroup buffer
 */
void ModbusSendTxBuffer()
{
    //  uint8_t i = 0;

    // append CRC to message
    uint16_t u16crc = ModbusCalcCRC(_u8BufferSize);
    _au8Buffer[ _u8BufferSize ] = u16crc >> 8;
    _u8BufferSize++;
    _au8Buffer[ _u8BufferSize ] = u16crc & 0x00ff;
    _u8BufferSize++;


    // transfer buffer to serial line
    PortWrite(_au8Buffer, _u8BufferSize);

    // keep RS485 transceiver in transmit mode as long as sending


    //!!!  port->flush();
    _u8BufferSize = 0;

    // set time-out for master
    _u32timeOut = millis() + (unsigned long) _u16timeOut;

    // increase message counter
    _u16OutCnt++;
}
예제 #4
0
파일: sccb.cpp 프로젝트: Neon22/pixy
CSccb::CSccb(unsigned char dev)
	{
	m_dev = dev;
	DIR_REG |= CLK_MASK;

	TriState();	// set clock as output, data tristate
	PortWrite(1, 0);	// set clock high (idle)	 


	//
#if 0
	volatile unsigned long val;
	Drive();
	PortWrite(0, 0);
	PortWrite(0, 1);
	PortWrite(1, 0);
	PortWrite(1, 1);
	TriState();	// set clock as output, data tristate
	val = DATA_REG&DATA_MASK;
	val = DATA_REG&DATA_MASK;
	val = DATA_REG&DATA_MASK;
#endif
	}
예제 #5
0
void MemMapper::Reset()
{
    PortWrite(0, 0);
}