Страница 1 из 1

акселерометр 7455 и MEGA8 на BASCOM

Добавлено: Ср янв 05, 2011 11:49:16
olegkomak
помогите "связать" акселерометр MMA7455 и MEGA8 на BASCOM .
схему спаял отсюда http://avrdevices.ru/akselerometr_mma7455l/
но вместо ATMega32 взял ATMega8 (что было под рукой).
Застопорился на ПО.Обмен данными между акселерометром и МК происходит по I2C но я с ним пока еще не сталкивался .
даташит на акселерометр тут http://www.avrdevices.ru/datasheets/MMA7455L.pdf
судя по нему изначально акселерометр выключен и чтобы включить необходимо по адресу $16 в ячейки D0 и D1 записать 1 (или туда или туда или в обе) подскажите синтаксис и операторы для BASCOM как это сделать . И заодно как считать с этогоже адреса значения эти же бит.

Re: акселерометр 7455 и MEGA8 на BASCOM

Добавлено: Ср янв 05, 2011 20:09:17
olegkomak
сей девайс по интерфейсу SPI может работать . может про него кто нибудь расскажет как в BASCOM пользовать?

Re: акселерометр 7455 и MEGA8 на BASCOM

Добавлено: Ср янв 05, 2011 20:41:47
Мурик
olegkomak писал(а):Обмен данными между акселерометром и МК происходит по I2C но я с ним пока еще не сталкивался.
Протокол I2C и Bascom

Re: акселерометр 7455 и MEGA8 на BASCOM

Добавлено: Пт янв 07, 2011 22:13:06
olegkomak
Мурик спасибо но и это уже читал тоже... сейчас застопорился на том , что везде описания i2c и примеры работы с ним подразумевают что в датчике только один регистр, а в 7455 акселерометре их больше 30-ти штук.
подскажите кто знает как в BASCOMe указать какой регистр мне нужен в тот или иной момент?

Re: акселерометр 7455 и MEGA8 на BASCOM

Добавлено: Пт янв 07, 2011 23:54:59
phenomen
У меня мост lis3lv02dq (акселерометр, снятый с нокии 5500спорт)-> mega8 -> CA-42 (usb кабель от телефонов нокиа
UART<->USB) -> Ноут
Работает на ура :)
Прогу писал под Codevision AVR на C.

Шина I2C:
Чтение одного байта (из даташита)
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 8-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 received
the transmitted data, but transmits a stop condition to end the data transfer.
Тоесть алгоритм чтения:
1)старт
2)отправить адрес устройства+запись (0)
3)отправить адрес регистра
4)старт
5)отправить адрес устройства+чтение (1)
6)получить данные
7)стоп.

И запись:
To start a write command, the Master transmits a start condition (ST) to the MMA7455L, slave address ($1D) with the R/W bit set
to “0” for a write, the MMA7455L sends an acknowledgement. Then the Master (MCU) transmits the 8-bit address of the register
to write to, and the MMA7455L sends an acknowledgement. Then the Master (or MCU) transmits the 8-bit data to write to the
designated register and the MMA7455L sends an acknowledgement that it has received the data. Since this transmission is complete,
the Master transmits a stop condition (SP) to the data transfer.
Алгоритм записи:
1)старт
2)отправить адрес устройства+запись (0)
3)отправить адрес регистра
4)отправить данные
5)стоп.

Используются функции:

Код: Выделить всё

I2cstart
I2cwbyte MyData
I2crbyte MyData, Nack
I2cstop
Есть одно НО! Адрес устройства в даташите надо ссунуть на 1 влево, поскольку в 0bXXXXXXXX биты - адрес устройства, а бит - флаг чтения или записи. И адрес устройства будет не 0x1D а 0x3A.

Успешным будет написание своих небольших функций для чтения/записи с параметрами: адрес устройства, адрес регистра, данные.
На Баскоме могу (хоть и с трудом) написать. На С уже имеется, если кому надо, обращайтесь.

Re: акселерометр 7455 и MEGA8 на BASCOM

Добавлено: Вс янв 09, 2011 11:37:03
olegkomak
phenomen спасибо, кажись лед немного тронулся , но ....
вот листинг простой программы - записываем в 16 регистр акселерометра байт , потом проверяем и обнаруживаем что там хранится не тот байт какой записывали - а почему не пойму ... подскажите пожалуйста .

Код: Выделить всё

$regfile = "m8def.dat"          ' МК Mega8L
$crystal = 8000000                        ' частота 8 Mhz

Config Scl = Portc.5                       ' конфигурируем SCL
Config Sda = Portc.4                      ' конфигурируем SDA

Config Portc.1 = Output                  ' выход на светодиод 1
Config Portc.2 = Output                  ' выход на светодиод 2

L1 Alias Portc.1                               ' обзовем светодиод 1 L1
L2 Alias Portc.2                               ' обзовем светодиод 2 L2

Const Adrw = &B00111010              ' Адрес устройства с битом записи   00111010
Const Adrr = &B00111011               ' Адрес устройства с битом чтения   00111011

Dim Value As Byte                          ' переменная для считывания байта

Do
' заишем в регистр 16 акселерометра 00000101 означает включить акселерометр
' и выбрать предел измерений 2g

 I2cstart                                           ' старт
   I2cwbyte Adrw                               ' адрес акселерометра на запись
   I2cwbyte &H16                               ' адрес регистра
   I2cwbyte &B00000101                    ' байт включения питания и установки предела измерения
  I2cstop                                           ' стоп
  Waitms 50                                       ' пауза на всяк случай
' теперь у нас в 16 регистре хранится 00000101 а мы считаем байт из этого
' регистра и проверим так ли это или нет ? :)
  I2cstart
   I2cwbyte Adrw                            ' адрес акселерометра на запись
   I2cwbyte &H16                            ' адрес регистра
  I2cstart
   I2cwbyte Adrr                             ' адрес акселерометра на чтение
   I2crbyte Value                             ' читаем байт в переменную VALUE
  I2cstop                                         ' стоп
  Waitms 50                                    ' пауза на всяк случай
' а теперь сравним VALUE и 00000101 то что мы записывали
' должно сойтись
If Value = &B00000101 Then
L1 = 1                                            ' если сошлось то мигнет светодиод 1
Waitms 300
L1 = 0
Else
L2 = 1                                          ' если не сошлось то мигнет светодиод 2
Waitms 300
L2 = 0
End If
Loop
End

Re: акселерометр 7455 и MEGA8 на BASCOM

Добавлено: Вс янв 09, 2011 11:56:59
Alex Medvedev
Вывод CS к питанию подтянут?

Re: акселерометр 7455 и MEGA8 на BASCOM

Добавлено: Вс янв 09, 2011 12:00:13
olegkomak
да Alex Medvedev , все строго по вашей схеме (сегодня перепроверял на всякий случай)
cxema1.jpg
(101.04 КБ) 823 скачивания

Re: акселерометр 7455 и MEGA8 на BASCOM

Добавлено: Вс янв 09, 2011 12:51:04
olegkomak
уважаемые пользователи Bascoma посмотрите синтаксических ошибок нет в тексте моей проги ?? мало ли

Re: акселерометр 7455 и MEGA8 на BASCOM

Добавлено: Вс янв 09, 2011 16:17:01
olegkomak
путем нехитрого волшебства выяснил что часть программы которая отвечает за чтение считывает регистр 16 и в нем все биты равны нулям ... наверное следует вывод что не происходит записи в этот регистр...
знатоки Баскома ну гляньте пожалуйста на листинг ? где может быть ошибка ?

Re: акселерометр 7455 и MEGA8 на BASCOM

Добавлено: Вс янв 09, 2011 17:47:29
olegkomak
заработало!!!
Alex Medvedev спасибо подсказал (в личке) что следует писать
I2crbyte Value,Nack
у меня NACK не было.
я по первости так и писал но наверное ошибка была в чем то другом и поэтому я nack стирал зачем то :)
теперь соберу демоборд под акселерометр и детально изучу его возможности . Надеюсь больше тайн не предвидится тогда тут отписывать не вижу смысла . Если кому то захочется (или придется) работать с подобным акселерометром пишите - отвечу :)
всем котам спасибо!