Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of BAE_icecream_1_0 by
mnm.cpp
- Committer:
- sakthipriya
- Date:
- 2015-02-27
- Revision:
- 7:603c2a89effc
- Parent:
- 5:4199c0dfed33
File content as of revision 7:603c2a89effc:
#include<mbed.h> #include "mnm.h" #include "pni.h" //pni header file Serial mnm(USBTX,USBRX); //for usb communication I2C i2c (PTC9,PTC8); //PTC2-sda,PTC1-scl /*void INIT_PNI(void); //initialization of registers happens float *EXECUTE_PNI(); //data is obtained void T_OUT(); //timeout function to stop infinite loop*/ Timeout to; //Timeout variable to int toFlag; void T_OUT() { toFlag=0; //as T_OUT function gets called the while loop gets terminated } //DEFINING VARIABLES char cmd[2]; char raw_gyro[6]; char raw_mag[6]; char store,status; int16_t bit_data; float gyro_data[3], mag_data[3],combined_values[6],*data; float senstivity_gyro =6.5536; //senstivity is obtained from 2^15/5000dps float senstivity_mag =32.768; //senstivity is obtained from 2^15/1000microtesla float gyro_error[3]= {0,0,0}, mag_error[3]= {0,0,0}; Timer r0; Timer r1; Timer r2; Timer r3; Timer r4; /* int main(void) { INIT_PNI(); data=EXECUTE_PNI(); //the angular velocity is stored in the first 3 values and magnetic field values in next 3 mnm.printf("gyro values\n"); //printing the angular velocity and magnetic field values for(int i=0; i<3; i++) { mnm.printf("%f\t",data[i]); } mnm.printf("mag values\n"); for(int i=3; i<6; i++) { mnm.printf("%f\t",data[i]); } }*/ void INIT_PNI() { r0.start(); cmd[0]=RESETREQ; cmd[1]=BIT_RESREQ; i2c.write(SLAVE_ADDR,cmd,2); r0.stop(); //When 0x01 is written in reset request register Emulates a hard power down/power up wait_ms(2000); //waiting for loading configuration file stored in EEPROM cmd[0]=SENTRALSTATUS; r1.start(); i2c.write(SLAVE_ADDR,cmd,1); i2c.read(SLAVE_ADDR_READ,&store,1); r1.stop(); wait_ms(100); //to check whether EEPROM is uploaded /* switch((int)store) { case(3): { printf("\nstore :%d\n",store); break; } case(11): { printf("\nstore11 :%d\n",store); break; } default: { cmd[0]=RESETREQ; cmd[1]=BIT_RESREQ; i2c.write(SLAVE_ADDR,cmd,2); wait_ms(2000); } }*/ //mnm.printf("Sentral Status is %x\n",(int)store); r2.start(); cmd[0]=HOST_CTRL; //0x01 is written in HOST CONTROL register to enable the sensors cmd[1]=BIT_RUN_ENB; i2c.write(SLAVE_ADDR,cmd,2); r2.stop(); wait_ms(100); r3.start(); cmd[0]=MAGRATE; //Output data rate of 100Hz is used for magnetometer cmd[1]=BIT_MAGODR; i2c.write(SLAVE_ADDR,cmd,2); r3.stop(); wait_ms(100); r4.start(); cmd[0]=GYRORATE; //Output data rate of 150Hz is used for gyroscope cmd[1]=BIT_GYROODR; i2c.write(SLAVE_ADDR,cmd,2); r4.stop(); wait_ms(100); cmd[0]=ALGO_CTRL; //When 0x00 is written to ALGO CONTROL register we get scaled sensor values cmd[1]=0x00; i2c.write(SLAVE_ADDR,cmd,2); wait_ms(100); cmd[0]=ENB_EVT; //enabling the error,gyro values and magnetometer values cmd[1]=BIT_EVT_ENB; i2c.write(SLAVE_ADDR,cmd,2); wait_ms(100); printf("\n \r %d %d %d %d %d",r0.read_us(),r1.read_us(),r2.read_us(),r3.read_us(),r4.read_us()); } float *EXECUTE_PNI() { //printf("\n\r mnm func \n"); toFlag=1; //toFlag is set to 1 so that it enters while loop to.attach(&T_OUT,2); //after 2 seconds the while loop gets terminated while(toFlag) { cmd[0]=EVT_STATUS; i2c.write(SLAVE_ADDR,cmd,1); i2c.read(SLAVE_ADDR_READ,&status,1); wait_ms(100); //mnm.printf("\nEvent Status is %x\n",(int)status); //if the 6th and 4th bit are 1 then it implies that gyro and magnetometer values are ready to take if(((int)status&40)==40) { printf("\nin if of mnm\n"); cmd[0]=GYRO_XOUT_H; //0x22 gyro LSB of x i2c.write(SLAVE_ADDR,cmd,1); i2c.read(SLAVE_ADDR_READ,raw_gyro,6); cmd[0]=MAG_XOUT_H; //LSB of x i2c.write(SLAVE_ADDR,cmd,1); i2c.read(SLAVE_ADDR_READ,raw_mag,6); //mnm.printf("\nGyro Values:\n"); for(int i=0; i<3; i++) { //concatenating gyro LSB and MSB to get 16 bit signed data values bit_data= ((int16_t)raw_gyro[2*i+1]<<8)|(int16_t)raw_gyro[2*i]; gyro_data[i]=(float)bit_data; gyro_data[i]=gyro_data[i]/senstivity_gyro; gyro_data[i]+=gyro_error[i]; //mnm.printf("%f\t",gyro_data[i]); } //mnm.printf("\nMag Values:\n"); for(int i=0; i<3; i++) { //concatenating mag LSB and MSB to get 16 bit signed data values bit_data= ((int16_t)raw_mag[2*i+1]<<8)|(int16_t)raw_mag[2*i]; mag_data[i]=(float)bit_data; mag_data[i]=mag_data[i]/senstivity_mag; mag_data[i]+=mag_error[i]; //mnm.printf("%f\t",mag_data[i]); } for(int i=0; i<3; i++) { combined_values[i]=gyro_data[i]; combined_values[i+3]=mag_data[i]; } return(combined_values); //returning poiter combined values } //checking for the error else if (((int)status&2)==2) { INIT_PNI(); //when there is any error then Again inilization is done to remove error } } }