Vincent Belanger
/
APP
APP 1 S5.
APP.cpp
- Committer:
- vinbel93
- Date:
- 2016-01-12
- Revision:
- 13:08ef55cd14c6
- Parent:
- 12:4961ec71bc8f
- Child:
- 14:d48d869ed365
File content as of revision 13:08ef55cd14c6:
// APP.cpp // Vincent Belanger - belv1802 // Jeremy Pare - parj2713 #include <math.h> #include <stdint.h> #include "mbed.h" #include "UART.h" #include "APP.h" #include "LPC17xx.h" static I2C i2c(p28, p27); void setup() { SystemCoreClockUpdate(); // Setup UART and I2C. UARTInit(9600); i2c.frequency(100000); // Clear display UARTSend(0x76); // Decimal point for display UARTSend(0x77); UARTSend(0x02); // Maximum brightness UARTSend(0x7A); UARTSend(0xFF); } void activateAccelerometer() { uint8_t data[2] = {CTRL_REG, 0x01}; i2c.write(ACC_ADDRESS, (char*) data, 2); } uint8_t readStatus() { uint8_t result[1]; uint8_t reg[1] = {STATUS_REG}; i2c.write(ACC_ADDRESS, (char*) reg, 1, true); i2c.read(ACC_ADDRESS, (char*) result, 1); return result[0]; } int16_t convertToAcceleration(uint8_t hi, uint8_t lo) { int16_t value = (lo >> 2) | (hi << 6); if (value > UINT14_MAX/2) { value -= UINT14_MAX; } return value; } int16_t readAndComputeAngle() { uint8_t result[6]; uint8_t reg[1] = {ACC_X_REG}; i2c.write(ACC_ADDRESS, (char*) reg, 1, true); i2c.read(ACC_ADDRESS, (char*) result, 6); int16_t accX = convertToAcceleration(result[0], result[1]); int16_t accY = convertToAcceleration(result[2], result[3]); int16_t accZ = convertToAcceleration(result[4], result[5]); float angle = acos((float) accZ / sqrt((float) accX*accX + accY*accY + accZ*accZ)) * 180.0 / PI; // To use integer operations instead of floating-point arithmetic, the angle is multiplied by 100. // This allows for two decimals of precision on the display. int16_t angleHundreds = angle * 100; if (angleHundreds > 9000) { angleHundreds = 18000 - angleHundreds; } return angleHundreds; } void updateDisplay(int16_t angle) { uint8_t digits[4]; sprintf((char*) digits, "%d", angle); if (angle < 100) { UARTSend('0'); UARTSend('0'); UARTSend(digits, 2); } else if (angle < 1000) { UARTSend('0'); UARTSend(digits, 3); } else { UARTSend(digits, 4); } } int32_t main() { setup(); activateAccelerometer(); while (true) { // Read bit 3 from the status register int8_t status = (readStatus() >> 3) & 0x01; if (status == 1) { // Get accelerations, compute angle uint16_t angle = readAndComputeAngle(); // Update 7 segment display updateDisplay(angle); } wait(0.4); } }