Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Исходники » Подключение MMA7455 по I2C


Подключение MMA7455 по I2C

Сообщений 1 страница 19 из 19

1

Доброго всем дня!
Первый раз столкнулся с шиной I2C, нашёл по ней мало примеров. Из того, что нашёл - у меня не работает.
Есть акселерометр MMA7455, есть Atmega328P. По даташиту у 7455 адрес $1D. Для работы в регистр $16 надо записать режим (&B00000101), потом считать значения из регистров $06 (x) и $07 (y).
Вот что у меня получилось благодаря гуглам и хелпам:

Код:
...
Config Sda = Portc.2
Config Scl = Portc.3
Config I2Cdelay = 10
...
I2cinit
Do
I2cstart
Waitms 20
I2cwbyte &H1D 'пишу адрес 7455
I2cwbyte &H16 'пишу адрес регистра
I2cwbyte &B00000101 'пишу значение регистра
I2cstart
Waitms 20
I2cwbyte &H06 'пишу адрес регистра
I2crbyte X_ , Ack 'читаю значение x
I2crbyte Y_ , Nack 'читаю значение y
I2cstop
...
Waitms 100
Loop

Мне кажется, что я что-то недопонял с адресацией, но из примеров на С и Ассемблере не могу понять, как надо правильно.

0

2

Как в схеме MMA7455 подключена нога 4?

0

3

Не совсем понятно. Она впаяна в плату (заказывал китайский модуль). Если верить тестеру - то подключена к +.

0

4

&H1D - запись в MMA7455

&H3A - чтение из MMA7455

стр.16 документации

SINGLE BYTE READ
The MMA7455L has an 10-bit ADC that can sample, convert and return sensor data on request. The transmission of an 8-bit
command begins on the falling edge of SCL. After the eight clock cycles are used to send the command, note that the data re-turned is sent with the MSB first once the data is received. Figure 6shows the timing diagram for the accelerometer 8-bit I2C
read operation. The Master (or MCU) transmits a start condition (ST) to the MMA7455L, slave address ($1D), with the R/W bit
set to “0” for a write, and the MMA7455L sends an acknowledgement. Then the Master (or MCU) transmits the 10-bit address of
the register to read and the MMA7455L sends an acknowledgement. The Master (or MCU) transmits a repeated start condition
(SR) and then addresses the MMA7455L ($1D) with the R/W bit set to “1” for a read from the previously selected register. The
Slave then acknowledges and transmits the data from the requested register. The Master does not acknowledge (NAK) it re-ceived the transmitted data, but transmits a stop condition to end the data transfer.



Читать надо 2 байта на каждую ось, т.к., значения 10-bit


Отредактировано sasha_1973 (2015-01-22 13:25:31)

0

5

Должно выглядеть примерно так:

Примерчик

Dim X_ось_word As Word
Dim X_ось_low As Byte At X_ось_word Overlay
Dim X_ось_high As Byte At X_ось_word + 1 Overlay

Dim Y_ось As Word
Dim Y_ось_low As Byte At Y_ось_word Overlay
Dim Y_ось_high As Byte At Y_ось_word + 1 Overlay

Dim Z_ось As Word
Dim Z_ось_low As Byte At Z_ось_word Overlay
Dim Z_ось_high As Byte At Z_ось_word + 1 Overlay

I2cstart
I2cwbyte &H3A       'пишу адрес записи чипа 7455   '&H1D + 0
I2cwbyte &H16       'пишу адрес регистра куда буду писать
I2cwbyte &B00000101       'пишу значение регистра
I2cstop

Waitms 20

I2cstart
I2cwbyte &H3A       'пишу адрес записи чипа 7455     '&H1D + 0
I2cwbyte &H06       'пишу адрес регистра откуда буду читать
I2crepstart
I2cwbyte &H3B       'пишу адрес регистра чтения чипа 7455     '&H1D + 1
I2crbyte X_ось_low , Ack       'читаю младший байт x
I2crbyte X_ось_high , Ack       'читаю старший байт x
I2crbyte Y_ось_low , Ack       'читаю младший байт x
I2crbyte Y_ось_high , Ack       'читаю старший байт x
I2crbyte Z_ось_low , Ack       'читаю младший байт x
I2crbyte Z_ось_high , Nack       'читаю старший байт x
I2cstop

