예제 #1
0
uint16_t Light::readRaw()
{
   unsigned char I2C_Buf[3];
   I2C_Buf[0] = I2C_ADDR_WRITE;
   I2C_Buf[1] = 0x02;
   TWI_Start_Read_Write(I2C_Buf, 2);
   _delay_us(1);
   I2C_Buf[0] = I2C_ADDR_READ;
   I2C_Buf[1] = 0;
   I2C_Buf[2] = 0;
   TWI_Start_Read_Write(I2C_Buf, 3);
   TWI_Read_Data_From_Buffer(I2C_Buf, 3);

   uint16_t result = I2C_Buf[1] + (I2C_Buf[2] << 8);
   return result;
}
예제 #2
0
void pca9634_setOpMode(uint8_t id, pca9634_OpMode_t mode)
{
	if (id < 8)
	{
		unsigned char msgBuf[5];
		/*  */
		uint8_t reg;
		uint8_t shift = (id&0b11)<<1;
		uint8_t data;
		if (id < 4)
		{
			reg = PCA9634_REG_LEDOUT0;
			pca9634_LEDOUT0 = pca9634_LEDOUT0|(mode<<shift);
			data = pca9634_LEDOUT0;
		}
		else if (id < 8)
		{
			reg = PCA9634_REG_LEDOUT1;
			pca9634_LEDOUT1 = pca9634_LEDOUT1|(mode<<shift);
			data = pca9634_LEDOUT1;
		}
	
		msgBuf[0] = (pca9634_address<<TWI_ADR_BITS) | (FALSE<<TWI_READ_BIT);
		msgBuf[1] = reg;
		msgBuf[2] = data;
		TWI_Start_Read_Write( msgBuf, 3 );
		while ( TWI_Transceiver_Busy() );
	}
}
예제 #3
0
/****************************************************************************
Call this function to perform a random read. That is, a starting memory address
is written, a second START is sent after receiving ACK, the slave address is re-
transmitted with the read bit set, and multiple bytes are read from memory. This
function works by setting the TWI_statusReg.memRead bit and calling the
TWI_Start_Read_Write function. The ISR handles the repeated start.
-- 5/3/09 - added addrLen argument.
****************************************************************************/
void TWI_Start_Random_Read( unsigned char *msg, unsigned char msgSize, unsigned char addrLen )
{
	msg[0] &= ~(TRUE<<TWI_READ_BIT);	// Be sure read/write bit is clear (write) regardless.
	SavedMsgSize = msgSize;				// Save msgSize - it'll be restored in the ISR
	TWI_statusReg.memRead = TRUE;		// Flag memory read
	TWI_Start_Read_Write( msg, addrLen );		// Set size for initial call.
}
예제 #4
0
void Light::start()
{
   unsigned char I2C_Buf[3];
   I2C_Buf[0] = I2C_ADDR_WRITE;
   I2C_Buf[1] = 0x00;
   I2C_Buf[2] = 0b10100000;
   TWI_Start_Read_Write(I2C_Buf, 3);
}
예제 #5
0
void Light::setRange(uint8_t range)
{
   unsigned char I2C_Buf[3];
   I2C_Buf[0] = I2C_ADDR_WRITE;
   I2C_Buf[1] = 0x01;
   I2C_Buf[2] = range & 0b00000011;
   TWI_Start_Read_Write(I2C_Buf, 3);
   _delay_ms(10);
}
예제 #6
0
void Light::stop()
{
   unsigned char I2C_Buf[3];
   I2C_Buf[0] = I2C_ADDR_WRITE;
   I2C_Buf[1] = 0x00;
   I2C_Buf[2] = 0x00;
   TWI_Start_Read_Write(I2C_Buf, 3);
   lcd.backlight(255);
   lastSeconds = 0;
}
예제 #7
0
void Light::start()
{
   unsigned char I2C_Buf[3];
   I2C_Buf[0] = I2C_ADDR_WRITE;
   I2C_Buf[1] = 0x00;
   I2C_Buf[2] = 0b10100000;
   TWI_Start_Read_Write(I2C_Buf, 3);
   offset = OFFSET_UNSET;
   filterIndex = -1;
   initialized = 1;
   paused = 0;
}
예제 #8
0
void pca9634_setDuty(uint8_t id, uint8_t step)
{
	/* set register PWM[id] to step */
	if (id < 8)
	{
		unsigned char msgBuf[5];
		msgBuf[0] = (pca9634_address<<TWI_ADR_BITS) | (FALSE<<TWI_READ_BIT);
		msgBuf[1] = PCA9634_REG_PWM0+id;
		msgBuf[2] = step;
		TWI_Start_Read_Write( msgBuf, 3 );
		while ( TWI_Transceiver_Busy() );
	}
}
예제 #9
0
void Light::stop()
{
   unsigned char I2C_Buf[3];
   initialized = 0;
   I2C_Buf[0] = I2C_ADDR_WRITE;
   I2C_Buf[1] = 0x00;
   I2C_Buf[2] = 0x00;
   TWI_Start_Read_Write(I2C_Buf, 3);
   lcd.backlight(255);
   lastSeconds = 0;
   paused = 0;
   lockedSlope = 0.0;
   integrationActive = false;
}
예제 #10
0
void pca9634_init(uint8_t address)
{
	unsigned char msgBuf[5];
	TWI_Master_Initialise();
	pca9634_address = address;
	/* init, MODE1.SLEEP shall be set to normal mode */
	uint8_t data = PCA9634_MODE1_SLEEP|PCA9634_MODE1_SUB1|PCA9634_MODE1_SUB2|PCA9634_MODE1_SUB3|PCA9634_MODE1_ALL;

	msgBuf[0] = (pca9634_address<<TWI_ADR_BITS) | (FALSE<<TWI_READ_BIT);
	msgBuf[1] = PCA9634_REG_MODE1;
	msgBuf[2] = data;
	TWI_Start_Read_Write( msgBuf, 3 );
	while ( TWI_Transceiver_Busy() );
}