wie sieht ein i2c protokoll aus?

#3559534
Lesenswert?

Hi,

Ich wollte mal gerne wissen wie so ein i2c protokoll aussieht. Also icj 
kann mittels i2c zahlen zwischen master und slave senden, aber wie 
kriege ich damit eine vernünftige kommunikation?

Also ich habe am Slave 2 PWMs, wie kann ich nun einfach und ohne große 
umwege dem slave sagen wert für OCR1A ist x und wert für OCR1B ist y?

Danke euch
#3559623
Lesenswert?

Tobias N. schrieb:
> Nunja, nur "wie" weiss der empfänger das sind die daten für x und das
> die daten für y?

Das weiß er, indem du die verlinkte Doku von Philips gelesen und 
umgesetzt hast. Das Lesen von Datenblättern verschiedener I2C Slaves 
bestätigt und verfestigt deine (Er)Kenntnisse von Philips.

Hier ein Klassiker: http://www.nxp.com/documents/data_sheet/PCF8574.pdf
Oder hier was lange Sommerabende: 
http://www.rn-wissen.de/index.php/I2C_Chip-%C3%9Cbersicht
Gast #3559640
Lesenswert?

Ich nehme an, Master und Slaves sind beides µC, die du selber 
programmierst? Ansonsten ist das Protokoll vorgegeben, und du musst ins 
Datenblatt gucken.

> Nunja, nur "wie" weiss der empfänger das sind die daten für x und das
> die daten für y?

z.B. indem du immer zuerst die für x und dann die für y schickst (in 
zwei Datenpacketen (bytes) der selben I2C Nachricht). D.h. er erkennt es 
einfach an der Reihenfolge.

Oder indem du zuerst eine Kennung schickst, die anzeigt was als nächstes 
kommt.
Z.B. 2 bytes in einer Nachricht:
byte 1=1 bedeutet: byte 2 ist der Wert für x
byte 1=2 bedeutet: byte 2 ist der Wert für y
Das wär dann sowas wie "Registeradressen" 1 und 2 für die "Register" x 
und y deines Slaves.
Diese Variante macht vor allem dann Sinn, wenn du viele "Register" hast, 
von denen sich normalerweise nur wenige ändern.

Kombination aus beidem: Das erste byte gibt die Start-Adresse an, danach 
kommen beliebig viele bytes (bis zum Ende der I2C-nachricht) mit Daten 
für "Register" ab dieser Adresse. Macht Sinn wenn du zusammenhängende 
Bereiche von Registern hast, die sich ändern, während andere gleich 
bleiben sollen.

"Register" immer in Anführungszeichen - Datenblätter von Slaves mit I2C 
Schnittstelle ("fertige" Bausteine, nicht µC) nennen das manchmal so. 
Hat (fast) nichts mit Registern im µC zu tun.
Kannst statt "Registeradresse" auch "Arrayindex" sagen.
#3560886
Lesenswert?

Tobias N. schrieb:
> Da ja nur meine eigenen ics miteinander reden kann ich mir das ja
> ausdenken oder?
>
> Ausser das Display, aber da sollte es ja keine probleme geben, oder?

Das Display hat ja eine andere Adresse.
Selbst wenn es auf dem Bus mithört, anhand der Adresse erkennt es ja, 
das das nachfolgende nicht für es gedacht ist.

> 078040

Was machen die 0-en da dazwischen?


erstens:
Du verschickst immer Bytes. Also schreib das auch als Bytes an.

zweitens:
es ist ungeschickt, da eine 0 dazwischen zu klemmen.
Fass das jeweils erste Byte als eine Art Subadresse auf, mit der der 
Master bekannt gibt, was er eigentlich haben will. Von mir aus bedeutet 
ein Byte mit dem Wert 0: das nächste Byte ist der Wert, der den Tastgrad 
für die PWM 1 bestimmt(OCR1A). Und ein Wert von 1 bedeutet: das nächste 
Byte ist der WErt, der den Tastgrad für die PWM 2 (bei dir OCR1B) 
angibt.

