реклама на сайте
подробности

 
 
> LSM303DLH + PIC18F2550
joint931
сообщение May 12 2011, 16:30
Сообщение #1





Группа: Новичок
Сообщений: 6
Регистрация: 9-07-10
Пользователь №: 58 379



Пытаюсь запустить супер акселерометр-магнитометр LSM303DLH в связке с PIC18F2550. Обмен по i2c. Судя по картинке с осциллографа инициализация проходит нормально, а с вот чтением данных облом.
Привожу код (компилятор ccs):
Код
#define __USB_PIC_PERIF__ 1

#include <18F2550.h>
#device ADC=10
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=20000000)
#use i2c(Master, SDA=PIN_B0, SCL=PIN_B1)

#define USB_HID_DEVICE  TRUE
#define USB_EP1_TX_ENABLE  USB_ENABLE_INTERRUPT  
#define USB_EP1_TX_SIZE    64
#define USB_EP1_RX_ENABLE  USB_ENABLE_INTERRUPT  
#define USB_EP1_RX_SIZE    64  

#include <pic18_usb.h>  
#include <desc.h>  
#include <usb.c>        
#include <LSM303.c>

void main() {
   int8 in_data[8];
   int8 out_data[8];
   int16 mm1, mm2, mm3, mm4;
   unsigned char ACC_Data[6];

   SETUP_ADC_PORTS(AN0);
   SETUP_ADC(ADC_CLOCK_DIV_64);
   SETUP_TIMER_0(RTCC_INTERNAL|RTCC_DIV_1);
   SETUP_TIMER_1(T1_DISABLED);
   SETUP_TIMER_2(T2_DISABLED, 127, 1);
   SETUP_TIMER_3(T3_INTERNAL | T3_DIV_BY_8);  
   SETUP_CCP1(CCP_OFF);
   SETUP_CCP2(CCP_OFF);
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);

   usb_init();
   output_high(PIN_B0);
   output_high(PIN_B1);
   delay_us(100);
  
   while (TRUE) {
      usb_task();
      if (usb_enumerated()) {
         if (usb_kbhit(1)) {
            usb_get_packet(1, in_data, 64);
  
   out_data[0] = 0;
   set_adc_channel(0);
   delay_us(30);
   mm1=READ_ADC();
   out_data[1] = mm1;
   out_data[2] = mm1>>8;


   LSM303Init();
  
   i2c_start();
   i2c_write(MAG_ADDRESS);  // write mag
   i2c_write(OUT_X_H_M);  // Select register OUT_X_L_M
   i2c_start();         // repeated start
   i2c_write(0x3D); // read mag
/*
For magnetic sensor, the default (factory) 7-bit slave address is 0011110b
(0x3C) for write operations, or 00111101b (0x3D) for read operations.
*/


   ACC_Data[0] = i2c_read();//read OUT_X_H_M (MSB)
   ACC_Data[1] = i2c_read();//read OUT_X_L_M (LSB)
   ACC_Data[2] = i2c_read();//read OUT_Y_H_M (MSB)
   ACC_Data[3] = i2c_read();//read OUT_Y_L_M (LSB)
   ACC_Data[4] = i2c_read();//read OUT_Z_H_M (MSB)
   ACC_Data[5] = i2c_read(0);//read OUT_Z_L_M (LSB) NACK
   i2c_stop();
  

   out_data[3] = ACC_Data[1];  
   delay_us(30);
   out_data[4] = ACC_Data[2];    
   delay_us(30);
   out_data[5] = ACC_Data[3];
   delay_us(30);
   out_data[6] = ACC_Data[4];
   delay_us(30);
   out_data[7] = ACC_Data[5];
        
            usb_put_packet(1, out_data, 64, USB_DTS_TOGGLE);
            
         }
      }
   }
}


Код инициализации:
Код
#ifndef  LSM303
#define  LSM303

//////////////////////////////////////
#define ACC_ADDRESS           (0x30)
#define MAG_ADDRESS           (0x3C)

#define CTRL_REG1_A           (0x20)
#define CTRL_REG2_A           (0x21)
#define CTRL_REG3_A           (0x22)
#define CTRL_REG4_A           (0x23)
#define CTRL_REG5_A           (0x24)
#define HP_FILTER_RESET_A     (0x25)
#define REFERENCE_A           (0x26)
#define STATUS_REG_A          (0x27)

#define OUT_X_L_A             (0x28)
#define OUT_X_H_A             (0x29)
#define OUT_Y_L_A             (0x2A)
#define OUT_Y_H_A             (0x2B)
#define OUT_Z_L_A             (0x2C)
#define OUT_Z_H_A             (0x2D)

#define INT1_CFG_A            (0x30)
#define INT1_SOURCE_A         (0x31)
#define INT1_THS_A            (0x32)
#define INT1_DURATION_A       (0x33)
#define INT2_CFG_A            (0x34)
#define INT2_SOURCE_A         (0x35)
#define INT2_THS_A            (0x36)
#define INT2_DURATION_A       (0x37)

#define CRA_REG_M             (0x00)
#define CRB_REG_M             (0x01)
#define MR_REG_M              (0x02)

#define OUT_X_H_M             (0x03)
#define OUT_X_L_M             (0x04)
#define OUT_Y_H_M             (0x05)
#define OUT_Y_L_M             (0x06)
#define OUT_Z_H_M             (0x07)
#define OUT_Z_L_M             (0x08)

#define SR_REG_M              (0x09)
#define IRA_REG_M             (0x0A)
#define IRB_REG_M             (0x0B)
#define IRC_REG_M             (0x0C)
//////////////////////////////////////


void LSM303Init()
{
   i2c_start();
   i2c_write(ACC_ADDRESS);  
   i2c_write(CTRL_REG1_A);  
   i2c_write(0x27);
   i2c_stop();

   i2c_start();
   i2c_write(MAG_ADDRESS);
   i2c_write(MR_REG_M);
   i2c_write(0x00);
   i2c_stop();

}
#endif

ACC_Data[0]..[5] на выходе получаются со значениями 255. В чем может быть косяк? Распаяно все вроде правильно,с пиком косяков нет, т.к. параллельно для проверки запущен АЦП и передача данных по HID на комп. Схемку для датчика брал здесь.

Заранее спасибо.
ps:
ссылка на доки
подробнее о датчике
исходник для avr'a
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- joint931   LSM303DLH + PIC18F2550   May 12 2011, 16:30


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st June 2025 - 14:15
Рейтинг@Mail.ru


Страница сгенерированна за 0.01366 секунд с 7
ELECTRONIX ©2004-2016