I2C Attiny (Master&Slave) funktioniert nicht richtig

Hey Leute,

ich weiß langsam nicht mehr weiter und sitz schon seit Tagen an meinem Problem. Ich bin in der Microcontroller-Geschichte noch ziemlich neu und mache gerade versuche mit I2C.

grober Aufbau: Attiny85(tinywireM <- Master) soll Informationen an Attiny85(tinyWireS <-Slave) senden.

Problem: Der Bus funktioniert nicht bzw. die gesendetet Daten werden falsch und unregelmässig umgesetzt vom Slave ..die Anzeige ändert sich alle paar Sekunden bzw. Minuten und dann nicht richtig.

Was soll passieren?

Meine 3 LEDs sollen testweise nacheinander leuchten (kleines Lauflicht).

Setup:

-2x Attiny85 1Mhz
-Aruino Uno as ISP
-Pull-Ups: 10k bzw 5k(2x10k parallel)
-Bibliotheken: TinyWireM und TinyWireS
-bei der TinyWireS hab ich 2 unterschiedliche Versionen probiert jeweils mit und ohne .onreceive Callback
Wenn im Master Loop kein Delay verwendet wurde, hat es mal funktioniert...dann kann ich aber meine funktion nicht umsetzten (bzw. nur den Blinker).

Master-Code:

#include <TinyWireM.h>
//#include <USI_TWI_Master.h>

int num=3;

void setup() {
  // put your setup code here, to run once:
TinyWireM.begin();
//delay(3000);
}

void loop() {
  // put your main code here, to run repeatedly:

//TinyWireM.beginTransmission(0x1);
//TinyWireM.send(B00000001);
//TinyWireM.endTransmission();
LED3();
delay(500);
LEDoff();
delay(500);
LED4();
delay(500);
LEDoff();
delay(500);
LED5();
delay(500);
LEDoff();


}


void LED3(){
  TinyWireM.beginTransmission(0x1);
TinyWireM.send(3);
TinyWireM.endTransmission();
}
void LED4(){
  TinyWireM.beginTransmission(0x1);
TinyWireM.send(4);
TinyWireM.endTransmission();
}
void LED5(){
  TinyWireM.beginTransmission(0x1);
TinyWireM.send(5);
TinyWireM.endTransmission();
}
void LEDoff(){
  TinyWireM.beginTransmission(0x1);
TinyWireM.send(6);
TinyWireM.endTransmission();
}

Slave-Code:

#include <TinyWireS.h>



#define I2C_SLAVE_ADDR 0x1

uint8_t master_data[16];

uint8_t master_bytes;




int DREI = 1;
int VIER = 3;
int FUENF = 4;
byte msg = 0;


void receiveEvent(uint8_t num_bytes)
{
  uint8_t i;
  uint8_t master_data[16];

  master_bytes = num_bytes;

  for (i = 0; i < master_bytes; i++)
    master_data[i] = TinyWireS.receive();
  if (TinyWireS.available()) {
    msg = TinyWireS.receive();
    if (msg == 1){Blink(DREI,2);}
    if (msg == 3) {
      digitalWrite(DREI, HIGH);
    }
    if (msg == 4) {
      digitalWrite(VIER, HIGH);
    }
    if (msg == 5) {
      digitalWrite(FUENF, HIGH);
    }
    if (msg == 6) {
      digitalWrite(DREI, LOW);
      digitalWrite(VIER, LOW);
      digitalWrite(FUENF, LOW);
      }
  }

    
}

void setup() {
  // put your setup code here, to run once:
  pinMode(DREI, OUTPUT);
  pinMode(VIER, OUTPUT);
  pinMode(FUENF, OUTPUT);
  TinyWireS.begin(I2C_SLAVE_ADDR);
TinyWireS.onReceive(receiveEvent);
delay(30);
Blink(DREI,5);
}

void loop() {
   if (TinyWireS.available()) {
    msg = TinyWireS.receive();
    if (msg == 1){Blink(DREI,2);}
    if (msg == 3) {
      digitalWrite(DREI, HIGH);
    }
    if (msg == 4) {
      digitalWrite(VIER, HIGH);
    }
    if (msg == 5) {
      digitalWrite(FUENF, HIGH);
    }
    if (msg == 6) {
      digitalWrite(DREI, LOW);
      digitalWrite(VIER, LOW);
      digitalWrite(FUENF, LOW);
      }
  }

TinyWireS_stop_check();

}
void Blink(byte led, byte times){ // poor man's display
  for (byte i=0; i< times; i++){
    digitalWrite(led,HIGH);
    delay (250);
    digitalWrite(led,LOW);
    delay (175);
  }
}

beim Versuch ohne .onReceive( wäre mir lieber) hab ich meine Auswertung natürlcih im main Loop gemacht.

Wie gesagt ändern sich die Zustände der LEDs so wie sie gerade lustig sind ://

Ich hoffe ihr könnt mir helfen :slight_smile:

Leider kann ich mich jetzt nicht in deine Sketche einlesen.

Habe dir aber einen Beitrag angehängt, nachdem ich kürzlich meine I2C-Verbindungen realisiert habe.

Evtl. hilft es, wenn nicht schon bekannt.

Danke für die Seite :slight_smile: ..ich glaube, dass ich es so ähnlich auch umgesetzt habe...finde einfach den Fehler nicht :confused:

CptnRtrd:
-2x Attiny85 1Mhz
delay(500);

Zitate aus der Bibliothek:
"You need to have at least 8MHz clock on the ATTiny for this to work!"
"You must not use delay() or I2C communications will fail"

Danke :slight_smile: ja ich hab auch delaymicroseconds schon ausprobeirt..ohne erfolg...zu der geschwindigkeit hab ich gefunden: Both the 1MHz and 8MHz clock speeds were tested.
By default the I2C master library (TinyWireM) is set to run at 1MHz. To run at 8MHz, #defines in USI_TWI_Master.h / .cpp must be changed. No changes are necessary for the I2C slave library (TinyWireS). hättest du ne quelle für die aussage zur taktrate? ist das für tinywireS oder für die masterbibliothek? Gäbe es evtl. ne Möglichkeit für 1Mhz...hab mit der frequenz noch nich rumgespielt Vor/Nachteile unbekannt usw.

CptnRtrd:
Danke :slight_smile: ja ich hab auch delaymicroseconds schon ausprobeirt..ohne erfolg...zu der geschwindigkeit hab ich gefunden: Both the 1MHz and 8MHz clock speeds were tested.
By default the I2C master library (TinyWireM) is set to run at 1MHz. To run at 8MHz, #defines in USI_TWI_Master.h / .cpp must be changed. No changes are necessary for the I2C slave library (TinyWireS). hättest du ne quelle für die aussage zur taktrate? ist das für tinywireS oder für die masterbibliothek? Gäbe es evtl. ne Möglichkeit für 1Mhz...hab mit der frequenz noch nich rumgespielt Vor/Nachteile unbekannt usw.

Warum musst du 1MHz verwenden ?
Einziger Vorteil der mir bekannt ist, der Stromverbrauch ist geringer.
Delaymicroseconds ist auch delay, geht also auch nicht.

THX Leute..war fast am verzweifeln ...mit delay aufm masterbug is kein problem ..scheint zu funktionieren..hab jetzt 8Mhz bootloader auf den slave gebrannt und es geht :slight_smile: wer lesen kann is klar im vorteil -.-'

Ist doch super, das es jetzt funktioniert.

Mir is da gerade glatt noch ein 2. Problem aufgefallen. ^^' Wenn ich jetzt LEDs ansteuere (also an und wieder abschalten) dann flackert sie manchmal...ich glaube der I2C verschluckt sich irgendwie :confused:

CptnRtrd:
Mir is da gerade glatt noch ein 2. Problem aufgefallen. ^^' Wenn ich jetzt LEDs ansteuere (also an und wieder abschalten) dann flackert sie manchmal...ich glaube der I2C verschluckt sich irgendwie :confused:

Was soll sich da verschlucken ?
Du hast deinen Aufbau sicher vorher nicht mit einem bzw. 2 Arduinos getestet.
Da könnte man per seriellem Monitor derartige Fehler herausfinden.
Um dem auf die Spur zu kommen, musst du wohl diesen Weg gehen.

scheint jetzt zu lappen..naja also alle 10-15 sekunden hat er einen Sendebefehl asugelassen..oder derslave hat ihn nicht erkannt...wie folgt getestet->led ausschalten;led einschalten;10ms warten...dabei hat die led alle paar sekunden mal eblinkt...da ich aber steckleitungen fürs breadboard verwendet hab für den Bus (2 Stück direkt parallel) und ich gelesen hab das die sich gerne mal gegenseitig beeinflussen, hab ich mal 2 einzelne Leitungen genommen. Die haben jetzt ungefähr 1cm Abstand statt vorher <1mm..scheint jetzt zu klappen ...kein geblinke mehr :slight_smile:

Wie sagt man so schön " Ende gut, alles gut" :wink:

Naja ..hab immer mal noch ne störung...muss ich mal genauer überprüfen wenn ich wieder n Oszi hab..ansonsten vil. einfach mal direkt verlöten :slight_smile:

HotSystems:
Da könnte man per seriellem Monitor derartige Fehler herausfinden.
Um dem auf die Spur zu kommen, musst du wohl diesen Weg gehen.

Das geht auch mit SoftwareSerial (nur TX) an UNO, der zum seriellen Monitor weiterreicht. Dazu habe ich ArduinoISP erweitert.

agmue:
Das geht auch mit SoftwareSerial (nur TX) an UNO, der zum seriellen Monitor weiterreicht. Dazu habe ich ArduinoISP erweitert.

Ja, ich vor einiger Zeit mal was darüber gelesen, aber nicht weiter verfolgt.
Gibt es da einen Beitrag/Link drüber ?

HotSystems:
Gibt es da einen Beitrag/Link drüber ?

Sorry, habe ich nicht so schnell gefunden, aber Du bist ja jetzt selbst fündig geworden. Ich wiederhole den Link in diesem Thema: „Debughilfe für den ATtiny85"

Man darf von dieser Debughilfe keine Wunder erwarten, aber um zu verstehen, was vor sich geht, ist es eine Hilfe.

agmue:
Sorry, habe ich nicht so schnell gefunden, aber Du bist ja jetzt selbst fündig geworden. Ich wiederhole den Link in diesem Thema: „Debughilfe für den ATtiny85"

Man darf von dieser Debughilfe keine Wunder erwarten, aber um zu verstehen, was vor sich geht, ist es eine Hilfe.

Ich danke dir.
Mal wieder durch deine Anregung bin ich in meinen Projekten vorran gekommen.
Suchen musste ich auch erst. Aber jetzt läuft es. :wink: