Forum: Mikrocontroller und Digitale Elektronik I2C Master-Slave Verbindung funktioniert teilweise nicht!


von Mad M. (madang)


Lesenswert?

Hallo!
Vielleicht kann mir jemand helfen!
Habe eine Master-Slave via I2C realisiert und kann mir folgendes nicht 
ganz erklären.
Wenn ich bei dem Master-Sketch die Laufvariable i mit einer geraden Zahl 
initialisieren, dann geht gar nichts (Led's an Pin 10, 11, 12, 
13)blinken nicht mehr. Bei einer geraden Zahl i= 3, i=9 funktioniert die 
ganze Sache gut.
Danke Mad
1
//+++++ Master-Sketch ++++++
2
3
#include <Wire.h>
4
int i = 0;
5
6
void setup()
7
{
8
  //Teilnehmer am I2C-Bus
9
  //keine Adresse, da Master
10
  Wire.begin();
11
}
12
void loop()
13
{  
14
    delay(10);  // Durchlaufzeit
15
    //Datenübertragung an Empfänger mit Ardesse 3 starten
16
    Wire.beginTransmission(3);
17
    // Wert zum Senden
18
    int dataval = i;
19
    // Daten senden
20
    Wire.write(dataval);
21
    // Datenübertragung stoppen
22
    Wire.endTransmission();
23
    //weitere Anweisungen    
24
    i++;    
25
    
26
    if(i == 14)  // nur Pin 10 - 13 werden für die Led's verwendet 
27
    {
28
      i = 9;
29
    } 
30
  }


++++++++ Slave-Sketch ++++++++
1
#include <Wire.h>
2
boolean running = false;  // Var. zum toggeln
3
int TasterPin = 2;        // Taster für die Freigabe LED blinken am Slave
4
5
void setup()
6
{
7
  // Teilnehemer am Bus als Slave mit der Adresse #3
8
  Wire.begin(3);   
9
  // falls Daten empfangen wurden, Funktion 
10
  Wire.onReceive(receiveData); 
11
  
12
  pinMode(10, OUTPUT);  // Led an Pin 10
13
  pinMode(11, OUTPUT);  // Led an Pin 11
14
  pinMode(12, OUTPUT);  // Led an Pin 12
15
  pinMode(13, OUTPUT);  // Led on Board
16
17
  pinMode(TasterPin, INPUT);    // Taster als Eingang def.
18
  digitalWrite(TasterPin, HIGH);  // Pullup ein  
19
}
20
void loop()
21
{
22
  // delay(100);
23
}
24
25
// Funktion ausführen, falls Daten empfangen
26
void receiveData(int AnzahlBytes)
27
{
28
  //Daten empfangen und in Variable ablegen
29
  int recData = Wire.read();
30
  //Verarbeitung der empfangenen Daten
31
  if(digitalRead(TasterPin) == LOW)    // Ist Taster gedrückt (Pin 0 auf Masse)
32
  {  
33
    running = !running;                // Wert der Variablen hin- und herschalten (toggle)
34
    digitalWrite(recData, running);    // toggle LED's
35
  }
36
}

von Mad M. (madang)


Lesenswert?

Hallo!
Vielleicht kann mir jemand helfen!
Habe eine Master-Slave via I2C realisiert und kann mir folgendes nicht
ganz erklären.
Wenn ich bei dem Master-Sketch die Laufvariable i mit einer geraden Zahl
initialisieren, dann geht gar nichts (Led's an Pin 10, 11, 12,
13)blinken nicht mehr. Bei einer geraden Zahl i= 3, i=9 funktioniert die
ganze Sache gut.
Danke Mad

•
1
//+++++ Master-Sketch ++++++
2
3
#include <Wire.h>
4
int i = 0;
5
6
void setup()
7
{
8
  //Teilnehmer am I2C-Bus
9
  //keine Adresse, da Master
10
  Wire.begin();
11
}
12
void loop()
13
{  
14
    delay(10);  // Durchlaufzeit
15
    //Datenübertragung an Empfänger mit Ardesse 3 starten
16
    Wire.beginTransmission(3);
17
    // Wert zum Senden
18
    int dataval = i;
19
    // Daten senden
20
    Wire.write(dataval);
21
    // Datenübertragung stoppen
22
    Wire.endTransmission();
23
    //weitere Anweisungen    
24
    i++;    
25
    
26
    if(i == 14)  // nur Pin 10 - 13 werden für die Led's verwendet 
27
    {
28
      i = 9;
29
    } 
30
  }

++++++++ Slave-Sketch ++++++++

•
1
#include <Wire.h>
2
boolean running = false;  // Var. zum toggeln
3
int TasterPin = 2;        // Taster für die Freigabe LED blinken am Slave
4
5
void setup()
6
{
7
  // Teilnehemer am Bus als Slave mit der Adresse #3
8
  Wire.begin(3);   
9
  // falls Daten empfangen wurden, Funktion 
10
  Wire.onReceive(receiveData); 
11
  
12
  pinMode(10, OUTPUT);  // Led an Pin 10
13
  pinMode(11, OUTPUT);  // Led an Pin 11
14
  pinMode(12, OUTPUT);  // Led an Pin 12
15
  pinMode(13, OUTPUT);  // Led on Board
16
17
  pinMode(TasterPin, INPUT);    // Taster als Eingang def.
18
  digitalWrite(TasterPin, HIGH);  // Pullup ein  
19
}
20
void loop()
21
{
22
  // delay(100);
23
}
24
25
// Funktion ausführen, falls Daten empfangen
26
void receiveData(int AnzahlBytes)
27
{
28
  //Daten empfangen und in Variable ablegen
29
  int recData = Wire.read();
30
  //Verarbeitung der empfangenen Daten
31
  if(digitalRead(TasterPin) == LOW)    // Ist Taster gedrückt (Pin 0 auf Masse)
32
  {  
33
    running = !running;                // Wert der Variablen hin- und herschalten (toggle)
34
    digitalWrite(recData, running);    // toggle LED's
35
  }
36
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.