Hallo Zusammen, ich hab hier nen 19" Baugruppenträger, in diesen sollen mehere Platinen eingeschoben werden, jeweils mit nem uC drauf (eventuell ATmega8). Nun sollen sich diese AVRs aber untereinander unterhalten können. Das Problem ist, dass ich mit einer Datenrate von ~2 bis 3 MBit rechne und Multimaster Betrieb brauche. Am liebsten wäre es mir natürlich wenn ich mich um den Buszugriff nicht kümmern müßte. Ich hab mir schon überlegt ob sich eventuell ein CAN-Controller dazu überreden läßt außerhalb der Spec zu tun. Hat sonst noch einer ne Idee ? Danke an alle.... Gruß Philipp
2-3 MBit sind n Haufen Holz ... die UART kann aber bis knapp unter 1MB/s ... das wären dann irgendwo um die 7MBit nur mit dem Multimaster geht RX-TX nicht. RS232 geht nicht ... RS485 könnte das bis zu Leitungslängen von x-hundert Metern.
Bei RS485 mögen es der Bus und der Transceiver ja packen, aber die Controller sind meist nur bis 1Mbps spezifiziert. Allerdings sind im x8-Mode immerhin theoretisch bis 2Mbps drin. Auch CAN beim AT90CAN128 mag vielleicht bei 2Mbps noch funktionieren, wirst Du aber gründlich ausprobieren müssen. Für mehr als 2Mbps und trotzdem Mega8 wirst Du wohl SPI verwenden müssen - das ist sowieso die einzige Schnittstelle, die nominell mehr als 1Mbps hergibt. Überleg es dir nochmal genau, was Du wirklich brauchst. Und wenn 2-3Mbps wirklich nötig sind, such einen Controller mit 10Mbps Ethernet drauf.
Warum nicht einfach SPI? Verbindung erfolgt über die soundso vorhande Rückverdrahtung. Die meisten Anwendung haben eh ein Master-Slave-Konzept. Ich habe so ohne Probleme 5MBit im Einsatz - allerdings per Checksumme gesichert.
Hi ! Auch mich würde generell auch mal Eure Meinung interessieren, wie Ihr die Kommunikation zwischen einem bzw. mehreren µC aufbauen wollt. Gibt es nen Hardwareplan..., den Ihr mal ins Forum stellen könntet? Softwaremäßig I²C, CAN oder Serielle Kommunikation? Danke ebenfalls für Eure Mithilfe! Mfg macke_a
Die SPI läuft aber nur wenn ein Master und x slaves, ausserdem brauchste den Chip-Select vom Master aus an jeden jeweiligen Slave. Multimaster wird da nicht hinhauen.
Ja, das mit SPI hatte ich mir auch überlegt, ist halt aber kein Multimaster. Andere Idee war noch einen parallelen Bus, mit den entsprechenden Steuerleitungen aber da muss ich um irgendein Buszugriffsverfahren kümmern. Also mit nem Arbiter.
"2-3 MBit sind n Haufen Holz ..." Da sind die AVRs ja voll mit Daten schaufeln ausgelastet und können nichts anderes mehr machen. Überleg Dir nochmal reale Angaben. Peter
"Da sind die AVRs ja voll mit Daten schaufeln ausgelastet und können nichts anderes mehr machen." Müssen sie auch nicht.
"Müssen sie auch nicht." ??? Wenn sie nichts tun müssen, laß sie doch weg. Nur Strom verbrauchen kannst Du auch mit einem Widerstand. Ich nehme MCs nur, wenn sie auch was erledigen sollen. Peter
Danke für deine konstruktiven Infos. Wenn du ein paar Widerstände hast die selektiv "Daten schaufeln" können, dann nur her damit...
Ich finde nur Daten schaufeln relativ witzlos. Ein MC muß schon Zeit haben, um erstmal Daten einzulesen, damit er sie an einen andern übertragen kann. Und der andere muß wiederum Zeit haben, die Daten auszuwerten und irgendwas damit anzufangen. Und dann sollte es auch einen triftigen Grund geben, warum die Daten erst noch umständlich übertragen werden müssen, d.h. warum das Einlesen und Auswerten nicht bequemer Weise ein und derselbe MC machen kann. Peter
Seh ich ähnlich... wenn die Mega8 ausser Datenschaufeln nichts machen sollen dann vergiß die ganze Sache und nimm einfach einen dickeren Prozessor (ARM-z.B.). Es sei denn, "der Weg ist das Ziel" - soll heißen, es geht Dir nur um die Machbarkeit der Vernetzung (Projekt oder ähnliches) und keine "sinnvolle" Aufgabe für die MC's.
Also meine Empfangsroutine der UART bekommt auf einem AVR ATMEGA16 bei 1MBit und 8Mhz schon leichte Probleme noch mitzukommen. 500Kbit sind sicher. (Ringpuffer mit Überlaufprüfung) ISR(USART_RXC_vect) //Empfangsinterrupt { unsigned char tmp; tmp=(unsigned char)(Seriell_Empfang.inp+1)%Seriell_EmpfangsbufferSize; if (tmp==Seriell_Empfang.outp) {//keine freien Elemente in Buffer Seriell_Empfang.Overflow=TRUE; } Seriell_Empfang.Buffer[tmp]=UDR; Seriell_Empfang.inp=tmp; } Der Assemblercode kommt auf 70 Takte. (Empfangsbuffersize ist 2^n) Sollte jemand was schnelleres in C haben würde es mich sehr interessieren. Auch bei SPI musst du jedes Byte im Interrupt anfassen ,die Interruptlast dürfte also nicht geringer sein. Solange du nicht etwas nimmst was gesamte Pakete erst einließt und nur relevante verarbeitet und zwischenpuffert wirst du es mit einem AVR bei dieser Datenrate nicht schaffen. CAN wäre eine Möglichkeit oder I2C im High Speed Modus.
Ich denk da braucht er externe Bauelemente die die Daten parallel ein- und ausgeben sonst kommt er kaum auf die transferrate und der avr kann wirklich nur noch daten schufeln. seriell bekommter das wohlakaum hin.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.