Прошу помощи, приём и передача данных по 8 пинам .

sirshulz
Offline
Зарегистрирован: 05.09.2015

Суть проблемы: устройство имеет 8 контактов - три входящие данные, три выходящие, входящие тактируются устройством, выходящие планируются микроконтроллером.
Устройство выставляет единицы и нули на трех пинах одновременно по спаду такта (я так понимаю один байт), и так четыре раза (4 байта), после чего тактирование передающий стороной останавливается. Ждём ответа.
Передатчик принимает эти данные, формирует ответ, так же четыре байта,и по другим пинам, аналогично тактирует и передаёт данные. Ждём следующий вопрос.
Время одного такта примерно 225ms.
Вопрос - возможно ли на ардуино это сделать?
Буду рад любым подсказкам и направлениям.
Заранее благодарен за ответ.

P.S. Картинки с осциллограф будут позже.

Волшебник
Offline
Зарегистрирован: 22.12.2016

На такой скорости как 225 мсек обычный дигиталРеад прокатит, детская задача. Вот если 22 микросек, тогда немного сложнее, но ардуино запросто справится и тут. 

sirshulz
Offline
Зарегистрирован: 05.09.2015

Как прочитать то мне понятно , я не знаю как ответ отправить , а именно как тактировать и выставлять уровни.

К сожалению флешка умерла, с картинками облом. Накидал на скорую руку, ширина клетки 112ms.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ну начинать надо так 

/*millis_sirshulz.ino
  #1 передатчик ->(2,3,4)
  CLKout          ->5  1\0 фиксация данных  0/1 готовность к передаче 0 - нет передачи
  #2 приемник
  Din_pin -> (6,7,8)
  CLKin ->9   1\0 фиксация данных  0/1 готовность к передаче 0 - нет передачи
       пауза    225ms   225ms
  D             --[==]---[==]--
  CLK __________/^^\___/^^\__
*/
//#1 передатчик
const int Dout_pin[3] = {2, 3, 4};
const int CLKout_pin = 5;
//#2 приемник
const int Din_pin[3] = {6, 7, 8};
const int CLKin_pin = 9;
void setup() {
  //#1 передатчик
  pinMode(Dout_pin[0], OUTPUT);
  pinMode(Dout_pin[1], OUTPUT);
  pinMode(Dout_pin[2], OUTPUT);
  pinMode(CLKout_pin, OUTPUT);

  //#2 приемник
  pinMode(Din_pin[0], INPUT);
  pinMode(Din_pin[1], INPUT);
  pinMode(Din_pin[2], INPUT);
  pinMode(CLKin_pin, INPUT);

}

void loop() {
  //#1 передатчик

  //#2 приемник

}

 

Волшебник
Offline
Зарегистрирован: 22.12.2016

Там ещё дигиталВрайт есть, пишем три раза на три пина. Потом смотрим пример "блинк визаут делэй", и если милисеки набежали до нужного значение, то пошем плЮс один дигиталВрайт по клок пину.

sirshulz
Offline
Зарегистрирован: 05.09.2015

Товарищи  !

Мне только казалось , то смогу прочитать данные.

Подскажите как правильно прочитать эти четыре байта и обьединить в одно число не растягивая код программы на несколько страниц?

Код даже публиковать стыдно , читать вообще не реально

Признаю , знаний у меня нет! 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ну, может я вас сбиваю своим подходом к программированию. Но передача  12 бит в течении 1 сек (225ms * 4)  при обычном (а не с помощью программирования параллельных потоков) тормознет работу всей вашей системы.

sirshulz
Offline
Зарегистрирован: 05.09.2015

qwone пишет:

Ну, может я вас сбиваю своим подходом к программированию. Но передача  12 бит в течении 1 сек (225ms * 4)  при обычном (а не с помощью программирования параллельных потоков) тормознет работу всей вашей системы.

Да, вы правы, но устройство куда я планирую подключить ардуино , передает и принимает именно с такой скоростью. Оно имеет встроенный цифровой осцилограф и показания этих входов и выходов сняты с него.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ну отправка 3 бит вроде есть. Но не проверял.

