Questa è la versione deifinitiva del codice del Lab2_I2C e del lab3_SPI (nell'altra c'era un commento sbagliato è do dovuto ripubblicarla)

Dependencies:   MMA8451Q mbed

Fork of Codice_Lab2_I2C_Lab3_SPI by SDI 2014/2015

Revision:
4:c40acfb63133
Parent:
3:f8f4a33c7aa2
Child:
5:bc92e421d5f8
--- a/main.cpp	Tue Jan 20 11:09:06 2015 +0000
+++ b/main.cpp	Tue Jan 20 23:03:39 2015 +0000
@@ -3,6 +3,7 @@
 #include "I2C.h"
 #include "SPI.h"
 #include "DigitalIn.h"
+#include "DigitalOut.h"
 
 //--prova--------------------------------------------
 //PinName const INT1 = PTA14 ; //pin interrupt
@@ -35,11 +36,16 @@
                 //  SCL I2C clock line pin
 //--prova------------------------------------------------------------
 //instanzia e inizializza oggetti int1 e int2 della classe DigitalIn
-DigitalIn int1(INT1); //inizializza int1
-DigitalIn int2(INT2); //inizializza int2
+//DigitalIn int1(INT1); //inizializza int1
+//DigitalIn int2(INT2); //inizializza int2
 //--prova------------------------------------------------------------
 
 
+//instanzia e inizializza oggettto spi della classe SPI
+SPI spi(mosi,miso,sck);
+DigitalOut slave_select(pcs0,1); //inizializza slave-select
+//-------------------------------------------------------                                             
+                                    
 //registri da impostare
 char CTRL_REG_1 = 0x2A ;  //read/write  // register address del CTRL_REG_1
 char CTRL_REG_2 = 0x2B ;  //read/write  // register address del CTRL_REG_2
@@ -51,8 +57,14 @@
 char XYZ_DATA_CFG = 0x0E; //read/write  // register address del XYZ_DATA_CFG
 char ASLP_COUNT= 0x29;    //read/write  // register address SLEEP TIME-OUT COUNTER
 char SYSMOD = 0x0B;       //read only   // register address  SYSMOD System Mode Register
+//registri da impostare-------------------------------------------------------------------
+
+//-indirizzo del dipositivo con l'ultimo bit asserito per la lettura e negato per la scrittura
 char address_wr = 0x3A ;                // byte per eseguire lettura: address_device + bit_wr(W=0)
 char address_rd = 0x3B ;                // byte per eseguire scrittura: address_device + bit_rd(R=1)
+//------------------------------------------------------------------------------------------------
+
+//--variabile di appoggio utilizzata per scrivere e leggere i registri
 char data = 0x00 ;                      // inizalizza la variabile data con le impostazioni da scrivere su CTRL_REG_1
 
 //--registri aggiunti e settati per prova ------------------------------------------------------------------
