Archiv verlassen und diese Seite im Standarddesign anzeigen : Hat jemand 3 oder 4 atmega´s schon verbunden??
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
Ich weiß nicht genau, wie du das meinst. Wenn du einen Datenaustausch machen willst, dann kannst du ja den eingebauten IIC-Bus verwenden.
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)
ok danke
aber noch ein frage zwischen jeden controller oder am ende oder vor dem ersten controller??
gruß
patrick
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)
ok danke schön Pascal.
gruß
patrick
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?
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.
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, 23: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
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, 14:32
Hi Pascal,
ich programmiere mit C!!
Ob Master oder Slave wird doch über TWCR geregelt, oder irre ich mich da?
Gruß Michi
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?
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, 17:09
Wird im TWCR entschieden ob Master oder Slave?
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
hi
ok danke schönfür die Mühe.
gruß
patrick
michaelb
13.09.2005, 18:55
Hi Pascal,
danke für die Antwort!
Kannst vielleicht mal Beispiel Master und Slavecode posten?
Gruß Michi
Hannebambel
14.09.2005, 08: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?
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, 15:05
Hi Pascal,
wäre gut wenn du einen Quelltext mal posten würdest!
Die Adresse wird doch im TWAR gesetzt, oder?
Gruß Michi
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, 12:29
Hi Pascal,
danke für die Codes!!
Wie sieht dann so ein Slave aus?
Gruß Michi
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, 12:58
Hi Pascal,
ok! Danke! Welche Bits im TWCR entscheiden ob ein Atmega Master oder Slave wird?
Gruß Michi
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... :-)
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.