Attiny85 с ArduinoUno для связи I2c - PullRequest
0 голосов
/ 20 декабря 2018

Я работаю над attiny85 для связи I2C.Я прошел через различные библиотеки, такие как Wire.h, TinyWire.h, tinyWireM.h, tinyWireS.h.

В начале я хочу послать некоторый байт данных через I2C comm и попытался установить контакт с осциллографом, но он не дал мне соответствующих результатов.Поиск в интернете различных способов заставить attiny85 работать с I2c действительно бессердечен, и я не смог достичь этой цели.Наконец, я попытался сделать attiny85 ведущим, а arduino Uno - рабом, каким он был запасным в моей коробке.

Я попытался сделать attiny85 ведущим и отправить данные в arduino и просмотреть вывод на последовательном мониторе, но он показывает ноль.

Для справки, главный и подчиненный коды прикреплены, и моя задачапросто проверить серийный номер.

Attiny85 в роли Master

#include <TinyWireM.h>

void setup()
{
  TinyWireM.begin();
}
void loop()
{
  TinyWireM.begin();
  TinyWireM.beginTransmission(0x08);
  TinyWireM.send(0x99);  
  int Byte1 = TinyWireM.endTransmission();
  delay(1000);
}

Arduino в качестве Slave

#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 Ответ

0 голосов
/ 20 декабря 2018

Я использовал Atiny85 в качестве ведомого, используя TinyWireS lib (https://github.com/nadavmatalon/TinyWireS) некоторое время назад, и он работал нормально. Ниже были конфигурации контактов

ATtiny85, контакт 5 с Arduino Uno A4 и ATtiny85, контакт 7с Arduino Uno A5

Ниже приведены мои коды

Atiny.

#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"));    
}
...