'Получаете значения в переменных:
'X_ось_word = значение по оси X
'Y_ось_word = значение по оси Y
'Z_ось_word = значение по оси Z

Отредактировано sasha_1973 (2015-01-22 20:31:50)

0

6

Спасибо огромнейшее!
Хотя про адрес записи не совсем верно, но благодаря примерчику и примеру на ассемблере наконец разобрался с адресацией.
Получилось &H3A - запись и &H3B - чтение.
Понял, что к адресу 7455 (&H1D - &B11101) надо добавить 0 для записи (&B111010) и 1 для чтения (&B111011). Вроде как по-английски именно это и написано, но перевёл только когда понял.

Регистры $00 - $05 содержат 10-битные значения XYZ, регистры $06-08 содержат 8-битные значения XYZ, поэтому я и читаю $06 и $07.
Ещё раз спасибо, без помощи ломал голову не один день.

+1

7

mc975 написал(а):

Получилось &H3A - запись и &H3B - чтение.

Точно так, прошляпил. Исправил

Отредактировано sasha_1973 (2015-01-22 18:42:28)

0

8

Раз у Вас есть железо, с Вас расширенный пример работы с данным чипом!

0

9

mc975, а как с шумом? На сколько стабильные показания в покое?

0

10

Использовал ADXL345, делал усреднение, результат очень даже приличный.

0

11

Расширенный пример непременно выложу в виде готовой конструкции.

В покое показания прыгают +-2 значения.

И ещё не разобрался с принципом работы. Мне он был нужен как измеритель ускорения (точнее торможения), а он работает как инклинометр, т.е. показывает отклонение, когда его поворачивают в той или иной плоскости - по принципу строительного уровня. Как бы получить нужное?

0

12

mc975 написал(а):

показывает отклонение, когда его поворачивают в той или иной плоскости - по принципу строительного уровня. Как бы получить нужное?

Устанавливаете ноль по оси, которую будете измерять, т.е., смещение "0" на фактические градусы при установке

'===============================================================================
'        Р А Б О Т А     С     А К С Е Л Е Р О М Е Т Р О М     ADXL345
'===============================================================================
' Акселерометр ADXL345
'----------------  Конфигурация акселерометра ADXL345  -------------------------
'------------  Константы для работы с микросхемой часов DS1307  ----------------

  Const Запись_adxl345 = &HA6       ' ADXL345 адрес записи
  Const Чтение_adxl345 = &HA7       ' ADXL345 адрес чтения

'===============================================================================
'             И С П О Л Ь З У Е М Ы Е     П Е Р Е М Е Н Н Ы Е
'===============================================================================
  Dim Y_byte(2) As Byte
  Dim Not_used_adxl345_1 As Byte       ' Буфер за строковой переменной, иначе в строковую переменную может попадать мусор
  Dim Y_integer As Integer At Y_byte(1) Overlay

  Dim Y_single As Single
  Dim Not_used_adxl345_2 As Byte       ' Буфер за строковой переменной, иначе в строковую переменную может попадать мусор

  Dim Цикл_adxl345 As Byte
  Dim Флаг_есть_данные_угла_наклона As Byte

  Dim Сумма_y_single As Single
  Dim Not_used_adxl345_3 As Byte       ' Буфер за строковой переменной, иначе в строковую переменную может попадать мусор

  Dim Угол_наклона_byte As Byte
  Dim Количество_измерений As Byte
  Dim Угол_наклона_integer As Integer

  Dim Угол_наклона_str As String * 3
  Dim Not_used_adxl345_4 As Byte       ' Буфер за строковой переменной, иначе в строковую переменную может попадать мусор
  Угол_наклона_str = "--°"

  Dim Y_str As String * 6
  Dim Not_used_adxl345_5 As Byte       ' Буфер за строковой переменной, иначе в строковую переменную может попадать мусор

'\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
'    З А П У С К    И    П Р Е Д В А Р И Т Е Л Ь Н Ы Е    Н А С Т Р О Й К И
'\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\

  I2cstart
  I2cwbyte Запись_adxl345
  I2cwbyte &H2D       ' Power-saving features control
  I2cwbyte &B0000_1000
  I2cstop

  I2cstart
  I2cwbyte Запись_adxl345
  I2cwbyte &H31
  I2cwbyte &B00000000       ' Data format control
  I2cstop       ' Освобождаем шину I2c

''' Первоначальное смещение угла наклона, требуется работа с EEPROM
''' Опробовано но не задействовано, требует доработки
'  I2cstart
'  I2cwbyte Запись_adxl345
'  I2cwbyte &H1F     ' Смещение оси Y
'  I2cwbyte 0        ' , &H2D - это 45° в hex формате
'  I2cstop           ' Освобождаем шину I2c

  For Цикл_adxl345 = 1 To 4
      Gosub Определение_угла_наклона
  Next Цикл_adxl345

Дальше я делал так

''===============================================================================
  Определение_угла_наклона:
'-------------------------------------------------------------------------------
    I2csend Запись_adxl345 , &H34       ' Чтение оси Y
    I2creceive Чтение_adxl345 , Y_byte(1) , 0 , 2

'    Incr Количество_измерений

'    Сумма_y_single = Сумма_y_single + Y_single

'    If Количество_измерений > 7 Then
'        Y_single = Сумма_y_single / 8
'        Количество_измерений = 0
'        Флаг_есть_данные_угла_наклона = 1
'    End If

'    If Флаг_есть_данные_угла_наклона <> 0 Then

        If Y_integer > 0 Then
            Y_single = Y_integer / 2.766666666666667
          Else
            Y_single = Y_integer / 2.9444444444444444
        End If

        Угол_наклона_integer = Y_single

      '''  Y_str = Fusing(y_single , "#.#")
      '''  Y_str = Format(y_str , "+   0")

        Угол_наклона_str = Str(угол_наклона_integer)

        Угол_наклона_str = Format(угол_наклона_str , "+  ")

        Угол_наклона_str = Угол_наклона_str + "°"

        Флаг_есть_данные_угла_наклона = 0

    End If

'-------------------------------------------------------------------------------
  Return
'===============================================================================

Получал наклон в градусах, объекта, на котором установлен акселерометр. Можно и с минутами, но мне вполне хватило градусов.

Делал велокомпьютер, удобно блин. Катишь, и видишь куда , с горки или на горку.

Отредактировано sasha_1973 (2015-01-22 20:42:05)

0

13

sasha_1973 написал(а):

Получал наклон в градусах, объекта, на котором установлен акселерометр. Можно и с минутами, но мне вполне хватило градусов.

Вот мне тоже наклон показывает. А нужно ускорение (точнее торможение) в горизонтальной плоскости. По ТЗ надо с помощью акселерометра отловить экстренное торможение. А он показывает наклон.

0

14

Думал над этим вопросом, что-бы "Стопы" запаливать, потом отказался и сделал механическим путём.

Выставляете нужную вам чувствительность и меряете. В неподвижном состоянии показывает 1G, в случае укорения показывает 1G + текущее ускорение, в моём датчике есть генерируемое прерывание  для этого, можно удары мерять, постукивания, вибрации и т.д. Всё зависит от настроек датчика.

0

15

Прошу совета по считанным данным из акселерометра . Данные из соответствующих регистров поступают, на эволюции датчик реагирует, но непонятно как их интерпретировать . Как превратить переменную в ускорение .Как получаются  отрицательные значения в данных . Весь даташит перечитал, но ясности не появилось .( правда, с английским у меня туго) . Просьба к тем , кто смог его расшифровать и привести к понятному виду - объясните .

Код:
'*******************************************************************************
'*                                                                             *
'*  adxl                            20.08.2015  *
'*                                                                             *
'*******************************************************************************


$regfile = "m8def.dat"
$baud = 9600
$crystal = 4000000
$hwstack = 64
$swstack = 128
$framesize = 256

