Forum: Mikrocontroller und Digitale Elektronik Arduino Mega I2C Problem mit DS1307?


von Yasar U. (carnefix)


Lesenswert?

Hallo Zusammen,

ich habe 2 Arduino Mega 2560. Eins als Master, das andere als Slave.
Auf jedem Board ist jeweils ein RTC DS1307, ein Touch Display MI0283QT9 
und 14 Wärmesensoren verbaut.

Ich habe die Boards mit dem oben beschriebenen Aufbau bekommen.

Beschreibung der Funktion:
Ich habe einen I2C Bus verwendet um die Boards miteinander zu verbinden, 
da dieser Aufbau später mit bis zu 4 Slaves arbeiten soll.

Beim Master wird nach dem Start auf dem Display eine Abtastrate 
eingestellt um die Messungen aufnehmen zu können. Der Master startet 
dann die eigene Messung und im Anschluss die Messungen der Slaves.

Die gemessenen Daten werden dann auf dem Display angezeigt und zusammen 
mit dem Datum und der Uhrzeit auf eine mircoSD gespeichert.

Ich hatte bereits ein Funktionierendes Programm für ein einzelnes Gerät 
und sollte den Code mit der Master/Slave Funktion erweitern.
Das der originale Quellcode fast 4000 Zeilen enthält und nicht von mir 
erstellt wurde, werde ich es nicht hochladen.


Dies ist mir auch gelungen, jedoch trat folgendes Problem auf:
Er tritt immer wieder auf, das das aktuelle Datum und die Uhrzeit nicht 
richtig erkannt werden (sei es Slave oder Master).

Hier habe ich die Nummer der Messung zusammen mit der Zeit und dem Datum 
auf dem Serial Monitor anzeigen lassen. Abtastrate war bei 5 Sekunden.
1
/*
2
12.2.2015;13:21:11;Measurement Nr.: 20
3
12.2.2015;13:21:16;Measurement Nr.: 21
4
12.2.2015;13:21:21;Measurement Nr.: 22
5
12.2.2015;13:21:26;Measurement Nr.: 23
6
12.2.2015;13:21:31;Measurement Nr.: 24
7
12.2.2015;13:21:36;Measurement Nr.: 25
8
12.2.2015;13:21:41;Measurement Nr.: 26
9
12.2.2015;13:21:46;Measurement Nr.: 27
10
0.0.2000;0:0:0;Measurement Nr.: 28
11
12.2.2015;13:21:56;Measurement Nr.: 29
12
12.2.2015;13:20:1;Measurement Nr.: 30
13
12.2.2015;13:20:6;Measurement Nr.: 31
14
0.0.2000;0:0:0;Measurement Nr.: 32
15
12.2.2015;13:20:16;Measurement Nr.: 33
16
12.2.2015;13:20:21;Measurement Nr.: 34
17
0.0.2000;0:0:0;Measurement Nr.: 35
18
12.2.2015;13:20:31;Measurement Nr.: 36
19
0.0.2000;0:0:0;Measurement Nr.: 37
20
12.2.2015;13:20:41;Measurement Nr.: 38
21
12.2.2015;13:20:46;Measurement Nr.: 39
22
12.2.2015;13:20:51;Measurement Nr.: 40
23
*/

Da kann man genau sehen das die Zeit manchmal nicht erfasst wird.


Meine Vermutung:
Der DS1307 auf jedem Board ist mit im I2C Bus. Dieser hat laut 
Hersteller eine festgelegte Adresse (0x68 bzw. 104).

1.) Könnte es daran liegen, das bei der Abfrage versucht wird auf beide 
RTC's gleichzeitig zuzugreifen?

2.) Wenn ja, gibt es eine Möglichkeit einen der beiden RTC's zu 
deaktivieren, ohne diesen entfernen zu müssen?

: Bearbeitet durch User
von Besserwisser (Gast)


Lesenswert?

Du darfst keine zwei von den DS1307 auf einem IIC-Bus haben.
Deaktivieren kannst Du den zweiten nicht - den musst Du schon auslöten.
Normalerweise einen separaten IIC-Bus für die Peripherie spendieren und 
einen zusätzlichen IIC-Bus zwischen Master- und Slavemodulen.
Denn jeder IIC-Baustein, der sonst noch auf dem gemeinsamen IIC-Bus 
angeschlossen ist macht Schwierigkeiten, wenn die Slaveadressen mehr als 
einmal vorkommen!

von Yasar U. (carnefix)


Lesenswert?

Hallo,

danke für die schnelle Antwort.

Also kann ich annehmen, dass ich mit meiner Vermutung richtig lag.

Ich habe vergessen zu erwähnen, das die RTC's auf einem mSD-shield 
verarbeitet sind.
Wenn möglich wollte ich nichts an den shields ändern aber es geht wohl 
nicht anders.


Entschuldige aber ich habe nicht ganz verstanden was du mit den 
zusätzlichen IIC Bussen meinst.


Von der Verbindung her habe ich vom Master die Pins GND, 5V(optional), 
SDA(#20) und SCL(#21) mit dem Slave verbunden.
Intern liegen beim Mega jeweils ein 10kOhm Widerstand zwischen 5V und 
SDA/SCL, deswegen habe ich keine weiteren pull ups verwendet.

von Peter D. (peda)


Lesenswert?

2 Slaves mit gleicher Adresse geht nicht.

Für die MC-MC Kommunikation mußt Du das HW-I2C nehmen (Slave per 
Interrupt).
Für die RTC und andere passive I2C-Slaves nimmst Du einen SW-I2C-Master.

Yasar U. schrieb:
> Ich habe vergessen zu erwähnen, das die RTC's auf einem mSD-shield
> verarbeitet sind.

Besonders beim Programmieren gilt: Divide et impera!

Man schreibt nicht einen einzigen, riesigen, unduchdringlichen 
Softwareknäuel.
Sondern man schreibt für jede Funktion einen eigene Routine. Und diese 
Routinen ruft man dann entsprechend auf.
Dann ist es überhaupt kein Problem, z.B. an der I2C-Routine Änderungen 
vorzunehmen, die dann von der RTC-Routine und diese von der mSD Routine 
usw. aufgerufen wird.

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.