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:
9:02f0249db903
20141001_2211 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
salemtang 8:18e86eb228ca 51 // read a register per, pass first reg value, reading 2 bytes increments register
salemtang 8:18e86eb228ca 52 // Reads MSB first then LSB
salemtang 8:18e86eb228ca 53 int MAG3110::readVal(char regAddr)
salemtang 8:18e86eb228ca 54 {
salemtang 8:18e86eb228ca 55 char cmd[2];
salemtang 8:18e86eb228ca 56
salemtang 8:18e86eb228ca 57 cmd[0] = regAddr;
salemtang 8:18e86eb228ca 58 _i2c.write(_i2c_address, cmd, 1);
salemtang 8:18e86eb228ca 59
salemtang 8:18e86eb228ca 60 cmd[0] = 0x00;
salemtang 8:18e86eb228ca 61 cmd[1] = 0x00;
salemtang 8:18e86eb228ca 62 _i2c.read(_i2c_address, cmd, 2);
salemtang 8:18e86eb228ca 63 return (int)( (cmd[1]|(cmd[0] << 8))); //concatenate the MSB and LSB
salemtang 8:18e86eb228ca 64 }
salemtang 8:18e86eb228ca 65
salemtang 8:18e86eb228ca 66
salemtang 8:18e86eb228ca 67 float MAG3110::getHeading()
salemtang 8:18e86eb228ca 68 {
salemtang 8:18e86eb228ca 69 int xVal = readVal(MAG_OUT_X_MSB);
salemtang 8:18e86eb228ca 70 int yVal = readVal(MAG_OUT_Y_MSB);
salemtang 8:18e86eb228ca 71 return (atan2((double)(yVal - _avgY),(double)(xVal - _avgX)))*180/PI;
salemtang 8:18e86eb228ca 72 }
salemtang 8:18e86eb228ca 73
salemtang 8:18e86eb228ca 74 void MAG3110::getValues(int *xVal, int *yVal, int *zVal)
salemtang 8:18e86eb228ca 75 {
salemtang 8:18e86eb228ca 76 *xVal = readVal(MAG_OUT_X_MSB);
salemtang 8:18e86eb228ca 77 *yVal = readVal(MAG_OUT_Y_MSB);
salemtang 8:18e86eb228ca 78 *zVal = readVal(MAG_OUT_Z_MSB);
salemtang 8:18e86eb228ca 79 }
salemtang 8:18e86eb228ca 80
salemtang 8:18e86eb228ca 81
salemtang 8:18e86eb228ca 82 void MAG3110::setCalibration(int minX, int maxX, int minY, int maxY )
salemtang 8:18e86eb228ca 83 {
salemtang 8:18e86eb228ca 84 _avgX=(maxX+minX)/2;
salemtang 8:18e86eb228ca 85 _avgY=(maxY+minY)/2;
salemtang 8:18e86eb228ca 86 }
salemtang 8:18e86eb228ca 87
salemtang 8:18e86eb228ca 88
salemtang 8:18e86eb228ca 89
salemtang 8:18e86eb228ca 90
salemtang 8:18e86eb228ca 91