@@ -64,9 +76,18 @@
 
 int main(void)
 {
-    printf("inizio \n");
-    //impostazione dei registri con scrittura Single Byte Write
+    printf("inizio \n");    
+    //--setting delle impostazioni del SPI in base alle specifiche------------------    
+    int bits = 8;
+    int mode = 1;
+    spi.format(bits,mode);//definisce formato spi con 16 bit e pol=0 e pha=1
+    //di default la frequenza è 1MHz
+    char command_wr=0x80; //comando per la scrittura (10000DDD), di default nella locazione DDD=000
+    //int command_rd=0; //comando per la lettura (00000DDD), dib default nella locazione DDD=000
+                        //non utilizzato !
+    //--setting delle impostazioni della SPI come da specifiche------------------------
     
+    //impostazione dei registri dell'I2C con scrittura Single Byte Write
     // setta impostazioni su CTRL_REG_1
     data = 0x58 ; // setta la variabile data con le impostazioni da scrivere su CTRL_REG_1
     //Bit 7-> ASLP_RATE1  = 0 
@@ -148,7 +169,7 @@
     i2c.stop();  
 
     //setta impostazioni su ASLP_COUNT
-    data=0x0F; //->impostato da me valore max
+    data=0xF0; //->impostato da me valore max
     //data=0x01; //impostato da me valore min
     //data=0x04; //imposta data con le impostazioni del ASLP_COUNT -> impostato dal professore!!!
     i2c.start(); // dai lo start
@@ -285,7 +306,16 @@
     printf("ASLP_COUNT: %1.2x \n", aslp_count); //in esadecimale
     
     char sysmod = 0x00;
-    float x_axis, y_axis, z_axis;
+    
+    float   x_axis,                                 y_axis,                                 z_axis;
+    float   x_axis_norm,                            y_axis_norm,                            z_axis_norm;
+    int     x_tens,             x_unit,             y_tens,             y_unit,             z_tens,             z_unit;
+    char    x_tens_ascii,       x_unit_ascii,       y_tens_ascii,       y_unit_ascii,       z_tens_ascii,       z_unit_ascii;
+    char    loc_x_tens=0x00,    loc_x_unit=0x01,    loc_y_tens=0x02,    loc_y_unit=0x03,    loc_z_tens=0x04,    loc_z_unit=0x05;
+    //location      DDD=000,            DDD=001,            DDD=010,            DDD=011,            DDD=100,            DDD=101;             
+    
+    char    command_location=0x00; // in caso di scrittura 1000 DDD
+    
     //int int1_value = 0;
     //int int2_value = 0;
     while (true) {
@@ -380,38 +410,93 @@
             z_axis=i2c.read(0);    // scrive bit di NAK (non acknowlodgement) e salva il dato sul bus su z_axis
             i2c.stop();  
             //accendo led
-            rled = 1.0f - x_axis/256;
-            gled = 1.0f - y_axis/256;
-            bled = 1.0f - z_axis/256;
+            rled = 1.0f - x_axis/64;
+            gled = 1.0f - y_axis/64;
+            bled = 1.0f - z_axis/64;
             //scrivo sulla seriale
             printf("X: %1.2f, Y: %1.2f, Z: %1.2f\n", x_axis/64, y_axis/64, z_axis/64);
             
-            //SCRIVO DATI SU DISPLAY A SETTE SEGMENTI MEDIANTE SPI
-            //comunicazione con SPI
-                int bits = 8;
-                int mode = 1;
-                spi.format(bits,mode);//definisce formato spi con 16 bit e pol=0 e pha=1
-                //di default la frequenza è 1MHz
-                
-                char character;
-                char lettura;
-                int i;
-               while(1)
-               {
-                int command_wr=128; //comando per la scrittura (10000DDD), di default nella locazione DDD=000
-                //int command_rd=0; //comando per la lettura (00000DDD), dib default nella locazione DDD=000
-               //for(i=0;i<7;i++)
-               //{
-                //character=(char)(65+i);
-               //scrittura
-                slave_select.write(0);
-                spi.write(133);
-                spi.write(3);
-                slave_select.write(1);
-                printf("Carattere in ingresso %c\n",character);
-                //command_wr++;
-                // }   
+            //SCRIVO DATI SU DISPLAY A SETTE SEGMENTI DELLA SCHEDA DE2 MEDIANTE SPI
+            //accelerazione sull'asse x
+            x_axis_norm=x_axis/64*99;  // normalizzo tra [0 99]  
+            x_tens = (int(x_axis_norm/10)); // ottengo le decine
+            x_unit = (x_axis_norm-10*x_tens); // ottengo le unità
+            x_tens_ascii = ( '0' + (x_tens)  ); // ottengo le decine in ASCII
+            x_unit_ascii = ( '0' + (x_unit)  ); // ottengo le unità in ASCII
+            //accelerazione sull'asse y
+            y_axis_norm=y_axis/64*99;  // normalizzo tra [0 99] 
+            y_tens = (int(y_axis_norm/10)); // ottengo le decine
+            y_unit = (y_axis_norm-10*y_tens); // ottengo le unità
+            y_tens_ascii = ( '0' + (y_tens)  ); // ottengo le decine in ASCII
+            y_unit_ascii = ( '0' + (y_unit)  ); // ottengo le unità in ASCII   
+            //accelerazione sull'asse z
+            z_axis_norm=z_axis/64*99;  // normalizzo tra [0 99] 
+            z_tens = (int(z_axis_norm/10)); // ottengo le decine
+            z_unit = (z_axis_norm-10*z_tens); // ottengo le unità
+            z_tens_ascii = ( '0' + (z_tens)  ); // ottengo le decine in ASCII
+            z_unit_ascii = ( '0' + (z_unit)  ); // ottengo le unità in ASCII   
+                      
+            //stampo nella seriale componente x,y,z dell'accelereazione normailzzate tra 0 e 99
+            printf("ax_norm: %1.2f, ay_norm: %1.2f, az_norm: %1.2f\n", x_axis_norm, y_axis_norm, z_axis_norm);
+            //stampo nella seriale le decine delle componenti x,y,z dell'accelereazione normailzzate tra 0 e 99
+            printf("ax_tens: %1.2d, ay_tens: %1.2d, az_tens: %1.2d\n", x_tens, y_tens, z_tens);
+            //stampo nella seriale le unità delle componenti x,y,z dell'accelereazione normailzzate tra 0 e 99
+            printf("ax_unit: %1.2d, ay_unit: %1.2d, az_unit: %1.2d\n", x_unit, y_unit, z_unit);
+            //stampo nella seriale le decine in ascii delle componenti x,y,z dell'accelereazione normailzzate tra 0 e 99
+            printf("ax_tens_ascii: %1.2c, ay_tens_ascii: %1.2c, az_tens_ascii: %1.2c\n", x_tens_ascii, y_tens_ascii, z_tens_ascii);
+            //stampo nella seriale le unità in ascii delle componenti x,y,z dell'accelereazione normailzzate tra 0 e 99
+            printf("ax_unit_ascii: %1.2c, ay_unit_ascii: %1.2c, az_unit_ascii: %1.2c\n", x_unit_ascii, y_unit_ascii, z_unit_ascii);
+            
+            //scrivo nei display i valori dell'accelerazione
             
+            //componente x dell'accelarazione
+            //scrivo codice ascii delle decine nel display nel display dedicato 
+            //command_location = char ( (command_wr) + int(loc_tens_x) ) ; //1000 000 = 0x80
+            command_location = 0x80;
+            slave_select.write(0);
+            spi.write(command_location);
+            spi.write(x_tens_ascii);
+            slave_select.write(1);
+            //scrivo codice ascii delle unità nel display nel display dedicato 
+            //command_location = command_wr + loc_unit_x ; //1000 001 = 0x81
+            command_location = 0x81;
+            slave_select.write(0);
+            spi.write(command_location);
+            spi.write(x_unit_ascii);
+            slave_select.write(1);
+
+            //componente y dell'accelarazione
+            //scrivo codice ascii delle decine nel display nel display dedicato 
+            //command_location = command_wr + loc_tens_y ; //1000 010 = 0x82
+            command_location = 0x82;
+            slave_select.write(0); //asserisco lo slave select attivo basso
+            spi.write(command_location);
+            spi.write(y_tens_ascii); 
+            slave_select.write(1); //nego lo slave select attivo basso
+            //scrivo codice ascii delle unità nel display nel display dedicato 
+            //command_location = command_wr + loc_unit_y ; //1000 011 = 0x83
+            command_location = 0x83;
+            slave_select.write(0); //asserisco lo slave select attivo basso
+            spi.write(command_location);
+            spi.write(y_unit_ascii);
+            slave_select.write(1); //nego lo slave select attivo basso
+            
+            //componente z dell'accelarazione
+            //scrivo codice ascii delle decine nel display nel display dedicato 
+            //command_location = command_wr + loc_tens_z ; //1000 100 = 0x84
+            command_location = 0x84;
+            slave_select.write(0); //asserisco lo slave select attivo basso
+            spi.write(command_location);
+            spi.write(z_tens_ascii);
+            slave_select.write(1); //nego lo slave select attivo basso
+            //scrivo codice ascii delle unità nel display nel display dedicato 
+            //command_location = command_wr + loc_unit_z ; //1000 101 = 0x85
+            command_location = 0x85;
+            slave_select.write(0);
+            spi.write(command_location);
+            spi.write(z_unit_ascii);
+            slave_select.write(1);   
+                     
         } //close 2nd if
     }//close while
 }//close main