FRDM-KL46Z board sLCD demo code

Dependencies:   SLCD mbed

Fork of FRDM-KL46Z LCD rtc Demo by Paul Staron

Committer:
salemtang
Date:
Wed Oct 01 13:11:15 2014 +0000
Revision:
8:18e86eb228ca
Child:
10:e6a7ab919241
20141001_2211 modified

Who changed what in which revision?

UserRevisionLine numberNew contents of line
salemtang 8:18e86eb228ca 1 /*
salemtang 8:18e86eb228ca 2 * MAG3110 Sensor Library for mbed
salemtang 8:18e86eb228ca 3 * TODO: Add proper header
salemtang 8:18e86eb228ca 4 */
salemtang 8:18e86eb228ca 5
salemtang 8:18e86eb228ca 6 #ifndef MAG3110_H
salemtang 8:18e86eb228ca 7 #define MAG3110_H
salemtang 8:18e86eb228ca 8
salemtang 8:18e86eb228ca 9 #include "mbed.h"
salemtang 8:18e86eb228ca 10
salemtang 8:18e86eb228ca 11 #define PI 3.14159265359
salemtang 8:18e86eb228ca 12
salemtang 8:18e86eb228ca 13 #define MAG_ADDR 0x1D
salemtang 8:18e86eb228ca 14
salemtang 8:18e86eb228ca 15 // define registers
salemtang 8:18e86eb228ca 16 #define MAG_DR_STATUS 0x00
salemtang 8:18e86eb228ca 17 #define MAG_OUT_X_MSB 0x01
salemtang 8:18e86eb228ca 18 #define MAG_OUT_X_LSB 0x02
salemtang 8:18e86eb228ca 19 #define MAG_OUT_Y_MSB 0x03
salemtang 8:18e86eb228ca 20 #define MAG_OUT_Y_LSB 0x04
salemtang 8:18e86eb228ca 21 #define MAG_OUT_Z_MSB 0x05
salemtang 8:18e86eb228ca 22 #define MAG_OUT_Z_LSB 0x06
salemtang 8:18e86eb228ca 23 #define MAG_WHO_AM_I 0x07
salemtang 8:18e86eb228ca 24 #define MAG_SYSMOD 0x08
salemtang 8:18e86eb228ca 25 #define MAG_OFF_X_MSB 0x09
salemtang 8:18e86eb228ca 26 #define MAG_OFF_X_LSB 0x0A
salemtang 8:18e86eb228ca 27 #define MAG_OFF_Y_MSB 0x0B
salemtang 8:18e86eb228ca 28 #define MAG_OFF_Y_LSB 0x0C
salemtang 8:18e86eb228ca 29 #define MAG_OFF_Z_MSB 0x0D
salemtang 8:18e86eb228ca 30 #define MAG_OFF_Z_LSB 0x0E
salemtang 8:18e86eb228ca 31 #define MAG_DIE_TEMP 0x0F
salemtang 8:18e86eb228ca 32 #define MAG_CTRL_REG1 0x10
salemtang 8:18e86eb228ca 33 #define MAG_CTRL_REG2 0x11
salemtang 8:18e86eb228ca 34
salemtang 8:18e86eb228ca 35 // what should WHO_AM_I return?
salemtang 8:18e86eb228ca 36 #define MAG_3110_WHO_AM_I_VALUE 0xC4
salemtang 8:18e86eb228ca 37
salemtang 8:18e86eb228ca 38
salemtang 8:18e86eb228ca 39 // Fields in registers
salemtang 8:18e86eb228ca 40 // CTRL_REG1: dr2,dr1,dr0 os1,os0 fr tm ac
salemtang 8:18e86eb228ca 41
salemtang 8:18e86eb228ca 42 // Sampling rate from 80Hz down to 0.625Hz
salemtang 8:18e86eb228ca 43 #define MAG_3110_SAMPLE80 0
salemtang 8:18e86eb228ca 44 #define MAG_3110_SAMPLE40 0x20
salemtang 8:18e86eb228ca 45 #define MAG_3110_SAMPLE20 0x40
salemtang 8:18e86eb228ca 46 #define MAG_3110_SAMPLE10 0x60
salemtang 8:18e86eb228ca 47 #define MAG_3110_SAMPLE5 0x80
salemtang 8:18e86eb228ca 48 #define MAG_3110_SAMPLE2_5 0xA0
salemtang 8:18e86eb228ca 49 #define MAG_3110_SAMPLE1_25 0xC0
salemtang 8:18e86eb228ca 50 #define MAG_3110_SAMPLE0_625 0xE0
salemtang 8:18e86eb228ca 51
salemtang 8:18e86eb228ca 52 // How many samples to average (lowers data rate)
salemtang 8:18e86eb228ca 53 #define MAG_3110_OVERSAMPLE1 0
salemtang 8:18e86eb228ca 54 #define MAG_3110_OVERSAMPLE2 0x08
salemtang 8:18e86eb228ca 55 #define MAG_3110_OVERSAMPLE3 0x10
salemtang 8:18e86eb228ca 56 #define MAG_3110_OVERSAMPLE4 0x18
salemtang 8:18e86eb228ca 57
salemtang 8:18e86eb228ca 58 // read only 1 byte per axis
salemtang 8:18e86eb228ca 59 #define MAG_3110_FASTREAD 0x04
salemtang 8:18e86eb228ca 60 // do one measurement (even if in standby mode)
salemtang 8:18e86eb228ca 61 #define MAG_3110_TRIGGER 0x02
salemtang 8:18e86eb228ca 62 // put in active mode
salemtang 8:18e86eb228ca 63 #define MAG_3110_ACTIVE 0x01
salemtang 8:18e86eb228ca 64
salemtang 8:18e86eb228ca 65 // CTRL_REG2: AUTO_MRST_EN _ RAW MAG_RST _ _ _ _ _
salemtang 8:18e86eb228ca 66 // reset sensor after each reading
salemtang 8:18e86eb228ca 67 #define MAG_3110_AUTO_MRST_EN 0x80
salemtang 8:18e86eb228ca 68 // don't subtract user offsets
salemtang 8:18e86eb228ca 69 #define MAG_3110_RAW 0x20
salemtang 8:18e86eb228ca 70 // reset magnetic sensor after too-large field
salemtang 8:18e86eb228ca 71 #define MAG_3110_MAG_RST 0x10
salemtang 8:18e86eb228ca 72
salemtang 8:18e86eb228ca 73 // DR_STATUS Register ZYXOW ZOW YOW XOW ZYXDR ZDR YDR XDR
salemtang 8:18e86eb228ca 74 #define MAG_3110_ZYXDR 0x08
salemtang 8:18e86eb228ca 75
salemtang 8:18e86eb228ca 76 /**
salemtang 8:18e86eb228ca 77 * MAG3110 Class to read X/Y/Z data from the magentometer
salemtang 8:18e86eb228ca 78 *
salemtang 8:18e86eb228ca 79 */
salemtang 8:18e86eb228ca 80 class MAG3110
salemtang 8:18e86eb228ca 81 {
salemtang 8:18e86eb228ca 82 public:
salemtang 8:18e86eb228ca 83 /**
salemtang 8:18e86eb228ca 84 * Main constructor
salemtang 8:18e86eb228ca 85 * @param sda SDA pin
salemtang 8:18e86eb228ca 86 * @param sdl SCL pin
salemtang 8:18e86eb228ca 87 * @param addr addr of the I2C peripheral
salemtang 8:18e86eb228ca 88 */
salemtang 8:18e86eb228ca 89 MAG3110(PinName sda, PinName scl);
salemtang 8:18e86eb228ca 90 /**
salemtang 8:18e86eb228ca 91 * Debug version of constructor
salemtang 8:18e86eb228ca 92 * @param sda SDA pin
salemtang 8:18e86eb228ca 93 * @param sdl SCL pin
salemtang 8:18e86eb228ca 94 * @param addr Address of the I2C peripheral
salemtang 8:18e86eb228ca 95 * @param pc Serial object to output debug messages
salemtang 8:18e86eb228ca 96 */
salemtang 8:18e86eb228ca 97 MAG3110(PinName sda, PinName scl, Serial *pc); //pass serial for debug
salemtang 8:18e86eb228ca 98 /**
salemtang 8:18e86eb228ca 99 * Setup the Magnetometer
salemtang 8:18e86eb228ca 100 *
salemtang 8:18e86eb228ca 101 */
salemtang 8:18e86eb228ca 102 void begin();
salemtang 8:18e86eb228ca 103 /**
salemtang 8:18e86eb228ca 104 * Read a register, return its value as int
salemtang 8:18e86eb228ca 105 * @param regAddr The address to read
salemtang 8:18e86eb228ca 106 * @return value in register
salemtang 8:18e86eb228ca 107 */
salemtang 8:18e86eb228ca 108 int readReg(char regAddr);
salemtang 8:18e86eb228ca 109 /**
salemtang 8:18e86eb228ca 110 * Read a value from a pair of registers, return as int
salemtang 8:18e86eb228ca 111 * @param regAddr The address to read
salemtang 8:18e86eb228ca 112 * @return Value from 2 consecutive registers
salemtang 8:18e86eb228ca 113 */
salemtang 8:18e86eb228ca 114 int readVal(char regAddr);
salemtang 8:18e86eb228ca 115 /**
salemtang 8:18e86eb228ca 116 * Calculate the heading
salemtang 8:18e86eb228ca 117 * @return heading in degrees
salemtang 8:18e86eb228ca 118 */
salemtang 8:18e86eb228ca 119 float getHeading();
salemtang 8:18e86eb228ca 120 /**
salemtang 8:18e86eb228ca 121 * Perform a read on the X, Y and Z values.
salemtang 8:18e86eb228ca 122 * @param xVal Pointer to X value
salemtang 8:18e86eb228ca 123 * @param yVal Pointer to Y value
salemtang 8:18e86eb228ca 124 * @param zVal Pointer to Z value
salemtang 8:18e86eb228ca 125 */
salemtang 8:18e86eb228ca 126 void getValues(int *xVal, int *yVal, int *zVal);
salemtang 8:18e86eb228ca 127 /**
salemtang 8:18e86eb228ca 128 * Set the calibration parameters if required.
salemtang 8:18e86eb228ca 129 * @param minX Minimum value for X range
salemtang 8:18e86eb228ca 130 * @param maxX Maximum value for X range
salemtang 8:18e86eb228ca 131 * @param minY Minimum value for Y range
salemtang 8:18e86eb228ca 132 * @param maxY maximum value for Y range
salemtang 8:18e86eb228ca 133 */
salemtang 8:18e86eb228ca 134 void setCalibration(int minX, int maxX, int minY, int maxY);
salemtang 8:18e86eb228ca 135
salemtang 8:18e86eb228ca 136 private:
salemtang 8:18e86eb228ca 137 I2C _i2c;
salemtang 8:18e86eb228ca 138 int _i2c_address;
salemtang 8:18e86eb228ca 139 Serial *_pc;
salemtang 8:18e86eb228ca 140 bool _debug;
salemtang 8:18e86eb228ca 141 int _avgX, _avgY;
salemtang 8:18e86eb228ca 142
salemtang 8:18e86eb228ca 143 };
salemtang 8:18e86eb228ca 144 #endif