arduino & i2c - danila i need help

Компьютеры, программы, периферия, коммуникации, интернет, программирование и т.п. Ранее назывался Hard-n-Soft.
Сообщение
Автор
djdance
Аватара пользователя
Благодарил (а): 1 раз
Поблагодарили: 4 раза

№ 0 Сообщение djdance » 05 ноя 2012 13:15

вдруг случится чудо, и в тему зайдет тот, кто прорюхал реализацию i2c на ардуинке.
к нему, уважаемому, такой вопрос.

если надо передать слово из двух байт в регистр слейва, то как грамотнее сделать?
делать одно write(word)? (возвращает 1, то есть передан 1 байт, а надо 2)
или делать write(word >>8) а потом write(word)? но тогда слейв не реагирует вообще
и второй вопрос, обрамлять ли каждый write парой begin...endTransmition, или шине в общем случае пофиг?
я тут могу написать еще многабукв с примерами, если надо

Пойманый_маньяк
Аватара пользователя
Благодарил (а): 404 раза
Поблагодарили: 694 раза

№ 1 Сообщение Пойманый_маньяк » 05 ноя 2012 16:59

0: djdance:

Библиотека Wire?

Вариант 1:

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

   Wire.beginTransmission(44); // transmit to device #44 (0x2c)
   Wire.write(val1);           // sends value byte  
   Wire.write(val2);           // sends value byte  
   Wire.endTransmission();     // stop transmitting
 
Вариант 2:

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

   Wire.beginTransmission(44); // transmit to device #44 (0x2c)
   Wire.write(val1);           // sends value byte  
   Wire.endTransmission();     // stop transmitting

   Wire.beginTransmission(44); // transmit to device #44 (0x2c)
   Wire.write(val2);           // sends value byte  
   Wire.endTransmission();     // stop transmitting
 
Эм? :)

Писать word, или dword, или что-то еще длиннее 8 бит смысла похоже нет - функция, судя по результату, обрубает 1 байт.
Последний раз редактировалось Пойманый_маньяк 05 ноя 2012 17:08, всего редактировалось 1 раз.

djdance
Аватара пользователя
Благодарил (а): 1 раз
Поблагодарили: 4 раза

№ 2 Сообщение djdance » 05 ноя 2012 17:01

1: Пойманый_маньяк:
вот я и спрашиваю, это с точки зрения стандарта i2c - одинаковые вещи или нет.
ну и эта. а как передать адрес регистра, куда пишем

Пойманый_маньяк
Аватара пользователя
Благодарил (а): 404 раза
Поблагодарили: 694 раза

№ 3 Сообщение Пойманый_маньяк » 05 ноя 2012 17:23

2: djdance:

Судя по этому - http://www.gaw.ru/pdf/interface/iic_r.pdf
Получается, что первый вариант (несколько write подряд) правильнее (Рисунок 5 Передача от Мастера к Слейву)

А адресации у него я что-то вообще пока не вижу :)

djdance
Аватара пользователя
Благодарил (а): 1 раз
Поблагодарили: 4 раза

№ 4 Сообщение djdance » 05 ноя 2012 17:26

но если по первому варианту, то ардуинка не получит акноледж.
а по канону - надо.

Пойманый_маньяк
Аватара пользователя
Благодарил (а): 404 раза
Поблагодарили: 694 раза

№ 5 Сообщение Пойманый_маньяк » 05 ноя 2012 17:42

Адресации походу как таковой нет.
Назначения байт - в конкретных устройствах различно.
Например datasheet какого-то ЦАПа DAC6571 с I2C.

MSB LSB
1 0 0 1 1 0 A0 0
The address byte is the first byte received following the START condition from the master device. The first six
bits (MSBs) of the address are factory-preset to 100110. The next bit of the address is the device select bit A0.
The A0 address input can be connected to VDD or digital GND, or can be actively driven by TTL/CMOS logic
levels. The device address is set by the state of this pin during the power-up sequence of the DAC6571. Up to
two devices (DAC6571) can be connected to the same I2C-bus without requiring additional glue logic.
MSB LSB
1 0 0 1 0 0 0 0
Broadcast addressing is also supported by DAC6571. Broadcast addressing can be used for synchronously
updating or powering down multiple DAC6571 devices. Using the broadcast address, DAC6571 responds
regardless of the state of the address pin A0.
The most significant byte (CTRL/MSB[7:0]) consists of two zeros, two power-down bits, and four most significant
bits of 10-bit unsigned binary D/A conversion data.
The least significant byte (LSB[7:0]) consists of the six least significant bits of the 10-bit unsigned binary D/A
conversion data, followed by two

