Forum: Mikrocontroller und Digitale Elektronik wie sieht ein i2c protokoll aus?


von Tobias N. (silberkristall)


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

: Verschoben durch Admin
von tommy (Gast)


Lesenswert?


von ich (Gast)


Angehängte Dateien:

Lesenswert?

Hier steht alles drin, was I²C betrifft.

von Mike (Gast)


Lesenswert?

Tobias N. schrieb:
> Also icj kann mittels i2c zahlen zwischen master und slave senden, aber
> wie kriege ich damit eine vernünftige kommunikation?

Wie bei jedem anderen Übertragungsprotokoll auch: Der Empfänger muss 
wissen, was er mit den Daten vom Sender tun soll oder welche Bytes er 
schicken soll, wenn der Master fragt.

von Tobias N. (silberkristall)


Lesenswert?

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

von Julian W. (julian-w) Benutzerseite


Lesenswert?

falsches Forum...

von Marek W. (ma_wa)


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

: Bearbeitet durch User
von sebastian (Gast)


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.

von sebastian (Gast)


Lesenswert?

Du kannst theoretisch auch einem Slave mehrere I2C Adressen geben.
Steht im Datenblatt deines µC, ob die Hardware-I2C das kann.

von Tim  . (cpldcpu)


Lesenswert?

Falsches Forum. Dabei steht es direkt oben...

von sebastian (Gast)


Lesenswert?

>  Falsches Forum. Dabei steht es direkt oben...

Hat schonmal einer gemerkt (3 Nachrichten weiter oben). Aber um das zu 
verschieben, brauchts halt einen Moderator, oder?

von Max H. (hartl192)


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 findet man oft im Datenblatt...

von Tobias N. (silberkristall)


Lesenswert?

Also könnte ich ihm z.b. eine Zahl senden, also sende ich ihm z.b. 
078040 und teile das dann auf dem slave, das die erste 3zahlen x und die 
letzten y sind, demnach dann x = 078 und y = 040?

OCR1A wäre dann 78
ORC1B wäre dann 40

: Bearbeitet durch User
von Uwe (Gast)


Lesenswert?

Wie du das machsts bleibt dir überlassen. Solange du es bei allen 
gesprächsteilnehmern gleich machsts. nenn t sich übrigens 
Kommunikationsprotokoll oder auch nur Protokoll. Und du kanst 
entscheiden ob du dir ein eigenes ausdenkst oder ob du eins von einem 
Bestimmten Schaltkreis oder Hersteller nimmst.

von Tobias N. (silberkristall)


Lesenswert?

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?

von Karl H. (kbuchegg)


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.

: Bearbeitet durch User
von Tobias N. (silberkristall)


Lesenswert?

Start
Sende adresse
Sende (078040)
Stop

Der pwm wert ist ja von 0 bis 100 und ich würde den empfangenen string 
(078040) dann auf dem slave zu je 3 teilen also in 078 und 040 und das 
dann auf die pwm werte geben. Ohne nullen würde es ja 7804 sein was wenn 
ich es dann teilen würde einmal 780 und einmal 4 seien würde.

von Max H. (hartl192)


Lesenswert?

Tobias N. schrieb:
> string (078040)
Wenn du statt dem String 2 Binärzahlen sendest, bist du 3-mal so schnell 
und sparst dir das umwandeln binär-->String-->binär.
Und du hast für jeden Wert noch ein Bit als steuerbit frei.

von Tobias N. (silberkristall)


Lesenswert?

Das mit den bits und bytes usw verstehe ich mal garnicht :(

von Eumel (Gast)


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.

von Karl H. (kbuchegg)


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.

: Bearbeitet durch User
von Max H. (hartl192)


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.

: Bearbeitet durch User
von Tobias N. (silberkristall)


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?

von Max H. (hartl192)


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?
Lies dir am besten den Teil des Datenblattes deins µCs durch, der das 
I2C Modul beschreibt. Und vorher wie das mit dem Bits und Bytes 
funktioniert.

: Bearbeitet durch User
von Route_66 H. (route_66)


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.

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.