Config Portd.1 = Output                                     'порт для rs232

Config Portb.3 = Output : Led Alias Portb.3

Led = 1
Wait 1
Led = 0
Wait 1
Led = 1

Print "adxl345)"

Dim Readx_low As Byte , Readx_high As Byte , Read_x As Word
Dim Ready_low As Byte , Ready_high As Byte , Read_y As Word
Dim Readz_low As Byte , Readz_high As Byte , Read_z As Word


Config Sda = Portc.0 : Set Portc.0                          'I2C-Pins definieren
Config Scl = Portc.1 : Set Portc.1

Declare Sub Adxl_write(byval Address As Byte , Byval Wdata As Byte)


Const Write_data = &HA6                                     'Used to perform a Write operation
Const Read_data = &HA7                                      'Used to perform a Read operation
Const D_frm = &H31                                          'Read/Write Register, Формат данных
Const Bw_rt = &H2C                                          'управление частотой выборки и режима питания
Const P_ctl = &H2D                                          'режим энергосбережения
Const F_ctl = &H38                                          'управление фифо
Const X_lsb = &H32                                          'Read Register, Output of X LSB 8-bit value.
Const X_msb = &H33                                          'Read Register, Output of X MSB 8-bit value.
Const Y_lsb = &H34                                          'Read Register, Output of Z LSB 8-bit value.
Const Y_msb = &H35                                          'Read Register, Output of Z MSB 8-bit value.
Const Z_lsb = &H36                                          'Read Register, Output of Y LSB 8-bit value.
Const Z_msb = &H37                                          'Read Register, Output of Y MSB 8-bit value.


Wait 1

I2cinit

Gosub Adxl_init

Do
   Gosub Zamer

   Read_x = Readx_high * 256                                'сносим старший разряд влево на 8  и суммируем с младшим
   Read_x = Read_x + Readx_low

   Read_y = Ready_high * 256
   Read_y = Read_y + Ready_low

   Read_z = Readz_high * 256
   Read_z = Read_z + Readz_low



   Print "X=" ; Read_x ; "  Y=" ; Read_y ; "  Z=" ; Read_z  'выводим на терминал

 Wait 1

         Loop

Zamer:

   I2cstart
   I2cwbyte Write_data
   I2cwbyte X_lsb
   I2cstop

   I2cstart
   I2cwbyte Read_data
   I2crbyte Readx_low , Ack
   I2crbyte Readx_high , Ack
   I2crbyte Ready_low , Ack
   I2crbyte Ready_high , Ack
   I2crbyte Readz_low , Ack
   I2crbyte Readz_high , Nack

   I2cstop


   Read_x = Readx_high * 256                                'сносим старший разряд и суммируем с младшим
   Read_x = Read_x + Readx_low

   Read_y = Ready_high * 256
   Read_y = Read_y + Ready_low

   Read_z = Readz_high * 256
   Read_z = Read_z + Readz_low

   Return

Adxl_init:

Waitms 50
   Adxl_write P_ctl , &H04                                  '
Waitms 2
   Adxl_write P_ctl , &H16                                  '
Waitms 2

Adxl_write P_ctl , &H08                                     '
Waitms 2

   Adxl_write F_ctl , &H00                                  '
Waitms 2
   Adxl_write Bw_rt , &H0C                                  'частота выборки 400
Waitms 2
   Adxl_write D_frm , &H00                                  '
Waitms 2

Return

Sub Adxl_write(byval Address As Byte , Byval Wdata As Byte)
   I2cstart
   I2cwbyte Write_data
   I2cwbyte Address
   I2cwbyte Wdata
   I2cstop
End Sub

End

А вот что выходит на терминал, датчик стоит вертикально , по даташиту x=1,y=0,z=0

http://s6.uploads.ru/t/A1fiX.jpg

0

16

1. почитайте в Баском про overlay, резко убыстрит и сократит код (ненужно будет с всякими умножениями мучатся)
2. есть регистр #31 - DATA_FORMAT, где настраиваем соответственно формат данных. Там есть бит "Justify", который регламентирует с какой стороны должен находится бит знака (27 страница датащита)
3. чтобы получить нормальные выходные значения (отрицательные), нужно использовать не word переменные, без знаковые, а Integer.

