Example #1
0
void initMPU6050()
{
	//Device Reset
	sendbuffer[0] = MPU6050_RA_PWR_MGMT_1;	//Registeradresse 0x6b
	sendbuffer[1] = 0x80;	//Device Reset
	TWI_MasterWrite(&twiMaster, SLAVE_ADDRESS, &sendbuffer[0], 2);
      while (twiMaster.status != TWIM_STATUS_READY){}
	
	//_delay_ms(10);
	_delay_loop_2(65535);	// 8,2 ms
      
	//PWR_MGMT_1
	sendbuffer[0] = MPU6050_RA_PWR_MGMT_1;	//Registeradresse 0x6b
	sendbuffer[1] = 0x03;	//DEVICE_RESET = 0, SLEEP = 0, CYCLE = 0, TEMP_DIS = 0, CLKSEL = PLL with z axis gyro reference
	TWI_MasterWrite(&twiMaster, SLAVE_ADDRESS, &sendbuffer[0], 2);
	while (twiMaster.status != TWIM_STATUS_READY){}
	
	
	//Sample Rate 1000/(1+1) =  500Hz
	sendbuffer[0] = MPU6050_RA_SMPLRT_DIV;	//Registeradresse 0x19
	sendbuffer[1] = 0x01;
	TWI_MasterWrite(&twiMaster, SLAVE_ADDRESS, &sendbuffer[0], 2);
	while (twiMaster.status != TWIM_STATUS_READY){}
	
	
	//DLPF
	sendbuffer[0] = MPU6050_RA_CONFIG; //Registeradresse 0x1a
	sendbuffer[1] = MPU6050_DLPF_CFG_42HZ;	//EXT_SYNC_SET = 0, Digital Low Pass Filter, Auswahl 5, 10, 20, 42, 98, 188, 256Hz
	TWI_MasterWrite(&twiMaster, SLAVE_ADDRESS, &sendbuffer[0], 2);
	while (twiMaster.status != TWIM_STATUS_READY){}
}
Example #2
0
void initAcc()
{
	//ACCEL_CONFIG
	sendbuffer[0] = MPU6050_RA_ACCEL_CONFIG;
	sendbuffer[1] = 0b00001000;	//Accel Selftest = disabled, Scale = +-4g, DHPF = disabled
	TWI_MasterWrite(&twiMaster, SLAVE_ADDRESS, &sendbuffer[0], 2);
	while (twiMaster.status != TWIM_STATUS_READY){}	
}
Example #3
0
void initGyro()
{	
	//GYRO_CONFIG
	sendbuffer[0] = MPU6050_RA_GYRO_CONFIG;  //Registeradresse 0x1b
	sendbuffer[1] = 0b00001000;	//Gyro Selftest FS_SEL = disabled, Scale +-500 deg/sec
	TWI_MasterWrite(&twiMaster, SLAVE_ADDRESS, &sendbuffer[0], 2);
	while (twiMaster.status != TWIM_STATUS_READY){}
}
Example #4
0
void gyro_write_byte(uint8_t slave, uint8_t address, uint8_t data)
{
    // Initialize and fill data buffer
    uint8_t data_buf[2];
    data_buf[0] = address;
    data_buf[1] = data;
    // Transmit bytes
    TWI_MasterWrite(&twiMaster,slave,data_buf,2);
    // Wait for transmission completion
    while (twiMaster.status != TWIM_STATUS_READY);
}
Example #5
0
uint8_t twiWriteWrapper(uint8_t addr, uint8_t* writeData, uint8_t bytesToWrite, char* callerDescr){
	uint32_t startTime = getTime();
	uint8_t result = 0;
	uint8_t printed = 0;
	while(!result){
		if((printed = waitForTWIReady(startTime, callerDescr))){
			result = TWI_MasterWrite(addr, writeData, bytesToWrite);
		}else{
			return 0;
		}
	}
	return result + printed - 1;
}
Example #6
0
int main(void)
{
	facilitatePowersaving();		// Pull-ups and PR Registers
	initHardware();					// Switches, LEDs, Sleep, Interrupt

	sei();							// Enable global interrupts

/* === Initialization of TWI Module === */

	// Enable internal pull-up on PD0, PD1 for correct TWI operation
	PORTCFG.MPCMASK = 0x03;
	TWIPORT.PIN0CTRL = (TWIPORT.PIN0CTRL & ~PORT_OPC_gm) | PORT_OPC_PULLUP_gc;

	/* Initialize TWI master. */
	TWI_MasterInit(&twiMaster,
	               &TWI,
	               TWI_MASTER_INTLVL_LO_gc,
	               TWI_BAUDSETTING);

	/* Initialize TWI slave. */
	TWI_SlaveInitializeDriver(&twiSlave, &TWI, TWI_SlaveProcessData);
	TWI_SlaveInitializeModule(&twiSlave,
	                          OWN_ADDRESS,
	                          TWI_SLAVE_INTLVL_LO_gc);

/* === End Initialization === */


	while (1) {
			
			// Try to sleep while we are waiting for button press
			while (READ_SWITCHES == 0x00){ //See board.h for READ_SWITCHES define.
				sleep();
				}
			_delay_ms(5);	// Debounce switch			

			sendBuffer[0] = READ_SWITCHES;
			TWI_MasterWrite(&twiMaster,		// Module
	                    OTHER_ADDRESS,		// Which slave
	                    &sendBuffer[0],		// What to send
	                    1);					// Send how much

			/* Wait until transaction is complete. Required TWI interrupts will be executed while waiting */
			while (twiMaster.status != TWIM_STATUS_READY); 
			
			// Wait for user to release button.
			while (READ_SWITCHES != 0x00); //See board.h for READ_SWITCHES define.
	}
	
}
Example #7
0
void rgb_sensor_init()
{
	#ifdef AUDIO_DROPLET
		uint8_t power_on_sequence[8] = {0x80, 0x01,  // Write 0x01 to ENABLE register, activating the device's oscillator.
										0x8F, 0x01,  // Write 0x01 to CONTROL register, setting the gain to x4.
										0x81, 0xD5,	 // Write 0xD5 to ATIME register, setting the integration time to 2.4ms*(256-ATIME)
										0x80, 0x03};  // Write 0x03 to ENABLE register, activating the ADC (and leaving the oscillator on);

		uint8_t result = TWI_MasterWrite(RGB_SENSE_ADDR, &(power_on_sequence[0]), 2);
		if(!result)	printf_P(RGB_SENSE_POWERON_FAILURE,1);
		delay_ms(5);
		result = TWI_MasterWrite(RGB_SENSE_ADDR, &(power_on_sequence[2]), 2);
		if(!result)	printf_P(RGB_SENSE_POWERON_FAILURE,2);
		delay_ms(5);
		result = TWI_MasterWrite(RGB_SENSE_ADDR, &(power_on_sequence[4]), 2);
		if(!result)	printf_P(RGB_SENSE_POWERON_FAILURE,3);
		delay_ms(5);
		result = TWI_MasterWrite(RGB_SENSE_ADDR, &(power_on_sequence[6]), 2);
		if(!result)	printf_P(RGB_SENSE_POWERON_FAILURE,4);
		delay_ms(5);
	#else		
		RGB_SENSOR_PORT.DIRCLR = RGB_SENSOR_R_PIN_bm | RGB_SENSOR_G_PIN_bm | RGB_SENSOR_B_PIN_bm;

		ADCA.REFCTRL = ADC_REFSEL_AREFA_gc;
		ADCA.CTRLB = ADC_RESOLUTION_LEFT12BIT_gc | ADC_CONMODE_bm;
		ADCA.PRESCALER = ADC_PRESCALER_DIV256_gc;
		/* When differential input is used, signed mode must be used. (sec. 28.6 of Manual) */

		ADCA.CH0.CTRL = ADC_CH_INPUTMODE_DIFFWGAIN_gc | ADC_CH_GAIN_1X_gc;	//Probably should turn the gain back up to 4X when we put the shells on.
		ADCA.CH1.CTRL = ADC_CH_INPUTMODE_DIFFWGAIN_gc | ADC_CH_GAIN_1X_gc;	//Probably should turn the gain back up to 4X when we put the shells on.
		ADCA.CH2.CTRL = ADC_CH_INPUTMODE_DIFFWGAIN_gc | ADC_CH_GAIN_2X_gc;	//Probably should turn the gain back up to 4X when we put the shells on.
	
		ADCA.CH0.MUXCTRL = ADC_CH_MUXPOS_PIN5_gc | ADC_CH_MUXNEG_INTGND_MODE4_gc;	// Red sensor on ADC A channel 0
		ADCA.CH1.MUXCTRL = ADC_CH_MUXPOS_PIN6_gc | ADC_CH_MUXNEG_INTGND_MODE4_gc;	// Green sensor on ADC A channel 1
		ADCA.CH2.MUXCTRL = ADC_CH_MUXPOS_PIN7_gc | ADC_CH_MUXNEG_INTGND_MODE4_gc;	// Blue sensor on ADC A channel 2
	
		ADCA.CALL = PRODSIGNATURES_ADCACAL0;
		ADCA.CALH = PRODSIGNATURES_ADCACAL1;

		ADCA.CTRLA = ADC_ENABLE_bm;
	
		//read_color_settings();
	
		delay_us(50);
		const int8_t num_samples = 3;
		get_red_sensor(); get_blue_sensor(); get_green_sensor();
		delay_ms(10);
		int16_t r_avg=0, g_avg=0, b_avg=0;
		for(uint8_t i=0; i<num_samples; i++)
		{
			r_avg+=get_red_sensor();
			g_avg+=get_green_sensor();
			b_avg+=get_blue_sensor();
			delay_ms(10);
			//printf("\r\n");
		}
		r_baseline= r_avg/num_samples;
		g_baseline= g_avg/num_samples;
		b_baseline= b_avg/num_samples;
		//printf("Baselines:\r\n%3d  %3d  %3d\r\n", r_baseline, g_baseline, b_baseline);
		r_baseline = 0;
		g_baseline = 0;
		b_baseline = 0;	
	#endif		
}