FRDM KL25Z code that sets the LED colour dependent on the angle of the board. Demo code on how to read the I2C interface for the accelerometer. Check out the acclv2 version of this code - basically the same, but written in c++, compiles to same size

Dependencies:   mbed

Committer:
summers
Date:
Mon Dec 29 16:19:02 2014 +0000
Revision:
0:6bd5123ecef8
FRDM KL25Z code that sets the LED colour dependent on the angle of the board. Demo code on how to read the I2C interface for the accelerometer. Check out the acclv2 version of this code - basically the same, but written in c++, compiles to same size

Who changed what in which revision?

UserRevisionLine numberNew contents of line
summers 0:6bd5123ecef8 1 // #include "mbed.h"
summers 0:6bd5123ecef8 2 #include "device.h"
summers 0:6bd5123ecef8 3 #include "PinNames.h"
summers 0:6bd5123ecef8 4 #include "PeripheralNames.h"
summers 0:6bd5123ecef8 5 #include "i2c_api.h"
summers 0:6bd5123ecef8 6 #include "wait_api.h"
summers 0:6bd5123ecef8 7 #include "pwmout_api.h"
summers 0:6bd5123ecef8 8 #include "rtc_api.h"
summers 0:6bd5123ecef8 9 #include <stdio.h>
summers 0:6bd5123ecef8 10 #include <math.h>
summers 0:6bd5123ecef8 11
summers 0:6bd5123ecef8 12 #define REG_WHO_AM_I 0x0D
summers 0:6bd5123ecef8 13 #define REG_CTRL_REG_1 0x2A
summers 0:6bd5123ecef8 14 #define REG_OUT_X_MSB 0x01
summers 0:6bd5123ecef8 15 #define REG_OUT_Y_MSB 0x03
summers 0:6bd5123ecef8 16 #define REG_OUT_Z_MSB 0x05
summers 0:6bd5123ecef8 17
summers 0:6bd5123ecef8 18 #define MMA8451_I2C_ADDRESS (0x1d<<1)
summers 0:6bd5123ecef8 19
summers 0:6bd5123ecef8 20 #define UINT14_MAX 16384
summers 0:6bd5123ecef8 21
summers 0:6bd5123ecef8 22 #define false 0
summers 0:6bd5123ecef8 23 #define true -1
summers 0:6bd5123ecef8 24
summers 0:6bd5123ecef8 25 static const float redx=0.0f;
summers 0:6bd5123ecef8 26 static const float redy=1.0f;
summers 0:6bd5123ecef8 27 static const float greenx=0.8660254f;
summers 0:6bd5123ecef8 28 static const float greeny=-0.5f;
summers 0:6bd5123ecef8 29 static const float bluex=-0.8660254f;
summers 0:6bd5123ecef8 30 static const float bluey=-0.5f;
summers 0:6bd5123ecef8 31
summers 0:6bd5123ecef8 32 static const float twothirds=0.6666667f;
summers 0:6bd5123ecef8 33
summers 0:6bd5123ecef8 34 void acclninit(i2c_t *i2c)
summers 0:6bd5123ecef8 35 {
summers 0:6bd5123ecef8 36 // set the i2c link pins SDA, SCL
summers 0:6bd5123ecef8 37 i2c_init(i2c,PTE25,PTE24);
summers 0:6bd5123ecef8 38
summers 0:6bd5123ecef8 39 // initialise the accelerometer
summers 0:6bd5123ecef8 40 {
summers 0:6bd5123ecef8 41 // REG_CTRL_REG_1 goes into the device Program Counter
summers 0:6bd5123ecef8 42 // then 1 gets written to that address
summers 0:6bd5123ecef8 43 uint8_t data[2] = {REG_CTRL_REG_1, 0x01};
summers 0:6bd5123ecef8 44 i2c_write(i2c,MMA8451_I2C_ADDRESS,(char *)data,2,true);
summers 0:6bd5123ecef8 45 }
summers 0:6bd5123ecef8 46
summers 0:6bd5123ecef8 47 // read the who am i register
summers 0:6bd5123ecef8 48 {
summers 0:6bd5123ecef8 49 // this sets the pointer in the I2C decice (accelerometer)
summers 0:6bd5123ecef8 50 // to point to the who_am_i register
summers 0:6bd5123ecef8 51 // REG_WHO_AM_I gets writtem to device Program Counter
summers 0:6bd5123ecef8 52 // We don't reset the device at the end (false)
summers 0:6bd5123ecef8 53 char t[1] = {REG_WHO_AM_I};
summers 0:6bd5123ecef8 54 i2c_write(i2c,MMA8451_I2C_ADDRESS,t,1,false);
summers 0:6bd5123ecef8 55 // and this reads the register
summers 0:6bd5123ecef8 56 uint8_t who_am_i = 0;
summers 0:6bd5123ecef8 57 i2c_read(i2c,MMA8451_I2C_ADDRESS,(char *)&who_am_i,1,true);
summers 0:6bd5123ecef8 58 printf("\r\nMMA8451 ID: %d\r\n", who_am_i );
summers 0:6bd5123ecef8 59 }
summers 0:6bd5123ecef8 60 }
summers 0:6bd5123ecef8 61
summers 0:6bd5123ecef8 62 float acclnread(i2c_t *i2c,uint8_t reg)
summers 0:6bd5123ecef8 63 {
summers 0:6bd5123ecef8 64 char t[1]= {reg};
summers 0:6bd5123ecef8 65 i2c_write(i2c,MMA8451_I2C_ADDRESS,t,1,false);
summers 0:6bd5123ecef8 66 uint8_t xbits[2] = {0,0};
summers 0:6bd5123ecef8 67 i2c_read(i2c,MMA8451_I2C_ADDRESS,(char *)xbits,2,true);
summers 0:6bd5123ecef8 68 int16_t xint = 0;
summers 0:6bd5123ecef8 69 xint=(xbits[0]<<6)|(xbits[1]>>2);
summers 0:6bd5123ecef8 70 if (xint > UINT14_MAX>>1)
summers 0:6bd5123ecef8 71 xint -= UINT14_MAX;
summers 0:6bd5123ecef8 72 return ((float) xint)/4096.0f;
summers 0:6bd5123ecef8 73 }
summers 0:6bd5123ecef8 74
summers 0:6bd5123ecef8 75
summers 0:6bd5123ecef8 76
summers 0:6bd5123ecef8 77 int main(void)
summers 0:6bd5123ecef8 78 {
summers 0:6bd5123ecef8 79 // typedef struct i2c_s i2c;
summers 0:6bd5123ecef8 80 i2c_t i2c;
summers 0:6bd5123ecef8 81
summers 0:6bd5123ecef8 82 acclninit(&i2c);
summers 0:6bd5123ecef8 83
summers 0:6bd5123ecef8 84 pwmout_t redled;
summers 0:6bd5123ecef8 85 pwmout_t greenled;
summers 0:6bd5123ecef8 86 pwmout_t blueled;
summers 0:6bd5123ecef8 87
summers 0:6bd5123ecef8 88 pwmout_init(&redled,LED_RED);
summers 0:6bd5123ecef8 89 pwmout_period_ms(&redled,1);
summers 0:6bd5123ecef8 90 pwmout_init(&greenled,LED_GREEN);
summers 0:6bd5123ecef8 91 pwmout_period_ms(&greenled,1);
summers 0:6bd5123ecef8 92 pwmout_init(&blueled,LED_BLUE);
summers 0:6bd5123ecef8 93 pwmout_period_ms(&blueled,1);
summers 0:6bd5123ecef8 94
summers 0:6bd5123ecef8 95 rtc_init();
summers 0:6bd5123ecef8 96
summers 0:6bd5123ecef8 97 while (true)
summers 0:6bd5123ecef8 98 {
summers 0:6bd5123ecef8 99 float xaccln=acclnread(&i2c,REG_OUT_X_MSB);
summers 0:6bd5123ecef8 100 float yaccln=acclnread(&i2c,REG_OUT_Y_MSB);
summers 0:6bd5123ecef8 101 float zaccln=acclnread(&i2c,REG_OUT_Z_MSB);
summers 0:6bd5123ecef8 102 printf("xaccln: %f yaccln: %f zaccln: %f Time: %d\r\n",
summers 0:6bd5123ecef8 103 xaccln,yaccln,zaccln,rtc_read());
summers 0:6bd5123ecef8 104 float norm=sqrt(xaccln*xaccln+yaccln*yaccln);
summers 0:6bd5123ecef8 105 float xacclnorm=xaccln/norm;
summers 0:6bd5123ecef8 106 float yacclnorm=yaccln/norm;
summers 0:6bd5123ecef8 107 float rvec=xacclnorm*redx+yacclnorm*redy;
summers 0:6bd5123ecef8 108 float gvec=xacclnorm*greenx+yacclnorm*greeny;
summers 0:6bd5123ecef8 109 float bvec=xacclnorm*bluex+yacclnorm*bluey;
summers 0:6bd5123ecef8 110 pwmout_write(&redled,twothirds*(1.0f-rvec));
summers 0:6bd5123ecef8 111 pwmout_write(&greenled,twothirds*(1.0f-gvec));
summers 0:6bd5123ecef8 112 pwmout_write(&blueled,twothirds*(1.0f-bvec));
summers 0:6bd5123ecef8 113 wait(0.1f);
summers 0:6bd5123ecef8 114 }
summers 0:6bd5123ecef8 115
summers 0:6bd5123ecef8 116 }
summers 0:6bd5123ecef8 117