Помогите примером для подачи своей команды в шину I2C

Valden
Offline
Зарегистрирован: 15.06.2015

Помогите пожалуйста примером ,мне нужно сделать устройство которое после включения просто выдаёт команду в шину I2C 

На шине только одно slave устройство с адресом (0XEC).
Процессор (master) при включении инициализирует порядка пятидесяти (slave) регистров - без ожидания,
прерываний.
T.e. надо выдать в шину I2C последовательность:
- записать в микросхему с адресом (0XEC)
-регистр адрес (0xXX)
-данные (0xXX)
 
                         HEX      BIN
Запись в Chip  {0xEC}   1110 1100 + ACK
Register           (0x03)    0000 0011 + ACK
Data                (0x00)    0000 0000 + ACK
 
И так пятьдесят регистров.
Понимаю, что это не совсем правильно, но как то так.
Время начала передачи не привязано –хоть через час после включения.
Снято анализатором:
Time [s], Analyzer Name, Decoded Protocol Result
8.629905416666666,I2C,Setup Write to ['236'(0xEC)] + ACK
8.631000250000000,I2C,'3' (0x03) + ACK
8.632095166666666,I2C,'0' (0x00) + ACK
8.633373750000001,I2C,Setup Write to ['236'(0xEC)] + ACK
8.634468666666667,I2C,'3'(0x03) + ACK
8.635563583333333,I2C,'3'(0x03) + ACK
8.636841750000000,I2C,Setup Write to ['236'(0xEC)] + ACK
8.637936583333333,I2C,'4'(0x04) + ACK
8.639031416666667,I2C,'8'(0x08) + ACK
и т.д.
 
Просто на просторах интернета нахожу только примеры для дисплеев и прочих датчиков,в который как я понял уже заложены команды. Можно ли как то написать простой пример.Или хотя бы толковые уроки подскажите,спасибо!

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А IDE у Вас установлено? Значит у Вас есть все примеры

Лезете туда, берёте пример к библиотеке, например, вот этот

<где там у Вас IDE стоит>\hardware\arduino\avr\libraries\Wire\examples\master_writer

И смотрите как в линию отправляют текст "x is ", а за ним значение переменной х.

Valden
Offline
Зарегистрирован: 15.06.2015

Евгений огромное спасибо за подсказку!

Задача стояла включать устройство "на столе". После включения питания один раз проходит команда с разными регистрами и датами 51 раз и так до следующего включения питания.

Паралельно узнал как пользоваться масивами))

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

#include <Wire.h>
int x=0;
byte Adress = 0x76;
byte Registr[]={0x03,0x03,0x04,0x05,0x06,0x07,0x08,0x09};
byte Data[]={0x00,0x03,0x08,0x40,0x64,0x40,0x40,0x04};
void setup() {
  Wire.begin();
}
void loop(){
met1:
for (x=0;x<8;x++){
  Wire.beginTransmission(Adress);
  Wire.write(Registr[x]);
  Wire.write(Data[x]);
  Wire.endTransmission();
  }
met2:
if (x<8){
   goto met1;
  }
  else{
   goto met2;
  }
}

 

bwn
Offline
Зарегистрирован: 25.08.2014

С гоу ту, вы, имхо погрячились. Лучше на ифы перелопатьте.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Чё за готофобия? А где толерантность?

bwn
Offline
Зарегистрирован: 25.08.2014

Толерантность, оно, канешна, да.... Задумался, а как в эту программу еще что-то прикрутить?

Valden
Offline
Зарегистрирован: 15.06.2015

bwn пишет:

С гоу ту, вы, имхо погрячились. Лучше на ифы перелопатьте.

GOTO очень удобно в данном случает,так как мне не надо чтобы команда гонялась постоянно.

Прошёл весь цикл регистров ,устройство включилось и всё,ардуино своё дело сделала и ждёт следующего выключени\включения питания.

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

Valden
Offline
Зарегистрирован: 15.06.2015

bwn пишет:

Толерантность, оно, канешна, да.... Задумался, а как в эту программу еще что-то прикрутить?

Если в эту программу ,что то ещё надо прикрутить,тогда и гото можно убрать.

Я просто привёл пример того, что работает так как задумано,может кому то поможет использовать пример,а уже изменить его под свои нужды)

bwn
Offline
Зарегистрирован: 25.08.2014

Valden пишет:

GOTO очень удобно в данном случает,так как мне не надо чтобы команда гонялась постоянно.

Прошёл весь цикл регистров ,устройство включилось и всё,ардуино своё дело сделала и ждёт следующего выключени\включения питания.

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

Так забейте этот фор в сетап и никаких гоу ту не надо.))))

Можно так:
 

#include <Wire.h>
//int x=0;
byte Adress = 0x76;
byte Registr[] = {0x03, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09};
byte Data[] = {0x00, 0x03, 0x08, 0x40, 0x64, 0x40, 0x40, 0x04};
void setup() {
  Wire.begin();
  for (byte x = 0; x < 8; x++) {
    Wire.beginTransmission(Adress);
    Wire.write(Registr[x]);
    Wire.write(Data[x]);
    Wire.endTransmission();
  }
}
void loop() {
 
}

Можно так:

#include <Wire.h>
//int x=0;
byte Adress = 0x76;
byte Registr[] = {0x03, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09};
byte Data[] = {0x00, 0x03, 0x08, 0x40, 0x64, 0x40, 0x40, 0x04};
void setup() {
  Wire.begin();
}
void loop() {
  static byte x = 0;
  if (x<8) {
  for (x=0;x<8;x++){
    Wire.beginTransmission(Adress);
    Wire.write(Registr[x]);
    Wire.write(Data[x]);
    Wire.endTransmission();
    }
  }
}

Но первый пример лучше.
 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Все, что после 17 строки меняется на while(true); или abort(). В крайнем случае, на exit()

b707
Offline
Зарегистрирован: 26.05.2017

Valden пишет:

GOTO очень удобно в данном случает,так как мне не надо чтобы команда гонялась постоянно.

у вас как раз программа ниже метки2 будет гонятся постоянно

Учитесь пользоваться циклами. не надо прикрываться мнимым удобством GOTO

bwn
Offline
Зарегистрирован: 25.08.2014

DetSimen пишет:

 или abort(). В крайнем случае, на exit()

Ни щитается, нет таких команд у ардуины. ))))

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

В stdlib.h есь и abort() и exit()

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

bwn пишет:

DetSimen пишет:

 или abort(). В крайнем случае, на exit()

Ни щитается, нет таких команд у ардуины. ))))

bwn
Offline
Зарегистрирован: 25.08.2014

DetSimen пишет:

В stdlib.h есь и abort() и exit()

От, там они есть, а в катехизисе нет. Не ренегатствуй. Тута форум ардуина.ру. )))))

Valden
Offline
Зарегистрирован: 15.06.2015

b707 пишет:

Valden пишет:

GOTO очень удобно в данном случает,так как мне не надо чтобы команда гонялась постоянно.

у вас как раз программа ниже метки2 будет гонятся постоянно

Учитесь пользоваться циклами. не надо прикрываться мнимым удобством GOTO

Да,будет гоняться во второй метке,но сначала программа сделает 8 циклов через метку 1,и главное выполнит свою задачу.

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

Применение довольно специфическое ,поэтому думаю оно может пригодится в первую очередь НЕ программистам. 

Был бы я программистом ,мне бы не понадобилось электронику на столе включать своими силами)))

Спасибо всем за советы,возможно в будущем мне это пригодится!