Forum: Mikrocontroller und Digitale Elektronik I2C: Bytearray RaspberryPi - Tiny328


von Flo D. (florian_d63)


Lesenswert?

Hi zusammen,

ich bin neu in der Welt der Mikrocontroller und wollt mich per learning 
by doing ein wenig einarbeiten.

Zu meinem Problem mit ein bisschen Hintergrund:

Ich hab mir zwei Tiny328 ( 
http://nathan.chantrell.net/20130923/tiny328-mini-wireless-arduino-clone 
) gebaut und habe eine RaspberryPi. Nun möchte ich die Daten eines 
Temperaturfühlers (DHT11) + zwei Mal eine Auswertung eines Türkontaktes 
(Reed) von einem Tiny zum anderen schicken. Der andere empfängt die 
Daten und übergibt sie an meinen Raspberry per I2C-Verbindung.

Ich hab programmtechnisch bis jetzt alles hinbekommen, nur scheitere ich 
jetzt an der Anbindung zum Raspberry.

Dieser Master/Slave Geschichte hat mich schon einige Nerven gekostet, 
das lös ich aber aktuell einfach über einen Interrupt vom Tiny zum 
Raspberry.

Zu meinem eigentlichen Problem: ein einzelnes Byte via
•
1
Wire.write(temp);
empfang ich an meinem Raspberry via
•
1
number = bus.read_byte(I2C_SLAVE)
ohne Probleme, aber wie les ich ein Bytearray aus? Ich verbring schon 
Stunden mit Recherge und verzweifel langsam.

Mit
•
1
Wire.write(temp, (size_t)2);
schick ich ja ein ganzes Array an Daten.

Ich habs schon versucht mit read_block_data, read_byte_data, 
read_i2c_block_data aber das liefert mir nur immer Dinge, mit denen ich 
nichts anfangen kann. Der Code am Raspberry ist mit Python geschrieben.

Wäre nett wenn mir jemand weiterhelfen könnte.
Gruß
Flo

von Sven B. (scummos)


Lesenswert?

Was liefert das denn für Dinge, mit denen du nichts anfangen kannst? 
Hast du ein Oszi, was du an die Leitung hängen kannst -- das hilft auch 
oft.

Der i2c-Controller vom Pi ist nicht so der tollste. Manche Sachen kann 
der auch einfach nicht, z.B. Repeated Start.

Grüße!

von Easylife (Gast)


Lesenswert?

Angenomen bei "temp" handelt es sich um ein Array,
Wire.write(temp, (size_t)2);
schickt genau 2 bytes raus.

Wire.beginTransmission(x);
und
Wire.endTransmission();
machst du auch, ja?

Wire.write() liefert übrigens die Anzahl der gesendeten Bytes zurück.
Kannst du ja mal auswerten.

number = bus.read_byte(I2C_SLAVE)

musst du vermutlich dann halt mehrmals hintereinander machen, und die 
Rückgabewerte zu einem Array oder String zusammensetzen.
Ich kann kein Python.

Evtl. wäre es noch von Nutzen, wenn das erste übertragene Byte die 
Anzahl der kommenden Datenbytes ankündigt, damit der Empfänger weiss, 
wie viele Bytes er lesen muss.

von Flo D. (florian_d63)


Lesenswert?

Puh... mit einem Oszi hab ich das letzte Mal vor 10 Jahren bei meiner 
Ausbildung gearbeitet :-) Zugriff hätt ich schon drauf, müsst ich mal 
mein Wissen wieder auffrischen.

Der Tiny ist der Slave, beginTransmission und endTransmission nehm ich 
ja, wenn es sich um den Master handelt, wenn ich das richtig verstanden 
habe.

Wire.write() bringt mir nichts, ich weiß ja schon, dass 2 Bytes gesendet 
werden, oder?

Die Idee mit dem bus.read_byte mehrmals ausführen hab ich bis jetzt noch 
nicht versucht. Interessante Theorie, auf so ne einfache Lösung wär ich 
vor lauter Bäumen nicht gekommen. Ich versuchs mal, vielleicht ist es ja 
die Lösung.

Gruß Flo

von Easylife (Gast)


Lesenswert?

Naja, deine Codeschnipselchen lassen nicht wirklich erkennen, wer hier 
Master und Slave ist...
Der ganze Part mit der I2C Adresse bzw. wie der Slave feststellt, dass 
von ihm gelesen werden soll steht nicht da.

von Flo D. (florian_d63)


Lesenswert?

Öhm... sorry.. war schlecht erklärt von mir :-)

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.