Projet S5 Lecture de l'accelerometre avec interruption

Dependencies:   mbed PowerControl

Fork of Projet_S5 by Jonathan Tousignant

Files at this revision

API Documentation at this revision

Comitter:
joGenie
Date:
Wed Mar 26 16:13:42 2014 +0000
Child:
1:feae56685ab1
Commit message:
In C++;

Changed in this revision

accelerometer.cpp Show annotated file Show diff for this revision Revisions of this file
accelerometer.h Show annotated file Show diff for this revision Revisions of this file
interrupt.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/accelerometer.cpp	Wed Mar 26 16:13:42 2014 +0000
@@ -0,0 +1,98 @@
+#include "accelerometer.h"
+
+Accelerometer::Accelerometer() :
+    i2c(p9, p10)
+{
+    initAccel();    
+}
+
+Accelerometer::~Accelerometer(){}
+
+void Accelerometer::writeToRegister(int address, int startingRegister, int data2Write) 
+{ 
+    char data[2]; 
+    data[0] = startingRegister; 
+    data[1] = data2Write; 
+  
+    i2c.write(address, data, 2); 
+} 
+  
+int Accelerometer::readRegister(int address, int startingRegister) 
+{ 
+    char content[1]; 
+    char reg[1]; 
+    reg[0] = startingRegister; 
+      
+    i2c.write(address, reg, 1, true); 
+    i2c.read(address, content, 1); 
+      
+    return content[0]; 
+} 
+  
+char Accelerometer::i2c_read_reg(char address) //fonction qui lit les valeurs des registres 
+{    
+    // Read from selected register adress 
+    i2c.start();                                          
+    i2c.write(MMA8452_WRITE_ADDRESS);    
+    i2c.write(address);                  
+    i2c.start();                         
+    i2c.write(MMA8452_READ_ADDRESS);     
+    char data = i2c.read(0);             
+    i2c.stop();                          
+   
+    // return the data readed 
+    return data;    
+} 
+  
+bool Accelerometer::initAccel() //fonction qui initialise l'Accelerometer avec i2c 
+{ 
+    // Start I2C communication    
+    char data = i2c_read_reg(WHO_AM_I); 
+    if(data != 0x2A) 
+    { 
+        return false; 
+    }
+    
+    // Put accelerometer in active mode at 6.25Hz 
+    writeToRegister(MMA8452_WRITE_ADDRESS, CTRL_REG1, 0x31); 
+      
+    // Put accelerometer in standby mode at 6.25Hz 
+    writeToRegister(MMA8452_WRITE_ADDRESS, CTRL_REG1, 0x30); 
+       
+    // Set accelerometer in 4g range 
+    writeToRegister(MMA8452_WRITE_ADDRESS, XYZ_DATA_CFG, 0x1); 
+       
+    // Put accelerometer in active mode at 6.25Hz 
+    writeToRegister(MMA8452_WRITE_ADDRESS, CTRL_REG1, 0x31);
+    
+    return true;      
+}
+
+unsigned short* Accelerometer::getAccelValue()
+{
+    unsigned short* values = new unsigned short[3];
+    
+    values[0] = i2c_read_reg(OUT_X_MSB);
+    values[1] = i2c_read_reg(OUT_Y_MSB);
+    values[2] = i2c_read_reg(OUT_Z_MSB);
+    
+    return values;
+} 
+
+extern void *Accelerometer_C_new()
+{
+    return new Accelerometer();
+}
+
+extern void  Accelerometer_C_delete(void *accelerometer)
+{
+    Accelerometer *acc = (Accelerometer*)accelerometer;
+    delete acc;
+}
+
+extern unsigned short* Accelerometer_C_getAccelValue(void *accelerometer)
+{
+    Accelerometer *acc = (Accelerometer*)accelerometer;
+    return acc->getAccelValue();
+}
+  
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/accelerometer.h	Wed Mar 26 16:13:42 2014 +0000
@@ -0,0 +1,55 @@
+#ifndef ACCELERATOR_H
+#define ACCELERATOR_H
+
+#include "mbed.h"
+
+/******************************************************** 
+* DEFINES 
+********************************************************/ 
+  
+#define DELAY           0.5 
+  
+#define MMA8452_WRITE_ADDRESS 0x3A 
+#define MMA8452_READ_ADDRESS  0x3B 
+#define WHO_AM_I        0x0D 
+#define OUT_X_MSB       0x01 
+#define OUT_X_LSB       0x02 
+#define OUT_Y_MSB       0x03 
+#define OUT_Y_LSB       0x04 
+#define OUT_Z_MSB       0x05 
+#define OUT_Z_LSB       0x06 
+#define CTRL_REG1       0x2A  
+#define CTRL_REG2       0x2B 
+#define XYZ_DATA_CFG    0x0E 
+
+class Accelerometer
+{
+public:
+    Accelerometer();
+    ~Accelerometer();
+    
+    unsigned short* getAccelValue();
+    
+private:
+    void writeToRegister(int address, int startingRegister, int data2Write);
+    int readRegister(int address, int startingRegister);
+    char i2c_read_reg(char address);
+    bool initAccel();
+    
+    I2C i2c; // I2C port (sda, scl) 
+};
+
+// Define function in C for interruption
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern void *Accelerometer_C_new();
+extern void  Accelerometer_C_delete(void *accelerometer);
+extern unsigned short* Accelerometer_C_getAccelValue(void *accelerometer);
+
+#ifdef __cplusplus
+}
+#endif
+    
+#endif
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/interrupt.h	Wed Mar 26 16:13:42 2014 +0000
@@ -0,0 +1,11 @@
+#ifndef INTERRUPT_H
+#define INTERRUPT_H
+
+extern "C"
+{
+void interruptMatch();
+void interruptCapture();
+
+void initialize();
+}
+#endif //INTERRUPT_H
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Mar 26 16:13:42 2014 +0000
@@ -0,0 +1,87 @@
+#include "accelerometer.h"
+#include "interrupt.h"
+
+Serial pc(USBTX, USBRX);
+void *accelerometer = Accelerometer_C_new();
+bool capture = false;
+
+extern "C" void interruptCapture()
+{
+    capture = !capture;
+    
+    if (capture)
+    {
+        LPC_TIM3->TC = 0;   // clear timer counter
+        LPC_TIM3->PC = 0;   // clear prescale counter
+        LPC_TIM3->PR = 0;   // clear prescale register
+        LPC_TIM3->IR |= 0xFF;
+        
+        NVIC_EnableIRQ(TIMER3_IRQn); // Enable timer3 interrupt
+        
+    }
+    else
+    {
+        NVIC_DisableIRQ(TIMER3_IRQn); // Disable timer3 interrupt
+    }
+}
+
+extern "C" void interruptMatch()
+{
+    unsigned short* values;
+    
+    values = Accelerometer_C_getAccelValue(accelerometer);
+    
+    for(int i = 0; i < 3; i++)
+            pc.printf("%d/n/r", values[i]);
+    
+
+    LPC_TIM3->IR |= 0x01; // Reset timer  
+}
+
+void initialize()
+{
+    // Set system control
+    LPC_SC->PCONP |= (3 << 22); // Enable Timer2
+    LPC_SC->PCLKSEL1 |= (1 << 12); // PClk Timer2 = CCLK
+    
+    // Set pin connection
+    LPC_PINCON->PINSEL0 |= (3 << 8) | (3<<20); // Pin 30 Capture and Pin X Match
+    
+    // Set timer 2 for capture
+    LPC_TIM2->TC = 0;               // clear timer counter
+    LPC_TIM2->PC = 0;               // clear prescale counter
+    LPC_TIM2->PR = 0;               // clear prescale register
+    LPC_TIM2->TCR = (1 << 1);       // reset timer
+    LPC_TIM2->IR |= 0xFF;           // Clear MR0 interrupt flag
+    LPC_TIM2->CCR |= (7 << 0);      // enable cap2.0 rising-edge capture and falling-edge; interrupt on cap2.0
+    LPC_TIM2->TCR = 1;              // start Timer2
+    
+    NVIC_EnableIRQ(TIMER2_IRQn);    //enable timer2 interrupt
+    
+    // Set timer 3 for match
+    LPC_TIM3->MR0 = SystemCoreClock / 20;
+    LPC_TIM3->MCR |= 0x03;              //interrupt and reset control
+    LPC_TIM3->TC = 0;                   // clear timer counter
+    LPC_TIM3->PC = 0;                   // clear prescale counter
+    LPC_TIM3->PR = 0;                   // clear prescale register
+    LPC_TIM3->TCR = 0x1;                // enable timer3
+    LPC_TIM3->IR |= 1 << 0;             // Clear MR0 interrupt flag
+    
+    // Set call function
+    NVIC_SetVector(TIMER2_IRQn, uint32_t(interruptCapture));
+    NVIC_SetVector(TIMER3_IRQn, uint32_t(interruptMatch));  
+}
+
+int main()
+{
+    Accelerometer accel;
+    while(1)
+    {  
+        unsigned short* values;
+        wait(0.1);
+        values = accel.getAccelValue();
+        
+        for(int i = 0; i < 3; i++)
+            pc.printf("%d/n/r", values[i]);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Wed Mar 26 16:13:42 2014 +0000
@@ -0,0 +1,1 @@
+http://world3.dev.mbed.org/users/mbed_official/code/mbed/builds/824293ae5e43
\ No newline at end of file