Пойманый_маньяк
Аватара пользователя
Благодарил (а): 404 раза
Поблагодарили: 694 раза

№ 6 Сообщение Пойманый_маньяк » 05 ноя 2012 17:46

4: djdance:

ACK вполне может быть получаем в результате каждой функции Write, например :)
А вариант 2 - это уже неканонический STOP, по всем признакам.

djdance
Аватара пользователя
Благодарил (а): 1 раз
Поблагодарили: 4 раза

№ 7 Сообщение djdance » 05 ноя 2012 17:47

угу, я одновременно докопался до того же
тупо слать N байт и все.
попробовал - работает.
бардак, никакой конкретной адресации, теперь хранить все регистры в памяти :chechen:

djdance
Аватара пользователя
Благодарил (а): 1 раз
Поблагодарили: 4 раза

№ 8 Сообщение djdance » 05 ноя 2012 17:48

6: Пойманый_маньяк:
> ACK вполне может быть получаем в результате каждой функции Write

в ардуиновской Wire - нет
в сторонних библах можно

Пойманый_маньяк
Аватара пользователя
Благодарил (а): 404 раза
Поблагодарили: 694 раза

№ 9 Сообщение Пойманый_маньяк » 05 ноя 2012 17:51

8: djdance:

Тогда как он понимает что отослал, и нет ошибки?

djdance
Аватара пользователя
Благодарил (а): 1 раз
Поблагодарили: 4 раза

№ 10 Сообщение djdance » 05 ноя 2012 17:55

"он" - ардуин? в конце всех пяти слов на endTransmission
в Wire, видимо, все ACK рюхаются в привате

Пойманый_маньяк
Аватара пользователя
Благодарил (а): 404 раза
Поблагодарили: 694 раза

№ 11 Сообщение Пойманый_маньяк » 05 ноя 2012 18:06

10: djdance:

Еще проще похоже...
:)

Wire.write(data, length);

http://robocraft.ru/blog/arduino/786.html

djdance
Аватара пользователя
Благодарил (а): 1 раз
Поблагодарили: 4 раза

№ 12 Сообщение djdance » 05 ноя 2012 18:23

11: Пойманый_маньяк:
не понял как связан твой ответ №11 с моим №10 ))

Пойманый_маньяк
Аватара пользователя
Благодарил (а): 404 раза
Поблагодарили: 694 раза

№ 13 Сообщение Пойманый_маньяк » 05 ноя 2012 18:33

12: djdance:

Да я вопроса признаться не совсем понял...

Он - оператор write.
Приват он или паблик - какая разница, главное чтобы ACKи ловил.

И он их видимо ловит, потому-что:
1. Если он их ловить не будет - ты в endTransmission соответственно числа переданных байт не увидишь. Потому-что - а как иначе получить данную цифру?
2. Функция Wire.write(data, length) - она тоже как-бы ненавязчиво намекает на то, что с ACKами между байтами write вполне справляется.

djdance
Аватара пользователя
Благодарил (а): 1 раз
Поблагодарили: 4 раза

№ 14 Сообщение djdance » 05 ноя 2012 18:38

>Приват он или паблик - какая разница, главное чтобы ACKи ловил.
но в случае привата ТЫ об этом не узнаешь. А надо бы.

>И он их видимо ловит, потому-что:
>1. Если он их ловить не будет - ты в endTransmission соответственно числа переданных байт не увидишь.
endTransmition не возвращает кол-во байт. Их как раз отдает write

>2. Функция Wire.write(data, length) - она тоже как-бы ненавязчиво намекает на то, что с ACKами между байтами write вполне справляется.
Я об этом и говорил. Я не задавал вопроса про наличие АСК в write, я написал, что это видимо понятно.


>И он их видимо ловит, потому-что:
потому что протокол :)

Пойманый_маньяк
Аватара пользователя
Благодарил (а): 404 раза
Поблагодарили: 694 раза

№ 15 Сообщение Пойманый_маньяк » 05 ноя 2012 18:41

14: djdance:

> endTransmition не возвращает кол-во байт. Их как раз отдает write
Да один хрен, главное их фиксируют.

Все. Понял. Наобщался с неадекватами* - везде знаки вопроса мерещатся.
Пардон муа :)

* - кстати, а как будет неадекват женского пола?

djdance
Аватара пользователя
Благодарил (а): 1 раз
Поблагодарили: 4 раза

№ 16 Сообщение djdance » 05 ноя 2012 18:54

15: Пойманый_маньяк:
> Да один хрен, главное их фиксируют.
так тут ведь как. Один индус меня настращал, мол по протоколу сядут усе слейв будеть бить тебя АСК-ответами до посинения, если не примешь, - не победишь. И вышеупомянутый тобой Вариант 2 с обрамлением каждой транзакции выглядит с этой точки зрения более безопасным, чем неизвестно-что-делающий-там-себе-write.

Ну ладно, хрен с ним, заработало и ладно :)

ЗЫ неадекваточка.

Пойманый_маньяк
Аватара пользователя
Благодарил (а): 404 раза
Поблагодарили: 694 раза

№ 17 Сообщение Пойманый_маньяк » 05 ноя 2012 19:11

16: djdance:

> И вышеупомянутый тобой Вариант 2 с обрамлением каждой транзакции выглядит с этой точки зрения более безопасным, чем неизвестно-что-делающий-там-себе-write.

Не выйдет боюсь.
Закрытие транзакции - это по всем признакам STOP и передача в slave P.
После которых ты начнешь писать опять в первый байт.

Можно на read'ах кстати проверить - почитать из какого-нибудь устройства минимум с 2 байтами ответа закрывая транзакцию...
Должен по идее читаться только первый бит. Два или более раза.

djdance
Аватара пользователя
Благодарил (а): 1 раз
Поблагодарили: 4 раза

№ 18 Сообщение djdance » 05 ноя 2012 19:32

17: Пойманый_маньяк:
проверил, да, на реадах все заново
а вдруг хитрые китайцы на запись сделали строгое ожидание полной посылки

Пойманый_маньяк
Аватара пользователя
Благодарил (а): 404 раза
Поблагодарили: 694 раза

№ 19 Сообщение Пойманый_маньяк » 05 ноя 2012 19:33

Рассуждал как:

В посылке протокола может быть несколько ACKов между битами, и один STOP в конце посылки.
В примерах программы было несколько write подряд, закрывающихся одним endTransmission.

Аналогия ACK - Write, STOP - endTransmission.

Необходимо знать какой байт из нескольких читаем или пишем.

STOP - по идее может разбираться со счетом двумя способами.
а. Обнулять счетчик в устройстве прочитанных / записанных байт.
б. Сохранять счетчик.

Вариант с сохранением счетчика крайне неприятен.
Так как в этом случае при перезагрузке программисту прийдется угадывать - какой по счету бит он сейчас читает или пишет.
А это - много мата и других некрасивых слов :)

djdance
Аватара пользователя
Благодарил (а): 1 раз
Поблагодарили: 4 раза

№ 20 Сообщение djdance » 05 ноя 2012 19:39

вот! за это wire и ругают, и пишут более лучшие обертки и либы, пример I2C library от Wayne Truchsess

Пойманый_маньяк
Аватара пользователя
Благодарил (а): 404 раза
Поблагодарили: 694 раза

№ 21 Сообщение Пойманый_маньяк » 05 ноя 2012 19:39

Проще говоря - на запись то-же самое с вероятностью 99,9%.
Если конечно хитрые китайцы хоть немного дружат с содержимым головы.

Пойманый_маньяк
Аватара пользователя
Благодарил (а): 404 раза
Поблагодарили: 694 раза

