Hi, eigentlich dachte ich, die AVRs langsam aber sicher zu verstehen, doch nun habe ich ein Problem und weiss einfach nicht, wo ich überhaupt ansetzen soll. Vielleicht kann mir einer helfen: Ich möchte ein "größeres" Projekt realisieren, das nicht nur einen, sondern ungefähr 5 AVRs verbraten wird. Die müssen untereinander kommunizieren, allerdings nicht jeder mit jedem, sondern die vier mit der "Hauptplatine" und dem dortigen AVR. Wenn man so will, also Sternförmig. Ich programmiere den ganzen Kram in BASCOM und möchte auch erst mal nicht davon weg. Die AVRs sind alle auf einer Platine, es müssen also nicht größere Entfernungen überbrückt werden. Was ich aber brauche, ist eine Routine, mit der ich einfach einen Buchstaben oder eine Zahl an einen anderen Prozessor schicken kann oder von dem empfangen kann. Das ganze muss nicht über einen Interrupt laufen, sondern kann gepollt werden. Was würdet Ihr mir raten, wie ich das realisiere? Hat jemand vielleicht ein verständliches Beispiel in Bascom? Ich kenne inzwischen die Begriffe I2C, CanBus etc., habe sogar darüber nachgedacht, den Kram per RS232 zu verschicken... Aber ich habe leider nichts richtig zum laufen gekommen. Als Basis sollen übrigens 2313er dienen, der "Hauptprozessor" vielleicht ein größerer... Vielen Dank! Sebezahn
Hi Sebezahn, da hast Du Dir ja was vorgenommen. Das mit dem Master und den 4 Slave ist schon mal gut. Dadurch ist der Ablauf schon mal klar. Der Master ist Chef im "Ring". Er steuert die Datensendungen und Anfragen. Nun muß noch jeder Slave wissen, wer er ist. Entweder über Adressjumper oder fest im Programmcode. Bei mir verwende ich RS485 Treiber für den Datenbus. RS232 ist ungeeignet, da Du damit nicht mehrere Teilnehmer auf eine Leitung bekommst. Zwei Ausgänge trieben gegeneinander. Softwareansatz: Master sendet: "M","1","D","x" Master an Adresse 1 "D" Daten und x als Wert. Auf das "M" kannst Du deine Empfänger triggern lassen. Die eigentlichen Daten sollten kein "M" enthalten "M","3","A","x" Master erwartet Daten von Adresse 3 "A" wie Anfrage Slave antwortet: "S","3","A","v" Slave 3 Antwortet und sendet das "v" Die anderen Slaves reagieren nicht, da sie auf das "M" warten. Eine klare Trennung von Steuerzeichen und Datenzeichen vereinfacht die ganze Sache. Wenn Du in den Datenzeichen auch M, A, oder Ziffern zulässt, wird die Sache schnell aufwendig. Ein viel infacheres Konzept fällt mir nicht ein. Ich habe so etwas auf einem 2313 realisiert. Mit dem AVRGCC. Er ist dann aber schon recht voll. Noch ein bisschen Anwendung, dann ist er voll. Wie effektiv Dein BASCOM ist, weiss ich nicht. Oryx
Servus, ich empfehl dir dafür den TWI(I2C) Bus. Bei mir läuft ein PC als Master und 6 AVR's als Slaves. Fertige Bibliotheken gibt es dafür auch. Verwenden tu ich allerdings nur C Code. cu flinkflash http://www.krabbelbot.de
Hi, vielen Dank, ich versuche mich mal, durch dieses RS485 durchzufressen. Gruß Sebezahn
Wenns 2313 sein sollen, scheidet I2C aus, ist zu aufwendig als Slave in Software. RS-485-Treiber sind Perlen vor die Säue, wenn alles auf einer Platine sitzt. Da ist 5V-Pegel sicher genug. Am einfachsten, TXD aller Slaves gehen an RXD des Masters und alle RXD der Slaves gehen an TXD des Masters. Der Master sendet, wie er lustig ist. Die Slaves erst, wenn sie vom Master dazu aufgefordert wurden und dann auch nur einer zur Zeit. Wichtig ! Erst wenn ein Slave senden soll, setzt er sein TX enable, damit nur ein TXD-Pin als Ausgang arbeitet. Alle anderen schalten den Pull-Up ein, damit der Pin nicht floatet wenn keiner sendet. Bist Du sicher, daß Du mit einer besseren Programmiersprache (C mit WINAVR) nicht doch alles mit einem AVR erschlagen kannst ? Peter
sehe ich ähnlich, habe aber auch schon Anwendungen gehabt, wo es 3 Prozessoren sein mussten. Ich habs mit SPI gelöst, der master war ein 8535, 3 slaves 2313 (mit Software-SPI). Kommunikation ging nur vom Master aus, dementsprechend waren Buskonflikte kein Thema. SCK und MOSI vom master zu den slaves, dazu 3 /CS-Signale. MISO wurde bei allen slaves einfach parallel geschaltet, und vom slave nur bei aktiviertem /CS aktiviert. Habe ich aber hauptsächlich deshalb benutzt, da im Gerät sowieso schon einiges über SPI lief und die UART auch schon anderweitig benutzt wurde. Alternativ könnte man auch einen Ring bilden, immer MOSI an MISO, Takt an alle gemeinsam.
hmm... beide Lösungen finde ich sehr gut, ich habe mich jetzt mal mit der Ring-Alternative beschäftigt und einen RS232-Ring gebaut. Das Protokoll dafür habe ich fertig geschrieben, und im Emulator funktioniert auch alles so, wie es soll... Oder geht das gar nicht und ich habe einen denkfehler? Normalerweise müsste man doch die Txds und Rxds in einem Ring aufbauen können, oder nicht? Aber die sache mit allen TXds am Master RXd und umgekehrt gefällt mir auch... Zumal das "Ring"-Programm, das ich geschrieben habe, auch damit funktionieren würde. Wenn also irgendetwas gegen den Ring spricht, dann bitte ich um Aufklärung ;-) @peter dannegger Ja, auf dauer möchte ich auch auf C umsteigen, zumal ich beruflich am PC damit arbeite und somit nicht wirklich Probleme bei der Syntax habe. Aber bevor ich jetzt wieder etwas neues anfange, will ich erst mal ein Projekt mit bereits erworbenem Wissen durchbekommen. Vielen Dank für Eure Antworten, Sebezahn
Hallo, ich steuere über eine Funkstrecke bis zu 999 Slave's, hierzu benutze ich die serielle Schnittstelle mit den beiden Signalen TXD und RXD. Der Master überträgt einen "Befehlsbuchstaben" gefolgt von einer Geräteadresse und einem Code zur Befehlausführung. Die Slave-Geräteadresse ist in jedem Slave im EEPROM hinterlegt. Bei Bedarf meldelt sich nur der wirklich angesprochene Slave, alle anderen Slave's ignorieren den Befehl weil für sie nicht die Geräteadresse passt. Manche Befehle gelten für alle Slaves, so zum Beispiel SLEEP oder RESET, hier entfällt natürlich die Adresse zur Selektion. Ich habe das in ASM programmiert und läuft auf 4433 hervorragend. Gruss Gerd
"Wenn also irgendetwas gegen den Ring spricht, dann bitte ich um Aufklärung ;-)" Der Ring hat den Nachteil der höheren CPU-Last, da alle Slaves auch die nicht für sie bestimmten Daten durchreichen müssen. Auch ergeben sich dadurch größere Durchlaufzeiten, jeder Slave sendet ja um mindestens 10 Bitzeiten verzögert weiter. Und wenn ein Slave abschmiert, sind auch alle anderen tot. Sind alle Slaves parallel, kann man den 9-Bit Modus mit Adreßerkennung nehmen. Dann kriegen die nichtadressierten Slaves nicht mal mehr einen Interrupt bei nicht für sie bestimmte Daten. Für den Master kann man auch einen AVR mit 2 UARTs nehmen (ATMega162), dann ist die eine z.B. für Verbindung mit dem PC übrig. 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.