Отредактировано RDW (2015-08-25 12:15:13)

0

17

Переменные поправил,как они располагаются  понял, и теперь код такой

Код:
'*************************************************************************
'*                                                                             *
'*  adxl                            28.08.2015/rt  *
'*                                                                             *
'*******************************************************************************
$regfile = "m8def.dat"
$baud = 9600
$crystal = 4000000
$hwstack = 64
$swstack = 128
$framesize = 256

Config Portd.1 = Output                                     'ïîðò äëÿ rs232

Config Portb.3 = Output : Led Alias Portb.3

Led = 1
Wait 1
Led = 0
Wait 1
Led = 1



Print "Salam"
'
Dim Read_x As Integer
Dim Read_y As Integer
Dim Read_z As Integer


  Dim Readx_low As Byte At Read_x Overlay
  Dim Readx_high As Byte At Read_x + 1 Overlay


  Dim Ready_low As Byte At Read_y Overlay
  Dim Ready_high As Byte At Read_y + 1 Overlay


  Dim Readz_low As Byte At Read_z Overlay
  Dim Readz_high As Byte At Read_z + 1 Overlay



Config Sda = Portc.0 : Set Portc.0                          'I2C-Pins definieren
Config Scl = Portc.1 : Set Portc.1

Declare Sub Adxl_write(byval Address As Byte , Byval Wdata As Byte)


Const Write_data = &HA6                                     'Used to perform a Write operation
Const Read_data = &HA7                                      'Used to perform a Read operation
Const D_frm = &H31                                          'Read/Write Register, Ôîðìàò äàííûõ
Const Bw_rt = &H2C                                          'óïðàâëåíèå ÷àñòîòîé âûáîðêè è ðåæèìà ïèòàíèÿ
Const P_ctl = &H2D                                          'ðåæèì ýíåðãîñáåðåæåíèÿ
Const F_ctl = &H38                                          'óïðàâëåíèå ôèôî
Const X_lsb = &H32                                          'Read Register, Output of X LSB 8-bit value.
Const X_msb = &H33                                          'Read Register, Output of X MSB 8-bit value.
Const Y_lsb = &H34                                          'Read Register, Output of Z LSB 8-bit value.
Const Y_msb = &H35                                          'Read Register, Output of Z MSB 8-bit value.
Const Z_lsb = &H36                                          'Read Register, Output of Y LSB 8-bit value.
Const Z_msb = &H37                                          'Read Register, Output of Y MSB 8-bit value.


Wait 1

I2cinit

Gosub Adxl_init

Do
   Gosub Zamer


  Print "X=" ; Read_x ; "  Y=" ; Read_y ; "  Z=" ; Read_z

 'Print "X=" ; Hex(readx_low) ; " " ; Hex(readx_high) ; "  Y=" ; Hex(ready_low) ; " " ; Hex(ready_high) ; "  Z=" ; Hex(readz_low) ; " " ; Hex(readz_high)

 Wait 1

         Loop

Zamer:

  I2cstart
   I2cwbyte Write_data
   I2cwbyte X_lsb
   I2cstop

   I2cstart
   I2cwbyte Read_data
   I2crbyte Readx_low , Ack
   I2crbyte Readx_high , Ack
   I2crbyte Ready_low , Ack
   I2crbyte Ready_high , Ack
   I2crbyte Readz_low , Ack
   I2crbyte Readz_high , Nack

   I2cstop

   Return


Adxl_init:

Waitms 50
   Adxl_write P_ctl , &H04                                  '
Waitms 2
   Adxl_write P_ctl , &H16                                  '
Waitms 2

Adxl_write P_ctl , &H08                                     '
Waitms 2

   Adxl_write F_ctl , &H00                                  '
Waitms 2
   Adxl_write Bw_rt , &H0C                                  '÷àñòîòà âûáîðêè 400
Waitms 2
   Adxl_write D_frm , &H00                                  '
Waitms 2

Return


Sub Adxl_write(byval Address As Byte , Byval Wdata As Byte)
   I2cstart
   I2cwbyte Write_data
   I2cwbyte Address
   I2cwbyte Wdata
   I2cstop
End Sub

End

а это то что на терминале

Код:
X=163  Y=-180  Z=511       ' x=1,y=0,z=0
X=161  Y=-178  Z=511


X=-462  Y=-181  Z=502      ' x=-1,y=0,z=0
X=-463  Y=-179  Z=507


X=-152  Y=-482  Z=511     ' x=0,y=-1,z=0
X=-149  Y=-481  Z=511


X=-139  Y=127  Z=511      ' x=0,y=1,z=0 
X=-141  Y=126  Z=511


X=-148  Y=-201  Z=511      x=0,y=0,z=1
X=-148  Y=-202  Z=511

X=-151  Y=-163  Z=247       x=0,y=0,z=-1
X=-148  Y=-164  Z=240

Справа я дописал вручную как располагается акселерометр и какие должны быть значения из даташита , а слева - то что идет на терминал .

Как мне из этих значения путем пересчета измерять  ускорения . По какой формуле ?

0

18

Все акселерометры и гироскопы показывают относительную величину (т.е. динамику изменений), если вам нужно реальное положение в пространстве, то вам нужен магнитрометр (аля компас).
А так, нужно перед использованием юстировать датчик в нулевую точку, только потом его использовать.

