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:
9:02f0249db903
20141002_2315 modified

Who changed what in which revision?

UserRevisionLine numberNew contents of line
salemtang 8:18e86eb228ca 1
salemtang 8:18e86eb228ca 2 #include "MAG3110.h"
salemtang 8:18e86eb228ca 3 #include "mbed.h"
salemtang 8:18e86eb228ca 4
salemtang 8:18e86eb228ca 5 /******************************************************************************
salemtang 8:18e86eb228ca 6 * Constructors
salemtang 8:18e86eb228ca 7 ******************************************************************************/
salemtang 8:18e86eb228ca 8 MAG3110::MAG3110(PinName sda, PinName scl): _i2c(sda, scl),
salemtang 8:18e86eb228ca 9 _i2c_address(0x1D), _pc(NULL), _debug(false)
salemtang 8:18e86eb228ca 10 {
salemtang 8:18e86eb228ca 11 begin();
salemtang 8:18e86eb228ca 12 }
salemtang 8:18e86eb228ca 13
salemtang 8:18e86eb228ca 14 MAG3110::MAG3110(PinName sda, PinName scl, Serial *pc): _i2c(sda, scl),
salemtang 8:18e86eb228ca 15 _i2c_address(0x1D), _pc(pc), _debug(true)
salemtang 8:18e86eb228ca 16 {
salemtang 8:18e86eb228ca 17 begin();
salemtang 8:18e86eb228ca 18 }
salemtang 8:18e86eb228ca 19
salemtang 8:18e86eb228ca 20 void MAG3110::begin()
salemtang 8:18e86eb228ca 21 {
salemtang 8:18e86eb228ca 22 char cmd[2];
salemtang 8:18e86eb228ca 23
salemtang 8:18e86eb228ca 24 cmd[0] = MAG_CTRL_REG2;
salemtang 8:18e86eb228ca 25 cmd[1] = 0x80;
salemtang 8:18e86eb228ca 26 _i2c.write(_i2c_address, cmd, 2);
salemtang 8:18e86eb228ca 27
salemtang 8:18e86eb228ca 28 cmd[0] = MAG_CTRL_REG1;
salemtang 8:18e86eb228ca 29 cmd[1] = MAG_3110_SAMPLE80+MAG_3110_OVERSAMPLE2+MAG_3110_ACTIVE;
salemtang 8:18e86eb228ca 30 _i2c.write(_i2c_address, cmd, 2);
salemtang 8:18e86eb228ca 31
salemtang 8:18e86eb228ca 32 // No adjustment initially
salemtang 8:18e86eb228ca 33 _avgX = 0;
salemtang 8:18e86eb228ca 34 _avgY = 0;
salemtang 8:18e86eb228ca 35 }
salemtang 8:18e86eb228ca 36
salemtang 8:18e86eb228ca 37 // Read a single byte form 8 bit register, return as int
salemtang 8:18e86eb228ca 38 int MAG3110::readReg(char regAddr)
salemtang 8:18e86eb228ca 39 {
salemtang 8:18e86eb228ca 40 char cmd[1];
salemtang 8:18e86eb228ca 41
salemtang 8:18e86eb228ca 42 cmd[0] = regAddr;
salemtang 8:18e86eb228ca 43 _i2c.write(_i2c_address, cmd, 1);
salemtang 8:18e86eb228ca 44
salemtang 8:18e86eb228ca 45 cmd[0] = 0x00;
salemtang 8:18e86eb228ca 46 _i2c.read(_i2c_address, cmd, 1);
salemtang 8:18e86eb228ca 47 return (int)( cmd[0]);
salemtang 8:18e86eb228ca 48 }
salemtang 8:18e86eb228ca 49
salemtang 8:18e86eb228ca 50 // read a register per, pass first reg value, reading 2 bytes increments register
salemtang 8:18e86eb228ca 51 // Reads MSB first then LSB
salemtang 8:18e86eb228ca 52 int MAG3110::readVal(char regAddr)
salemtang 8:18e86eb228ca 53 {
salemtang 8:18e86eb228ca 54 char cmd[2];
salemtang 8:18e86eb228ca 55
salemtang 8:18e86eb228ca 56 cmd[0] = regAddr;
salemtang 8:18e86eb228ca 57 _i2c.write(_i2c_address, cmd, 1);
salemtang 8:18e86eb228ca 58
salemtang 8:18e86eb228ca 59 cmd[0] = 0x00;
salemtang 8:18e86eb228ca 60 cmd[1] = 0x00;
salemtang 8:18e86eb228ca 61 _i2c.read(_i2c_address, cmd, 2);
salemtang 8:18e86eb228ca 62 return (int)( (cmd[1]|(cmd[0] << 8))); //concatenate the MSB and LSB
salemtang 8:18e86eb228ca 63 }
salemtang 8:18e86eb228ca 64
salemtang 8:18e86eb228ca 65 float MAG3110::getHeading()
salemtang 8:18e86eb228ca 66 {
salemtang 8:18e86eb228ca 67 int xVal = readVal(MAG_OUT_X_MSB);
salemtang 8:18e86eb228ca 68 int yVal = readVal(MAG_OUT_Y_MSB);
salemtang 8:18e86eb228ca 69 return (atan2((double)(yVal - _avgY),(double)(xVal - _avgX)))*180/PI;
salemtang 8:18e86eb228ca 70 }
salemtang 8:18e86eb228ca 71
salemtang 8:18e86eb228ca 72 void MAG3110::getValues(int *xVal, int *yVal, int *zVal)
salemtang 8:18e86eb228ca 73 {
salemtang 8:18e86eb228ca 74 *xVal = readVal(MAG_OUT_X_MSB);
salemtang 8:18e86eb228ca 75 *yVal = readVal(MAG_OUT_Y_MSB);
salemtang 8:18e86eb228ca 76 *zVal = readVal(MAG_OUT_Z_MSB);
salemtang 8:18e86eb228ca 77 }
salemtang 8:18e86eb228ca 78
salemtang 8:18e86eb228ca 79 void MAG3110::setCalibration(int minX, int maxX, int minY, int maxY )
salemtang 8:18e86eb228ca 80 {
salemtang 8:18e86eb228ca 81 _avgX=(maxX+minX)/2;
salemtang 8:18e86eb228ca 82 _avgY=(maxY+minY)/2;
salemtang 8:18e86eb228ca 83 }