PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : komunikation über I2C



Bluesmash
13.08.2005, 08:49
hallo zusammen!

ich möchte zwei prozessoren (mega32,mega8) über den I2C-Bus kommunizieren lassen. hat mir jemand einen programmschnipsel oder einen link wie man soetwas programmiert? ich habe nur anleitungen für das beschreiben und lesen von eprom's gefunden... wie funktioniert das aber mit 2 prozessoren? wie schalte ich den mega8 in den slave modus?

gruss Bluesmash

Rage_Empire
13.08.2005, 10:47
Stell ich mir etwas schwierig vor, da einer von beiden Master und der andere Slave sein muß. Warum willst du das über I2C realisieren? Über die USART der µCs wäre es um vieles einfacher.

blizzard
13.08.2005, 13:25
Auf dieser Seite gibt Infos zum TWI (I2C bei AVRs):
http://www.mc-project.de/ (unter TWI)

mfg blizzard

Bluesmash
14.08.2005, 17:24
@Rage_Empire: ich benütze die UART schon um daten an meinen prozessor für das display zu senden nd ich möchte mal lernen den i2C-bus zu beützen...

@blizzard: danke für den link ich werde ihn mir mal anschauen...

ich habe in den Bascom beispielen ein slave programm gefunden das funkioniert aber nur mit den kleineren AVR's die keine hardware TWI haben, aber wie man es mit der HW TWI macht habe ich noch nichts gefunden...

Rage_Empire
14.08.2005, 17:49
Hm, da war mal was mit ner Slave- Lib welche man bei MCS kaufen musste. Bin mir aber nicht ganz sicher, ob es die HW- TWI betrifft.

Bluesmash
14.08.2005, 21:12
für das beispiel programm von bascom (i2c_slave) braucht man diese Lib aber ich glaube das funktioniert nur mit der software TWI...
oder kann man dieses beispiel auch für die HW-TWI benützen? weiss das jemand?

mfg bluesmash

Bluesmash
14.08.2005, 21:31
@blizzard: ich habe mal die seite studiert... es ist wunderbar alles beschrieben... aber ich habe keine ahnung wie ich das in bascom umsetzen soll...

Bluesmash
16.08.2005, 16:21
so langsam bin ich verwirrt...

in den beispiel dateien von bascom hat es eine Datei (TWI-slave.bas) damit kann man ja einen prozessor (im beispiel nen m128) als slave am hardware I2C-Bus (TWI) betreiben, aber dazu brauche ich ja die I2C_TWI-SLAVE.LBX

also gehen wir auf die MCS Homepage und kaufen die datei... aber dort finde ich nur die I2CSlave Library und dort steht: Works for 2313,2323, 2333,2343,4433, tiny22, tiny12, tiny15 and M8. Other AVR chips have build in hardware for I2C.

also funktioniert die ja nur mit dem software I2C???
und wie komme ich zu der I2C_TWI-SLAVE.LBX????

kann mir da jemand helfen? hat schon mal jemand mit dem TWI-slave.bas beispiel gearbeitet???

gruss Bluesmash

Bluesmash
19.08.2005, 20:00
vielleicht intressierts ja noch jemand...

bei MCS bekommt man die TWI_I2C LIB die den Hardware I2C(TWI) des avr's unterstützt. damit hab ich mir jetzt mit nem mega8 nen I2C slave controller gebaut der 2 servos steuert.

gruss bluesmash

hacker
20.08.2005, 14:20
also musstest du die kaufen?! wenn ja wieviel?

BlooD
20.08.2005, 16:44
Das würd mich auch brennend interressieren!
Hast du es von da:
http://www.mcselec.com/i2cslave.htm ???

Kann ja kaum sein, denn da steht doch:

Works for 2313,2323, 2333,2343,4433, tiny22, tiny12, tiny15 and M8. Other AVR chips have build in hardware for I2C.

So, als könnte der ATMega8 das schon...

(Muss ich mir wegen dem jetzt noch nen PayPal-Account zulegen?!)

Bluesmash
20.08.2005, 16:46
ja für 5 Euro bekommt man die I2C_SLAVE.lib (für Software I2C) und die TWI_I2C_SLAVE.LIB (für Hardware I2C, TWI) wobei die TWI Slave noch ne Beta ist aber sie funktioniert gut...
Mark von MCS hat momentan aber ferien....

in den bascom beispielen ist auch ein TWI_SLAVE sample....

gruss Bluesmash

BlooD
20.08.2005, 16:49
jetzt hab ich meinen post editiert, als du geantwortet hast...

wenn ich dich richtig verstehe, dann hat der ATMega8 zwar I2C_TWI, aber nicht für SLAVE-Mode, der kommt dann mit der LIB aber dazu, die I2C_SLAVE.lib brächte man beim ATMega8 dann nicht.

