PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 2 getrennte I2C-Interfaces an einem MEGA8 ?



Ulfens
22.01.2006, 13:13
Hallo,

nachdem ich nun endlich meinen I2C-Slave zum Laufen bekommen habe (mit Hilfe dieses Thread's hier: https://www.roboternetz.de/phpBB2/viewtopic.php?t=15715) wollte ich gern wissen, ob man die Zuordnung der Pin's SLA & SLC auch während eines Laufenden Programms ändern kann.
(z.B. mit Config Sda = Portc.4

Hintergrund: Ich möchte einen Mega8 als I2C-Master einsetzen, der von einem oder mehreren Mega8 (I2C-Slaves) Daten abfragt, oder Steuerbefehle sendet.
An den Slaves wiederum ist zum einen der Master-Mega8 angeschlossen, zum anderen sollen an den Slaves aber auch I2C-Sensoren angeschlossen werden (z.B. DS1621). Beide I2C-Schnittstellen sollen am Slave voneinander getrennt sein.

D.h. am Slave müsste ich je 2 Port-Pins für SLA/SLC verwenden.
Da die I2C-Befehle jedoch nicht unterscheiden, an welchem Port sie Daten senden oder empfangen sollen, müsste ich zur Laufzeit des Programms die Zuordnung von SLA & SLC ändern können. Mit den o.g Config-Befehl müsste sowas ja gehen. Aber haben diese Befehle auch Auswirkungen während der Laufzeit, oder nutzt sie nur der Compiler nur zur einmaligen Einstellung. Gibt es dafür ggf. eine andere, alternative Vorgehensweise?

Vielen Dank!
Gruß,
Ulf

Hellmut
22.01.2006, 13:18
Ansonsten das Umkonfigurieren einfach als kleine Assembler-Routine in deinem Basic-kode einfügen. Da muß ja nur sehr wenig gemacht werden! Ich würde dabei auch gleich die Adresse ändern um so doppelt sicherzustellen das der mega8 nach der Umstellung richtig reagiert!

ruediw
22.01.2006, 16:13
Vieleicht wäre RS-485 eine Alternative ?

linux_80
22.01.2006, 16:25
Darf man fragen warum der Bus getrennt werden soll,
der Vorteil von I2C ist doch das man alles an die gleichen Kabel hängen kann.

Ein weiterer Vorteil mit einem µC ist, das dieser Master und Slave gleichzeitig sein kann, bzw. man initialisiert ihn als Slave, und wenn der µC was will, sendet er eine Starbedingung, und ist ab da Master. Nach der Stopbedingung ist der µC wieder Slave.

Das trifft aber nur zu, wenn man TWI benutzt, also die Hardwarelösung (SCL/SCA-Pins festgelegt), bei Softwarelösungen kommts drauf an wie's ausgeführt ist.

Hellmut
22.01.2006, 16:49
Hallo linux_80

Es gibt mehrere Gründe warum es sinnvoll sein kann den i2c bus aufzutrennen:

1. Die zu überbrückende Länge ist zu groß
2. Der erwartete Traffic wird zu groß
3. Reaktionszeiten können kritisch sein wenn zu viele sich den Bus teilen

ruediw
22.01.2006, 17:02
Wenn die Länge zu gross wird, wäre das eigendlich eine
klassiche Anwendung für RS485...

Hellmut
22.01.2006, 17:19
Hallo Ruedi

Wenn die Länge wesentlich länger ist hast du recht. Bei mir geht es darum statt der circa 80cm längen bis 150cm zu erreichen. Da muß man nicht gleich voll neu umstricken! Übrigens gibt es auch den "CAN-Bus" wie er im Automobil Bereich angewendet wird!

Ulfens
22.01.2006, 23:25
Hallo,

erstmal vielen Dank für die Antworten.
Da ich in der I2C-Bus-Specification (siehe: http://www.esacademy.com/faq/i2c/I2C_Bus_specification.pdf ) leider keine konkreten Angaben über die max. möglichen Kabellängen gefunden habe, vermute ich aber anhand der Bemerkung von "Hellmut", daß ich mit meiner Planung voll daneben liege (Kabellänge ~150cm ?)
Ich hatte nämlich vor, das Ganze als Bussystem für ein Einfamilienhaus zu verwenden, indem unten (Keller oder Hauswirtschaftsraum) der MASTER die SLAVES in den einzelnen Zimmern steuert, wobei die Slaves selbst Daten sammeln (z.B. Temperatur, oder den Zustand eines PIR-Sensors), aber auch Steuerbefehle erhalten können (z.B. Licht ein/aus, Rollladen rauf runter).
RS485 als Stromschnittstelle wäre da sicher unkritisch (was die Kabellänge betrifft), soweit ich weiß ist RS485 aber nicht so ohne weiteres "busfähig" oder ?? Vom Datendurchsatz ist meine Anwendung eher unkritisch, da eh nur ein paar Byte hin- und hergehen.
Gibt es dafür irgendwo eine App-Note (incl. der erforderlichen Hardware)?

Ansonsten würde mich aber dennoch ein Beispiel (Code ?) interessieren, ob und wie man die Zuordnung der SLA/SLC-Pins zur Laufzeit ändern kann. Zum Beispiel für die Anwendung: SLAVE fragt via I2C einen DS1621 ab und der MASTER fragt zyklisch den Temp-Wert vom Slave ab.
Hier wäre ja am SLAVE zwei mal ein I2C-Interface zu realisieren!

Danke & Gruß,
Ulf

xanadu
22.01.2006, 23:38
Ich programmiere in C und kann dir deshalb zu dem zweite I2C unter Bascom nichts sagen (ausser das ich mich gerade frage, ob es eine brauchbare Lib für einen Software I2C gibt).

Bei deinem Anwendungsfall würde ich mir über die Kabellänge mal nicht so viel Gedanken machen. Je länger die Leitung desto geringer die erzielbare Übertragungsrate. Sie sollte aber trotzdem noch über dem liegen, was du benötigst. Und wenn du einmal raus hast, wie man einen Atmega mit einer zweiten I2C Schnittstelle austattet, kannst du dir natürlich auch einen Repeater bauen (da würde eigentlich auch eine Transistorschaltung reichen). Ich denke, damit fährst Du unter dem Strich günstiger als wenn du anfängst mit CAN oder RS485 zu hantieren.

Gruß,
Xanadu

linux_80
23.01.2006, 01:16
Für RS485 braucht man noch etwas Zusatzhardware, welche von RS232 auf RS485 konvertiert. dazu gibts aber was im Wiki -> RS485 (https://www.roboternetz.de/wissen/index.php/RS485)

@Xanadu
hier gibts eine für i2C-Master von Peter Fleury
http://jump.to/fleury
unter AVR software

Software-I2C-Slave ist ein wenig umfangreicher, weswegen auch bei Bascom ein paar Rubel dafür ausgegeben werden müssen.

Wenn möglich sollte man immer die Hardware verwenden, einfacher gehts ned, braucht auch weniger Programmplatz.

rapo
23.01.2006, 20:12
Hi,
zum Thema Kabellänge bei TWI/I2C: Arbeite mit ca. 30m problemlos, mehrere Slaves dran. Verwende den P82B715. Ist nicht ganz "billig", aber zuverläßig! Gibts bei Segor.de.

MFG Ralf

rapo
23.01.2006, 20:12
Hi,
zum Thema Kabellänge bei TWI/I2C: Arbeite mit ca. 30m problemlos, mehrere Slaves dran. Verwende den P82B715. Ist nicht ganz "billig", aber zuverläßig! Gibts bei Segor.de.

MFG Ralf

ruediw
23.01.2006, 21:08
RS485 benötigt genau einen Chip mehr. Du brauchts also nicht einen CAN Controller dazu.Ist jedenfalls viel weniger störanfällig als i2c da das Signal symetrisch ist.