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
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.
Nunja, nur "wie" weiss der empfänger das sind die daten für x und das die daten für y?
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
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.
Du kannst theoretisch auch einem Slave mehrere I2C Adressen geben. Steht im Datenblatt deines µC, ob die Hardware-I2C das kann.
> 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?
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...
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
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.
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?
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
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.
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.
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.
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
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
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?
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.