pic32 accelerometer mma7455l

Discussion in 'Embedded Systems and Microcontrollers' started by Cibele29, May 4, 2012.

  1. Cibele29

    Thread Starter New Member

    May 4, 2012
    3
    0
    hi, i need help =(

    i'm trying for a weeks ago work with this accelerometer, i used your code, the pic32mx795f512l usb starter kit II, the I/O expansion board and the I2C2, connect SDA2 to pin 36 and SCL2 to pin 38 for J11 connector of expansion board and the i2c is not working i have the pull ops resistor of 4.7 k for SDA and SCL and is not working i dont know what to do... is my first time posting a problem please help me is for my graduation work



    Code ( (Unknown Language)):
    1.  
    2. #include "HardwareProfile.h"
    3. #include "dee_emulation/dee_emulation_pic32.h"
    4. #include <stdio.h>
    5. #include <peripheral/i2c.h>
    6. #include <plib.h>
    7.  
    8.  
    9. // FreeRTOS includes
    10. #include "FreeRTOS.h"
    11. #include "task.h"
    12. #include "queue.h"
    13. #include "semphr.h"
    14. #include "croutine.h"
    15.  
    16.  
    17. // set the configuration fuses for the processor
    18.  
    19.     #pragma config FPLLODIV = DIV_1, FPLLMUL = MUL_20, FPLLIDIV = DIV_2
    20.     #pragma config FWDTEN = OFF, FPBDIV = DIV_2, POSCMOD = HS, FNOSC = PRIPLL, CP = OFF
    21.  
    22.  
    23. void prvACELEROMETRO_ADC( void *pvParameters)
    24. {
    25. for(;;) {
    26.  unsigned char canal;
    27.  signed int muestreo;
    28.  unsigned char unidad_muestreo_total;
    29.  unsigned char muestreo_total;
    30.  unsigned int horas;
    31.  unsigned int minutos;
    32.  unsigned int segundos;
    33.  float Xdata;
    34.  float Ydata;
    35.  float Zdata;
    36.  
    37. unsigned char dato1, dato2, dato3, dato;
    38.  
    39. //leer la variable de luz, dividir los bit, si es 1 iniciar el adc guardar los otro en variables y el tiempo total tambien//
    40. //DataEEReadArray (&acelerometroL,5,1);
    41. //DataEEReadArray (&acelerometro_tiempoL,6,1);
    42. //
    43. //canal = acelerometroL >> 7;
    44. //muestreo = (acelerometroL & 0b01111111);
    45. //unidad_muestreo_total = acelerometro_tiempoL >> 6;
    46. //muestreo_total = (acelerometro_tiempoL & 0b00111111);
    47. //segundos = ((muestreo)* 1000);
    48. //
    49. //     if(canal == 1){
    50.  //        while (segundos > 0 ){
    51.                              void configPIC(){
    52.                                 SYSTEMConfigPerformance(GetSystemClock());   //que e slo mismo que config(system_clk)
    53.                               }  
    54.                              void configureI2C(void){
    55.                                 I2CConfigure(I2C2, I2C_ENABLE_SLAVE_CLOCK_STRETCHING|I2C_ENABLE_HIGH_SPEED);
    56.                                 I2CSetFrequency (I2C2,80000000ul,4000);
    57.                                 I2CEnable (I2C2, TRUE);
    58.                               }        
    59.                              void accelwrite(unsigned int PER_ADDR, unsigned int reg_addr, unsigned char *buf)
    60.                                 {
    61.                                  I2CStart(I2C2);
    62.                                  I2CBusIsIdle(I2C2);
    63.                                  I2CSendByte(I2C2, PER_ADDR | 0);           //llamo el dispositivo para escribir
    64.                                  I2CBusIsIdle(I2C2);
    65.  
    66.                                  if (I2C2STATbits.ACKSTAT){return;}    //solicitar un ack
    67.                                  I2CSendByte(I2C2,reg_addr);               //envio la direccion del registro del periferico
    68.                                  I2CBusIsIdle(I2C2);
    69.  
    70.                                  I2CSendByte(I2C2,*buf);       //escribo el dato almacenado en la variable apuntada por buf
    71.                                  I2CBusIsIdle(I2C2);
    72.                                  if (I2C2STATbits.ACKSTAT){return;}          //solicitando un ack
    73.  
    74.                                   I2CStop(I2C2);
    75.                                   I2CBusIsIdle(I2C2);
    76.                                  while(1)
    77.                                  {
    78.                                   I2CStart(I2C2);
    79.                                   I2CBusIsIdle(I2C2);
    80.                                    I2CSendByte(I2C2,PER_ADDR | 0);       //llamo el dispositivo para escribir
    81.                                   I2CBusIsIdle(I2C2);
    82.  
    83.                                  if (I2C2STATbits.ACKSTAT==0){ break;}   //si se devuelve un ack dejo el ciclo
    84.                                   I2CStop(I2C2);
    85.                                   I2CBusIsIdle(I2C2);
    86.                                   }
    87.  
    88.                                  I2CStop(I2C2);
    89.                                  I2CBusIsIdle(I2C2);
    90.                                 }              
    91.                              void  accel_init(){
    92.                                 int inicio = 0x3A;
    93.                                 dato = 0b00000001;
    94.                                 accelwrite (inicio,0x16,&dato);
    95.                                 dato = 0b00000000;
    96.                                 accelwrite (inicio,0x18,&dato);
    97.                                 dato = 0b00000000;
    98.                                 accelwrite (inicio,0x18,&dato);
    99.                              }
    100.                                  void accelread(unsigned int PER_ADDR, unsigned int reg_addr,unsigned char *buf1,unsigned char *buf2,unsigned char *buf3)
    101.                                  {
    102.                                  I2CStart(I2C2);           //comenzar el I2C
    103.                                  I2CBusIsIdle(I2C2);            //en espera de un comando
    104.                                   I2CSendByte(I2C2,PER_ADDR | 0);       //parte del dispositivo en el cual escribir
    105.                                  I2CBusIsIdle(I2C2);            
    106.                                  if (I2C2STATbits.ACKSTAT==1){return;}      //se devuelve si recibe un ack si no se reinicia
    107.                                   I2CSendByte(I2C2,reg_addr);        //llama el registro interno del periferico
    108.                                  I2CBusIsIdle(I2C2);
    109.                                  if(I2C2STATbits.ACKSTAT==1){ return;}      //si retorna un ack si no reinicia el proceidmiento
    110.                                  I2CRepeatStart(I2C2);           //hacer un reinicio con el fin de llamar a la funcion de leer de lo contrario se crea un conflicto en el bus
    111.                                  I2CBusIsIdle(I2C2);
    112.                                  I2CSendByte(I2C2,PER_ADDR | 1);       //llama al periferico donde se desea la lectura
    113.                                  I2CBusIsIdle(I2C2);
    114.                                  if(I2C2STATbits.ACKSTAT==1) {return;}      
    115.                                  I2C2CONbits.RCEN = 1;
    116.                                  while(!I2CReceivedDataIsAvailable(I2C2));      //empezar a recibir datos
    117.                                  *buf1 = I2C2RCV;           //pongo el dato en el buffer
    118.                                  I2C2CONbits.ACKDT = 0;
    119.                                  I2C2CONbits.ACKEN = 1;
    120.                                  while(!I2CReceivedDataIsAvailable(I2C2));         //empiezo a recibir datos
    121.                                  *buf2 = I2C2RCV;           //pongo el dato en el buffer
    122.                                  I2C2CONbits.ACKDT = 0;
    123.                                  I2C2CONbits.ACKEN = 1;
    124.                                  while(!I2CReceivedDataIsAvailable(I2C2));         //empiezo a recibir datos
    125.                                  *buf3 = I2C2RCV;           //pongo el dato en el buffer
    126.                                  I2C2CONbits.ACKDT = 1;
    127.                                  I2C2CONbits.ACKEN = 1;
    128.                                  while(!I2CReceivedDataIsAvailable(I2C2));       //inicio el procedimiento del ack para llegar al final de la transmicion
    129.                                  I2CStop(I2C2);
    130.                                  I2CBusIsIdle(I2C2);        
    131.                                  }
    132.                                  void Elabacc ()
    133.                                  {
    134.                                   int inicio=0x3A;
    135.                                   accelread(inicio,0x06,&dato1,&dato2,&dato3); //Z axis 8 bit, only one avaible in measurament mode
    136.                                   Xdata=dato1;
    137.                                   Ydata=dato2;
    138.                                   Zdata=dato3;
    139.                                   }
    140.  
    141. configPIC();
    142. configureI2C();
    143. accel_init();
    144. Elabacc();
    145. //segundos = segundos - 100;
    146. vTaskDelay (100/portTICK_RATE_MS);  // delay por 100 ms
    147. }
    148. }
    149.  
     
    Last edited by a moderator: May 4, 2012
  2. bertus

    Administrator

    Apr 5, 2008
    15,647
    2,346
  3. Cibele29

    Thread Starter New Member

    May 4, 2012
    3
    0
    sorry i tried a reply for that thread
     
  4. Cibele29

    Thread Starter New Member

    May 4, 2012
    3
    0
    someone please help me
     
Loading...