I2C: Bytearray RaspberryPi - Tiny328

OP #3755678
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
#3755783
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!
Gast #3755948
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.
OP #3755967
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
Gast #3756001
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.