So wie bei der Post:
In einem Mietshaus wohne viele Parteien. Alle haben prinzipiell erst mal 
dieselbe Adresse. Die wird auf einem Brief angegeben. Um aber die 
einzelnen Parteien an der prinzipiell gleichen Adresse unterscheiden zu 
können, gibt es den Zusatz der Postkastennummer.
Damit ist für den Briefträger eindeutig, wohin der Brief 
"Beethofenstrasse 27/6" gehört. Er gehört in den Briefkasten mit der 
Nummer 6, der in besagtem Haus steht. Das ist ein anderer Empfänger als 
ein Brief, der an die Adresse "Beethofenstrasse 27/5" adressiert ist. 
Das ist der Briefkasten gleich daneben.
Gast #3560906
Lesenswert?

Tobias N. schrieb:
> Das mit den bits und bytes usw verstehe ich mal garnicht :(

Na Angenommen du willst ne Zahl schicken und hast dafür 2 Byte, dann 
kannst du das als Ascii zeichen tun und kannst alle Zahlen von 0 bis 99 
übertragen. Das eine Byte sind die Zehnerstellen als Ascii zeichen und 
das andere die einer stellen als Ascii zeichen. Betrachtest du die 
beiden Bytes aber als zusammengehörige Binärzahl kannst du alle Zahlen 
von 0 bis 65535 übertragen.
#3560912
Lesenswert?

Tobias N. schrieb:
> Start
> Sende adresse
> Sende (078040)
> Stop

Das wird so nicht gehen :-)


* Start unter Angabe der Slave Adresse
* Sende das Byte 0x00 als Kennzeichen, dass das nächste Byte der X WErt 
ist
* Sende das Byte 78 als Wert für diesen X-Wert
* Sende das Byte 0x01 als Kennzeichen, dass das nächste Byte der Y Wert 
ist
* Sende das Byte 40 als Wert für diesen Y-Wert
* Stop


> Der pwm wert ist ja von 0 bis 100 und ich würde den empfangenen string

Ämh.
Da gibt es keinen String.
Das sind Bytes, die da über die Leitung gehen. Es macht absolut keinen 
Sinn, da über die Zwischenstufe eines Strings zu gehen. Das versendete 
Byte ist schon der jeweilige Wert selber.

Strings nimmt man dann als Kommunikationsmedium, wenn sie einen Vorteil 
bringen, wie zb. das man am anderen Ende ein Terminal anhängen kann, so 
dass ein Mensch mitlesen kann. Aber abgesehen davon, machen Strings da 
wenig Sinn. Und schon gar nicht bei I2C, bei dem man noch nicht mal das 
Problem hat, das man manche Bytewerte zur Protokollsynchronisierung 
benötigen würde. Die Synchronisierung geschieht durch den Start und den 
Stop wunderbar ganz von alleine.
#3560914
Lesenswert?

Tobias N. schrieb:
> Das mit den bits und bytes usw verstehe ich mal garnicht :(
Dann solltest du es lernen oder die ein anderes Hobby suchen.
I2C sendest die Daten byteweiße (8bit). Mit dem 8bit kannst du zahlen 
von 0 bis 255 Darstellen, mit nur 7 bit von 0...127, was ja genügt. 
Somit hättest du das 8. bit als Steuerbit frei.

Die gesamte übertragung würde ich so machen:
Start - Adresse des Empfängers - PWM1 - PWM2 - Stop
Die Adresse, PWM1 und PWM2 sind 8bit Zahlen.
#3560927
Lesenswert?

Karl Heinz schrieb:
> * Start unter Angabe der Slave Adresse
> * Sende das Byte 0x00 als Kennzeichen, dass das nächste Byte der X WErt
> ist
> * Sende das Byte 78 als Wert für diesen X-Wert
> * Sende das Byte 0x01 als Kennzeichen, dass das nächste Byte der Y Wert
> ist
> * Sende das Byte 40 als Wert für diesen Y-Wert
> * Stop
>
Was/wie empfängt der Slave die daten denn dann und weisst sie zu? Wo und 
wie schreibt der die sich hin?
#3561667
Lesenswert?

Tobias N. schrieb:
> Was/wie empfängt der Slave die daten denn dann und weisst sie zu? Wo und
> wie schreibt der die sich hin?

Hallo!
Wenn du den Slave fertig kaufst (z.B den bereits genannten PCF8574), 
steht das in dessen Datenblatt. Wenn Du selbst einen Slave baust, dann 
ist genau das Deine Aufgabe. Du allein mußt festlegen, wie der Slave 
arbeitet, Dir ein Protokoll ausdenken und das dann in Software umsetzen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren