PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : I²C Bus bei AVR's benutzen



Goldenflash
12.09.2005, 01:59
Hallo erstmal,
Für all diejenigen, die noch keine absolute Anfängerfrage von mir lesen mussten :cheesy: : Ich bin noch ziehmlich neu hier! (Ich wollte das nur mal wieder vorher sagen...)

Also, so ein paar Sachen habe ich ja jetzt schon mehr oder weniger verstanden: LCD ansteuern, Motoren per AVR steuern...

Doch da Semesterferien sind, und ich im Moment viel Freizeit habe :-b bin ich über diesen (https://www.roboternetz.de/wiki/pmwiki.php?n=Main.I2C) Artikel gestolpert, welcher mich auf folgende Idee :idea: brachte: "Ich nehme alle Sachen die ich mal gebaut habe und verbinde sie!" (Nein, ich verfolge kein bestimmtes Ziel, ich versuche nur ein paar grundlegende Dinge zu verstehen.) Leider ist der Artikel nicht sonderlich hilfreich wenn es darum geht mehrere AVR's miteinander zu verbinden. :(
Ich habe mir dass in etwa so vorgestellt: Ein AVR steuert das LCD ein anderer wertet die Sensordaten aus und ein dritter steuert die Motoren. (naja es würden wohl auch 2 reichen).
Mein Problem besteht nun darin:

Wie verbinde ich die AVR's miteinander (Schaltplan)?
Wie würde ein Bascom-Beispiel-Code aussehen?(Hier (https://www.roboternetz.de/wiki/pmwiki.php?n=Main.I2CBascom) steht leider nicht besonders viel.)
Welche AVR's sind besonders geeignet? (zur Zeit verwende ich nur AT90S4433's und ATMega8)
und kann ich alle an den gleichen Quarzoszillator anschließen?

Danke schonmal
Gruß Florian

PS: Ich bin immer an Informationen interessiert.

Hannebambel
12.09.2005, 10:28
Also dann mal los.



Wie verbinde ich die AVR's miteinander (Schaltplan)?


Du musst eigentlich nur die Busleitungen der TWI Intrfaces miteiander verbinden (sda und scl) die Pullup Widerstände kannst du dir sparen, du kannst die Internen Pullups des AVR verwenden.



Wie würde ein Bascom-Beispiel-Code aussehen?(Hier steht leider nicht besonders viel.)

Schau mal in der Bascom Hilfe nach da steht alles genau beschrieben.



Welche AVR's sind besonders geeignet? (zur Zeit verwende ich nur AT90S4433's und ATMega8)


Alle die ein TWI Interface haben. Du kannst das Interface natürlich auch Softwareseitig emulieren. Würde ich aber nicht empfehlen, das kostet nur Rechenzeit und Programmspeicher.



und kann ich alle an den gleichen Quarzoszillator anschließen?


Nein kannst du nicht. Jeder AVR einen oszi. Wenn du willst kannst du auch den Internen Oszillator den Manche AVR's haben benutzen. Allerdings ist er
1. sehr empfindlich was Temperatuschwankungen angeht.
und
2. Bei weitem nicht so genau wie ein externer Quarzoszi (mit dem eine Genauigkeit von locker 100ppm möglich sind).

Weiterhin muss dir klar sein das eine Leseoperation nur vom Busmaster angefordert werden kann.
Das kann bei einigen Anwendungen zum Problem werden.

SprinterSB
12.09.2005, 10:59
Also dann mal los.

und kann ich alle an den gleichen Quarzoszillator anschließen?
Nein kannst du nicht. Jeder AVR einen oszi.

Doch, das geht. Du kannst einen Oszillator für alls AVRs benutzen.
Verwechsle aber nicht das englische 'quartz oscillator' (meint externen Quarz) mit 'external Clock', die du dir über einen Quarz-Oszillator besorgen kannst (so ein Ding mit 4 Pins im DIL-Gehäuse aus Metall).
Die Fuses der AVR's mussen allerdings stimmen.

Du kannst auch einen AVR mir einem Quarz oder Keramik-Schwinger betreiben und von dessen Takt für die anderen AVRs abzweigen:

Takt-Master:
Keramik oder Quarz, Einstellung auf 'noisy environment', damit wird die Treiberstufe stärker geschaltet und kann weitere AVRs versorgen. Takt-Ausgang ist XTAL2.

Takt-Slaves:
Einstellung auf 'external clock', Takt-Eingang ist XTAL1, XTAL2 bleibt offen.

Die Takt-Leitungen sollten nicht zu lange sein; wenn's also mehrer Meter zwischen den AVR's sind, jedem einen Quarz oder Taktgeber spendieren.

Hannebambel
12.09.2005, 11:08
Wieder etwas dazugelernt =D> \:D/

Goldenflash
12.09.2005, 11:12
Hm einiges ist mir leider immernoch unklar: :-k

Du musst eigentlich nur die Busleitungen der TWI Intrfaces miteiander verbinden (sda und scl) die Pullup Widerstände kannst du dir sparen, du kannst die Internen Pullups des AVR verwenden.
Also, mir ist nicht ganz klar was sda und scl an meinem Avr sein soll, oder kann ich das selbst definieren?


Schau mal in der Bascom Hilfe nach da steht alles genau beschrieben.
Nunja, der Code an sich sieht nicht sonderlich kompliziert aus, allerdings wurden dort PB5 und PB7 verwendet: Aber der AT90S4433 hat keinen PB7 :( und ich stehe auch vor dem Problem ob ich jeden beliebigen Port als sda und scl definieren kann oder ob das nur bei 2 bestimmten geht.


Alle die ein TWI Interface haben. Du kannst das Interface natürlich auch Softwareseitig emulieren. Würde ich aber nicht empfehlen, das kostet nur Rechenzeit und Programmspeicher.
Also, das habe ich nun überhaupt nicht verstanden. ](*,)




Weiterhin muss dir klar sein das eine Leseoperation nur vom Busmaster angefordert werden kann.
Das kann bei einigen Anwendungen zum Problem werden.
Ich verstehe das so, dass der Master die Motoren steuern und auch die Ausgabe zum LCD übernehmen muss, da er nur "lesen" kann. Die Sensoren könnte ich jedoch an einem Slave betreiben, welcher die Ergebnisse dann zum Master sendet, oder sehe ich das falsch?

SprinterSB
12.09.2005, 11:34
TWI steht für Two Wire Interface, weil Phillips den Name I2C reserviert hat.

Wo SCL und SDA beim Mega8 liegen, siehst du bei den Port-Funktionen bzw 'Aternate Port Functions' oder 'Pin Configurations'
SCL = PC5 = Pin 28
SDA = PC4 = Pin 27

Wenn du das TWI-Interface (also die AVR-Hardware-Unterstützung für I²C) verwendest, dann ist die Lage der Ports fest. Direkt auf die Ports zugreifen brauchst du nicht, das tut die TWI-Hardware für dich.

Hannebambel
12.09.2005, 11:49
Nein der Master kann auch schreiben. Wen jetzt z.b. der Slave einen Kollisionssensor hat. Kann er dem Master nicht sagen Achtung da kommt was. Er mus warten bis er vom Master angesprochen wird und kann dann erst antworten (wie in der Schule).
Es gibt jedoch die Möglichkeit das der Slave noch eine Leitung zu einem Interrupt eingang am Master hat.
Mit dieser Leitung kann der Slave sich sozusagen Melden. In der dadurch aufgerufenen Interruptrutine kann der Master dann den Slave ansprechen.

Sorry,
bin nicht so gut im erklären.

rapo
12.09.2005, 15:17
Hi,

@Hannebambel:
das mit dem Int. ist möglich, aber überflüssig. avr's lassen sich auch im multi-master-betrieb vernetzen. es sendet dann jeder master genau dann, wenn er "was wichtiges" hat. ist bei avrs mit hardware twi ohne große probleme möglich...
wenn es "sehr wichtig ist" und alle wissen sollten, dass die welt gleich untergeht, dann ist sogar ein general-call möglich, der an alle angeschlossenen teilnehmer geht...

Hannebambel
12.09.2005, 15:22
Ich habe den Multimaster Betrieb noch nicht geteste habe nur gehört das es ein erheblicher Mehraufwand ist.
Da ein eigenes Protokoll dazu geschrieben werden muss um zu verhindern das 2 Master versuchen daten über den Bus zu senden.
Hättest du ein par Codebeispiele für mich (uns)?

Goldenflash
12.09.2005, 15:31
SCL = PC5 = Pin 28
SDA = PC4 = Pin 27

Sehe ich das richtig: Ich muss nur alle PC5 und PC4 miteinander verbinden, der Rest läuft über die Software?

Gruß Florian

SprinterSB
12.09.2005, 15:34
Ja, ist korrekt.
Die Pullups solltest du an diesen Pins noch aktivieren, denn die I2C-Verdrahtung muss ein wired-and realisieren. Oder 2 externe pullups; die internen sind etwas zu groß geraten, jedenfalls wenn man sich nach der Spez richten will.

Den Rest macht die Software -- falls sie funzt ;-)

Goldenflash
12.09.2005, 15:42
Was sind denn Pullups? :-s

Meinst du eine solche Schaltung:
http://free.pages.at/osdevdevu/01120905.jpg
Diese ist aus der Bascom Hilfe.

SprinterSB
12.09.2005, 15:47
Die 10k sind Pullups, sie ziehen Leitungen nach Vcc (nach oben eben), wenn diese nicht aktiv nach low geschaltet werden.
Die 330er brauchst du nicht.
--> Pullups (http://www.elektronik-kompendium.de/public/schaerer/pullr.htm)

Carbolo
12.09.2005, 16:01
Hallo Goldenflash,

um den I2C oder TWI-bus zu verstehen solltest du dir vielleicht folgende links anschauen.Dort sind alle deiner Fragen umfangreich beantwortet :-)

https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=4585

https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=3447

Schöne Grüße:
Z