I2C - 2 Atmega32 - 1 Atmega328P - 1 DS1307

Hallo,
Ich habe eine kleine Vernetzung von µC per I2C Bus vorgenommen.
Nun habe ich ein Problem welches ich nicht lösen kann.
Ich hab einen Master(atmega32), 2 Slave(atmega328P u atmega32) und ein
DS1307 Modul.
Der Master soll die Daten der Uhr empfangen, der Slave1 die Steuerung
des Master übernehmen da der Master die anzeige und Slave1 der
Touchscreen ist.
der Slave2 soll Meßwerte an den Master übergeben der sie dann je nach
Auswahl des Slave1, darstellt.
Alles klappt auch soweit einzeln.
Slave1 an Master und Uhr Modul Problemlos…nur wenn ich den Slave2
dazunehme und die Daten an den Master sende geht mein Uhr Signal
verloren.
Hier die verkürzten Quellcodes der einzelnen Controller:

Master Code

#include <Wire.h>
#include <DS1307new.h>

const int slaveAddress = 8;
int recived = 0;

char bytebuff[13];
char testbuf1[4];
char testbuf2[4];
char testbuf3[4];
char testbuf4[4];
char oelBuffer[14];
char waterBuffer[16];
char fuelBuffer[14];
char outerBuffer[16];

uint16_t startAddr = 0x0000;           
uint16_t lastAddr;                    
uint16_t TimeIsSet = 0xaa55;

void setup()
{
  Wire.begin(5);

  lcd.setColor(255,255,255);
  lcd.setBackColor(0,0,0);
  lcd.setFont(BigFont);
  RTC.setRAM(0, (uint8_t *)&startAddr, sizeof(uint16_t));
  RTC.getRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
  RTC.getTime();
  RTC.ctrl = 0x00;                    
  RTC.setCTRL();
  
}

void loop()
{     
  printtime();
  
  Wire.requestFrom(8, 1);        //Empfang von slave1
  recived = Wire.read();
  Wire.requestFrom(11, 13);   //Empfang von slave2(messwerte)
  while(Wire.available()) 
  {          
    bytebuff[i] = Wire.read();
    i++;    
  }
  int i = 0;
  
  int a = 0;
  int bx = 3;
  int c = 6;
  int d = 9;
  for(int j = 0;j<3;j++)
  {
    testbuf1[j] = bytebuff[a];
    testbuf2[j] = bytebuff[bx];
    testbuf3[j] = bytebuff[c];
    testbuf4[j] = bytebuff[d]; 
    a++;
    bx++;
    c++;
    d++;
  }
  
  sprintf(oelBuffer, "oelTemp: %c%c%c", testbuf1[0], testbuf1[1], testbuf1[2]);
  sprintf(waterBuffer, "waterTemp: %c%c%c", testbuf2[0], testbuf2[1], testbuf2[2]);
  sprintf(fuelBuffer, "fuel: %c%c%c", testbuf3[0], testbuf3[1], testbuf3[2]);
  sprintf(outerBuffer, "outerTemp: %c%c%c", testbuf4[0], testbuf4[1], testbuf4[2]);

  lcd.print(oelBuffer, 0, 60);       //von lcd lib
  lcd.print(waterBuffer, 0, 80);     //*
  lcd.print(fuelBuffer, 0, 100);     //* 
  lcd.print(outerBuffer, 0, 120);    //von lcd lib
  
}


void setMyTime()
{
  RTC.stopClock();

  RTC.fillByYMD(2013,5,2);
  RTC.fillByHMS(01,30,0);

  RTC.setTime();
  TimeIsSet = 0xaa55;
  RTC.setRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
  RTC.startClock();
}

void calcTime( char* timeBuffer, int time, int max )     
{  
  if ( time < max )  
  {  
    timeBuffer[0] = '0' + time / 10;         
    timeBuffer[1] = '0' + time % 10;     
  }  
  else  
  {  
    timeBuffer[0] = timeBuffer[1] = '-';  
  }  
}    

void printtime()      
{      
  RTC.getTime();        
  char timeBuffer[10];      

  calcTime(&timeBuffer[0], RTC.hour, 24 );  
  calcTime(&timeBuffer[3], RTC.minute, 60 );  
  calcTime(&timeBuffer[6], RTC.second, 60 );  

  timeBuffer[2] = ':';      
  timeBuffer[5] = ':';      
  timeBuffer[8] = 0;     
 
  lcd.print(timeBuffer, CENTER, 300);      //von lcd lib
}

Slave1 Code

#include <Wire.h>
#include <UTouch.h>

const int ownAddress = 8;

byte flag1 = 0;

void setup()
{  
  Wire.begin(ownAddress);
  Wire.onRequest(requestEvent);  
}

void loop()
{ 
  
}

void requestEvent()
{  
  Wire.write(flag1);
}

Slave2 Code

#include <Wire.h>
const int myAddress = 11;
void setup()
{
  Wire.begin(myAddress);               
  Wire.onRequest(requestEvent);
}
int test1 = 33;
int test2 = 33;
int test3 = 33;
int test4 = 33;
char testbuf1[4];
char testbuf2[4];
char testbuf3[4];
char testbuf4[4];
char bytebuff[13];
void loop()
{
  if(test1 > 127)
    test1 = 33;
  if(test2 > 127)
    test2 = 33;
  if(test3 > 127)
    test3 = 33;
  if(test4 > 127)
    test4 = 33;
  test1++;
  test2+=2;
  test3+=3;
  test4+=4; 
  if(test1 < 100)
    sprintf(testbuf1, "0%d", test1);
  else
    sprintf(testbuf1, "%d", test1);

  if(test2 < 100)
    sprintf(testbuf2, "0%d", test2);
  else
    sprintf(testbuf2, "%d", test2);

  if(test3 < 100)
    sprintf(testbuf3, "0%d", test3);
  else
    sprintf(testbuf3, "%d", test3);

  if(test4 < 100)
    sprintf(testbuf4, "0%d", test4);
  else
    sprintf(testbuf4, "%d", test4);
    
  int a = 0;
  int bx = 3;
  int c = 6;
  int d = 9;
  for(int j = 0;j<3;j++)
  {
    bytebuff[a] = testbuf1[j];
    bytebuff[bx] = testbuf2[j];
    bytebuff[c] = testbuf3[j];
    bytebuff[d] = testbuf4[j];
    a++;
    bx++;
    c++;
    d++;
  }  
  bytebuff[13] = 0;
}

void requestEvent()
{
  Wire.write(bytebuff);
}

In den Code dieses “int bx” kommt daher das dieses CMS hier meine
indexierung als Spam erkennt…daher das ‘x’ am index

im Anhang ist noch ein Bild meiner Vernetzung…
Vielen Dank schonmal
mfg StefanP

Wahrscheinlich ist nicht der Code das Problem, sondern die Hardware. Ersetze mal die 10k Pull-ups mit kleineren Werten (ich würde es mal mit 3k3 versuchen), da durch die erhöhte Gesamtbus-Kapazität sonst kein ausreichender Pegel mehr erreicht wird.

hallo,
hab jetzt 6 640ohm, 2mal in reihe benutzt da ich keine 3k3 habe...
gleiches problem weiterhin...
danke

640? bzw. 1k8 sind zuwenig! Oder hast Du je 6 Mal 640? genommen (also 3k8)?

Ersetze mal

  Wire.write(bytebuff);

durch

  Wire.write(bytebuff, 13);

sonst wird nur der Wert des Pointers übertragen und nicht der Inhalt des Puffers.

Hallo,
Ja genau ich habe jeweils 6 Stück verwendet.
Das mit dem Buffet klappt da ich ihn als Array initialisiert hab. Bekomm die Daten problemlos rueber nur das das Signal der uhr dann erlischt. Wenn ich den slave dann vom Bus nehme ist das uhr Signalwieder da... Das ist ja das was iich nicht verstehe. Die beiden slave kommunizieren ohne Probleme zusammen mit dem Master . Der slave der das flag1 schickt hat wiederum keine Probleme mit der uhr... Nur wenn der slave für die Messwerte zum Einsatzkommt. BBedeutet Master als atmega32 und der slave als atmega32 gehen mit uhr. Wenn ich den 328p anstecke gibt's das Problem? Jemand Ahnung ob das an den Controller liegen kann... Quellcode ist ja vorhanden...
Vielen dank
Mfg Stefanp

Text übrigens mit Handy verfasst...

Könnte es sein, dass die Stromversorgung knapp wird? Wenn beim DS1307 die Spannung etwas einbricht, gibt er auf dem I2C keine Antwort mehr.

Hallo,
mittlerweile konnte ich das Problem beheben.
Habe nun pro Busleitung einen 4,7 kOhm Widerstände benutzt und die gegen Masse gezogen.
Eigentlich gegen VCC ?!?

Aufbau ist wie folgt:
atmega32 (Master)
atmega32 (Slave1)
atmega32 (Slave2)
DS1307 (Slave)

Am 328p lag es nicht..habe es auch mit dem und nen mega2560, mit dieser Schaltung gegen Masse, erfolgreich zu laufen bekommen..

Stromversorgung war übrigens auch ok...betreibe das an nen großen Netzteil.

danke für die antworten
gruß

Habe nun pro Busleitung einen 4,7 kOhm Widerstände benutzt und die gegen Masse gezogen.

Wenn Du einen I2C-Bus mit Widerständen gegen Masse ziehst, funktioniert er nicht mehr, denn das gegen Masse ziehen ist die Methode, mit der die Kommunikation erst zustande kommt.

Ich glaube, Du solltest Deine Schaltung mal aufzeichnen oder ein Foto davon machen.