Richtig?

Bluesmash
20.08.2005, 16:56
wenn man die I2C_SLAVE bei MCS kauft erhält man zwei LIB's... eine für software I2C und eine für Hardware I2C (TWI)...

das Beispiel auf der Homepage ist nur für die Software LIB... schau dir mal das TWI_I2C_SLAVE beispiel in den samples bei bascom an das ist für den Hardware I2C(TWI) und da wird ein m128 verwendet...

ich hoffe es ist jetzt verständlich... da es recht verwirrend ist das ganze...

gruss Bluesmash

*edit*: man braucht kin paypal man kann das geld auch per bank überweisen...

BlooD
25.08.2005, 16:44
Erstmal sorry, das ich hier nochmal nachhaken muss...

ich hab heute Stunden damit verbracht, verschiedene Threads über TWI-SLAVE zu lesen, irgendwie wird immerwieder von Problemen berichtet, vorallem Fehler in der Lib, die man bei o.g. Quelle kaufen kann. Aber was bringt das, wenn die LIB fehler enthält?
Manche Threads sind schon ein bisschen älter, jetzt möcht ich einfach mal den aktuellen Stand wissen.

Wie Bluesmash sagte sollte das funktionieren, aber Pebisoft und Frank waren da mal anderer Meinung. Viele berichten auch von Assemblerlösungen, die hier im Board gepostet/behandelt wurden und die besser wären, als die LIB.
Dann hatte Pascal mal eine Lösung in C gepostet, allerdings auch schon ein dreivirteljahr her.

Was ist denn nun aktuell? Oder gibt es noch keine 100&ige Lösung?
Könnte man nichtmal die Möglichkeiten zusammenfassen und in einen Artikel posten?


@Bluesmash:
Du hast es ja erfolgreich geschafft mit dem ATMega8.
Du hast ja HW-TWI verwendet, oder?
Kannst du behaupten das alles problemlos funktioniert?

Bluesmash
25.08.2005, 17:16
ich kann leider nichts behaupten... das einzige was ich gemacht habe ist vom master, daten an den slave zu senden (über HW-TWI), im slave die daten auszuwerten und damit 2 servos zu steuern...

gruss bluesmash

BlooD
26.08.2005, 11:42
h,, dann nochmal genauer:

ich will auch zwei sachen steuern, wie du.
1.) ich will eine Position zwischen 0 und 20 übermitteln, damit soll der ATmega8 diese anfahren. Das Abfragen der Position sollte auch möglich sein.
2.) ich will einen wert zwischen 0 und 999 übermitteln, das soll der ATmega8 auch verarbeiten. Den aktuellen wert sollte man wieder abfragen können.

Ist das damit möglich?!?

Bluesmash
27.08.2005, 09:20
von wo aus sendest du die daten? von einem anderen avr?
ja das funktioniert. den wert 0-999 musst du wahrscheinlich auf 2 byte verteilen um ihn zu übertragen. schau dir doch mal das twi_slave beispiel in bascom an...

gruss bluesmash

BlooD
27.08.2005, 14:31
die daten kommen von einem mikrocontroller, der mit java arbeitet,
das bascom-beispiel hab ich mir schon x-mal angeschaut, aber ich steige da noch nicht so durch - werd mich mal versuchen reinzuarbeiten.

rapo
27.08.2005, 19:03
Hallo zusammen,
hab das Ganze gerade überflogen...
Die Programmierung der Hardware TWI, um mehrere AVRs zu vernetzen ist kein riesiges Geheimnis. Hab mich auch schon länger damit gespielt und das mit Bascom nur über das Setzen der zuständigen Register beim Mega8 gelöst, funktioniert tadellos... Ist ja auch im Datasheet ausführlich erklärt (Master und Slave)
Ich hab schon lange vor, das hier zu veröffentlichen, nur wußte ich noch nicht wie und wo unter roboternetz...
Hinzu kommt, dass der Quellcode schlecht kommentiert ist und ich einfach noch keine Zeit hatte, das zu ändern. (Warum keine Zeit -> www.lapoferm.de)
Solltet ihr wirkliches Interesse haben, werde ich das gerne veröffentlichen, wenn ich mal eine freie Stunde habe und drandenke...
Bleibt die Frage wo? Einfach ins Forum stellen oder als Download oder...?

Grüße "Slave" Ralf

BlooD
28.08.2005, 12:13
Hi,

also ich hab wirklich großes Interesse daran, hab allerdings noch keine Ahnung wie das mit den Registern gehen soll - hab auch noch fast nix mit Bascom gemacht, das werd ich die Tage mal probieren.

Aber ich denke nicht nurich wäre dir dankbar, sondern auch viele andere - man liest im Forum ja immer wieder etwas über das Thema.

Artikel können da geschrieben werden:
https://www.roboternetz.de/phpBB2/artikeluebersicht.php
(dann der Link ganz unten)
Ist ja wie ein normaler Forenbeitrag.

Anderer Vorschlag:
Kannst das auch mal in einem neuen Thema starten, ich les mir das durch und versuch es nachzuvolziehen, da ich ein Anfänger bin werd ich über so ziemlich alles mögliche stolpern, dann können wir darüber diskutieren und wenn alle unklarheiten beseitigt sind, kannst du den fertigen Artikel dann posten :)

hacker
28.08.2005, 19:23
@rapo : HER DAMIT =) wenn du nur mal ein kurzen blick in die suchfunktion wirfst und nach dem thema hier suchst, wirst du merken, wie gross das interesse daran ist!!

Bluesmash
28.08.2005, 21:04
@Blood: wen du die Slave Lib vin MCS verwendest must du nichts von registern verstehen... verstehe auch nix davon ;)
bei aktivitäten auf dem I2C bus werden einfach die entsprechenden ISR Rutinen aufgerufen...
hier mal ein kleiner code wie ich es gemacht habe um 2 bytes im slave zu empfangen... ich hoffe man versteht es...




'die variable empfangen wird auf 2 bytes definiert wenn mehrere bytes empfangen werden sollen muss diese entsprechend erhöt werden...
Dim Empfangen(2) As Byte
Dim Index As Byte

'Hier wird die adresse für den Slave gesetzt
Config Twislave = &H70 , Btr = 1 , Bitrate = 100000


Enable Interrupts

Do
nop
Loop
End

Twi_stop_rstart_received:
'Master hat Stop oder restard gesendet
Return

Twi_addressed_goread:
'wir wurden adressiert und master will daten lesen
Return

Twi_addressed_gowrite:
'wir wurden vom master adressiert und der master will bytes senden
'variable index auf 0 setzen
Index = 0
Return

Twi_gotdata:
Incr Index
'Index wird bei jedem empfangenen byte erhöt empfangen(1) enthält das erste byte empfangen(2) das zweite byte
Empfangen(index) = Twi
'twi enthält das momentan empfangene byte
Return

Twi_master_needs_byte:

Return


Twi_master_need_nomore_byte:

Return

tuxilein
30.08.2005, 11:31
mm warum nimst du nich tden canbus her ich wollte auch erst meine mcu's über i2c kommuniziren lassen aber das is nicht so die gute idee das bringt nur bugs mit sich - das fuchst mich wie sonst noch was.

das master slave prob hab i so gelöst, mit nem interrupt der slave sendet nen interrupt wenn der slave daten für den master hat.

E-Fan
30.08.2005, 16:33
hmm... ich hab mal mit dem Gedanken gespielt einen Interrupt zu nutzen, dessen Routine ein Datenwort im Takt der SCL-Leitung nach links schieben bzw, rotieren und den jeweiligen Zustand der SDA-Leitung in das LSB eintragen lässt.

BlooD
30.08.2005, 20:23
Also ich kann kein CAN benutzen, weil der andere Mikrocontroller das nicht kann :/

tuxilein
31.08.2005, 07:33
jo es gibt doch dafür can controller! wie mcp2515 und der tranciver mcp2551
der kommt an den spi bus ran.
für paranelen gibt es den SJA1000 (philips)

viel spaß

BlooD
02.09.2005, 14:54
@Bluesmash

Dieses Label gibts doch gar nicht in der LIB, oder - jedenfalls find ich nix darüber:


Twi_addressed_gowrite:
'wir wurden vom master adressiert und der master will bytes senden
'variable index auf 0 setzen
Index = 0
Return

Irgendwie rätselhaft ist mir das ganze aber schon noch - kommt vielleicht noch.
Irgendwie ist mir nicht klar, wie ich auf der Slave-Seite unterscheiden kann, ob ich jetzt mit der LESE- oder SCHREIB-Adresse addressiert wurde.

@tuxilein:
ich hab am anderen Mikroncontroller auch kein SPI oder so - und da ich wenigstens schon was über I2C geschickt hab und es auch angekommen ist, bleib ich bei I2C ;)

tuxilein
02.09.2005, 15:10
@BlooD,

verstehe ich würde ich auch machen, wenn schon mal was geht.

Und bei zwei MCU's is das kein prob nur i habe mehr MCU's und brauch für fas für jeden einen i2c!

Bluesmash
02.09.2005, 16:44
@Blood: ich sende vom master aus: I2csend 10 , Daten(1) , 2
damit wird im slave mit der adresse 10 als erstes die Twi_addressed_gowrite: ISR aufgerufen da der slave adressiert wurde und der master daten senden will danach werden die daten in der Twi_gotdata: die daten in der Twi variable bereitgestellt...

ich hoffe das hilft dir weiter... gruss bluesmash