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){} }
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){} }
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){} }
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); }
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; }
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. } }
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 }