Интерфейс I2C не работает, не понимаю почему (rs 485 тоже)
- Войдите на сайт для отправки комментариев
Добрый день. Решил изучать интерфейсы передачи данных. Вначале пробовал реализовать общение через 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); } }
Ниже код на I2C, и фото макета.
Где? Ни фото, ни схемы не вижу.
Вы шлёте 0, 1, 2, и т.д. а при чтении ожидаете почему-то '0', '1', '2', и т.д. Вы думаете. что 1 и '1' - одно и тоже? Таки нет.
В слейве в строке 4 переменная x неправильно описана. Если Вы изменяете её из обработчика прерывания, необходимо при описании явно указать, что такие неожиданных изменения возможны.
А с какого перепуга это должно работать. Ваш мастер отправляет по одному байту в каждой посылке. Значение этого байта изменяется от 0 до 9.
Ваш слейв должен мигать 5 раз в две секунды если принял байт со значением 48 и длинными вспышками с короткими паузами, если принял значение 51.
Добавьте копию строки 24 после 15 и смотрите сами.
Все, спасибо большое, стер кавычки "1" в цикле слейва, все заработало
Второе моё замечание таки разберите. Это не привродит к немедленному и однозначному краху, но вызывает необъяснимые глюки - никакой глюкометр не поможет.
И, квалификатор volatile, вроде как не говорит о том, что работа с этой переменной будет атомарна. Это в скетче тоже не обеспечивается..