/*millis_sirshulz.ino
  #1 передатчик ->(2,3,4)
  CLKout          ->5  1\0 фиксация данных  0/1 готовность к передаче 0 - нет передачи
  #2 приемник
  Din_pin -> (6,7,8)
  CLKin ->9   1\0 фиксация данных  0/1 готовность к передаче 0 - нет передачи
       пауза    225ms   225ms
  D           --<=====><=====>--
  CLK __________/^^\___/^^\__
  #3 кнопка -> A0 (btn1_pin)
*/
//#1 передатчик
const int Dout_pin[3] = {2, 3, 4};
const int CLKout_pin = 5;
bool CLKout;
bool do_transmission;// сделать передачу 1 / 0 нет
bool transmission;// 1 идет передача /0 нет
byte bit3_Tx = 0x5; // число b 0000 0101;
void Out_bit3(byte data) { // отправка данных
  bit3_Tx = data; // загрузить данные
  do_transmission = 1; // подать команду "сделать передачу"
}
//#2 приемник
const int Din_pin[3] = {6, 7, 8};
const int CLKin_pin = 9;
bool CLKin, CLKin_old;
byte bit3_Rx;
byte In_bit3() {
  return digitalRead(Din_pin[2]) * 4 + digitalRead(Din_pin[1]) * 2 + digitalRead(Din_pin[0]);
}
//#3 кнопка
const int btn1_pin = A0;
bool btn1, btn1_old; //нажатие кнопки

void setup() {
  Serial.begin(9600);
  //#1 передатчик
  pinMode(Dout_pin[0], OUTPUT);
  pinMode(Dout_pin[1], OUTPUT);
  pinMode(Dout_pin[2], OUTPUT);
  pinMode(CLKout_pin, OUTPUT);
  digitalWrite(CLKout_pin, CLKout = 0); // линия свободна
  //#2 приемник
  pinMode(Din_pin[0], INPUT);
  pinMode(Din_pin[1], INPUT);
  pinMode(Din_pin[2], INPUT);
  pinMode(CLKin_pin, INPUT);
  CLKin = digitalRead(CLKin_pin); // опрос линии приемника
  //#3 кнопка
  pinMode(btn1_pin, INPUT_PULLUP);
  btn1 = digitalRead(btn1_pin);
}

void loop() {
  //#1 передатчик
  static uint32_t past_1 = 0 ;
  if (do_transmission && ! transmission) { // если команда "сделать передачу" и прередачи нет
    past_1 = millis(); // сделать отметку
    transmission = 1; // включить передачу
    do_transmission = 0; // снять команду
    digitalWrite(CLKout_pin, CLKout = 1); // линия занята
    digitalWrite(Dout_pin[0], bit3_Tx & 0x1 );
    digitalWrite(Dout_pin[1], bit3_Tx & 0x2);
    digitalWrite(Dout_pin[2], bit3_Tx & 0x4);
  }
  if ( CLKout &&   millis() - past_1 >= 112) { // формирование 1\0 CLKout
    digitalWrite(CLKout_pin, CLKout = 0);
  }
  if ( transmission &&   millis() - past_1 >= 225) { // если истекло время передачи
    transmission = 0; // выключить передачу
  }
  //#2 приемник
  CLKin_old = CLKin;
  CLKin = digitalRead(CLKin_pin); // опрос линии приемника
  if (CLKin_old && ! CLKin) { // если произошел перепад 1\0
    bit3_Rx = In_bit3();
    Serial.println(bit3_Rx);
  }
  //#3 кнопка
  static uint32_t past_3 = 0 ;
  if (millis() - past_3 >= 1000) { // если прошло 1000 миллисек
    past_3 = millis() ;
    btn1_old = btn1;
    btn1 = digitalRead(btn1_pin);
    if (btn1_old && ! btn1 && ! CLKout)  // если нажата кнопка 1 и нет передачи
      Out_bit3(0x5);// то передать 3 бита
  }
}

 

sirshulz
Offline
Зарегистрирован: 05.09.2015

Спасибо, суть уловил.
Буду пробовать доработать, так как принять и распознать надо четыре цифры и сразу отправить правильный ответ, тоже четыре цифры. И так пять раз.