arduino & i2c - danila i need help
вдруг случится чудо, и в тему зайдет тот, кто прорюхал реализацию i2c на ардуинке.
к нему, уважаемому, такой вопрос.
если надо передать слово из двух байт в регистр слейва, то как грамотнее сделать?
делать одно write(word)? (возвращает 1, то есть передан 1 байт, а надо 2)
или делать write(word >>8) а потом write(word)? но тогда слейв не реагирует вообще
и второй вопрос, обрамлять ли каждый write парой begin...endTransmition, или шине в общем случае пофиг?
я тут могу написать еще многабукв с примерами, если надо
к нему, уважаемому, такой вопрос.
если надо передать слово из двух байт в регистр слейва, то как грамотнее сделать?
делать одно write(word)? (возвращает 1, то есть передан 1 байт, а надо 2)
или делать write(word >>8) а потом write(word)? но тогда слейв не реагирует вообще
и второй вопрос, обрамлять ли каждый write парой begin...endTransmition, или шине в общем случае пофиг?
я тут могу написать еще многабукв с примерами, если надо
0: djdance:
Библиотека Wire?
Вариант 1:
Вариант 2:
Эм? 
Писать word, или dword, или что-то еще длиннее 8 бит смысла похоже нет - функция, судя по результату, обрубает 1 байт.
Библиотека 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
Код: Выделить всё
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 раз.
1: Пойманый_маньяк:
вот я и спрашиваю, это с точки зрения стандарта i2c - одинаковые вещи или нет.
ну и эта. а как передать адрес регистра, куда пишем
вот я и спрашиваю, это с точки зрения стандарта i2c - одинаковые вещи или нет.
ну и эта. а как передать адрес регистра, куда пишем
2: djdance:
Судя по этому - http://www.gaw.ru/pdf/interface/iic_r.pdf
Получается, что первый вариант (несколько write подряд) правильнее (Рисунок 5 Передача от Мастера к Слейву)
А адресации у него я что-то вообще пока не вижу
Судя по этому - http://www.gaw.ru/pdf/interface/iic_r.pdf
Получается, что первый вариант (несколько write подряд) правильнее (Рисунок 5 Передача от Мастера к Слейву)
А адресации у него я что-то вообще пока не вижу
но если по первому варианту, то ардуинка не получит акноледж.
а по канону - надо.
а по канону - надо.
Адресации походу как таковой нет.
Назначения байт - в конкретных устройствах различно.
Например 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
Назначения байт - в конкретных устройствах различно.
Например 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
4: djdance:
ACK вполне может быть получаем в результате каждой функции Write, например
А вариант 2 - это уже неканонический STOP, по всем признакам.
ACK вполне может быть получаем в результате каждой функции Write, например
А вариант 2 - это уже неканонический STOP, по всем признакам.
угу, я одновременно докопался до того же
тупо слать N байт и все.
попробовал - работает.
бардак, никакой конкретной адресации, теперь хранить все регистры в памяти
тупо слать N байт и все.
попробовал - работает.
бардак, никакой конкретной адресации, теперь хранить все регистры в памяти
6: Пойманый_маньяк:
> ACK вполне может быть получаем в результате каждой функции Write
в ардуиновской Wire - нет
в сторонних библах можно
> ACK вполне может быть получаем в результате каждой функции Write
в ардуиновской Wire - нет
в сторонних библах можно
8: djdance:
Тогда как он понимает что отослал, и нет ошибки?
Тогда как он понимает что отослал, и нет ошибки?
"он" - ардуин? в конце всех пяти слов на endTransmission
в Wire, видимо, все ACK рюхаются в привате
в Wire, видимо, все ACK рюхаются в привате
10: djdance:
Еще проще похоже...
Wire.write(data, length);
http://robocraft.ru/blog/arduino/786.html
Еще проще похоже...
Wire.write(data, length);
http://robocraft.ru/blog/arduino/786.html
11: Пойманый_маньяк:
не понял как связан твой ответ №11 с моим №10 ))
не понял как связан твой ответ №11 с моим №10 ))
12: djdance:
Да я вопроса признаться не совсем понял...
Он - оператор write.
Приват он или паблик - какая разница, главное чтобы ACKи ловил.
И он их видимо ловит, потому-что:
1. Если он их ловить не будет - ты в endTransmission соответственно числа переданных байт не увидишь. Потому-что - а как иначе получить данную цифру?
2. Функция Wire.write(data, length) - она тоже как-бы ненавязчиво намекает на то, что с ACKами между байтами write вполне справляется.
Да я вопроса признаться не совсем понял...
Он - оператор write.
Приват он или паблик - какая разница, главное чтобы ACKи ловил.
И он их видимо ловит, потому-что:
1. Если он их ловить не будет - ты в endTransmission соответственно числа переданных байт не увидишь. Потому-что - а как иначе получить данную цифру?
2. Функция Wire.write(data, length) - она тоже как-бы ненавязчиво намекает на то, что с ACKами между байтами write вполне справляется.
>Приват он или паблик - какая разница, главное чтобы ACKи ловил.
но в случае привата ТЫ об этом не узнаешь. А надо бы.
>И он их видимо ловит, потому-что:
>1. Если он их ловить не будет - ты в endTransmission соответственно числа переданных байт не увидишь.
endTransmition не возвращает кол-во байт. Их как раз отдает write
>2. Функция Wire.write(data, length) - она тоже как-бы ненавязчиво намекает на то, что с ACKами между байтами write вполне справляется.
Я об этом и говорил. Я не задавал вопроса про наличие АСК в write, я написал, что это видимо понятно.
>И он их видимо ловит, потому-что:
потому что протокол
но в случае привата ТЫ об этом не узнаешь. А надо бы.
>И он их видимо ловит, потому-что:
>1. Если он их ловить не будет - ты в endTransmission соответственно числа переданных байт не увидишь.
endTransmition не возвращает кол-во байт. Их как раз отдает write
>2. Функция Wire.write(data, length) - она тоже как-бы ненавязчиво намекает на то, что с ACKами между байтами write вполне справляется.
Я об этом и говорил. Я не задавал вопроса про наличие АСК в write, я написал, что это видимо понятно.
>И он их видимо ловит, потому-что:
потому что протокол
14: djdance:
> endTransmition не возвращает кол-во байт. Их как раз отдает write
Да один хрен, главное их фиксируют.
Все. Понял. Наобщался с неадекватами* - везде знаки вопроса мерещатся.
Пардон муа
* - кстати, а как будет неадекват женского пола?
> endTransmition не возвращает кол-во байт. Их как раз отдает write
Да один хрен, главное их фиксируют.
Все. Понял. Наобщался с неадекватами* - везде знаки вопроса мерещатся.
Пардон муа
* - кстати, а как будет неадекват женского пола?
15: Пойманый_маньяк:
> Да один хрен, главное их фиксируют.
так тут ведь как. Один индус меня настращал, мол по протоколу сядут усе слейв будеть бить тебя АСК-ответами до посинения, если не примешь, - не победишь. И вышеупомянутый тобой Вариант 2 с обрамлением каждой транзакции выглядит с этой точки зрения более безопасным, чем неизвестно-что-делающий-там-себе-write.
Ну ладно, хрен с ним, заработало и ладно
ЗЫ неадекваточка.
> Да один хрен, главное их фиксируют.
так тут ведь как. Один индус меня настращал, мол по протоколу сядут усе слейв будеть бить тебя АСК-ответами до посинения, если не примешь, - не победишь. И вышеупомянутый тобой Вариант 2 с обрамлением каждой транзакции выглядит с этой точки зрения более безопасным, чем неизвестно-что-делающий-там-себе-write.
Ну ладно, хрен с ним, заработало и ладно
ЗЫ неадекваточка.
16: djdance:
> И вышеупомянутый тобой Вариант 2 с обрамлением каждой транзакции выглядит с этой точки зрения более безопасным, чем неизвестно-что-делающий-там-себе-write.
Не выйдет боюсь.
Закрытие транзакции - это по всем признакам STOP и передача в slave P.
После которых ты начнешь писать опять в первый байт.
Можно на read'ах кстати проверить - почитать из какого-нибудь устройства минимум с 2 байтами ответа закрывая транзакцию...
Должен по идее читаться только первый бит. Два или более раза.
> И вышеупомянутый тобой Вариант 2 с обрамлением каждой транзакции выглядит с этой точки зрения более безопасным, чем неизвестно-что-делающий-там-себе-write.
Не выйдет боюсь.
Закрытие транзакции - это по всем признакам STOP и передача в slave P.
После которых ты начнешь писать опять в первый байт.
Можно на read'ах кстати проверить - почитать из какого-нибудь устройства минимум с 2 байтами ответа закрывая транзакцию...
Должен по идее читаться только первый бит. Два или более раза.
17: Пойманый_маньяк:
проверил, да, на реадах все заново
а вдруг хитрые китайцы на запись сделали строгое ожидание полной посылки
проверил, да, на реадах все заново
а вдруг хитрые китайцы на запись сделали строгое ожидание полной посылки
Рассуждал как:
В посылке протокола может быть несколько ACKов между битами, и один STOP в конце посылки.
В примерах программы было несколько write подряд, закрывающихся одним endTransmission.
Аналогия ACK - Write, STOP - endTransmission.
Необходимо знать какой байт из нескольких читаем или пишем.
STOP - по идее может разбираться со счетом двумя способами.
а. Обнулять счетчик в устройстве прочитанных / записанных байт.
б. Сохранять счетчик.
Вариант с сохранением счетчика крайне неприятен.
Так как в этом случае при перезагрузке программисту прийдется угадывать - какой по счету бит он сейчас читает или пишет.
А это - много мата и других некрасивых слов
В посылке протокола может быть несколько ACKов между битами, и один STOP в конце посылки.
В примерах программы было несколько write подряд, закрывающихся одним endTransmission.
Аналогия ACK - Write, STOP - endTransmission.
Необходимо знать какой байт из нескольких читаем или пишем.
STOP - по идее может разбираться со счетом двумя способами.
а. Обнулять счетчик в устройстве прочитанных / записанных байт.
б. Сохранять счетчик.
Вариант с сохранением счетчика крайне неприятен.
Так как в этом случае при перезагрузке программисту прийдется угадывать - какой по счету бит он сейчас читает или пишет.
А это - много мата и других некрасивых слов
вот! за это wire и ругают, и пишут более лучшие обертки и либы, пример I2C library от Wayne Truchsess
Проще говоря - на запись то-же самое с вероятностью 99,9%.
Если конечно хитрые китайцы хоть немного дружат с содержимым головы.
Если конечно хитрые китайцы хоть немного дружат с содержимым головы.
Слушай, а что за устройство?
Во многих случаях можно ж и запись аналогично проверить...
Во многих случаях можно ж и запись аналогично проверить...
> Во многих случаях можно ж и запись аналогично проверить
нуэ. Потратив два дня на битье об стену, я больше не хочу исследовать этот черный ящик методом выискивания намеков на соответствие предположениям о совокупности языка, даташита и паяльника. Работает, и ладно.
> Слушай, а что за устройство?
http://www.parallax.com/Store/Accessori ... fault.aspx
это клон.
оригинал - на 3.3V , ему оказался нужен логик конвертер, и я пока призабил.
Кстати, по логик конвертерам дополнительный вопрос знатокам. Конвертер точно должен быть дуплексным, для SPI ?
нуэ. Потратив два дня на битье об стену, я больше не хочу исследовать этот черный ящик методом выискивания намеков на соответствие предположениям о совокупности языка, даташита и паяльника. Работает, и ладно.
> Слушай, а что за устройство?
http://www.parallax.com/Store/Accessori ... fault.aspx
это клон.
оригинал - на 3.3V , ему оказался нужен логик конвертер, и я пока призабил.
Кстати, по логик конвертерам дополнительный вопрос знатокам. Конвертер точно должен быть дуплексным, для SPI ?
-
Axl
- Благодарил (а): 1 раз
Нуждаюсь в дисплее для Arduino "на поиграться".
16х2, 20х2, 20х4 или, э-э-э... любой, подходящий без особого колдунства (русский язык - не принципиально).
Контроллеры купил(nano), кнопки-светодиоды-релюшки тоже есть, а про дисплей сразу не подумал.
Сразу не заказал, а теперь ещё месяц+ (из Китая) не вытерплю, страсть как охота побаловаться
Могу купить, могу заказать вам похожий/аналогичный или просто дайте на время
По спекулятивной цене - не надо.
И заодно спрошу (в программировании, по-большому счёту, лох):
складываю 2 шт. unsigned long ( var1 = var2 + var3; ) и получаю какую-то чушь (огромное несуразное число);
если просто long - то всё нормально, складывается предсказуемо.
"Это баг или фича?"
16х2, 20х2, 20х4 или, э-э-э... любой, подходящий без особого колдунства (русский язык - не принципиально).
Контроллеры купил(nano), кнопки-светодиоды-релюшки тоже есть, а про дисплей сразу не подумал.
Сразу не заказал, а теперь ещё месяц+ (из Китая) не вытерплю, страсть как охота побаловаться
Могу купить, могу заказать вам похожий/аналогичный или просто дайте на время
По спекулятивной цене - не надо.
И заодно спрошу (в программировании, по-большому счёту, лох):
складываю 2 шт. unsigned long ( var1 = var2 + var3; ) и получаю какую-то чушь (огромное несуразное число);
если просто long - то всё нормально, складывается предсказуемо.
"Это баг или фича?"
25: Axl:
> unsigned long ( var1 = var2 + var3; )
давно нет времени на ардуинку
но насколько помню - глюк, да.
навскидку - сложите по очереди
var1 = var2;
var1 += var3; или даже var1 = var1 + var3;
там часто все глюкаво с инкрементами из-за реализации памяти
ну и второй вариант - кто-то портит переменную выходом за диапазон (массив рядом?). До long с его 4 байтами порча не доходит, а до ансигнеда - доходит... И такие проблемы ловил (со строками в основном).
> unsigned long ( var1 = var2 + var3; )
давно нет времени на ардуинку
навскидку - сложите по очереди
var1 = var2;
var1 += var3; или даже var1 = var1 + var3;
там часто все глюкаво с инкрементами из-за реализации памяти
ну и второй вариант - кто-то портит переменную выходом за диапазон (массив рядом?). До long с его 4 байтами порча не доходит, а до ансигнеда - доходит... И такие проблемы ловил (со строками в основном).
Кант хелп ю, сорри. Трай ту аск р2д2 инстед.
25: Axl:
Число отрицательное, двоешники...
unsigned - беззнаковое.
signed - со знаком
На примере числа 10000011 и unsigned / signed byte (лишние нули не втыкать):
signed
10000011 = -3
unsigned
10000011 = 131
С long ситуация аналогичная, только добавляться из-за знака будет не 128, а сто тыщ миллионов.
Число отрицательное, двоешники...
unsigned - беззнаковое.
signed - со знаком
На примере числа 10000011 и unsigned / signed byte (лишние нули не втыкать):
signed
10000011 = -3
unsigned
10000011 = 131
С long ситуация аналогичная, только добавляться из-за знака будет не 128, а сто тыщ миллионов.
28: Пойманый_маньяк:
> Число отрицательное, двоешники...
и чо?
твоя логика сработает, только если одно из слагаемых отрицательное, а это невозможно - они оба ансигнед.
UPD если только одно из них отрицательное на этапе присвоения из сигнед, о чем автор не знает, допустим, а в сигнед-версии у него положительный результат из-за величины второго слагаемого. Таким образом, надо советовать проверять источник обоих слагаемых.
> Число отрицательное, двоешники...
и чо?
твоя логика сработает, только если одно из слагаемых отрицательное, а это невозможно - они оба ансигнед.
UPD если только одно из них отрицательное на этапе присвоения из сигнед, о чем автор не знает, допустим, а в сигнед-версии у него положительный результат из-за величины второго слагаемого. Таким образом, надо советовать проверять источник обоих слагаемых.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей