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; }
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() ); } }
/**************************************************************************** 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. }
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); }
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); }
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; }
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; }
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() ); } }
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; }
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() ); }