Контрольный байт для связи с акселерометром MMA7455L - Форум Picbasic.ru
Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 212»
Модератор форума: ivan_fd 
Форум Picbasic.ru » Программирование МК » PicBasicPro » Контрольный байт для связи с акселерометром MMA7455L
Контрольный байт для связи с акселерометром MMA7455L
somlich Дата: Вт, 07.08.2012, 07:40  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 35
Репутация: 0   ±
Замечания:   ±
На сайте с 23.02.2009

Статус: Offline

Связь идет по I2C, в командах I2cread и I2cwrite после dpin,cpin идет некий контрольный байт control. Если для связи с внешней памяти я использовал байт %10100000 (с учебника) все работало прекрасно. А тут никак, как узнать контрольный байт для чтения и записи для этого устройства. Даташит читал, но не нашел.
Прикрепления: MMA7455L.pdf(510Kb)
ЯНДЕКС Дата: 07.08.2012
DAlexV Дата: Вт, 07.08.2012, 09:38  |                                                                                                                Сообщение # 2
Группа: Модераторы
Ранг:  Разобрался
Сообщений: 691
Репутация: 17   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Quote (somlich)
А тут никак, как узнать контрольный байт для чтения и записи для этого устройства. Даташит читал, но не нашел.
стр 23. Регистр $0D: I2C Device Address (Bit 6-0: Read only, Bit 7: Read/Write) % 0011101 Default


Будьте оригинальны - не повторяйте чужих ошибок !!!!
Пишу только на Рыбе (SwordFish). Другую пищу не предлагать, на шерсть влияет :)
somlich Дата: Чт, 16.08.2012, 22:56  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 35
Репутация: 0   ±
Замечания:   ±
На сайте с 23.02.2009

Статус: Offline

Quote (DAlexV)
стр 23. Регистр $0D: I2C Device Address (Bit 6-0: Read only, Bit 7: Read/Write) % 0011101 Default

Спс. Буду пробовать.

Добавлено (16.08.2012, 22:56)
---------------------------------------------
Испортил уже два акселерометра, думал не пропаял все таки тяжелый корпус. Третий уже аккуратно тонкими про водочками к каждому контакту и этого ежика на плату, так что непропай исключен. Подключил все как по даташиту. 1, 4, 6, 7 к 3.3В. 2,5 - GND. 13 - Data, 14 - Clock. (конденсаторы по питанию стоят, сопротивления 4,7К на подтяжку I2C стоят) Процессор F18F2550, питание 3.3В (линейный стабилизатор с +5В от USB). B0 (DPIN) к линии Data акселя, B1 (CPIN) к линии Clock. Кнопки соответственно к B2-B5. USB настроен как HID джойстик, система его видит, кнопки работают, в калибровке отображаются. А вот оси x и y на значении 1 обе так и висят вне зависимости от поворота акселя. В общем я уже и не знаю что делать. Уже две недели недели мучаюся...

Code


Define  OSC     20

DPIN var PORTB.0  
CPIN var PORTB.1  

bt1   VAR PORTB.2
     TRISB.2 = 1
bt2   VAR PORTB.3
     TRISB.3 = 1
bt3   VAR PORTB.4
     TRISB.4 = 1
bt4   VAR PORTB.5
     TRISB.5 = 1
Buttons     VAR byte
x    VAR    byte  
y    VAR byte

'USB
buffer    Var    Byte[3]
USBInit

' 2G - %101  $05

I2cwrite dpin,cpin,$1D,$16,[$05]

main:
     
     I2cread dpin,cpin,$1D,$06,[x]
     I2cread dpin,cpin,$1D,$07,[y]
   
  buffer[0] = x  
  buffer[1] = y  
   
  if bt1 = 1 then  
        buttons.bit0 = 1
     else  
        buttons.bit0 = 0
     endif     
  if bt2 = 1 then  
        buttons.bit1 = 1
     else  
        buttons.bit1 = 0
     endif
     if bt2 = 1 then  
        buttons.bit2 = 1
     else  
        buttons.bit2 = 0
     endif
      if bt3 = 1 then  
        buttons.bit3 = 1
     else  
        buttons.bit3 = 0
     endif

     buffer[2] = buttons  
     
  USBService  
  USBOut 1, buffer, 3, main   

GOTO main  


Вот и что делать, даже не представляю. Помогите кто чем может.
DAlexV Дата: Пт, 17.08.2012, 00:10  |                                                                                                                Сообщение # 4
Группа: Модераторы
Ранг:  Разобрался
Сообщений: 691
Репутация: 17   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Советую внимательно прочитать страницу 17 (протокол обмена), а именно так называемый ответ от устройства (ACK) и повторный старт (SR). Если протокол обмена нарушить, то ответа от устройства не будет. Можно потренироваться сначала в Протеусе над чтением (записью) любой микрухи с интрефейсом I2C (24LC128 например). А после уже переложить работающий код на MMA7455L. Успехов wink