На счет "DATA_FORMAT/Justify Bit", чтобы понять правильно ли отдает данные/знак датчик (для наглядности), то выводите в бинарном виде (для глаз), вроде в Баскоме, в инте знак находится в самом старшем бите (в MSB (+1), с этим вы тоже можете локально поиграться (для уверености).

Если проделанное не поможет ("должны быть значения из даташита"), то значит что-то с остальными настройками датчика.

0

19

Разобрался с ADXL-345, теперь показывает как в даташите .Все дело было в калибровке . Я о ней знал , но не думал что придется вводить такие большие значения . В даташите это называется OFFSET CALIBRATION стр. 30. Выставляем по уровню датчик и смотрим отклонение . Делим это отклонение на четыре и вносим их в Х-офсет,У-офсет и ЗЕТ-Офсет. Ниже код, который у меня работает - может кому пригодится . В офсетах ставьте свои значения

Код:
'*******************************************************************************
'*                                                                             *
'*  adxl                            28.09.2015/rt  *
'*                                                                             *
'*******************************************************************************


$regfile = "m8def.dat"
$baud = 9600
$crystal = 4000000
$hwstack = 64
$swstack = 128
$framesize = 256

Config Portd.1 = Output                                     'порт для rs232

Config Portb.3 = Output : Led Alias Portb.3

Led = 1
Wait 1
Led = 0
Wait 1
Led = 1



Print "Salam"


Dim Read_x As Integer
Dim Read_y As Integer
Dim Read_z As Integer
Dim A As Byte

  Dim Readx_low As Byte At Read_x + 0 Overlay               ' Наша переменная Интеджер она занимает в памяти
  Dim Readx_high As Byte At Read_x + 1 Overlay              ' две ячейки .А акселерометр возвращает два байта.
                                                              ' Что бы опять восстановить в слово мы используем
                                                               'две ячейки в памяти . Причем, адрес не указываем,
  Dim Ready_low As Byte At Read_y + 0 Overlay               ' а просто говорим что нижняя часть будет занимать
  Dim Ready_high As Byte At Read_y + 1 Overlay              ' ячейку 0, а верхняя часть ячейку +1
                                                              '

  Dim Readz_low As Byte At Read_z + 0 Overlay
  Dim Readz_high As Byte At Read_z + 1 Overlay

Config Sda = Portc.0                                        ': Set Portc.0                          'I2C-Pins definieren
Config Scl = Portc.1                                        ': Set Portc.1
Config I2cdelay = 20


Declare Sub Adxl_write(byval Address As Byte , Byval Wdata As Byte)       ' Программа записи в АДХЛ по СПАЙ
                                                                          '

Const Write_data = &HA6                                     'Это код для записи
Const Read_data = &HA7                                      'Код для чтения

  ' Важная часть - требует пояснения .По адресу 00 находится DEVID - имя данное акселерометру заводом.
 'И оно равно 11100101, что в десятичной 229 , в хексе Е5. Но так как мы общаемся по СПАЙ ,
 ' При записи нам необходимо добавить 0 ,а при чтении добавить 1.( Нужно не прибавлять , а именно
   'добавить еще один разряд) Причем , адрес можно менять с помощью ALT ADRESS,если зануляем ,
    '  то адреса становятся А6 и А7. Если не занулять - 3А,3В.стр18
    '
  '
  '
Const D_frm = &H31                                          'Read/Write Register, Формат данных
Const Bw_rt = &H2C                                          'управление частотой выборки и режима питания
Const P_ctl = &H2D                                          'режим энергосбережения
Const F_ctl = &H38                                          'управление фифо
Const X_lsb = &H32                                          'Read Register, Output of X LSB 8-bit value.
Const X_msb = &H33                                          'Read Register, Output of X MSB 8-bit value.
Const Y_lsb = &H34                                          'Read Register, Output of Z LSB 8-bit value.
Const Y_msb = &H35                                          'Read Register, Output of Z MSB 8-bit value.
Const Z_lsb = &H36                                          'Read Register, Output of Y LSB 8-bit value.
Const Z_msb = &H37                                          'Read Register, Output of Y MSB 8-bit value.

Const Ofsx = &H1E                                           '&H00 эти величины вносятся экспериментально
Const Ofsy = &H1F                                           '&H00
Const Ofsz = &H20                                           '&H05

Wait 1

I2cinit

Gosub Adxl_init

Do
   Gosub Zamer

  Print "X=" ; Read_x ; "  Y=" ; Read_y ; "  Z=" ; Read_z

 Wait 1

         Loop

Zamer:


  I2cstart                                                  'Здесь общение по СПАЙ - указываем устройство обращения
   I2cwbyte Write_data                                      ' и ячейку памяти этого устройства - здесь это ячейка
   I2cwbyte X_lsb                                           ' ЛОУ Х-параметра
   I2crepstart                      '
   I2cwbyte Read_data                                       ' А теперь начинаем считывать последовательно все ячейки
   I2crbyte Readx_low , Ack                                 ' начинаем с Х-ЛОУ и поочереди все остальные до Z-Hi
   I2crbyte Readx_high , Ack         '
   I2crbyte Ready_low , Ack           '
   I2crbyte Ready_high , Ack          '
   I2crbyte Readz_low , Ack            '
   I2crbyte Readz_high , Nack            '
   I2cstop

   Return


Adxl_init:

Waitms 50
   Adxl_write P_ctl , &H00                                  '
Waitms 20

   Adxl_write P_ctl , &H08                                  '
Waitms 20

Waitms 20
   Adxl_write D_frm , &H00                                  '4-сдвигаем влево,0- сдвигаем вправо
Waitms 20
                            '
Waitms 20

 I2cstart
 I2cwbyte &HA6
 I2cwbyte Ofsx                                              ' вносим поправки по каждой оси
 I2cwbyte &H24                                              '
 I2cstop
 Waitms 20                                                  '

 I2cstart                                                   '
 I2cwbyte &HA6
 I2cwbyte Ofsy                                              '
 I2cwbyte &H2E                                              '
 I2cstop
 Waitms 20                                                  '
                                                             '
 I2cstart
 I2cwbyte &HA6                                              '
 I2cwbyte Ofsz                                              '
 I2cwbyte &H81                                              '
 I2cstop                                                    '
 Waitms 20



Return


Sub Adxl_write(byval Address As Byte , Byval Wdata As Byte)
   I2cstart
   I2cwbyte Write_data
   I2cwbyte Address
   I2cwbyte Wdata
   I2cstop
End Sub

End

0


Вы здесь » Программирование ATMEL в BASCOM. » Исходники » Подключение MMA7455 по I2C