Forum: Mikrocontroller und Digitale Elektronik I2C - 2 Atmega32 - 1 Atmega328P - 1 DS1307


von Stefan P. (stefanp)


Angehängte Dateien:

Lesenswert?

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
1
#include <Wire.h>
2
#include <DS1307new.h>
3
4
const int slaveAddress = 8;
5
int recived = 0;
6
7
char bytebuff[13];
8
char testbuf1[4];
9
char testbuf2[4];
10
char testbuf3[4];
11
char testbuf4[4];
12
char oelBuffer[14];
13
char waterBuffer[16];
14
char fuelBuffer[14];
15
char outerBuffer[16];
16
17
uint16_t startAddr = 0x0000;           
18
uint16_t lastAddr;                    
19
uint16_t TimeIsSet = 0xaa55;
20
21
void setup()
22
{
23
  Wire.begin(5);
24
25
  lcd.setColor(255,255,255);
26
  lcd.setBackColor(0,0,0);
27
  lcd.setFont(BigFont);
28
  RTC.setRAM(0, (uint8_t *)&startAddr, sizeof(uint16_t));
29
  RTC.getRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
30
  RTC.getTime();
31
  RTC.ctrl = 0x00;                    
32
  RTC.setCTRL();
33
  
34
}
35
36
void loop()
37
{     
38
  printtime();
39
  
40
  Wire.requestFrom(8, 1);        //Empfang von slave1
41
  recived = Wire.read();
42
  Wire.requestFrom(11, 13);   //Empfang von slave2(messwerte)
43
  while(Wire.available()) 
44
  {          
45
    bytebuff[i] = Wire.read();
46
    i++;    
47
  }
48
  int i = 0;
49
  
50
  int a = 0;
51
  int bx = 3;
52
  int c = 6;
53
  int d = 9;
54
  for(int j = 0;j<3;j++)
55
  {
56
    testbuf1[j] = bytebuff[a];
57
    testbuf2[j] = bytebuff[bx];
58
    testbuf3[j] = bytebuff[c];
59
    testbuf4[j] = bytebuff[d]; 
60
    a++;
61
    bx++;
62
    c++;
63
    d++;
64
  }
65
  
66
  sprintf(oelBuffer, "oelTemp: %c%c%c", testbuf1[0], testbuf1[1], testbuf1[2]);
67
  sprintf(waterBuffer, "waterTemp: %c%c%c", testbuf2[0], testbuf2[1], testbuf2[2]);
68
  sprintf(fuelBuffer, "fuel: %c%c%c", testbuf3[0], testbuf3[1], testbuf3[2]);
69
  sprintf(outerBuffer, "outerTemp: %c%c%c", testbuf4[0], testbuf4[1], testbuf4[2]);
70
71
  lcd.print(oelBuffer, 0, 60);       //von lcd lib
72
  lcd.print(waterBuffer, 0, 80);     //*
73
  lcd.print(fuelBuffer, 0, 100);     //* 
74
  lcd.print(outerBuffer, 0, 120);    //von lcd lib
75
  
76
}
77
78
79
void setMyTime()
80
{
81
  RTC.stopClock();
82
83
  RTC.fillByYMD(2013,5,2);
84
  RTC.fillByHMS(01,30,0);
85
86
  RTC.setTime();
87
  TimeIsSet = 0xaa55;
88
  RTC.setRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
89
  RTC.startClock();
90
}
91
92
void calcTime( char* timeBuffer, int time, int max )     
93
{  
94
  if ( time < max )  
95
  {  
96
    timeBuffer[0] = '0' + time / 10;         
97
    timeBuffer[1] = '0' + time % 10;     
98
  }  
99
  else  
100
  {  
101
    timeBuffer[0] = timeBuffer[1] = '-';  
102
  }  
103
}    
104
105
void printtime()      
106
{      
107
  RTC.getTime();        
108
  char timeBuffer[10];      
109
110
  calcTime(&timeBuffer[0], RTC.hour, 24 );  
111
  calcTime(&timeBuffer[3], RTC.minute, 60 );  
112
  calcTime(&timeBuffer[6], RTC.second, 60 );  
113
114
  timeBuffer[2] = ':';      
115
  timeBuffer[5] = ':';      
116
  timeBuffer[8] = 0;     
117
 
118
  lcd.print(timeBuffer, CENTER, 300);      //von lcd lib
119
}

Slave1 Code
1
#include <Wire.h>
2
#include <UTouch.h>
3
4
const int ownAddress = 8;
5
6
byte flag1 = 0;
7
8
void setup()
9
{  
10
  Wire.begin(ownAddress);
11
  Wire.onRequest(requestEvent);  
12
}
13
14
void loop()
15
{ 
16
  
17
}
18
19
void requestEvent()
20
{  
21
  Wire.write(flag1);
22
}

Slave2 Code
1
#include <Wire.h>
2
const int myAddress = 11;
3
void setup()
4
{
5
  Wire.begin(myAddress);               
6
  Wire.onRequest(requestEvent);
7
}
8
int test1 = 33;
9
int test2 = 33;
10
int test3 = 33;
11
int test4 = 33;
12
char testbuf1[4];
13
char testbuf2[4];
14
char testbuf3[4];
15
char testbuf4[4];
16
char bytebuff[13];
17
void loop()
18
{
19
  if(test1 > 127)
20
    test1 = 33;
21
  if(test2 > 127)
22
    test2 = 33;
23
  if(test3 > 127)
24
    test3 = 33;
25
  if(test4 > 127)
26
    test4 = 33;
27
  test1++;
28
  test2+=2;
29
  test3+=3;
30
  test4+=4; 
31
  if(test1 < 100)
32
    sprintf(testbuf1, "0%d", test1);
33
  else
34
    sprintf(testbuf1, "%d", test1);
35
36
  if(test2 < 100)
37
    sprintf(testbuf2, "0%d", test2);
38
  else
39
    sprintf(testbuf2, "%d", test2);
40
41
  if(test3 < 100)
42
    sprintf(testbuf3, "0%d", test3);
43
  else
44
    sprintf(testbuf3, "%d", test3);
45
46
  if(test4 < 100)
47
    sprintf(testbuf4, "0%d", test4);
48
  else
49
    sprintf(testbuf4, "%d", test4);
50
    
51
  int a = 0;
52
  int bx = 3;
53
  int c = 6;
54
  int d = 9;
55
  for(int j = 0;j<3;j++)
56
  {
57
    bytebuff[a] = testbuf1[j];
58
    bytebuff[bx] = testbuf2[j];
59
    bytebuff[c] = testbuf3[j];
60
    bytebuff[d] = testbuf4[j];
61
    a++;
62
    bx++;
63
    c++;
64
    d++;
65
  }  
66
  bytebuff[13] = 0;
67
}
68
69
void requestEvent()
70
{
71
  Wire.write(bytebuff);
72
}

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

von Stefan P. (stefanp)


Lesenswert?

Entschuldigung...
Niemand eine Idee?

von Stefan P. (stefanp)


Lesenswert?

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.

gruß

von Klaus (Gast)


Lesenswert?

Stefan Pyplo schrieb:
> Habe nun pro Busleitung einen 4,7 kOhm Widerstände benutzt und die gegen
> Masse gezogen.

Also das verstösst eigentlich gegen I2C Spezifizierung.
Gegen VCC war schon richtig.

Aus deinem Code geht leider nicht hervor wie der I2C - Bus im
detail angesprochen wird.

Benutzt du eine fertige Wire.h lib oder hast die selber programmiert.

Hast du ein Oszi?

So wie es aussieht scheint einer der Teilnehmer die SDA-Leitung ständig 
auf Low zu ziehen bzw. nicht freigeben.

Stefan Pyplo schrieb:
> nur wenn ich den Slave2
> dazunehme und die Daten an den Master sende geht mein Uhr Signal
> verloren.

Schau dir Slave2 mal genauer an. Vllt. ein Adressierungsproblem.
Es kann ja  nur immer ein Teilnehmer abgefragt werden also niemals 
gleichzeitig.

von Stefan P. (stefanp)


Lesenswert?

Hi.
Ja überall die wire.h Lib wie im Code zu sehen.
Ja ich hab ein computer oszi...

Das nur von einem empfangen werden kann das weiß ich ja nur komisch ist, 
dass wenn ich wie geschrieben slave2 dranhänge geht das Signal der uhr 
verloren aber slave1 sendet Problemlos weiter bzw Master empfängt es von 
slave2...und natürlich von slave1 auch. Ich werd mal ein Bild vom oszi 
machen und das hier anhängen. Muss ich erst herauswühlen:)
Danke schonmal
Gruß

von Klaus (Gast)


Lesenswert?

@Stefan Pyplo

slaveAddress = 8; vs. ownAddress = 8;
Das hier ist schon mal eine Adresskollision.

Im Datenblatt steht für den DS1307  D0h = 11010000b.

Du sendest aber nur ne 8h.

Da stellt sich nun die Frage wie es sein kann, das du vom RTC gültige 
werte bekommst?

So ein I2C Baustein hat immer eine feste Adresse und bei einige 
Bausteine  die man selber Hardwaremäßig einstellen kann.

Im Datenblatt steht auch das zum Schreiben D0h gesendet werden muss und
zum lesen D1h.

Wie ist das nun mit deinen Atmegas? Welche Adressen haben die?

Dann nochmal die Frage: Ist die Wire.h von dir selber programmiert 
worden?

von Klaus (Gast)


Lesenswert?

@Stefan Pyplo

Der Atmega32 hat ja TWI eingebaut wird das auch genutzt oder
ist es bei dir reine Softwarelösung.

PC1 (SDA)
PC0 (SCL)

von Stefan P. (stefanp)


Lesenswert?

Jo die unterhalten sich alle Hardware technisch über twi

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.