Будьте оригинальны - не повторяйте чужих ошибок !!!!
Пишу только на Рыбе (SwordFish). Другую пищу не предлагать, на шерсть влияет :)

Сообщение отредактировал DAlexV - Пт, 17.08.2012, 10:17
somlich Дата: Пт, 17.08.2012, 11:29  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 35
Репутация: 0   ±
Замечания:   ±
На сайте с 23.02.2009

Статус: Offline

С обычной внешней памятью я работал, там все нормально. Я вот думаю может причина в том, что МК и акселерометр работают на 3.3В а логика USB на 5В. Даже не знаю. В МК подключено все к железному I2C. Вот же засада то. Даташит прочитал, но ведь PicBasic при компиляции использует свой протокол, и судя по всем у внешней EEprom по I2C проблем нет.
DAlexV Дата: Пт, 17.08.2012, 11:38  |                                                                                                                Сообщение # 6
Группа: Модераторы
Ранг:  Разобрался
Сообщений: 691
Репутация: 17   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Quote (somlich)
PicBasic при компиляции использует свой протокол
I2C он везде стандартный, но обращение к разным микрухам может быть организованно по разному. Одной не требуется подтверждение ответа(Slave->Master), другой это условие обязательно(из за внутренней занятости). Хотелось бы посмотреть схемку и полный код.


Будьте оригинальны - не повторяйте чужих ошибок !!!!
Пишу только на Рыбе (SwordFish). Другую пищу не предлагать, на шерсть влияет :)
somlich Дата: Пт, 17.08.2012, 12:46  |                                                                                                                Сообщение # 7
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 35
Репутация: 0   ±
Замечания:   ±
На сайте с 23.02.2009

Статус: Offline

Код полный представил выше.

Вот схема, аксель питается теми же 3.3V что и МК

Прикрепления: 1759515.jpg(102Kb) · 8200140.jpg(46Kb) · 7616413.jpg(180Kb)
somlich Дата: Пт, 17.08.2012, 12:50  |                                                                                                                Сообщение # 8
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 35
Репутация: 0   ±
Замечания:   ±
На сайте с 23.02.2009

Статус: Offline

Вот прикладываю архив всех файлов проекта. Собственно проект 18F2550_Gamepad.BAS
Прикрепления: 18F2550_Gamepad.rar(105Kb)
DAlexV Дата: Пт, 17.08.2012, 14:47  |                                                                                                                Сообщение # 9
Группа: Модераторы
Ранг:  Разобрался
Сообщений: 691
Репутация: 17   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Судя по схеме, это попытка переделки вот этого проекта Загнал hex в Протеус. I2C отладчик кажет что не проверяется условие ACK, что и требовалось доказать. Берем кусок мануала на MMA7455L
SINGLE BYTE WRITE
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. The data sent to the MMA7455L is now stored in the appropriate
register.

Теперь по нашему:

Запись одного байта

мастер отправляет в МАХ стартовую последовательность(ST)
адрес устройства ($1D) (бит записи установить в 0-запись)
MMA7455L подтверждает запись (ACK)
мастер отправляет в МАХ 8-бит адреса регистра для записи
MMA7455L подтверждает запись (ACK)
мастер отправляет в МАХ 8-бит данных для записи
MMA7455L подтверждает запись (ACK)
на этом процедура записи одного байта завершена
мастер отправляет условие стоп (ST) подтверждая окончание передачи

Теперь картинка

Красным отмечено NotACK (нет ответа)

Для сравнения кусок мануала про 24lc128

то же самое, после записи каждого байта обязательно ACK Надеюсь доходчиво объяснил проблему. Удачи wink
Прикрепления: 1366803.png(17Kb) · 6764749.png(12Kb)


Будьте оригинальны - не повторяйте чужих ошибок !!!!
Пишу только на Рыбе (SwordFish). Другую пищу не предлагать, на шерсть влияет :)

Сообщение отредактировал DAlexV - Пт, 17.08.2012, 14:48
somlich Дата: Пт, 17.08.2012, 17:06  |                                                                                                                Сообщение # 10
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 35
Репутация: 0   ±
Замечания:   ±
На сайте с 23.02.2009

Статус: Offline

Quote (DAlexV)
Судя по схеме, это попытка переделки вот этого проекта

ага
Quote (DAlexV)
Загнал hex в Протеус

хм, а я в протеусе (7 Pro) не нашел mma7455.
Quote (DAlexV)
то же самое, после записи каждого байта обязательно ACK

Это понятно, но я так понимаю что через команду I2CWrite это не осуществимо.
Хотя вот есть цитата из знаменитой книги Хилинского про описание шины i2c
Quote
Пересылка каждого байта данных должна завершиться сигналом
подтверждения приема;

Свой протокол тогда изобретать что ли?

Добавлено (17.08.2012, 17:06)
---------------------------------------------
А можно скинуть проект протеуса где был получена картинка? А то я с ним если честно не особо дружен (с протеусом).

DAlexV Дата: Пт, 17.08.2012, 18:39  |                                                                                                                Сообщение # 11
Группа: Модераторы
Ранг:  Разобрался
Сообщений: 691
Репутация: 17   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Quote (somlich)
Это понятно, но я так понимаю что через команду I2CWrite это не осуществимо
Да нет, возможно все, вопрос какими силами.
Quote (somlich)
Хотя вот есть цитата из знаменитой книги Хилинского про описание шины i2c Пересылка каждого байта данных должна завершиться сигналом подтверждения приема;
У нас и на заборе то же пишут, а на самом желе там дрова лежат smile (надеюсь шутка уместна) В PBP куча подводных камней, и по удобству написания он уступает. Закончил работу с ним когда дело дошло до работы с прерываниями.
Quote (somlich)
А можно скинуть проект протеуса где был получена картинка? А то я с ним если честно не особо дружен (с протеусом).
Да пожалуйста, приклеил, только советую отрезать USB из схемы. Иначе комп по страшному тормозит.
+ добавил стандартный пример на другом языке (Рыбе) где все как положено происходит.
Прикрепления: 9249410.rar(135Kb) · I2C.rar(555Kb)


Будьте оригинальны - не повторяйте чужих ошибок !!!!
Пишу только на Рыбе (SwordFish). Другую пищу не предлагать, на шерсть влияет :)
somlich Дата: Пт, 17.08.2012, 19:13  |                                                                                                                Сообщение # 12
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 35
Репутация: 0   ±
Замечания:   ±
На сайте с 23.02.2009

Статус: Offline

В общем если обращаться к внешней EEPROM по I2C и использовать адрес не $1d как у меня а стандартный адрес $A0 то все прекрасно работает и записывается в память и из нее читается и по USB оправляется и в калибровках джойстика отображается. Блин где бы достать mma7455 для протеуса.

Например по http://avrdevices.ru/akselerometr_mma7455l/ вроде в протеусе показан акселерометр.
DAlexV Дата: Пт, 17.08.2012, 19:28  |                                                                                                                Сообщение # 13
Группа: Модераторы
Ранг:  Разобрался
Сообщений: 691
Репутация: 17   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Quote (somlich)
адрес не $1d как у меня а стандартный адрес $A0
Прошу прощения, похоже это я туплю сегодня. Про адресацию совсем забыл.
Quote (somlich)
Блин где бы достать mma7455 для протеуса
Полную модель, это вряд ли. Варианта 2. Или искать что то что подойдет по адресации и регистрам, или писать свое (заморочно, но можно). Есть в Протеусе еще один элементик I2CSLAVE называется, но с ним не приходилось работать.


Будьте оригинальны - не повторяйте чужих ошибок !!!!
Пишу только на Рыбе (SwordFish). Другую пищу не предлагать, на шерсть влияет :)
somlich Дата: Пт, 17.08.2012, 19:33  |                                                                                                                Сообщение # 14
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 35
Репутация: 0   ±
Замечания:   ±
На сайте с 23.02.2009

Статус: Offline

В общем закажу наверно в Китае аналоговые акселерометры, буду спокойно АЦП делать и все sad
Например ADXL335

Сообщение отредактировал somlich - Пт, 17.08.2012, 20:26
DAlexV Дата: Пт, 17.08.2012, 22:51  |                                                                                                                Сообщение # 15
Группа: Модераторы
Ранг:  Разобрался
Сообщений: 691
Репутация: 17   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Quote (somlich)
В общем закажу наверно в Китае аналоговые акселерометры, буду спокойно АЦП делать и все
Спокойствие, только спокойствие smile Так как малехо напутал, придется расхлебывать. Попробую написать имитатор MMA7455L пару-тройку активных регистров для отладки, тем паче что нашел библиотеку для работы I2C Slave. Сейчас изучаю, и ломаю. Так что могет и получится. cool


Будьте оригинальны - не повторяйте чужих ошибок !!!!
Пишу только на Рыбе (SwordFish). Другую пищу не предлагать, на шерсть влияет :)
Форум Picbasic.ru » Программирование МК » PicBasicPro » Контрольный байт для связи с акселерометром MMA7455L
Страница 1 из 212»
Поиск: