Hallo werte Experten,
Ich möchte 2 PIC über i2c miteinander verbinden, einer als Master der
andere als Slave. Nun haben ja MC keine eigene Adresse. Kann man ohne
Adresse kommunizieren, wenn nichts anderes am Bus hängt. Oder kann der
Master eine frei gewählte Adresse senden, nur wie bringe ich dem Slave
bei, auf welche er reagieren soll. Wer kann mir einfach erklären wie das
gemacht wird.
Wie bei allen anderen Mikrocontrollern auch wirst du wohl beim PIC I2C
Slave eine Adresse einstellen können, auf die er reagiert. Die musst du
dann auch beim Master angeben.
I2C als Master ist einfach. Ist in vielen Pics vorhanden, kann man auch
ohne Hardware so programmieren.
I2C-Slave sollte in Hardware explizit vorhanden sein, sonst brichst Du
Dir einen ab.
Wenn I2C-Slave vorhanden ist, dann lies die Kapitel dort, wenn nicht,
nimm einen anderen Prozessor.
Hi
- warte auf Idle
- warte auf Start
- empfange Adresse
- empfange Datenrichtung
- (N)ACK
dann:
- empfange Byte +ACK
oder:
- sende Byte
- warte auf ACK
sobald ein STOP oder START (=ReStart) kommt, goto 'empfange Adresse'
Ungetestet, soll aber so in meine Steinchen rein
I2C-Addy:
Sofern Du nicht diese Geräte im großen Stil verkaufen willst, wirst Du
keine eigene Adresse bei Philips beantragen müssen - dann nimmst Du, was
Dir gerade an Zahl gefällt und Deine anderen I2C-Komponenten nicht
stört.
MfG
Erst mal Danke für die Antworten.
Ich nutze zum Programmieren GCGBasic. Damit komme ich nach längerer
Einarbeitungszeit ser gut zurecht. Nur finde ich bei i2c Modus Slave
keine Option für die Adresse. Ok, wenn ich das nicht hinbekomme, benutze
ich die serielle Verbindung.
Manfred schrieb:> Ok, wenn ich das nicht hinbekomme, benutze> ich die serielle Verbindung.
Die serielle Verbindung ist um Größenordnungen einfacher und schneller.
Zudem lässt sie sich bei Bedarf über beliebig lange Entfernungen
tunneln.
Christian schrieb:
>Welche PICs verwendest Du? Ich hab mir mal nen Krampf programmiert auf'm>16F876 und lief trotzdem nicht! Du brauchst eine ISR mit 4>Verzweigungen.
Mein allererstes Projekt vor über 15 Jahren war eine Implementierung
einer MASTER-SLAVE Anwendung auf IIC Basis. Es gab jedoch bis zu 31
SLAVES am Bus und damals gabs noch keinen 16F876 oder so. Der MASTER
wurde mit einem
16C63 und die SLAVES mit je einem 16C54 in Assembler programmiert OHNE
Interrupts! FAZIT: es geht heute noch. Die Teile werden immer noch in
Aufzugsanlagen als Etagenanzeigen oder Informationsanzeigen eingesetzt.
In der Zwischenzeit ist jedoch aus dem 16C54 ein 16F54 geworden und der
16C63 wurde zu einem 16F76.
Was ich damit sagen möchte ist:
Man sollte sich einfach mal mit der Materie (IIC Bus Protokoll usw)
vertraut machen und nicht immer auf irgendwelche Fremd-LIBs
zurückgreifen. Das hat nämlich einen erheblichen Lerneffekt.
Und noch was: Ich habe bis heute noch keine gute Hardwareimplementierung
für IIC gesehen.
Gruß
TK
Achim S. schrieb:> Manfred schrieb:>> Ok, wenn ich das nicht hinbekomme, benutze>> ich die serielle Verbindung.>> Die serielle Verbindung ist um Größenordnungen einfacher und schneller.> Zudem lässt sie sich bei Bedarf über beliebig lange Entfernungen> tunneln.
Und wenn das Ganze nur eine Punkt-zu-Punkt-Verbindung zwischen zwei
Controllern sein soll, wofür sowieso überhaupt kein Bus benötigt wird,
ist I2C eine - sagen wir mal - "suboptimale" Schnittstellenwahl.
Manfred schrieb:> Ich möchte 2 PIC über i2c miteinander verbinden,
Ok, welche?
> einer als Master der andere als Slave.
Soweit so normal.
> Nun haben ja MC keine eigene Adresse.
Doch, jede du du vorgibst
> Kann man ohne Adresse kommunizieren, wenn nichts anderes am Bus hängt.
Wenn es der I²C Standard vorsieht ja, sonst nein. Also nein.
> Oder kann der Master eine frei gewählte Adresse senden
Ja
> nur wie bringe ich dem Slave bei, auf welche er reagieren soll.
Indem du dir den I²C Teil des Datenblattes durchliest und verstehen
lernst
> Wer kann mir einfach erklären wie das gemacht wird.
Bei beiden:
Du schreibst die richtigen Werte in die Konfigurationsregister
Sender:
schreibst die Daten ins Senderegister
Empfänger:
liest Sie aus dem Empfangsregister
und schon geht's ;-)
Thomas E. schrieb:> Und wenn das Ganze nur eine Punkt-zu-Punkt-Verbindung zwischen zwei> Controllern sein soll, wofür sowieso überhaupt kein Bus benötigt wird,> ist I2C eine - sagen wir mal - "suboptimale" Schnittstellenwahl.
Da muß ich aber widersprechen und will nur mal zwei Aspekte anführen:
die Übertragung ist synchron und benötigt daher auf beiden Seiten
keinen genauen Takt. Und sie ist geframet, der Anfang und das Ende
einer Message ist vom Protokoll vorgegeben und muß nicht extra in die
Daten kodiert werden. Trotzdem werden nur zwei Datenleitungen gebraucht.
MfG Klaus