PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hat jemand 3 oder 4 atmega´s schon verbunden??



patti16
12.09.2005, 18:39
hallo

wie der Title das schon sacht, hat jemand schon mehrere Atmegas mit einander verbunden und wie habt ihr die Geschaltet??

brauch man ein Vorwiderstand oder sowas??

in der suche habe ich leider nichts gefunden.

gruß
patrick

tml
12.09.2005, 18:44
Ich weiß nicht genau, wie du das meinst. Wenn du einen Datenaustausch machen willst, dann kannst du ja den eingebauten IIC-Bus verwenden.

Pascal
12.09.2005, 18:48
ich würde dir auch eine Verbindung per TWI vorschlagen, ich habe damit zwar noch keine 3 oder 4 AVRs miteinander verbunden, aber dafür 2 Stück, bei denen die Masterposition oft wechselt, also könnte man auch gut noch mehr AVRs dazubauen(nur brauch ich die im Moment noch nicht)

du verbindest von allen AVRs die SCL- und die SDA-Pins und verbindest die beiden Leitungen jeweils mit einem Widerstand(mit so um die 5 -10 KOhm)

patti16
12.09.2005, 18:52
ok danke

aber noch ein frage zwischen jeden controller oder am ende oder vor dem ersten controller??


gruß
patrick

Pascal
12.09.2005, 18:56
du brauchst nur jeweils einen pullup nach 5V an der SDA- und der SCL-Leitung (nur am "ersten" µC, an den anderen brauchst du keine pullups)

patti16
12.09.2005, 19:09
ok danke schön Pascal.

gruß
patrick

patti16
12.09.2005, 19:23
also so:

atmega 8 -----sda-----__Widerstand__-------Atmega 8
-----scl---- __Widerstand__-------


oder so:
5volt
........................|
atmega 8 ------sda------widerstand-----------atmega8-------sda----atmega8
.............------scl--------widerstand-----------atmega8-------scl-----atmega8
.......................|
5volt

die punkte sind nur für die Ausrichtung da.

glaube das unterste ist richtig oder?

Pascal
12.09.2005, 19:32
passt beides nicht so richtig...
vielleicht wirds damit klarer:
5V---Widerstand---SDA(µC1)---SDA(µC2)---SDA(µC3) usw.

5V---Widerstand---SCL(µC1)---SCL(µC2)---SCL(µC3) usw.

patti16
12.09.2005, 19:33
achso ok,

wenn du aber netter weiße einen schaltplan mir zeigen könntest wäre ich dir sehr dank bar nicht das ich alles bei der Aktion hier verschrotte.

danke


gruß
patrick

michaelb
12.09.2005, 22:18
Hallo Zusammen,
hab ne Frage an Pascal:
Geht es das die Masterposition wechselt? Wie macht man das?
Kannst du mal nen Master und Slavecode posten in dem der Master wechselt? Wäre echt voll nett!!!!
Gruß Michi

Pascal
12.09.2005, 22:27
wenn du aber netter weiße einen schaltplan mir zeigen könntest wäre ich dir sehr dank bar nicht das ich alles bei der Aktion hier verschrotte.

einen Schaltplan hab ich leider nicht, ich hab das ganze "frei Hand" gebaut, wenn du dich noch etwas gedulden kannst, mach ich noch einen(muss ich sowieso, das ganze wird ein Teil meiner Facharbeit für die Schule)
allerdings kann ich das wahrscheinlich erst morgen machen, hab auf meinem Rechner noch kein eagle



Geht es das die Masterposition wechselt? Wie macht man das?

weißt du wie man einen AVR als Slave verwendet?

nachdem ein Master seine Daten gesendet hat, kann er ja die Kommunikation mit dem Slave beenden, so dass der Bus dann wieder frei ist
dann kann ein beliebiges anderes I²C(-Master)-fähiges Gerät an dem Bus zum Master werden

mit was programmierst du?

michaelb
13.09.2005, 13:32
Hi Pascal,
ich programmiere mit C!!
Ob Master oder Slave wird doch über TWCR geregelt, oder irre ich mich da?
Gruß Michi

hacker
13.09.2005, 16:00
mal n andere frage...is des einfach nur eine "spielerei" oder was für ne leistung brauchst du wenn dir ein mega16 nicht reich o.ä ...so viele?

Pascal
13.09.2005, 16:07
ich brauch das für ein modulares System, bei dem sich ein µC um das Datenspeichern kümmert, der andere µC um das Anzeigen dieser Daten und um die Eingabe neuer Daten
und weil das ganze leicht erweiterbar sein muss, kann ich das ganze nicht auf einem µC implementieren

michaelb
13.09.2005, 16:09
Wird im TWCR entschieden ob Master oder Slave?

Pascal
13.09.2005, 16:44
ich hab mal nen Schaltplan angehängt, mit dem die Beschaltung des TWI nochmal deutlich werden sollte

ja, ob Master oder Slave wird über TWCR geregelt

patti16
13.09.2005, 17:12
hi

ok danke schönfür die Mühe.

gruß
patrick

michaelb
13.09.2005, 17:55
Hi Pascal,
danke für die Antwort!
Kannst vielleicht mal Beispiel Master und Slavecode posten?
Gruß Michi

Hannebambel
14.09.2005, 07:36
Ja ich währe auch an einem Codebeispiel interesiert.
Habe ich das richtig verstanden, wenn der Bus frei ist kann jeder µC einen Schreibvorgang einleiten?
Woher weis der andere Busteilnehmer das er damit angesprochen wird, wenn er gerade noch die Bus Masterfunktion hatte?

Pascal
14.09.2005, 13:56
ich kann demnächst mal was online stellen, muss aber dafür erst das für TWI unwesentliche aus dem Code entfernen, kann noch etwas dauern



Habe ich das richtig verstanden, wenn der Bus frei ist kann jeder µC einen Schreibvorgang einleiten?

ja, ansonsten wäre der I²C doch kein Multimasterbus



Woher weis der andere Busteilnehmer das er damit angesprochen wird, wenn er gerade noch die Bus Masterfunktion hatte?

er erkennt das daran, dass er seine Addresse nach einem Start empfängt
damit er reagieren kann, muss man bei ihm im TWCR die entsprechenden Bits setzen

michaelb
14.09.2005, 14:05
Hi Pascal,
wäre gut wenn du einen Quelltext mal posten würdest!
Die Adresse wird doch im TWAR gesetzt, oder?
Gruß Michi

Pascal
17.09.2005, 11:19
ja, die Addresse wird in TWAR gesetzt

hier eine init-Methode:


void TWI_init(uchar ownaddr)
{
TWAR = ownaddr;
TWCR = 0x45;
TWSR &= 0xFC;
TWBR = 0xA;
}


dann eine zum starten:

uchar TWI_start(uchar ndevaddr)
{
uchar errcounter;
errcounter = 0;

TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);

while(!(TWCR & (1<<TWINT))); {
if(errcounter==10) {

errcounter = 0;
return 1;
}
errcounter++;
}
TWDR = ndevaddr;
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT)));
for(unsigned char i = 0; i < 20; i++)
asm("nop");
if( !((TWSR & 0xf8) == 0x18 ) ) {
return 1;
}

return 0;
}


zum senden:


void TWI_sendbyte(uchar nbyte)
{

TWDR = nbyte;
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT)));
}


und schließlich zum stoppen:


void TWI_stop(void)
{

TWCR = (1<<TWINT) | (1<<TWSTO) | (1<<TWEN);
for(unsigned char i = 0; i < 40; i++)
asm("nop");

TWCR |= 0x45;
for(unsigned char i = 0; i < 40; i++)
asm("nop");

}


ob meine ganzen nops wirklich nötig sind, hab ich noch nicht ausprobiert, schaden wirds aber nicht

michaelb
17.09.2005, 11:29
Hi Pascal,
danke für die Codes!!
Wie sieht dann so ein Slave aus?
Gruß Michi

Pascal
17.09.2005, 11:43
meinst du, wie der Code für einen Slave aussehen kann?

das kannst du alles in die ISR(Interrupt Service Routine) vom TWI reinschreiben, also besser wärs natürlich, wenn du in der ISR nur ein bestimmtes Bit setzt, worauf hin dann in der Hauptschleife die entsprechende Funktion aufgerufen wird
in der ISR vom TWI kannst du mithilfe des TWSR abfragen, was grad passiert is, also zB, ob Daten empfangen wurden

mir fällt grad auf, was ich vergessen hab...du musst am Anfang im Programm des Slaves noch Interrupts global aktivieren und "TWCR |= 0x80;" ausführen, sonst wirds nicht gehn

michaelb
17.09.2005, 11:58
Hi Pascal,
ok! Danke! Welche Bits im TWCR entscheiden ob ein Atmega Master oder Slave wird?
Gruß Michi

Pascal
17.09.2005, 12:41
so direkt ein Master- oder Slave-Bit gibts net

zum Master wird ein µC, wenn er START macht und der Bus frei ist, ansonsten muss er es nochmal versuchen, den Bus gibt er mi STOP wieder frei

ein Slave ist ja im Prinzip ein µC, der auf Signale aufm TWI-Bus reagiert und dafür gibts das Bit TWEN und damit der Interrupt ausgelöst wird noch das TWIE, damit er Acknowledges sendet das TWEA und zu guter Letzt noch das TWINT, wenn das nicht gesetzt ist, reagiert er nicht auf den TWI-Bus

ich hoffe mal, ich hab jetzt nichts durcheinander gebracht... :-)