№ 22 Сообщение Пойманый_маньяк » 05 ноя 2012 19:41

Слушай, а что за устройство?
Во многих случаях можно ж и запись аналогично проверить...

djdance
Аватара пользователя
Благодарил (а): 1 раз
Поблагодарили: 4 раза

№ 23 Сообщение djdance » 05 ноя 2012 19:50

> Во многих случаях можно ж и запись аналогично проверить
нуэ. Потратив два дня на битье об стену, я больше не хочу исследовать этот черный ящик методом выискивания намеков на соответствие предположениям о совокупности языка, даташита и паяльника. Работает, и ладно.

> Слушай, а что за устройство?
http://www.parallax.com/Store/Accessori ... fault.aspx

это клон.
оригинал - на 3.3V , ему оказался нужен логик конвертер, и я пока призабил.


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

intu

№ 24 Сообщение intu » 30 ноя 2012 14:01

Жесть. Посоны вообще ребята! :o

Axl
Благодарил (а): 1 раз

№ 25 Сообщение Axl » 11 янв 2014 23:00

Нуждаюсь в дисплее для Arduino "на поиграться".
16х2, 20х2, 20х4 или, э-э-э... любой, подходящий без особого колдунства (русский язык - не принципиально).

Контроллеры купил(nano), кнопки-светодиоды-релюшки тоже есть, а про дисплей сразу не подумал.
Сразу не заказал, а теперь ещё месяц+ (из Китая) не вытерплю, страсть как охота побаловаться :crazy:

Могу купить, могу заказать вам похожий/аналогичный или просто дайте на время :rollhappy:
По спекулятивной цене - не надо.

И заодно спрошу (в программировании, по-большому счёту, лох):
складываю 2 шт. unsigned long ( var1 = var2 + var3; ) и получаю какую-то чушь (огромное несуразное число);
если просто long - то всё нормально, складывается предсказуемо.
"Это баг или фича?"

djdance
Аватара пользователя
Благодарил (а): 1 раз
Поблагодарили: 4 раза

№ 26 Сообщение djdance » 11 янв 2014 23:30

25: Axl:
> unsigned long ( var1 = var2 + var3; )

давно нет времени на ардуинку :( но насколько помню - глюк, да.
навскидку - сложите по очереди
var1 = var2;
var1 += var3; или даже var1 = var1 + var3;
там часто все глюкаво с инкрементами из-за реализации памяти

ну и второй вариант - кто-то портит переменную выходом за диапазон (массив рядом?). До long с его 4 байтами порча не доходит, а до ансигнеда - доходит... И такие проблемы ловил (со строками в основном).

revik
Благодарил (а): 2 раза
Поблагодарили: 51 раз

№ 27 Сообщение revik » 12 янв 2014 20:47

Кант хелп ю, сорри. Трай ту аск р2д2 инстед.

Пойманый_маньяк
Аватара пользователя
Благодарил (а): 404 раза
Поблагодарили: 694 раза

№ 28 Сообщение Пойманый_маньяк » 14 янв 2014 16:35

25: Axl:

Число отрицательное, двоешники...

unsigned - беззнаковое.
signed - со знаком
На примере числа 10000011 и unsigned / signed byte (лишние нули не втыкать):

signed
10000011 = -3
unsigned
10000011 = 131

С long ситуация аналогичная, только добавляться из-за знака будет не 128, а сто тыщ миллионов.

djdance
Аватара пользователя
Благодарил (а): 1 раз
Поблагодарили: 4 раза

№ 29 Сообщение djdance » 14 янв 2014 16:43

28: Пойманый_маньяк:
> Число отрицательное, двоешники...

и чо?
твоя логика сработает, только если одно из слагаемых отрицательное, а это невозможно - они оба ансигнед.

UPD если только одно из них отрицательное на этапе присвоения из сигнед, о чем автор не знает, допустим, а в сигнед-версии у него положительный результат из-за величины второго слагаемого. Таким образом, надо советовать проверять источник обоих слагаемых.

Вернуться в «Компьютерный форум»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей