Интерфейс I2C не работает, не понимаю почему (rs 485 тоже)

yozhikovd
Offline
Зарегистрирован: 17.10.2018

Добрый день. Решил изучать интерфейсы передачи данных. Вначале пробовал реализовать общение через rs 485, купил три микросхемы max 485, собрал все по схемам, скачал пример кода, прошил - не работает, осциллографа посомтреть, что на шинах данных нет. Подумал, что возможно проблема в том, что rs 485 реализовал без сопротивлений и емкостей, на чистых микросхемах, по этому от греха по дальше заказал готовые модули. Пока идут модули, решил попробовать передать данные через I2C, снова собрал по схеме, скачал пример с англо сайта - не работает. В чем проблема? Arduino Uno - китайские. Ниже код на I2C, и фото макета. Питание 12V от отдельного БП компьютера (Мастер посылает команду слейву на мигание светодиода)

//Мастер
#include <Wire.h> 
int x = 0;
void setup() {
  // Start the I2C Bus as Master
  Serial.begin(9600);
  Wire.begin(1); 
}
void loop() {
  Wire.beginTransmission(9); // transmit to device #9
  Wire.write(x);              // sends x 
  Wire.endTransmission();    // stop transmitting
  x++; // Increment x
  if (x > 10) x = 0; // `reset x once it gets 6
  delay(500);
  Serial.print(x);
}
//Слейв
 #include <Wire.h>
int LED = 8;
int x = 0;
void setup() {
  // Define the LED pin as Output
  pinMode (LED, OUTPUT);
  Serial.begin(9600);
// Start the I2C Bus as Slave on address 9
  Wire.begin(9); 
  // Attach a function to trigger when something is received.
  Wire.onReceive(receiveEvent);
}
void receiveEvent(int bytes) {
  x = Wire.read();    // read one character from the I2C
}
void loop() {
  //If value received is 0 blink LED for 200 ms
  if (x == '0') {
    digitalWrite(LED, HIGH);
    delay(200);
    digitalWrite(LED, LOW);
    delay(200);
    Serial.print(x);
  }
  //If value received is 3 blink LED for 400 ms
  if (x == '3') {
    digitalWrite(LED, HIGH);
    delay(1000);
    digitalWrite(LED, LOW);
    delay(100);
    Serial.print(x);
  }
  
}

 

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

yozhikovd пишет:

Ниже код на I2C, и фото макета.

Где? Ни фото, ни схемы не вижу.

Вы шлёте 0, 1, 2, и т.д. а при чтении ожидаете почему-то '0', '1', '2', и т.д. Вы думаете. что 1 и '1' - одно и тоже? Таки нет.

В слейве в строке 4 переменная x неправильно описана. Если Вы изменяете её из обработчика прерывания, необходимо при описании явно указать, что такие неожиданных изменения возможны.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

А с какого перепуга это должно работать. Ваш мастер отправляет по одному байту в каждой посылке. Значение этого байта изменяется от 0 до 9.

Ваш слейв должен мигать 5 раз в две секунды если принял байт со значением 48 и длинными вспышками с короткими паузами, если принял значение 51.

Добавьте копию строки 24 после 15 и смотрите сами.

yozhikovd
Offline
Зарегистрирован: 17.10.2018

Все, спасибо большое, стер кавычки "1" в цикле слейва, все заработало

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

Второе моё замечание таки разберите. Это не привродит к немедленному и однозначному краху, но вызывает необъяснимые глюки - никакой глюкометр не поможет.

sadman41
Offline
Зарегистрирован: 19.10.2016

И, квалификатор volatile, вроде как не говорит о том, что работа с этой переменной будет атомарна. Это в скетче тоже не обеспечивается..