Hi zusammen, ich habe folgendes Problem: Ich möchte einen Atmega 128 mit 2 kleineren Atmels (z.B. AT90S2313) vernetzen. Dabei schickt der Atmega Daten in Richtung der kleinen Atmel Prozessoren, die daraufhin Daten am seriellen Port generieren. Die Übertragung soll dabei zu jedem 2313er mit mind. 110kbps laufen. Ausserdem bekommen die beiden 2313er jeweils noch ein externes Ram (das braucht ja auch pins). Mein Problem liegt jetzt darin, dass ich noch nie etwas mit der Vernetzung mehrerer Atmels zu tun hatte und etwas auf dem Schlauch stehe, weil ich nicht weiß wie man (Hardware, Protokoll) die jetzt am Besten vernetzt. Meine Frage lautet also (sehr allgemein), wie man diese Kommunikation am Besten realisieren könnte. Natürlich habe ich mich auch schon etwas schlau gelesen - leider sind aber viele Beiträge in diesem Forum sehr spezieller Natur, was mir die Auswahl eines bestimmten Verfahrens erschwert. So wie ich das Sehe, kann ich das A) über I2C/TWI machen Der Master (Atmega) spricht dabei die einzelnen Slaves (2313) über das Protokoll direkt an -> weniger Leitungen aber langsamer B) über SPI machen Master selektiert die Slaves mit separater Leitung -> schneller aber mehr verbrauchte Pins C) UART - geht nicht, sind schon anderweitig belegt D) irgendwie anders machen Das der Atmega die passenden Interfaces bereitstellt ist klar - aber wie kann man es am einfachsten mit den kleineren 2313ern realisieren? Müsste man dort I2C oder SPI in Software realisieren? Danke schonmal im voraus.
Wenn der Mega die Daten zu den 2313 schaufeln muss, kann er sie doch gleich selber generieren? .. oder seh ich da was falsch? Poste doch mal etwas über die Rahmenbedingungen. grüsse leo9
Ne kann er nich, bzw. soll er nicht. Der Mega hat genug anderes zu tun (Display, ne Menge Knöpfe, andere IO Sachen), so dass die beiden kleineren Chips dazu gedacht sind ihn auch rechentechnisch zu entlasten indem sie aufwendige zwischenberechnungen für die serielle ausgabe selber machen. hinzu kommt, dass wenn der mega mal kräftig am rechnen ist - die serielle ausgabe immer noch vorhanden ist (ausfallsicherheit). Gruß, Thomas
Hallo Bretti Neben den HW-UARTS kann man auch noch mehrere Software-UARTS programmieren. In welcher Programmiersprache willst Du deine Aufgabe programmieren ? Günter
Hallo Berti Bin dazu Verdonnert ein ähnliches Problem zu lösen. Ich muss ein Atmega32 mit einem AT90S2313 vernetzen. Dafür steht mir nur I2C zu Verfügung. Sende dir ne email wenn ich ne Brauchbare Lösung habe. Ralph
Wenns schnell sein soll, geht beim 2313 nur die UART. Alles andere frißt die komplette CPU Zeit auf, da ja kein Hardware SPI oder I2C. SRAM am 2313 ist auch fast unmöglich, da viel zu wenig Pins. Wenn die UART nicht geht, dann hilft nur der Mega8 statt des 2313. Vielleicht sind dessen 1kB RAM dann auch genug für Dich. "Der Mega hat genug anderes zu tun (Display, ne Menge Knöpfe, andere IO Sachen)" Das sind alles aber keine Belastungen für einen Mega128, er dreht dabei mindestens 99,9% nur Däumchen. Z.B. ein Display sollte man nicht schneller als 2..5* je Sekunde ausgeben, schließlich soll das ja ein Mensch auch ablesen können. Und Knöpfe drehen bzw. drücken macht ein Mensch auch im absoluten Schneckentempo, bezogen auch die Geschwindigkeit eines Mega128. Peter
Hallo verstehe ich nicht!!! Also ob ich nun eine Vernetzung realisiere mit 110kBps oder es gleich raus schicke ist doch egal oder nicht. evt. ist bei einer Vernetzung die programmierung einfacher Mfg Uli
Hi, danke für die vielen Antworten. "In welcher Programmiersprache willst Du deine Aufgabe programmieren?" Ob C oder Assembler ist mir eigentlich gleich (obwohl ich ASM besser kann) "Wenns schnell sein soll, geht beim 2313 nur die UART" Das hatte ich befürchtet - die UART brauche ich aber für was anderes. Das mit dem SRAM ist auch schlecht. Hatte selbst schon an den Atmega8 gedacht - ist wahrscheinlich besser insbesondere weil ich ca. 700b Ram benötige. "Das sind alles aber keine Belastungen für einen Mega128, er dreht dabei mindestens 99,9% nur Däumchen" Stimmt wohl, sind aber an die 200 Knöpfe + 200 LEDs + noch ein bischen kleinkram. Allerdings können die Ergebnisse, wenn die Knöpfe gedrückt werden schonmal recht rechenintensiv werden, so dass auch der Atmega (kurzzeitig) ausgelastet sein wird. Die Ausgabe auf den UARTs wird dabei nochmal durch viele Zwischenberechnungen ziemlich aufgebläht. Weil diese zu jeder Zeit stabil sein muss, habe ich mich für die extra Chip Variante entschieden. Der Preis ist dabei nicht so wichtig. Ausserdem ist, wie schon bemerkt wurde, die Programmierung dann etwas einfacher. Aber wie siehts denn jetzt so mit dem eigentlichen Vernetzen aus? Ist I2C (TWI) schnell genug, damit der Master an beide Slaves 110kbps übertragen kann? Gruß, Thomas
Die Ausgabe ist also unabhängig von den Berechnungen? Dazu gibt es doch Interrupts, damit kannst du dauernd Daten raushauen und dich in Echtzeit mit deiner Umgebung unterhalten und wenn der Interrupt zu ende ist, dann rechnet der ATmega128 weiter. Oder verstehe ich da was falsch?
Schön und gut - mir geht es hier allerdings nicht darum, OB ich meine Atmels jetzt vernetze oder nicht, sondern WIE ich sie vernetze. Ich denke, dass ich ausreichend Gründe genannt habe, warum ich sie vernetzen möchte. Hinzu kommt, dass ein einziger Atmel nicht ausreichend serielle Ports bietet. Vielleicht könnte man ja wirklich alles irgendwie in einen einzigen Chip quetschen - aber warum soll ich mir das antun? So geht es meines erachtens einfach besser (weniger programmieraufwand, schön klar getrennte aufgaben, spätere erweiterbarkeit usw.). Ich würde jetzt gern einmal über die Vor- und Nachteile der verschiedenen Arten der Vernetzung reden, nicht darüber wann sie sinnvoll ist. Gruß, Thomas
"Ausserdem ist, wie schon bemerkt wurde, die Programmierung dann etwas einfacher." Ich habe immer die gegenteilige Erfahrung gemacht. Programme, die eine schnelle und sichere Kommunikation zwischen mehreren µC benötigen sind grundsätzlich um Größenordnungen komplizierter. Du mußt ein Protokoll aufsetzen und auch schnelle Interrupthandler, damit keine Daten verloren gehen bzw. eine Fehlererkennung mit nachfolgendem Retry möglich ist. Am einfachsten ist daher der CAN-Bus, da er viele dieser Protokollschichten bereits in Hardware durchführt. In einem älteren Gerät hatte ich noch den I2C-Bus benutzt (etwa 10kBit Nutzdatenrate), aber in den neueren nur noch den CAN-Bus (AT89C51CC01). Aber den 2313 kannste zum Vernetzen bei 110kBit voll vergessen. Selbst über die UART ist das mehr als haarig. Peter
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.