void print_debug() { // check if that is really in the mode we set _printf(0, LCD_SEG_L1_3_0, "%03x", as_read_register(ADDR_CTRL)); _printf(0, LCD_SEG_L2_5_0, "%05x", as_read_register(ADDR_MDFFTMR)); }
// ************************************************************************************************* // @fn as_get_data // @brief Service routine to read acceleration values. // @param none // @return none // ************************************************************************************************* void as_get_data(unsigned * data) { // Exit if sensor is not powered up if ((AS_PWR_OUT & AS_PWR_PIN) != AS_PWR_PIN) return; // Store X/Y/Z acceleration data in buffer *(data+0) = as_read_register(0x06); *(data+1) = as_read_register(0x07); *(data+2) = as_read_register(0x08); }
void as_get_data(uint8_t *data) { /* Exit if sensor is not powered up */ if ((AS_PWR_OUT & AS_PWR_PIN) != AS_PWR_PIN) return; /* Store X/Y/Z acceleration data in buffer */ *(data + 0) = as_read_register(0x06); *(data + 1) = as_read_register(0x07); *(data + 2) = as_read_register(0x08); }
// ************************************************************************************************* // @fn cma_as_read_register // @brief Read a byte from the acceleration sensor // @param u8 bAddress Register address // @return u8 0 or bResult Register content // If the returned value is 0 there was an error. // ************************************************************************************************* u8 cma_as_read_register(u8 bAddress) { bAddress <<= 2; // Address to be shifted left by 2 and // RW bit to be reset return as_read_register(bAddress); }
static void up_btn() { // Depending on the state what do we do? switch (submenu_state) { case VIEW_SET_MODE: as_config.mode++; as_config.mode %= 3; change_mode(as_config.mode); update_menu(); break; case VIEW_SET_PARAMS: _printf(0,LCD_SEG_L1_3_0 , "%04x", as_read_register(ADDR_CTRL)); break; case VIEW_STATUS: _printf(0,LCD_SEG_L1_3_0, "%1u", as_status.all_flags); break; case VIEW_AXIS: display_chars(0,LCD_SEG_L1_3_0 , "TODO", SEG_SET); break; default: break; } /* update menu screen */ lcd_screen_activate(0); }
uint8_t as_get_z(void) { if ((AS_PWR_OUT & AS_PWR_PIN) != AS_PWR_PIN) return 0; return as_read_register(0x08); }
uint8_t as_get_status() { volatile uint8_t status; if ((AS_PWR_OUT & AS_PWR_PIN) != AS_PWR_PIN) return 0; status= as_read_register(ADDR_INT_STATUS); return status; }
static void as_event(enum sys_message msg) { if ( (msg & SYS_MSG_RTC_MINUTE) == SYS_MSG_RTC_MINUTE) { if(sAccel.mode == ACCEL_MODE_ON) sAccel.timeout--; //if timeout is over disable the accelerometer if(sAccel.timeout<1) { //disable accelerometer to save power as_stop(); //update the mode to remember sAccel.mode = ACCEL_MODE_OFF; } } if ( (msg & SYS_MSG_AS_INT) == SYS_MSG_AS_INT) { //Check the vti register for status information as_status.all_flags=as_get_status(); //TODO For debugging only _printf(0, LCD_SEG_L1_1_0, "%1u", as_status.all_flags); buzzer_play(smb); //if we were in free fall or motion detection mode check for the event if(as_status.int_status.falldet || as_status.int_status.motiondet){ //if such an event is detected enable the symbol //display_symbol(0, LCD_ICON_ALARM , SEG_SET | BLINK_ON); //read the data as_get_data(sAccel.xyz); //display_data(0); /* update menu screen */ lcd_screen_activate(0); }//if we were in measurment mode do a measurement and put it in the virtual screen else { //display_symbol(0, LCD_ICON_ALARM , SEG_SET | BLINK_OFF); display_data(1); /* refresh to accelerometer screen only if in that modality */ if (submenu_state== VIEW_AXIS )lcd_screen_activate(1); } } /* The 1 Hz timer is used to refresh the menu screen */ if ( (msg & SYS_MSG_RTC_SECOND) == SYS_MSG_RTC_SECOND) { /*check the status register for debugging purposes */ _printf(0, LCD_SEG_L1_1_0, "%1u", as_read_register(ADDR_INT_STATUS)); /* update menu screen */ lcd_screen_activate(0); } }
// ************************************************************************************************* // @fn as_get_data // @brief Service routine to read acceleration values. // @param none // @return none // ************************************************************************************************* void as_get_data(u8 * data) { // Exit if sensor is not powered up if ((AS_PWR_OUT & AS_PWR_PIN) != AS_PWR_PIN) return; // Dummy read LSB from LSB acceleration data to update MSB (BMA250 datasheet 4.4.1) *(data+1) = as_read_register(BMP_ACC_X_LSB); *(data+0) = as_read_register(BMP_ACC_Y_LSB); *(data+2) = as_read_register(BMP_ACC_Z_LSB); // Store X/Y/Z MSB acceleration data in buffer *(data+1) = as_read_register(BMP_ACC_X_MSB); *(data+0) = as_read_register(BMP_ACC_Y_MSB); *(data+2) = as_read_register(BMP_ACC_Z_MSB); }
u8 as_get_y(void) { if ((AS_PWR_OUT & AS_PWR_PIN) != AS_PWR_PIN) return 0; return as_read_register(0x07); }
// ************************************************************************************************* // @fn bmp_as_read_register // @brief Read a byte from the acceleration sensor // @param u8 bAddress Register address // @return u8 Register content // ************************************************************************************************* u8 bmp_as_read_register(u8 bAddress) { bAddress |= BIT7; // set R/W bit for reading return as_read_register(bAddress); }