FRDM-KL46Z board sLCD demo code

Dependencies:   SLCD mbed

Fork of FRDM-KL46Z LCD rtc Demo by Paul Staron

Committer:
salemtang
Date:
Thu Oct 02 14:14:28 2014 +0000
Revision:
12:cae0afb130b1
Parent:
10:e6a7ab919241
20141002_2315 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 // Fields in registers
salemtang 8:18e86eb228ca 39 // CTRL_REG1: dr2,dr1,dr0 os1,os0 fr tm ac
salemtang 8:18e86eb228ca 40
salemtang 8:18e86eb228ca 41 // Sampling rate from 80Hz down to 0.625Hz
salemtang 8:18e86eb228ca 42 #define MAG_3110_SAMPLE80 0
salemtang 8:18e86eb228ca 43 #define MAG_3110_SAMPLE40 0x20
salemtang 8:18e86eb228ca 44 #define MAG_3110_SAMPLE20 0x40
salemtang 8:18e86eb228ca 45 #define MAG_3110_SAMPLE10 0x60
salemtang 8:18e86eb228ca 46 #define MAG_3110_SAMPLE5 0x80
salemtang 8:18e86eb228ca 47 #define MAG_3110_SAMPLE2_5 0xA0
salemtang 8:18e86eb228ca 48 #define MAG_3110_SAMPLE1_25 0xC0
salemtang 8:18e86eb228ca 49 #define MAG_3110_SAMPLE0_625 0xE0
salemtang 8:18e86eb228ca 50
salemtang 8:18e86eb228ca 51 // How many samples to average (lowers data rate)
salemtang 8:18e86eb228ca 52 #define MAG_3110_OVERSAMPLE1 0
salemtang 8:18e86eb228ca 53 #define MAG_3110_OVERSAMPLE2 0x08
salemtang 8:18e86eb228ca 54 #define MAG_3110_OVERSAMPLE3 0x10
salemtang 8:18e86eb228ca 55 #define MAG_3110_OVERSAMPLE4 0x18
salemtang 8:18e86eb228ca 56
salemtang 8:18e86eb228ca 57 // read only 1 byte per axis
salemtang 8:18e86eb228ca 58 #define MAG_3110_FASTREAD 0x04
salemtang 8:18e86eb228ca 59 // do one measurement (even if in standby mode)
salemtang 8:18e86eb228ca 60 #define MAG_3110_TRIGGER 0x02
salemtang 8:18e86eb228ca 61 // put in active mode
salemtang 8:18e86eb228ca 62 #define MAG_3110_ACTIVE 0x01
salemtang 8:18e86eb228ca 63
salemtang 8:18e86eb228ca 64 // CTRL_REG2: AUTO_MRST_EN _ RAW MAG_RST _ _ _ _ _
salemtang 8:18e86eb228ca 65 // reset sensor after each reading
salemtang 8:18e86eb228ca 66 #define MAG_3110_AUTO_MRST_EN 0x80
salemtang 8:18e86eb228ca 67 // don't subtract user offsets
salemtang 8:18e86eb228ca 68 #define MAG_3110_RAW 0x20
salemtang 8:18e86eb228ca 69 // reset magnetic sensor after too-large field
salemtang 8:18e86eb228ca 70 #define MAG_3110_MAG_RST 0x10
salemtang 8:18e86eb228ca 71
salemtang 8:18e86eb228ca 72 // DR_STATUS Register ZYXOW ZOW YOW XOW ZYXDR ZDR YDR XDR
salemtang 8:18e86eb228ca 73 #define MAG_3110_ZYXDR 0x08
salemtang 8:18e86eb228ca 74
salemtang 8:18e86eb228ca 75 /**
salemtang 8:18e86eb228ca 76 * MAG3110 Class to read X/Y/Z data from the magentometer
salemtang 8:18e86eb228ca 77 *
salemtang 8:18e86eb228ca 78 */
salemtang 8:18e86eb228ca 79 class MAG3110
salemtang 8:18e86eb228ca 80 {
salemtang 8:18e86eb228ca 81 public:
salemtang 8:18e86eb228ca 82 /**
salemtang 8:18e86eb228ca 83 * Main constructor
salemtang 8:18e86eb228ca 84 * @param sda SDA pin
salemtang 8:18e86eb228ca 85 * @param sdl SCL pin
salemtang 8:18e86eb228ca 86 * @param addr addr of the I2C peripheral
salemtang 8:18e86eb228ca 87 */
salemtang 8:18e86eb228ca 88 MAG3110(PinName sda, PinName scl);
salemtang 8:18e86eb228ca 89 /**
salemtang 8:18e86eb228ca 90 * Debug version of constructor
salemtang 8:18e86eb228ca 91 * @param sda SDA pin
salemtang 8:18e86eb228ca 92 * @param sdl SCL pin
salemtang 8:18e86eb228ca 93 * @param addr Address of the I2C peripheral
salemtang 8:18e86eb228ca 94 * @param pc Serial object to output debug messages
salemtang 8:18e86eb228ca 95 */
salemtang 8:18e86eb228ca 96 MAG3110(PinName sda, PinName scl, Serial *pc); //pass serial for debug
salemtang 8:18e86eb228ca 97 /**
salemtang 8:18e86eb228ca 98 * Setup the Magnetometer
salemtang 8:18e86eb228ca 99 *
salemtang 8:18e86eb228ca 100 */
salemtang 8:18e86eb228ca 101 void begin();
salemtang 8:18e86eb228ca 102 /**
salemtang 8:18e86eb228ca 103 * Read a register, return its value as int
salemtang 8:18e86eb228ca 104 * @param regAddr The address to read
salemtang 8:18e86eb228ca 105 * @return value in register
salemtang 8:18e86eb228ca 106 */
salemtang 8:18e86eb228ca 107 int readReg(char regAddr);
salemtang 8:18e86eb228ca 108 /**
salemtang 8:18e86eb228ca 109 * Read a value from a pair of registers, return as int
salemtang 8:18e86eb228ca 110 * @param regAddr The address to read
salemtang 8:18e86eb228ca 111 * @return Value from 2 consecutive registers
salemtang 8:18e86eb228ca 112 */
salemtang 8:18e86eb228ca 113 int readVal(char regAddr);
salemtang 8:18e86eb228ca 114 /**
salemtang 8:18e86eb228ca 115 * Calculate the heading
salemtang 8:18e86eb228ca 116 * @return heading in degrees
salemtang 8:18e86eb228ca 117 */
salemtang 8:18e86eb228ca 118 float getHeading();
salemtang 8:18e86eb228ca 119 /**
salemtang 8:18e86eb228ca 120 * Perform a read on the X, Y and Z values.
salemtang 8:18e86eb228ca 121 * @param xVal Pointer to X value
salemtang 8:18e86eb228ca 122 * @param yVal Pointer to Y value
salemtang 8:18e86eb228ca 123 * @param zVal Pointer to Z value
salemtang 8:18e86eb228ca 124 */
salemtang 8:18e86eb228ca 125 void getValues(int *xVal, int *yVal, int *zVal);
salemtang 8:18e86eb228ca 126 /**
salemtang 8:18e86eb228ca 127 * Set the calibration parameters if required.
salemtang 8:18e86eb228ca 128 * @param minX Minimum value for X range
salemtang 8:18e86eb228ca 129 * @param maxX Maximum value for X range
salemtang 8:18e86eb228ca 130 * @param minY Minimum value for Y range
salemtang 8:18e86eb228ca 131 * @param maxY maximum value for Y range
salemtang 8:18e86eb228ca 132 */
salemtang 8:18e86eb228ca 133 void setCalibration(int minX, int maxX, int minY, int maxY);
salemtang 8:18e86eb228ca 134
salemtang 8:18e86eb228ca 135 private:
salemtang 8:18e86eb228ca 136 I2C _i2c;
salemtang 8:18e86eb228ca 137 int _i2c_address;
salemtang 8:18e86eb228ca 138 Serial *_pc;
salemtang 8:18e86eb228ca 139 bool _debug;
salemtang 8:18e86eb228ca 140 int _avgX, _avgY;
salemtang 8:18e86eb228ca 141
salemtang 8:18e86eb228ca 142 };
salemtang 8:18e86eb228ca 143 #endif