PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : I2C-"Netzwerk" mit ATMega8... noch unklares...



Jaecko
19.03.2007, 12:29
Moin.

Da die einzelnen Geräte mit nem ATMega8 immer mehr werden und diese letztendlich doch mal alle gemeinsam gesteuert werden sollen, wollte ich diese nun über den I2C-Bus verbinden. Geplant ist, dass alle Geräte als Slaves arbeiten und dann ein ATMega8 allein die Aufgabe des Masters übernimmt.

Hab zwar schon mal nach Infos gesucht, aber trotzdem gibts da noch einige Punkte, bei denen ich noch nicht ganz 100% sicher bin. Darum mal hier die unklaren Punkte.

#1) I2CSlave Library: "Works for 2313,2323, 2333,2343,4433, tiny22, tiny12, tiny15 and M8. Other AVR chips have build in hardware for I2C."
Geh ich richtig, dass M8 dort den ATMega8 bezeichnet und somit für einen Slave diese Library benötigt wird, bei einem ATmega16 aber nicht?

#2) Soweit klar, dass ein Slave nicht von sich aus senden kann. Wenn nun Slave 2 an Slave 4 etwas senden will, muss der Master die Daten also von S2 auslesen und danach an S4 weiterleiten... ?

#3) Aus einem Codebeispiel weiss ich, dass man mit dem Folgenden Code (für Master) einen Slave abfragen kann...



I2cstart
I2cwbyte ICaddress
I2crbyte Bytetoread, Ack
I2crbyte Bytetoread, Nack
I2cstop


Aber wie sieht hierzu dann im Slave das Gegenstück des Codes aus?

MfG
S.C

triplebit
19.03.2007, 18:16
Hallo Jaecko,

ich komme zwar aus der C-Ecke, aber ich probiers mal.

Ob ein AVR TWI Hardware-mässig unterstützt, musst Du in den Datenblättern nachschauen. Der Mega8 unterstützt TWI auf jeden Fall(in HW).

In einem TWI-Bus kann ein Slave auf keinen Fall senden! Es wäre zwar möglich, dass er einfach wartet bis er vom Master abgefragt wird, und dieser es dann an den 2. Slave weitergibt. Aber hier ist MultiMaster auf jeden Fall die bessere Lösung.

Es gibt ein wiki dazu auf roboternetz. Wenn mich nicht alles täuscht sogar ein Beispiel in BASCOM für Multimaster.

An einem TWI-Bus gibt es zur gleichen Zeit immer nur einen Master. Wenn es ein Multimaster-Bus ist, und 2 gleichzeitig Master werden wollen, gibt es ein Verfahren(Arbitation) wodurch einer gewinnt und Master wird und der andere zum Slave wird(oder sollte).

Beschäftige Dich mal mit dem Wiki, und schreibe hier einfach wenn Du noch fragen hast.

cu

Martin

Jaecko
21.03.2007, 07:11
Sodele... hab mich mal mit der TWI-Praxis beschäftigt und die dort enthaltenen Codes aussortiert und in eine .bas zusammengefügt (im Anhang als twicomm.bas; nicht kopiert, sondern abgeschrieben, um die Funktion zu verstehen).

Versteh ich das nun mit den Befehlen so richtig:

Master will ein Zeichen an Slave senden:
CALL TWI_Send_Byte(Slave-Adresse, Byte)
Die im Slave empfangenen Daten können dann aus TWDR abgerufen werden.

Master soll Zeichen von Slave holen:
Daten = TWI_Read_Byte(Slave-Adresse)
Die Daten, die dann hiermit abgeholt werden, müssen im Slave im Register TWDR liegen....


Gibts denn irgendwie noch ne möglichkeit, die TWI-Kommunikation in Bascom zu testen oder muss ma da dann direkt gleich die AVRs füttern?


Edit: Anhang aus Platzgründen entfernt

linux_80
21.03.2007, 11:36
Hallo,
im Prinzip stimmt das schon so mit dem TWDR, aber es ist nicht ganz so einfach, der Slave hat etwas mehr zu tun als nur das Byte auszulesen.
Ein Beispiel für eine Slave gibts aber auch im Wiki.

Hier im letzten Beitrag ist auch noch eine etwas umfangreichere Version für den Slave:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=15715