Задача моделирования параллельной связи

Привет, я пытаюсь отправить данные (1 байт) с одного Arduino на другой, используя параллельную связь (шина из 8 соединений) и не используя какую-либо библиотеку. Однако проблема в том, что данные постоянно повреждаются, и то, что я должен получить на приемнике Arduino, не то, что я отправляю. Протокол, который я составил, похож на протокол uart. Есть контакт ES, и когда он низкий, передача начинается, а когда высокий, передача завершается. Я думаю, что проблема может быть связана с проводами, которые я использую для соединения двух ардуино. Может быть некоторый шум, который может перевернуть биты в проводах, или код проблематичен. Я отправляю свой код. Может быть, вы поможете мне пройти через это и решить мою проблему.

Код отправителя:

#define ES 8 //включить выборку
#define B0 0 //Шина 0
#define B1 1
#define B2 2
#define B3 3
#define B4 4
#define B5 5
#define B6 6
#define B7 7
const char dataToBeSent = 'C';
bool data_bit;

void setup() {
  pinMode(ES,OUTPUT);
  pinMode(B0,OUTPUT);
  pinMode(B1,OUTPUT);
  pinMode(B2,OUTPUT);
  pinMode(B3,OUTPUT);
  pinMode(B4,OUTPUT);
  pinMode(B5,OUTPUT);
  pinMode(B6,OUTPUT);
  pinMode(B7,OUTPUT);
  digitalWrite(ES,HIGH);
  delay(3000);
} 
void loop() {
  
 digitalWrite(ES,LOW); //передача запущена
 delay(10);

 for(int i = 0 ; i<8 ; i++){
    data_bit = dataToBeSent & (0x80 >> i);
    digitalWrite(i,data_bit);
 }
  delay(10);
  digitalWrite(ES,HIGH); //завершить передачу
  while(true){}
}

Код получателя:

#define ES 8 //включить выборку
#define B0 0 //Шина 0
#define B1 1
#define B2 2
#define B3 3
#define B4 4
#define B5 5
#define B6 6
#define B7 7

char rx_data;
byte rx_byte= 0;
bool rx_pin;

void setup() {
  Serial.begin(9600);
  pinMode(ES,INPUT);
  pinMode(B0,INPUT);
  pinMode(B1,INPUT);
  pinMode(B2,INPUT);
  pinMode(B3,INPUT);
  pinMode(B4,INPUT);
  pinMode(B5,INPUT);
  pinMode(B6,INPUT);
  pinMode(B7,INPUT);
  delay(1000);

}

void loop() {
  
  byte rx_byte= 0;
  
  while(digitalRead(ES) == HIGH){}
  delay(15);

  for(int i = 0 ; i<8 ; i++){
    rx_pin = digitalRead(i);
    Serial.print(rx_pin);
    if(rx_pin == 1){
      rx_byte |= (0x80 >> i);
    }
  }
 
 rx_data = rx_byte ;

 Serial.print("Received data: ");
 Serial.println(rx_data);

 delay(15);

 while(digitalRead(ES)== HIGH){}
 
}

, 👍0

Обсуждение

контакты 0 и 1 являются последовательными на некоторых Arduinos. если бы вы использовали контакты одного порта, вы могли бы сразу записать данные, @Juraj


1 ответ


Лучший ответ:

0

Проблема в том, что вы используете только одну фазу своего "ES" часы, хотя на самом деле вы должны использовать два.

На первом этапе, когда значение ES высокое, вы устанавливаете контакты ввода-вывода для представления передаваемого байта. Только после того, как это будет сделано, вы можете перейти ко второй фазе, где ES низкий, чтобы указать получателю, что «я настроил свои выходные данные, теперь вам нужно их прочитать».

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

  1. Установите ВЫСОКИЙ ES
  2. Установите выходные контакты для представления байта.
  3. Установите НИЗКИЙ ЭШ.
  4. Задержка
  5. Установите ВЫСОКИЙ ES

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

Например, вот протокол Centronics (параллельный порт):

Данные изменяются, когда nStrobe имеет ВЫСОКОЕ значение, и только тогда, когда эти данные "установлены". nStrobe переводится в НИЗКИЙ уровень, чтобы сообщить приемнику, что он может считывать данные. Как только nStrobe снова становится ВЫСОКИМ, данные изменяются на следующий байт для передачи.

,

спасибо большое попробую, @EEstudent