Attiny85 с ArduinoUno для связи I2c
Я работаю над attiny85 для связи I2C. Я прошел через разные библиотеки уже как Wire.h
, TinyWire.h
, tinyWireM.h
, tinyWireS.h
,
В начале я хочу послать некоторый байт данных через I2C-коммуникацию и попытался установить ось на осциллограф, но это не дает мне соответствующих результатов. Поиск в интернете различных способов заставить attiny85 работать с I2c действительно бессердечен, и я не смог достичь этой цели. Наконец, я попытался сделать attiny85 ведущим, а arduino Uno - рабом, каким он был запасным в моей коробке.
Я попытался сделать attiny85 как master и отправить данные в arduino и посмотреть вывод на последовательном мониторе, но он показывает ноль.
Для справки, главный и подчиненный коды прилагаются, и моя задача просто проверить серийно.
Attiny85 в качестве мастера
#include <TinyWireM.h>
void setup()
{
TinyWireM.begin();
}
void loop()
{
TinyWireM.begin();
TinyWireM.beginTransmission(0x08);
TinyWireM.send(0x99);
int Byte1 = TinyWireM.endTransmission();
delay(1000);
}
Arduino как раб
#include <Wire.h>
const byte add = 0x08;
int byte1;
void setup()
{
Wire.begin(add);
Wire.onReceive(receiveEvent);
Serial.begin(9600);
}
void loop()
{
Serial.println ("Data receiving");
Serial.println(byte1);
delay(1000);
}
void receiveEvent(int bytes)
{
byte1 = Wire.read();
}
Но я не могу получить вывод на последовательный монитор Arduino. Что я здесь не так делаю?
1 ответ
Я использовал Atiny85 в качестве ведомого, используя TinyWireS lib ( https://github.com/nadavmatalon/TinyWireS) некоторое время назад, и он работал нормально. Ниже приведены конфигурации контактов
Контакт 5 ATtiny85 с Arduino Uno A4 и контакт 7 ATtiny85 с Arduino Uno A5
Ниже приведены мои коды
Крошечный.
#include "TinyWireS.h"
const byte SLAVE_ADDR = 100;
const byte NUM_BYTES = 4;
volatile byte data = { 0, 1, 2, 3 };
void setup() {
TinyWireS.begin(SLAVE_ADDR);
TinyWireS.onRequest(requestISR);
}
void loop() {}
void requestISR() {
for (byte i=0; i<NUM_BYTES; i++) {
TinyWireS.write(data[i]);
data[i] += 1;
}
}
Uno.
#include <Wire.h>
const byte SLAVE_ADDR = 100;
const byte NUM_BYTES = 4;
byte data[NUM_BYTES] = { 0 };
byte bytesReceived = 0;
unsigned long timeNow = millis();
void setup() {
Serial.begin(9600);
Wire.begin();
Serial.print(F("\n\nSerial is Open\n\n"));
}
void loop() {
if (millis() - timeNow >= 750) { // trigger every 750mS
Wire.requestFrom(SLAVE_ADDR, NUM_BYTES); // request bytes from slave
bytesReceived = Wire.available(); // count how many bytes received
if (bytesReceived == NUM_BYTES) { // if received correct number of bytes...
for (byte i=0; i<NUM_BYTES; i++) data[i] = Wire.read(); // read and store each byte
printData(); // print the received data
} else { // if received wrong number of bytes...
Serial.print(F("\nRequested ")); // print message with how many bytes received
Serial.print(NUM_BYTES);
Serial.print(F(" bytes, but got "));
Serial.print(bytesReceived);
Serial.print(F(" bytes\n"));
}
timeNow = millis(); // mark preset time for next trigger
}
}
void printData() {
Serial.print(F("\n"));
for (byte i=0; i<NUM_BYTES; i++) {
Serial.print(F("Byte["));
Serial.print(i);
Serial.print(F("]: "));
Serial.print(data[i]);
Serial.print(F("\t"));
}
Serial.print(F("\n"));
}